diff options
| author | Laurent Redor | 2016-08-02 15:28:27 +0000 |
|---|---|---|
| committer | Laurent Redor | 2016-08-09 08:55:13 +0000 |
| commit | dda4e01094ef362a91635282b4dd4f24bd350c69 (patch) | |
| tree | 44b1b4caa4b2197827e7608e06ad9be2fb072506 | |
| parent | eb1b1b6bfb44e5e4d2d68ad557ef8b99556fd86b (diff) | |
| download | org.eclipse.sirius-dda4e01094ef362a91635282b4dd4f24bd350c69.tar.gz org.eclipse.sirius-dda4e01094ef362a91635282b4dd4f24bd350c69.tar.xz org.eclipse.sirius-dda4e01094ef362a91635282b4dd4f24bd350c69.zip | |
[496466] Add a drop down menu in the tabbar for Paste actions
Add a drop down menu in the tabbar instead of the current push button
that only calls Paste Format.
Bug: 496466
Change-Id: I074cfdfb6a7abf75440e8777be8eeffc97b6a63f
Signed-off-by: Laurent Redor <laurent.redor@obeo.fr>
7 files changed, 185 insertions, 19 deletions
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/ui/actions/ActionIds.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/ui/actions/ActionIds.java index 8690a62a5d..3fec14ac3a 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/ui/actions/ActionIds.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/ui/actions/ActionIds.java @@ -29,6 +29,9 @@ public interface ActionIds { /** Action contribution id for the copy format (layout and style). */ String COPY_FORMAT = "copyFormatAction"; //$NON-NLS-1$ + /** Id of menu that groups paste actions. **/ + String MENU_PASTE_FORMAT = "pasteFormatMenu"; //$NON-NLS-1$ + /** Action contribution id for the paste format (layout and style). */ String PASTE_FORMAT = "pasteFormatAction"; //$NON-NLS-1$ diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/layout/PasteFormatAction.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/layout/PasteFormatAction.java index 54fd74bb66..d95514074d 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/layout/PasteFormatAction.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/layout/PasteFormatAction.java @@ -98,8 +98,8 @@ public class PasteFormatAction extends AbstractCopyPasteFormatAction { Command pasteFormatCommand = UnexecutableCommand.INSTANCE; if (SiriusLayoutDataManagerForSemanticElementsFactory.getInstance().getSiriusLayoutDataManager().containsData()) { - // Create a compound command to hold the resize commands - CompoundCommand doStoreFormatsCmd = new CompoundCommand(Messages.PasteFormatAction_restoreFormatCommandLabel); + // Create a compound command to hold the paste commands + CompoundCommand doPasteFormatsCmd = new CompoundCommand(Messages.PasteFormatAction_restoreFormatCommandLabel); // Create an iterator for the selection final Iterator<?> iter = getSelectedObjects().iterator(); @@ -114,12 +114,12 @@ public class PasteFormatAction extends AbstractCopyPasteFormatAction { final Object next = iter.next(); if (next instanceof IGraphicalEditPart) { final IGraphicalEditPart torestore = (IGraphicalEditPart) next; - doStoreFormatsCmd.add(new ICommandProxy(new PasteFormatDataCommand(torestore.getEditingDomain(), diagram.get(), torestore))); + doPasteFormatsCmd.add(new ICommandProxy(new PasteFormatDataCommand(torestore.getEditingDomain(), diagram.get(), torestore))); } } } } - pasteFormatCommand = doStoreFormatsCmd.unwrap(); + pasteFormatCommand = doPasteFormatsCmd.unwrap(); } return pasteFormatCommand; } diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/layout/PasteLayoutAction.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/layout/PasteLayoutAction.java index 836c020532..3193eae7a2 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/layout/PasteLayoutAction.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/layout/PasteLayoutAction.java @@ -97,8 +97,8 @@ public class PasteLayoutAction extends AbstractCopyPasteFormatAction { Command pasteLayoutCommand = UnexecutableCommand.INSTANCE; if (SiriusLayoutDataManagerForSemanticElementsFactory.getInstance().getSiriusLayoutDataManager().containsData()) { - // Create a compound command to hold the resize commands - CompoundCommand doStoreLayoutsCmd = new CompoundCommand(Messages.PasteLayoutAction_restoreLayoutCommandLabel); + // Create a compound command to hold the paste commands + CompoundCommand doPasteLayoutsCmd = new CompoundCommand(Messages.PasteLayoutAction_restoreLayoutCommandLabel); // Create an iterator for the selection final Iterator<?> iter = getSelectedObjects().iterator(); @@ -113,12 +113,12 @@ public class PasteLayoutAction extends AbstractCopyPasteFormatAction { final Object next = iter.next(); if (next instanceof IGraphicalEditPart) { final IGraphicalEditPart torestore = (IGraphicalEditPart) next; - doStoreLayoutsCmd.add(new ICommandProxy(new PasteLayoutDataCommand(torestore.getEditingDomain(), diagram.get(), torestore))); + doPasteLayoutsCmd.add(new ICommandProxy(new PasteLayoutDataCommand(torestore.getEditingDomain(), diagram.get(), torestore))); } } } } - pasteLayoutCommand = doStoreLayoutsCmd.unwrap(); + pasteLayoutCommand = doPasteLayoutsCmd.unwrap(); } return pasteLayoutCommand; } diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/layout/PasteStyleAction.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/layout/PasteStyleAction.java index 44e0c6d3da..005bd24b22 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/layout/PasteStyleAction.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/actions/layout/PasteStyleAction.java @@ -96,8 +96,8 @@ public class PasteStyleAction extends AbstractCopyPasteFormatAction { Command pasteStyleCommand = UnexecutableCommand.INSTANCE; if (SiriusLayoutDataManagerForSemanticElementsFactory.getInstance().getSiriusLayoutDataManager().containsData()) { - // Create a compound command to hold the resize commands - CompoundCommand doStoreStylesCmd = new CompoundCommand(Messages.PasteStyleAction_restoreStyleCommandLabel); + // Create a compound command to hold the paste commands + CompoundCommand doPasteStylesCmd = new CompoundCommand(Messages.PasteStyleAction_restoreStyleCommandLabel); // Create an iterator for the selection final Iterator<?> iter = getSelectedObjects().iterator(); @@ -112,12 +112,12 @@ public class PasteStyleAction extends AbstractCopyPasteFormatAction { final Object next = iter.next(); if (next instanceof IGraphicalEditPart) { final IGraphicalEditPart torestore = (IGraphicalEditPart) next; - doStoreStylesCmd.add(new ICommandProxy(new PasteStyleDataCommand(torestore.getEditingDomain(), diagram.get(), torestore))); + doPasteStylesCmd.add(new ICommandProxy(new PasteStyleDataCommand(torestore.getEditingDomain(), diagram.get(), torestore))); } } } } - pasteStyleCommand = doStoreStylesCmd.unwrap(); + pasteStyleCommand = doPasteStylesCmd.unwrap(); } return pasteStyleCommand; } diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/actions/PasteFormatMenuManager.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/actions/PasteFormatMenuManager.java new file mode 100644 index 0000000000..78e463d9a6 --- /dev/null +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/actions/PasteFormatMenuManager.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2016 THALES GLOBAL SERVICES 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: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.actions; + +import org.eclipse.gmf.runtime.common.ui.action.ActionMenuManager; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.sirius.diagram.ui.provider.DiagramUIPlugin; +import org.eclipse.sirius.diagram.ui.provider.Messages; +import org.eclipse.sirius.diagram.ui.tools.api.image.DiagramImagesPath; +import org.eclipse.sirius.diagram.ui.tools.api.ui.actions.ActionIds; + +/** + * The paste format menu manager. It contains all paste format related actions + * (format, layout and style). + * + * @author <a href="mailto:laurent.redor@obeo.fr">Laurent Redor</a> + */ +public class PasteFormatMenuManager extends ActionMenuManager { + + /** + * The paste format menu action containing the UI for the paste format menu + * manager + */ + private static class PasteFormatMenuAction extends Action { + public PasteFormatMenuAction() { + setText(Messages.PasteFormatAction_text); + setToolTipText(Messages.PasteFormatAction_toolTipText); + ImageDescriptor imageDesc = DiagramUIPlugin.Implementation.getBundledImageDescriptor(DiagramImagesPath.PASTE_FORMAT_ICON); + setImageDescriptor(imageDesc); + setHoverImageDescriptor(imageDesc); + } + } + + /** + * Creates a new instance of the distribute menu manager. + */ + public PasteFormatMenuManager() { + super(ActionIds.MENU_PASTE_FORMAT, new PasteFormatMenuAction(), true); + } +} diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/actions/TabbarPasteFormatMenuManager.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/actions/TabbarPasteFormatMenuManager.java new file mode 100644 index 0000000000..24ea5f060e --- /dev/null +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/actions/TabbarPasteFormatMenuManager.java @@ -0,0 +1,117 @@ +/******************************************************************************* + * Copyright (c) 2016 THALES GLOBAL SERVICES. + * 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: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.actions; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import org.eclipse.gmf.runtime.common.ui.action.IDisposableAction; +import org.eclipse.jface.action.ActionContributionItem; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.action.IContributionItem; +import org.eclipse.sirius.common.ui.tools.api.util.EclipseUIUtil; +import org.eclipse.sirius.diagram.ui.tools.api.ui.actions.ActionIds; +import org.eclipse.sirius.diagram.ui.tools.internal.actions.layout.PasteFormatAction; +import org.eclipse.sirius.diagram.ui.tools.internal.actions.layout.PasteLayoutAction; +import org.eclipse.sirius.diagram.ui.tools.internal.actions.layout.PasteStyleAction; +import org.eclipse.ui.IWorkbenchPage; + +/** + * A paste format (layout and style) menu manager which handle cleanly + * {@link IDisposableAction} and set correctly handler for tabbar. + * + * @author <a href="mailto:laurent.redor@obeo.fr">Laurent Redor</a> + */ +public class TabbarPasteFormatMenuManager extends PasteFormatMenuManager { + + @Override + public void add(IAction action) { + super.add(action); + if (action instanceof IDisposableAction) { + ((IDisposableAction) action).init(); + } + } + + @Override + protected void itemRemoved(IContributionItem item) { + if (item instanceof ActionContributionItem) { + IAction action = ((ActionContributionItem) item).getAction(); + if (action instanceof IDisposableAction) { + ((IDisposableAction) action).dispose(); + } + } + super.itemRemoved(item); + } + + @Override + public void dispose() { + removeAll(); + super.dispose(); + } + + /** + * Set the default action id for this menu manager. + * + * @param actionId + * the action id to set + */ + public void setDefaultAction(String actionId) { + for (final IContributionItem item : getItems()) { + if (item instanceof ActionContributionItem) { + if (actionId.equals(((ActionContributionItem) item).getAction().getId())) { + final IAction defaultAction = ((ActionContributionItem) item).getAction(); + setHandler(defaultAction); + super.setDefaultAction(defaultAction); + return; + } + } + } + } + + /** + * We should use reflection to access the default handler method + * + * @param defaultAction + * the default action to set + */ + private void setHandler(final IAction defaultAction) { + Method method; + try { + method = MenuCreatorAction.class.getDeclaredMethod("setActionHandler", IAction.class); //$NON-NLS-1$ + method.setAccessible(true); + method.invoke(super.action, defaultAction); + } catch (SecurityException e) { + /* do nothing should not happen */ + } catch (NoSuchMethodException e) { + /* do nothing should not happen */ + } catch (IllegalArgumentException e) { + /* do nothing should not happen */ + } catch (IllegalAccessException e) { + /* do nothing should not happen */ + } catch (InvocationTargetException e) { + /* do nothing should not happen */ + } + } + + @Override + public void setVisible(boolean visible) { + super.setVisible(visible); + if (isEmpty() && visible) { + IWorkbenchPage page = EclipseUIUtil.getActivePage(); + if (page != null) { + add(new PasteFormatAction(page)); + add(new PasteLayoutAction(page)); + add(new PasteStyleAction(page)); + setDefaultAction(ActionIds.PASTE_FORMAT); + } + } + } +} diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/contributions/TabbarContributionFactory.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/contributions/TabbarContributionFactory.java index f3339d1e1b..144a760dea 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/contributions/TabbarContributionFactory.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/contributions/TabbarContributionFactory.java @@ -38,7 +38,6 @@ import org.eclipse.sirius.diagram.ui.tools.internal.actions.SizeBothAction; import org.eclipse.sirius.diagram.ui.tools.internal.actions.delete.DeleteFromDiagramAction; import org.eclipse.sirius.diagram.ui.tools.internal.actions.delete.DeleteFromModelWithHookAction; import org.eclipse.sirius.diagram.ui.tools.internal.actions.layout.CopyFormatAction; -import org.eclipse.sirius.diagram.ui.tools.internal.actions.layout.PasteFormatAction; import org.eclipse.sirius.diagram.ui.tools.internal.actions.refresh.RefreshDiagramAction; import org.eclipse.sirius.diagram.ui.tools.internal.actions.style.ResetStylePropertiesToDefaultValuesAction; import org.eclipse.sirius.diagram.ui.tools.internal.actions.style.SetStyleToWorkspaceImageAction; @@ -52,6 +51,7 @@ import org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.actions.Tabbar import org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.actions.TabbarArrangeMenuManager; import org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.actions.TabbarColorPropertyContributionItem; import org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.actions.TabbarDistributeMenuManager; +import org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.actions.TabbarPasteFormatMenuManager; import org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.actions.TabbarPinElementsEclipseAction; import org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.actions.TabbarRouterMenuManager; import org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.actions.TabbarSelectMenuManager; @@ -628,12 +628,9 @@ public class TabbarContributionFactory { * being initialized. */ public IContributionItem createPasteFormatContribution(IDiagramWorkbenchPart part) { - IWorkbenchPartSite site = part.getSite(); - if (site != null) { - PasteFormatAction pasteFormatAction = new PasteFormatAction(site.getPage(), part); - return new ActionContributionItem(pasteFormatAction); - } - return null; + TabbarPasteFormatMenuManager pasteFormatMenu = new TabbarPasteFormatMenuManager(); + pasteFormatMenu.setVisible(true); + return pasteFormatMenu; } /** |
