Java tutorial
/******************************************************************************* * Copyright (c) 2003, 2007 s IT Solutions AT Spardat GmbH . * 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: * s IT Solutions AT Spardat GmbH - initial API and implementation *******************************************************************************/ /** * <copyright> * </copyright> * * %W% * @version %I% %H% */ package at.spardat.xma.guidesign.presentation.action; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; 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.CreateChildAction; import org.eclipse.emf.edit.ui.action.CreateSiblingAction; import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor; 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.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.jface.viewers.StructuredSelection; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.actions.ActionFactory; import org.eclipse.ui.part.IPage; import org.eclipse.ui.views.properties.IPropertySheetPage; import at.spardat.xma.guidesign.HiddenWidget; import at.spardat.xma.guidesign.IFormaterAttachable; import at.spardat.xma.guidesign.PageComposite; import at.spardat.xma.guidesign.XMAComponent; import at.spardat.xma.guidesign.XMAPage; import at.spardat.xma.guidesign.XMAScrolledComposite; import at.spardat.xma.guidesign.XMATable; import at.spardat.xma.guidesign.XMATableColumn; import at.spardat.xma.guidesign.XMAWidget; import at.spardat.xma.guidesign.flex.IGeneratable; import at.spardat.xma.guidesign.plugin.GUIDesignerPlugin; /** * This is the action bar contributor for the Guidesign model editor. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public class GuidesignActionBarContributor extends EditingDomainActionBarContributor implements ISelectionChangedListener { /** * 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 will contain one {@link CreateChildAction} corresponding to each descriptor * generated for the current selection by the item provider. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected Collection 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 CreateSiblingAction} corresponding to each descriptor * generated for the current selection by the item provider. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected Collection 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 will contain one Edit Action corresponding to each widget * @modified */ protected Collection editActions; /** * This is the menu manager into which menu contribution items should be added for edit actions. * @modified */ protected IMenuManager editMenuManager; /** * This creates an instance of the contributor. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public GuidesignActionBarContributor() { } /** * This adds Separators for editor additions to the tool bar. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public void contributeToToolBar(IToolBarManager toolBarManager) { toolBarManager.add(new Separator("guidesign-settings")); toolBarManager.add(new Separator("guidesign-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 --> * @modified */ public void contributeToMenu(IMenuManager menuManager) { super.contributeToMenu(menuManager); IMenuManager submenuManager = new MenuManager( GUIDesignerPlugin.INSTANCE.getString("_UI_GuidesignEditor_menu"), "at.spardat.xma.guidesignMenuID"); 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(GUIDesignerPlugin.INSTANCE.getString("_UI_CreateChild_menu_item")); submenuManager.insertBefore("additions", createChildMenuManager); // Prepare for CreateSibling item addition or removal. // createSiblingMenuManager = new MenuManager( GUIDesignerPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item")); submenuManager.insertBefore("additions", createSiblingMenuManager); //Prepare for CreateGenerate item addition or removal. editMenuManager = new MenuManager(GUIDesignerPlugin.INSTANCE.getString("_UI_Edit_menu_item")); submenuManager.insertBefore("additions", editMenuManager); } /** * 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 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 ISelectionChangedListener}, * handling {@link SelectionChangedEvents} 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); } if (editMenuManager != null) { depopulateManager(editMenuManager, editActions); } // Query the new selection for appropriate new child/sibling descriptors // Collection newChildDescriptors = null; Collection newSiblingDescriptors = null; Object object = null; ISelection selection = event.getSelection(); if (selection instanceof IStructuredSelection) { IStructuredSelection structSels = (IStructuredSelection) selection; if (structSels.size() == 1) { object = ((IStructuredSelection) selection).getFirstElement(); EditingDomain domain = ((IEditingDomainProvider) activeEditorPart).getEditingDomain(); newChildDescriptors = domain.getNewChildDescriptors(object, null); newSiblingDescriptors = domain.getNewChildDescriptors(null, object); } //create edit actions editActions = generateEditActions(structSels); } // 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); } if (editMenuManager != null) { populateManager(editMenuManager, editActions, null); editMenuManager.update(true); } } /** * @param sels the currently selected object in the workbench * @return a collection of actions dependend of the type of the selection object */ private Collection generateEditActions(IStructuredSelection sels) { Collection actions = new LinkedList(); Object selection = null; if (((IStructuredSelection) sels).size() == 1) { selection = ((IStructuredSelection) sels).getFirstElement(); //create edit action for all xmawidget that may have Formdata if (selection instanceof XMAWidget && !(selection instanceof HiddenWidget) && !(selection instanceof PageComposite) && !(selection instanceof IGeneratable && ((IGeneratable) selection).isYnGenerated())) { actions.add(new EditFormDataAction("FormData", (XMAWidget) selection, activeEditorPart)); } //create edit action for xmacomponent that may have xma properties if (selection instanceof XMAComponent) { actions.add(new EditComponentPropertyAction("Component Property", (XMAComponent) selection, activeEditorPart)); } //only showable xmawidget may have validator if (selection instanceof IFormaterAttachable && !(selection instanceof IGeneratable && ((IGeneratable) selection).isYnGenerated())) { actions.add( new EditValidatorAction("Validator", (IFormaterAttachable) selection, activeEditorPart)); } //only showable xmawidget is a table with more than 1 columns if (selection instanceof XMATable && ((XMATable) selection).getColumn().size() > 0 && !(selection instanceof IGeneratable && ((IGeneratable) selection).isYnGenerated())) { actions.add(new EditCalculateTablelayoutAction("Calculate Layout", (XMATable) selection, activeEditorPart)); } } else { // we have more than one selection ArrayList selWids = new ArrayList(); for (Iterator it = sels.iterator(); it.hasNext();) { Object selObj = it.next(); if (selObj instanceof XMAWidget && !(selObj instanceof HiddenWidget) && !(selObj instanceof PageComposite)) { selWids.add(selObj); } } if (selWids.size() > 1) { actions.add(new MultiEditFormDataAction("FormData (multi selection)", selWids, activeEditorPart)); } } return actions; } /** * This generates a {@link CreateChildAction} for each object in <code>descriptors</code>, * and returns the collection of these actions. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected Collection generateCreateChildActions(Collection descriptors, ISelection selection) { Collection actions = new LinkedList(); if (descriptors != null) { for (Iterator i = descriptors.iterator(); i.hasNext();) { CommandParameter parameter = (CommandParameter) i.next(); //use the own actions to start the new dialogs if (parameter.value instanceof XMAWidget) { if (parameter.value instanceof XMAScrolledComposite) { actions.add(new CreateScrolledCompositeAction(activeEditorPart, selection, parameter)); } else { actions.add(new CreateXMAWidgetAction(activeEditorPart, selection, parameter)); } } else if (parameter.value instanceof XMAPage) { actions.add(new CreateXMAPageAction(activeEditorPart, selection, parameter)); } else if (parameter.value instanceof XMATableColumn) { actions.add(new CreateXMATableColumnAction(activeEditorPart, selection, parameter)); } else { actions.add(new CreateChildAction(activeEditorPart, selection, parameter)); } } } return actions; } /** * This generates a {@link CreateSiblingAction} for each object in <code>descriptors</code>, * and returns the collection of these actions. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected Collection generateCreateSiblingActions(Collection descriptors, ISelection selection) { Collection actions = new LinkedList(); if (descriptors != null) { for (Iterator i = descriptors.iterator(); i.hasNext();) { CommandParameter parameter = (CommandParameter) i.next(); //use the own actions to start the new dialogs if (parameter.value instanceof XMAWidget) { if (parameter.value instanceof XMAScrolledComposite) { actions.add( new CreateScrolledCompositeSiblingAction(activeEditorPart, selection, parameter)); } else { actions.add(new CreateXMAWidgetSiblingAction(activeEditorPart, selection, parameter)); } } else if (parameter.value instanceof XMAPage) { actions.add(new CreateXMAPageSiblingAction(activeEditorPart, selection, parameter)); } else if (parameter.value instanceof XMATableColumn) { actions.add(new CreateXMATableColumnSiblingAction(activeEditorPart, selection, parameter)); } else { actions.add(new CreateSiblingAction(activeEditorPart, selection, parameter)); } } } return actions; } /** * This populates the specified <code>manager</code> with {@link ActionContributionItem}s * based on the {@link IAction}s contained in the <code>actions</code> collection, * by inserting them before the specified contribution item <code>contributionID</code>. * If <code>ID</code> is <code>null</code>, they are simply added. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected void populateManager(IContributionManager manager, Collection actions, String contributionID) { if (actions != null) { for (Iterator i = actions.iterator(); i.hasNext();) { IAction action = (IAction) i.next(); if (contributionID != null) { manager.insertBefore(contributionID, action); } else { manager.add(action); } } } } /** * This removes from the specified <code>manager</code> all {@link ActionContributionItem}s * based on the {@link IAction}s contained in the <code>actions</code> collection. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected void depopulateManager(IContributionManager manager, Collection 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 menuAboutToShow(IMenuManager menuManager) { //we don't need undo/redo therefore menuAboutToShow is copied from //the superclass // **** begin copy // Add our standard marker. menuManager.add(new Separator("additions")); menuManager.add(new Separator("edit")); // Add the edit menu actions. //menuManager.add(new ActionContributionItem(undoAction)); //menuManager.add(new ActionContributionItem(redoAction)); menuManager.add(new Separator()); menuManager.add(new ActionContributionItem(cutAction)); menuManager.add(new ActionContributionItem(copyAction)); menuManager.add(new ActionContributionItem(pasteAction)); menuManager.add(new Separator()); menuManager.add(new ActionContributionItem(deleteAction)); // Add our other standard marker. menuManager.add(new Separator("additions-end")); // **** end copy //super.menuAboutToShow(menuManager); MenuManager submenuManager = null; submenuManager = new MenuManager(GUIDesignerPlugin.INSTANCE.getString("_UI_CreateChild_menu_item")); populateManager(submenuManager, createChildActions, null); menuManager.insertBefore("additions", submenuManager); submenuManager = new MenuManager(GUIDesignerPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item")); populateManager(submenuManager, createSiblingActions, null); menuManager.insertBefore("additions", submenuManager); submenuManager = new MenuManager(GUIDesignerPlugin.INSTANCE.getString("_UI_Edit_menu_item")); populateManager(submenuManager, editActions, null); menuManager.insertBefore("additions", submenuManager); } /** * the sense of this override of the superclass method is to remove * undo/redo from the global actions */ public void shareGlobalActions(IPage page, IActionBars actionBars) { if (!(page instanceof IPropertySheetPage)) { 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(IWorkbenchActionConstants.UNDO, undoAction); //actionBars.setGlobalActionHandler(IWorkbenchActionConstants.REDO, redoAction); } /** * the sense of this override of the superclass method is to remove * undo/redo from the global actions */ public void activate() { activeEditor.addPropertyListener(this); deleteAction.setActiveEditor(activeEditor); cutAction.setActiveEditor(activeEditor); copyAction.setActiveEditor(activeEditor); pasteAction.setActiveEditor(activeEditor); undoAction.setActiveEditor(null); redoAction.setActiveEditor(null); ISelectionProvider selectionProvider = activeEditor instanceof ISelectionProvider ? (ISelectionProvider) activeEditor : activeEditor.getEditorSite().getSelectionProvider(); selectionProvider.addSelectionChangedListener(deleteAction); selectionProvider.addSelectionChangedListener(cutAction); selectionProvider.addSelectionChangedListener(copyAction); selectionProvider.addSelectionChangedListener(pasteAction); update(); } /** * the sense of this override of the superclass method is to remove * undo/redo from the global actions */ public void update() { ISelectionProvider selectionProvider = activeEditor instanceof ISelectionProvider ? (ISelectionProvider) activeEditor : activeEditor.getEditorSite().getSelectionProvider(); ISelection selection = selectionProvider.getSelection(); IStructuredSelection structuredSelection = selection instanceof IStructuredSelection ? (IStructuredSelection) selection : StructuredSelection.EMPTY; deleteAction.updateSelection(structuredSelection); cutAction.updateSelection(structuredSelection); copyAction.updateSelection(structuredSelection); pasteAction.updateSelection(structuredSelection); //undoAction.update(); //redoAction.update(); } }