Java tutorial
/** * Copyright (c) 2011 NetXForge * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/> * * Contributors: * Christophe Bouhier - initial API and implementation and/or initial documentation */ package com.netxforge.screens.editing.base.actions.handlers; import java.util.ArrayList; import java.util.Collection; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.domain.IEditingDomainProvider; import org.eclipse.emf.edit.ui.action.CreateChildAction; import org.eclipse.emf.edit.ui.action.CreateSiblingAction; 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.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.ui.IActionBars; import org.eclipse.ui.IWorkbenchPart; import com.netxforge.screens.editing.base.actions.IActionHandler; /** * This is the action bar contributor for the Netxstudio model editor. <!-- * begin-user-doc --> <!-- end-user-doc --> * * @generated */ public class CreationActionsHandler implements IActionHandler, ISelectionChangedListener { /** * This keeps track of the active editor. <!-- begin-user-doc --> <!-- * end-user-doc --> * * @generated */ protected IWorkbenchPart activePart; /** * This keeps track of the current selection provider. <!-- begin-user-doc * --> <!-- end-user-doc --> * * @generated */ protected ISelectionProvider selectionProvider; /** * 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 CreationActionsHandler() { } public void initActions(IActionBars bars) { contributeToMenu(bars.getMenuManager()); contributeToToolBar(bars.getToolBarManager()); // if (bars instanceof IActionBars2) { // contributeToCoolBar(((IActionBars2) bars).getCoolBarManager()); // } // contributeToStatusLine(bars.getStatusLineManager()); } /** * This adds Separators for editor additions to the tool bar. */ public void contributeToToolBar(IToolBarManager toolBarManager) { toolBarManager.add(new Separator("netxstudio-settings")); toolBarManager.add(new Separator("netxstudio-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. */ public void contributeToMenu(IMenuManager menuManager) { menuManager.add(new Separator("additions")); IMenuManager submenuManager = new MenuManager("menu", "com.netxforge.netxstudioMenuID"); 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("children"); submenuManager.insertBefore("additions", createChildMenuManager); // Prepare for CreateSibling item addition or removal. // // createSiblingMenuManager = new MenuManager("siblings"); // 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); } }); } /** * When the active editor changes, this remembers the change and registers * with it as a selection provider. <!-- begin-user-doc --> <!-- * end-user-doc --> * * @generated */ public void setActivePart(IWorkbenchPart part) { activePart = part; // Switch to the new selection provider. // if (selectionProvider != null) { selectionProvider.removeSelectionChangedListener(this); } if (part == null) { selectionProvider = null; } else { ISelectionProvider selectionProvider = part instanceof ISelectionProvider ? (ISelectionProvider) part : 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) activePart).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) { // specialized actions based on ?????? actions.add(new CreateChildAction(activePart, 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(activePart, 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. */ public void showMenu(ActionHandlerDescriptor descriptor) { if (descriptor.isEnableChildCreationActions()) { IMenuManager menuManager = descriptor.getMenuManager(); MenuManager submenuManager = null; if (descriptor.isEnableChildCreationActions()) { submenuManager = new MenuManager("New"); populateManager(submenuManager, createChildActions, null); menuManager.insertBefore("screen", submenuManager); } // if (descriptor.isEnableSiblingCreationActions()) { // submenuManager = new MenuManager("siblings"); // populateManager(submenuManager, createSiblingActions, null); // menuManager.insertBefore("screen", submenuManager); // } } } public void propertyChanged(Object source, int propId) { if (source instanceof IWorkbenchPart) { update((IWorkbenchPart) source); } } public void update(IWorkbenchPart part) { // Update the actions, according to the selection provider. this.setActivePart(part); } public void deactivate() { // nothing to deactivate. } }