Java tutorial
/** * Copyright (c) 2009, 2010 Anyware Technologies 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: * Anyware Technologies - initial API and implementation * * $Id: EmfActionBarContributor.java,v 1.7 2009/12/02 11:24:33 bcabe Exp $ */ package org.eclipse.pde.emfforms.editor; import java.util.ArrayList; import java.util.Collection; import org.eclipse.emf.edit.command.CommandParameter; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.domain.IEditingDomainProvider; import org.eclipse.emf.edit.ui.action.*; import org.eclipse.jface.action.*; import org.eclipse.jface.viewers.*; import org.eclipse.pde.emfforms.internal.Activator; import org.eclipse.ui.*; import org.eclipse.ui.actions.ActionFactory; /** * A specialized {@link EditingDomainActionBarContributor} very similar * to what EMF codegen generates in the editor layer. */ public class EmfActionBarContributor extends EditingDomainActionBarContributor implements ISelectionChangedListener { /** The create child menu manager. */ private MenuManager createChildMenuManager; /** The create child menu manager. */ private MenuManager createSiblingMenuManager; /** The active editor part. */ private IEditorPart activeEditorPart; /** The selection provider. */ private ISelectionProvider selectionProvider; /** The create child actions. */ private Collection<IAction> createChildActions; /** The create sibling actions */ protected Collection<IAction> createSiblingActions; @Override public void init(IActionBars actionBars) { super.init(actionBars); // initially disable every global action redirection disableGlobalHandlers(); } public void disableGlobalHandlers() { getActionBars().clearGlobalActionHandlers(); getActionBars().updateActionBars(); } public void enableGlobalHandlers() { IActionBars actionBars = getActionBars(); actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), deleteAction); actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(), cutAction); actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), copyAction); actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), pasteAction); actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(), undoAction); actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(), redoAction); actionBars.updateActionBars(); } public IAction getDeleteAction() { return deleteAction; } /** The show properties view action. */ protected IAction showPropertiesViewAction = new Action("Open properties") { @Override public void run() { try { getPage().showView("org.eclipse.ui.views.PropertySheet"); } catch (PartInitException exception) { Activator.logErrorMessage("The properties view is not available"); } } }; /** The filter for create child actions . */ private IFilter createChildMenuFilter = AcceptAllFilter.getInstance(); /** The filter for create sibling actions. */ private IFilter createSiblingMenuFilter = AcceptAllFilter.getInstance(); private String menuID; public void setMenuID(String menuID) { this.menuID = menuID; } /** * Instantiates a new emf action bar contributor. */ public EmfActionBarContributor() { super(ADDITIONS_LAST_STYLE); loadResourceAction = new LoadResourceAction(); validateAction = new ValidateAction(); controlAction = new ControlAction(); } public EmfActionBarContributor(String menuID) { this(); setMenuID(menuID); } /* (non-Javadoc) * @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#contributeToMenu(org.eclipse.jface.action.IMenuManager) */ @Override public void contributeToMenu(IMenuManager menuManager) { super.contributeToMenu(menuManager); IMenuManager submenuManager = new MenuManager("", menuID); 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("New"); submenuManager.insertBefore("additions", createChildMenuManager); // Force an update because Eclipse hides empty menus now. submenuManager.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager menuManager) { menuManager.updateAll(true); } }); addGlobalActions(submenuManager); } /* (non-Javadoc) * @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#setActiveEditor(org.eclipse.ui.IEditorPart) */ @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())); } } } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) */ 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); } } /** * Populate manager. * * @param manager the manager * @param actions the actions * @param contributionID the contribution id */ private void populateManager(MenuManager 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); } } } } /** * Generate create actions for child menu. * * @param childDescriptors the child descriptors * @param selection the selection * * @return the collection< i action> */ public Collection<IAction> generateCreateChildActions(Collection<?> childDescriptors, ISelection selection) { Collection<IAction> actions = new ArrayList<IAction>(); if (childDescriptors != null) { for (Object descriptor : childDescriptors) { if (this.createChildMenuFilter.select(((CommandParameter) descriptor).value)) actions.add(new CreateChildAction(activeEditorPart, selection, descriptor)); } } return actions; } /** * Generate create actions for sibling menu. * * @param descriptors the sibling descriptors * @param selection the selection * * @return the collection< i action> */ public Collection<IAction> generateCreateSiblingActions(Collection<?> descriptors, ISelection selection) { Collection<IAction> actions = new ArrayList<IAction>(); if (descriptors != null) { for (Object descriptor : descriptors) { if (this.createSiblingMenuFilter.select(((CommandParameter) descriptor).value)) actions.add(new CreateSiblingAction(activeEditorPart, selection, descriptor)); } } return actions; } /** * Depopulate manager. * * @param manager the manager * @param actions the actions */ 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); } } } } } /* (non-Javadoc) * @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#menuAboutToShow(org.eclipse.jface.action.IMenuManager) */ @Override public void menuAboutToShow(IMenuManager menuManager) { super.menuAboutToShow(menuManager); MenuManager submenuManager = null; submenuManager = new MenuManager("New child"); populateManager(submenuManager, createChildActions, null); menuManager.insertBefore("edit", submenuManager); submenuManager = new MenuManager("New sibling"); populateManager(submenuManager, createSiblingActions, null); menuManager.insertBefore("edit", submenuManager); } /** * Sets the filter used to selection actions to display in the create child menu. * * @param filter the new filter */ public void setCreateChildMenuFilter(IFilter filter) { this.createChildMenuFilter = filter; } /** * Sets the filter used to selection actions to display in the create sibling menu. * * @param filter the new filter */ public void setCreateSiblingMenuFilter(IFilter filter) { this.createSiblingMenuFilter = filter; } }