Java tutorial
/* * Copyright (c) 2014, 2015 Eike Stepper (Berlin, Germany) and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eike Stepper - initial API and implementation */ package org.eclipse.oomph.workingsets.presentation; import org.eclipse.oomph.workingsets.WorkingSet; import org.eclipse.oomph.workingsets.WorkingSetGroup; import org.eclipse.oomph.workingsets.WorkingSetsFactory; import org.eclipse.oomph.workingsets.provider.WorkingSetsEditPlugin; import org.eclipse.emf.common.command.CommandStackListener; import org.eclipse.emf.common.ui.viewer.IViewerProvider; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.domain.IEditingDomainProvider; import org.eclipse.emf.edit.provider.ItemProvider; import org.eclipse.emf.edit.ui.action.ControlAction; import org.eclipse.emf.edit.ui.action.CreateChildAction; import org.eclipse.emf.edit.ui.action.CreateSiblingAction; import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor; import org.eclipse.emf.edit.ui.action.LoadResourceAction; import org.eclipse.emf.edit.ui.action.ValidateAction; import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; import org.eclipse.emf.edit.ui.provider.DecoratingColumLabelProvider; import org.eclipse.emf.edit.ui.provider.DiagnosticDecorator; import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IContributionManager; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.action.SubContributionItem; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.ISelectionService; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.model.IWorkbenchAdapter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.EventObject; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; /** * This is the action bar contributor for the WorkingSets model editor. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public class WorkingSetsActionBarContributor extends EditingDomainActionBarContributor implements ISelectionChangedListener { /** * @author Ed Merks */ public static class PreviewDialog extends Dialog { protected static class Input extends ItemProvider { public EList<WorkingSetPresentation> getWorkingSets() { @SuppressWarnings("unchecked") EList<WorkingSetPresentation> result = (EList<WorkingSetPresentation>) (EList<?>) getChildren(); return result; } } protected static class WorkingSetPresentation extends ItemProvider { private WorkingSet workingSet; public WorkingSetPresentation(WorkingSet workingSet) { super(workingSet.getName(), WorkingSetsEditPlugin.INSTANCE.getImage("full/obj16/WorkingSet")); this.workingSet = workingSet; } public EList<ProjectPresentation> getProjects() { @SuppressWarnings("unchecked") EList<ProjectPresentation> result = (EList<ProjectPresentation>) (EList<?>) getChildren(); return result; } public WorkingSet getWorkingSet() { return workingSet; } } protected static class ProjectPresentation extends ItemProvider { private IProject project; public ProjectPresentation(IProject project) { super(project.getName(), ExtendedImageRegistry.INSTANCE .getImage(project.getAdapter(IWorkbenchAdapter.class).getImageDescriptor(project))); this.project = project; } public IProject getProject() { return project; } } protected TreeViewer tree; private IEditorPart activeEditorPart; protected Input input = new Input(); private ISelectionListener selectionListener = new ISelectionListener() { public void selectionChanged(IWorkbenchPart part, ISelection selection) { PreviewDialog.this.selectionChanged(part, selection); } }; private IWorkbenchWindow workbenchWindow; private CommandStackListener commandStackListener = new CommandStackListener() { public void commandStackChanged(EventObject event) { PreviewDialog.this.commandStackChanged(event); } }; public PreviewDialog(Shell parentShell, IEditorPart activeEditorPart) { super(parentShell); setActiveEditorPart(activeEditorPart); setShellStyle(getShellStyle() ^ SWT.APPLICATION_MODAL | SWT.MODELESS | SWT.RESIZE | SWT.MAX | SWT.MIN); setBlockOnOpen(false); workbenchWindow = activeEditorPart.getEditorSite().getWorkbenchWindow(); ISelectionService selectionService = workbenchWindow.getSelectionService(); selectionService.addPostSelectionListener(selectionListener); } protected void selectionChanged(IWorkbenchPart part, ISelection selection) { if (selection instanceof IStructuredSelection) { Set<Object> selectedObjects = new HashSet<Object>(); for (Object value : ((IStructuredSelection) selection).toArray()) { if (value instanceof EObject) { for (EObject eObject = (EObject) value; eObject != null; eObject = eObject.eContainer()) { for (WorkingSetPresentation workingSet : input.getWorkingSets()) { if (eObject == workingSet.getWorkingSet()) { selectedObjects.add(workingSet); } } } } if (value instanceof IAdaptable) { IProject project = ((IAdaptable) value).getAdapter(IProject.class); if (project != null) { for (WorkingSetPresentation workingSet : input.getWorkingSets()) { for (ProjectPresentation p : workingSet.getProjects()) { if (project.equals(p.getProject())) { selectedObjects.add(p); } } } } } } if (!selectedObjects.isEmpty()) { tree.setSelection(new StructuredSelection(new ArrayList<Object>(selectedObjects))); } } } protected void commandStackChanged(EventObject event) { reconcile(); tree.expandAll(); } @Override public boolean close() { setActiveEditorPart(null); ISelectionService selectionService = workbenchWindow.getSelectionService(); selectionService.removePostSelectionListener(selectionListener); return super.close(); } public void setActiveEditorPart(IEditorPart activeEditorPart) { if (this.activeEditorPart != null) { ((IEditingDomainProvider) this.activeEditorPart).getEditingDomain().getCommandStack() .removeCommandStackListener(commandStackListener); } this.activeEditorPart = activeEditorPart; if (activeEditorPart != null) { ((IEditingDomainProvider) activeEditorPart).getEditingDomain().getCommandStack() .addCommandStackListener(commandStackListener); } } @Override protected Control createDialogArea(Composite parent) { getShell().setText("Working Sets Preview"); tree = new TreeViewer(parent); reconcile(); tree.setInput(input); tree.expandAll(); GridLayout layout = new GridLayout(); layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN); layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN); layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING); layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING); Tree treeControl = tree.getTree(); treeControl.setLayout(layout); GridData layoutData = new GridData(GridData.FILL_BOTH); layoutData.heightHint = 800; layoutData.widthHint = 400; treeControl.setLayoutData(layoutData); applyDialogFont(treeControl); return treeControl; } protected void reconcile() { EList<Object> children = input.getChildren(); children.clear(); AdapterFactoryEditingDomain editingDomain = (AdapterFactoryEditingDomain) ((IEditingDomainProvider) activeEditorPart) .getEditingDomain(); tree.setContentProvider(new AdapterFactoryContentProvider(editingDomain.getAdapterFactory())); DecoratingColumLabelProvider labelProvider = new DecoratingColumLabelProvider( new AdapterFactoryLabelProvider(editingDomain.getAdapterFactory()), new DiagnosticDecorator( editingDomain, tree, WorkingSetsEditorPlugin.getPlugin().getDialogSettings())); tree.setLabelProvider(labelProvider); WorkingSet otherProjectsWorkingSet = WorkingSetsFactory.eINSTANCE.createWorkingSet(); otherProjectsWorkingSet.setName("Other Projects"); ItemProvider otherProjects = new WorkingSetPresentation(otherProjectsWorkingSet); children.add(otherProjects); Set<IProject> projects = new LinkedHashSet<IProject>( Arrays.asList(ResourcesPlugin.getWorkspace().getRoot().getProjects())); Set<IProject> unmatchedProjects = new LinkedHashSet<IProject>(projects); for (WorkingSet workingSet : getWorkingSets()) { ItemProvider child = new WorkingSetPresentation(workingSet); EList<Object> contents = child.getChildren(); for (IProject project : projects) { if (project.isHidden()) { unmatchedProjects.remove(project); } else if (workingSet.matches(project)) { ItemProvider childProject = new ProjectPresentation(project); contents.add(childProject); unmatchedProjects.remove(project); } } children.add(child); } if (!unmatchedProjects.isEmpty()) { EList<Object> contents = otherProjects.getChildren(); for (IProject project : unmatchedProjects) { ItemProvider childProject = new ProjectPresentation(project); contents.add(childProject); } } } protected List<WorkingSet> getWorkingSets() { EditingDomain editingDomain = ((IEditingDomainProvider) activeEditorPart).getEditingDomain(); Resource resource = editingDomain.getResourceSet().getResources().get(0); WorkingSetGroup workingSetGroup = (WorkingSetGroup) resource.getContents().get(0); return workingSetGroup.getWorkingSets(); } @Override protected Control createButtonBar(Composite parent) { return null; } } /** * This keeps track of the active editor. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected IEditorPart activeEditorPart; /** * This keeps track of the current selection provider. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected ISelectionProvider selectionProvider; /** * This action opens the Properties view. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected IAction showPropertiesViewAction = new Action( WorkingSetsEditorPlugin.INSTANCE.getString("_UI_ShowPropertiesView_menu_item")) { @Override public void run() { try { getPage().showView("org.eclipse.ui.views.PropertySheet"); } catch (PartInitException exception) { WorkingSetsEditorPlugin.INSTANCE.log(exception); } } }; /** * This action refreshes the viewer of the current editor if the editor * implements {@link org.eclipse.emf.common.ui.viewer.IViewerProvider}. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected IAction refreshViewerAction = new Action( WorkingSetsEditorPlugin.INSTANCE.getString("_UI_RefreshViewer_menu_item")) { @Override public boolean isEnabled() { return activeEditorPart instanceof IViewerProvider; } @Override public void run() { if (activeEditorPart instanceof IViewerProvider) { Viewer viewer = ((IViewerProvider) activeEditorPart).getViewer(); if (viewer != null) { viewer.refresh(); } } } }; /** * This will contain one {@link org.eclipse.emf.edit.ui.action.CreateChildAction} corresponding to each descriptor * generated for the current selection by the item provider. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected Collection<IAction> createChildActions; /** * This is the menu manager into which menu contribution items should be added for CreateChild actions. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected IMenuManager createChildMenuManager; /** * This will contain one {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} corresponding to each descriptor * generated for the current selection by the item provider. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected Collection<IAction> createSiblingActions; /** * This is the menu manager into which menu contribution items should be added for CreateSibling actions. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected IMenuManager createSiblingMenuManager; /** * This creates an instance of the contributor. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public WorkingSetsActionBarContributor() { super(ADDITIONS_LAST_STYLE); loadResourceAction = new LoadResourceAction(); validateAction = new ValidateAction(); liveValidationAction = new DiagnosticDecorator.LiveValidator.LiveValidationAction( WorkingSetsEditorPlugin.getPlugin().getDialogSettings()); controlAction = new ControlAction(); } /** * This adds Separators for editor additions to the tool bar. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public void contributeToToolBar(IToolBarManager toolBarManager) { toolBarManager.add(new Separator("workingsets-settings")); toolBarManager.add(new Separator("workingsets-additions")); } /** * This adds to the menu bar a menu and some separators for editor additions, * as well as the sub-menus for object creation items. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public void contributeToMenu(IMenuManager menuManager) { super.contributeToMenu(menuManager); IMenuManager submenuManager = new MenuManager( WorkingSetsEditorPlugin.INSTANCE.getString("_UI_WorkingSetsEditor_menu"), "org.eclipse.oomph.workingsetsMenuID"); menuManager.insertAfter("additions", submenuManager); submenuManager.add(new Separator("settings")); submenuManager.add(new Separator("actions")); submenuManager.add(new Separator("additions")); submenuManager.add(new Separator("additions-end")); // Prepare for CreateChild item addition or removal. // createChildMenuManager = new MenuManager( WorkingSetsEditorPlugin.INSTANCE.getString("_UI_CreateChild_menu_item")); submenuManager.insertBefore("additions", createChildMenuManager); // Prepare for CreateSibling item addition or removal. // createSiblingMenuManager = new MenuManager( WorkingSetsEditorPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item")); submenuManager.insertBefore("additions", createSiblingMenuManager); // Force an update because Eclipse hides empty menus now. // submenuManager.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager menuManager) { menuManager.updateAll(true); } }); addGlobalActions(submenuManager); } /** * When the active editor changes, this remembers the change and registers with it as a selection provider. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public void setActiveEditor(IEditorPart part) { super.setActiveEditor(part); activeEditorPart = part; // Switch to the new selection provider. // if (selectionProvider != null) { selectionProvider.removeSelectionChangedListener(this); } if (part == null) { selectionProvider = null; } else { selectionProvider = part.getSite().getSelectionProvider(); selectionProvider.addSelectionChangedListener(this); // Fake a selection changed event to update the menus. // if (selectionProvider.getSelection() != null) { selectionChanged(new SelectionChangedEvent(selectionProvider, selectionProvider.getSelection())); } } } /** * This implements {@link org.eclipse.jface.viewers.ISelectionChangedListener}, * handling {@link org.eclipse.jface.viewers.SelectionChangedEvent}s by querying for the children and siblings * that can be added to the selected object and updating the menus accordingly. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public void selectionChanged(SelectionChangedEvent event) { // Remove any menu items for old selection. // if (createChildMenuManager != null) { depopulateManager(createChildMenuManager, createChildActions); } if (createSiblingMenuManager != null) { depopulateManager(createSiblingMenuManager, createSiblingActions); } // Query the new selection for appropriate new child/sibling descriptors // Collection<?> newChildDescriptors = null; Collection<?> newSiblingDescriptors = null; ISelection selection = event.getSelection(); if (selection instanceof IStructuredSelection && ((IStructuredSelection) selection).size() == 1) { Object object = ((IStructuredSelection) selection).getFirstElement(); EditingDomain domain = ((IEditingDomainProvider) activeEditorPart).getEditingDomain(); newChildDescriptors = domain.getNewChildDescriptors(object, null); newSiblingDescriptors = domain.getNewChildDescriptors(null, object); } // Generate actions for selection; populate and redraw the menus. // createChildActions = generateCreateChildActions(newChildDescriptors, selection); createSiblingActions = generateCreateSiblingActions(newSiblingDescriptors, selection); if (createChildMenuManager != null) { populateManager(createChildMenuManager, createChildActions, null); createChildMenuManager.update(true); } if (createSiblingMenuManager != null) { populateManager(createSiblingMenuManager, createSiblingActions, null); createSiblingMenuManager.update(true); } } /** * This generates a {@link org.eclipse.emf.edit.ui.action.CreateChildAction} for each object in <code>descriptors</code>, * and returns the collection of these actions. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected Collection<IAction> generateCreateChildActions(Collection<?> descriptors, ISelection selection) { Collection<IAction> actions = new ArrayList<IAction>(); if (descriptors != null) { for (Object descriptor : descriptors) { actions.add(new CreateChildAction(activeEditorPart, selection, descriptor)); } } return actions; } /** * This generates a {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} for each object in <code>descriptors</code>, * and returns the collection of these actions. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected Collection<IAction> generateCreateSiblingActions(Collection<?> descriptors, ISelection selection) { Collection<IAction> actions = new ArrayList<IAction>(); if (descriptors != null) { for (Object descriptor : descriptors) { actions.add(new CreateSiblingAction(activeEditorPart, selection, descriptor)); } } return actions; } /** * This populates the specified <code>manager</code> with {@link org.eclipse.jface.action.ActionContributionItem}s * based on the {@link org.eclipse.jface.action.IAction}s contained in the <code>actions</code> collection, * by inserting them before the specified contribution item <code>contributionID</code>. * If <code>contributionID</code> is <code>null</code>, they are simply added. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected void populateManager(IContributionManager manager, Collection<? extends IAction> actions, String contributionID) { if (actions != null) { for (IAction action : actions) { if (contributionID != null) { manager.insertBefore(contributionID, action); } else { manager.add(action); } } } } /** * This removes from the specified <code>manager</code> all {@link org.eclipse.jface.action.ActionContributionItem}s * based on the {@link org.eclipse.jface.action.IAction}s contained in the <code>actions</code> collection. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected void depopulateManager(IContributionManager manager, Collection<? extends IAction> actions) { if (actions != null) { IContributionItem[] items = manager.getItems(); for (int i = 0; i < items.length; i++) { // Look into SubContributionItems // IContributionItem contributionItem = items[i]; while (contributionItem instanceof SubContributionItem) { contributionItem = ((SubContributionItem) contributionItem).getInnerItem(); } // Delete the ActionContributionItems with matching action. // if (contributionItem instanceof ActionContributionItem) { IAction action = ((ActionContributionItem) contributionItem).getAction(); if (actions.contains(action)) { manager.remove(contributionItem); } } } } } /** * This populates the pop-up menu before it appears. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public void menuAboutToShowGen(IMenuManager menuManager) { super.menuAboutToShow(menuManager); MenuManager submenuManager = null; submenuManager = new MenuManager(WorkingSetsEditorPlugin.INSTANCE.getString("_UI_CreateChild_menu_item")); populateManager(submenuManager, createChildActions, null); menuManager.insertBefore("edit", submenuManager); submenuManager = new MenuManager(WorkingSetsEditorPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item")); populateManager(submenuManager, createSiblingActions, null); menuManager.insertBefore("edit", submenuManager); } @Override public void menuAboutToShow(IMenuManager menuManager) { menuAboutToShowGen(menuManager); menuManager.insertBefore("ui-actions", new Action() { @Override public String getText() { return "Preview..."; } @Override public void run() { Dialog dialog = new PreviewDialog(activeEditorPart.getSite().getShell(), activeEditorPart); dialog.open(); } }); } /** * This inserts global actions before the "additions-end" separator. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override protected void addGlobalActions(IMenuManager menuManager) { menuManager.insertAfter("additions-end", new Separator("ui-actions")); menuManager.insertAfter("ui-actions", showPropertiesViewAction); refreshViewerAction.setEnabled(refreshViewerAction.isEnabled()); menuManager.insertAfter("ui-actions", refreshViewerAction); super.addGlobalActions(menuManager); } /** * This ensures that a delete action will clean up all references to deleted objects. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override protected boolean removeAllReferencesOnDelete() { return true; } }