diff options
| author | Laurent Redor | 2018-01-19 09:13:18 +0000 |
|---|---|---|
| committer | Laurent Redor | 2018-04-20 07:58:53 +0000 |
| commit | 41262564155c59570f6a40146313368797c7886e (patch) | |
| tree | c82d6054eaf3ef3afaea995ada282f5becc50459 | |
| parent | d94a1be54f6cbadd03a69b1dc9e2106057a1f2c2 (diff) | |
| download | org.eclipse.sirius-41262564155c59570f6a40146313368797c7886e.tar.gz org.eclipse.sirius-41262564155c59570f6a40146313368797c7886e.tar.xz org.eclipse.sirius-41262564155c59570f6a40146313368797c7886e.zip | |
[529992] POC of Popup Menu and actions improvement concerning tabbar
This commit adds capability to add new contribution in tabbar. It is a
POC and only "Select" dropdown menu is currently configured to accept
contributions.
To add a contribution in "Select" dropdown menu, a Popup Menu must be
declared with documentation property equals to "tabbarPath=Select".
Bug: 529992
Change-Id: Ifab82bed7a1c163a1f3dbcca9e885161211fb688
Signed-off-by: Laurent Redor <laurent.redor@obeo.fr>
5 files changed, 214 insertions, 75 deletions
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/AbstractMenuContributionItem.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/AbstractMenuContributionItem.java index f2c6bc3b01..da9f785d96 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/AbstractMenuContributionItem.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/AbstractMenuContributionItem.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010, 2014 THALES GLOBAL SERVICES and others. + * Copyright (c) 2010, 2018 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 @@ -12,6 +12,7 @@ package org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar; import java.util.Iterator; import java.util.List; +import java.util.Optional; import org.eclipse.emf.ecore.EObject; import org.eclipse.gmf.runtime.notation.Diagram; @@ -59,11 +60,7 @@ public abstract class AbstractMenuContributionItem extends AbstractTabbarContrib private List<String> tooltips = Lists.newArrayList(); - /** - * {@inheritDoc} - * - * @see org.eclipse.sirius.diagram.tools.internal.editor.tabbar.TabbarContribution#create(org.eclipse.swt.widgets.ToolBar) - */ + @Override public void create(final ToolBarManager tb, String groupId) { tb.insertAfter(groupId, createContributionItem(tb)); } @@ -114,6 +111,7 @@ public abstract class AbstractMenuContributionItem extends AbstractTabbarContrib listener = new MenuContributionItemArmListener(control); menu.addListener(SWT.Show, new Listener() { + @Override public void handleEvent(Event event) { final Iterator<String> it = tooltips.iterator(); for (final MenuItem item : menu.getItems()) { @@ -138,16 +136,23 @@ public abstract class AbstractMenuContributionItem extends AbstractTabbarContrib if (menuManager != null) { return menuManager; } - - menuManager = new MenuManager(); + // Use the tooltip, if it exists, as id for this menu manager. It can be reused to find it later. + String id = null; + Optional<String> tooltip = tooltips.stream().findFirst(); + if (tooltip.isPresent()) { + id = tooltip.get(); + } + menuManager = new MenuManager(id, id); menuManager.setRemoveAllWhenShown(true); menuManager.addMenuListener(new IMenuListener2() { + @Override public void menuAboutToHide(IMenuManager manager) { /* do nothing */ } + @Override public void menuAboutToShow(IMenuManager manager) { menuShow(manager); } diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/SelectAllContributionItem.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/SelectAllContributionItem.java new file mode 100644 index 0000000000..5df3a2b378 --- /dev/null +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/SelectAllContributionItem.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (c) 2018 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; + +import org.eclipse.gmf.runtime.diagram.ui.actions.internal.SelectAllAction; +import org.eclipse.gmf.runtime.diagram.ui.actions.internal.l10n.DiagramUIActionsMessages; +import org.eclipse.gmf.runtime.diagram.ui.actions.internal.l10n.DiagramUIActionsPluginImages; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.sirius.common.ui.tools.api.util.EclipseUIUtil; +import org.eclipse.sirius.diagram.ui.provider.DiagramUIPlugin; +import org.eclipse.sirius.diagram.ui.tools.internal.menu.PopupMenuContribution; +import org.eclipse.swt.graphics.Image; +import org.eclipse.ui.IWorkbenchActionConstants; +import org.eclipse.ui.IWorkbenchPage; + +/** + * Contribute a menu to tab bar to activate a specific SelectAll actions. This menu contains GMF global SelectAll + * actions plus SelectAll actions defined in the VSM. Currently, the action defined in the VSM is just for a POC. + * + * @author lredor + */ +public class SelectAllContributionItem extends AbstractMenuContributionItem { + + /** + * Default constructor. + */ + public SelectAllContributionItem() { + addTooltip(DiagramUIActionsMessages.SelectActionMenu_SelectDropDownTooltip); + } + + @Override + protected Image getMenuImage() { + return DiagramUIPlugin.getPlugin().getImage(DiagramUIActionsPluginImages.DESC_SELECTALL); + } + + @Override + protected String getLabel() { + // Add a menu named Select + return DiagramUIActionsMessages.SelectActionMenu_SelectDropDownText; + } + + @Override + protected void menuShow(IMenuManager manager) { + IWorkbenchPage page = EclipseUIUtil.getActivePage(); + // Add default GMF contributions + if (page != null) { + manager.add(SelectAllAction.createToolbarSelectAllAction(page)); + manager.add(SelectAllAction.createToolbarSelectAllConnectionsAction(page)); + manager.add(SelectAllAction.createToolbarSelectAllShapesAction(page)); + } + // Add a default "additions" group + manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); + // Add potential select all actions contributed in VSM + PopupMenuContribution.contributeToPopupMenuProgrammatically(manager, part); + } + +} diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/TabbarFillerWithContributions.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/TabbarFillerWithContributions.java index 49e676729f..422cc4b198 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/TabbarFillerWithContributions.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/tabbar/TabbarFillerWithContributions.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010, 2017 THALES GLOBAL SERVICES and others. + * Copyright (c) 2010, 2018 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 @@ -22,6 +22,7 @@ import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDDiagramEditPart; import org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.contributions.TabbarContributionFactory; +import org.eclipse.sirius.diagram.ui.tools.internal.menu.PopupMenuContribution; import org.eclipse.ui.IWorkbenchPage; import com.google.common.collect.Lists; @@ -166,7 +167,11 @@ public class TabbarFillerWithContributions extends AbstractTabbarFiller { } private void addDiagramContributionItems() { - addContributionItem(diagramContributionItems, ARRANGE_SELECTION, contributionFactory.createSelectMenuManager()); + if (Boolean.getBoolean(PopupMenuContribution.POPUP_MENU_IMPROVEMENT_ID)) { + addContributionItem(diagramContributionItems, ARRANGE_SELECTION, contributionFactory.createSelectAllContribution(part, manager)); + } else { + addContributionItem(diagramContributionItems, ARRANGE_SELECTION, contributionFactory.createSelectMenuManager()); + } addContributionItem(diagramContributionItems, ARRANGE_SELECTION, contributionFactory.createArrangeMenuManager(part)); addContributionItem(diagramContributionItems, REFRESH, contributionFactory.createRefreshContribution()); 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 92bafa7422..702f4cecc7 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2016, 2017 Obeo. + * Copyright (c) 2016, 2018 Obeo. * 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 @@ -46,6 +46,7 @@ import org.eclipse.sirius.diagram.ui.tools.internal.actions.visibility.HideDDiag import org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.FiltersContributionItem; import org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.LayersContribution; import org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.LayoutingModeSwitchingAction; +import org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.SelectAllContributionItem; import org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.ShowingModeSwitchingAction; import org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.actions.DiagramActionContributionItem; import org.eclipse.sirius.diagram.ui.tools.internal.editor.tabbar.actions.HideDDiagramElementLabelActionContributionItem; @@ -105,6 +106,22 @@ public class TabbarContributionFactory { } /** + * Creates the SelectAll contribution item. + * + * @param part + * the diagram workbench part. + * @param manager + * the toolbar manager. + * @return the {@link IContributionItem}. + */ + public IContributionItem createSelectAllContribution(IDiagramWorkbenchPart part, ToolBarManager manager) { + SelectAllContributionItem selectAllContribution = new SelectAllContributionItem(); + ContributionItem filterItem = selectAllContribution.createContributionItem(manager); + selectAllContribution.setPart(part); + return filterItem; + } + + /** * Creates the Alignment contribution item. This menu contains several operations which can be used to align several * graphical elements in various ways. * diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/menu/PopupMenuContribution.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/menu/PopupMenuContribution.java index a8e8abb833..6c79757e81 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/menu/PopupMenuContribution.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/menu/PopupMenuContribution.java @@ -102,7 +102,7 @@ public class PopupMenuContribution implements IContributionItemProvider { /** * VM argument name to activate the POC of bugzilla 529992. */ - private static final String POPUP_MENU_IMPROVEMENT_ID = "org.eclipse.sirius.experimental.popupMenuImprovement"; //$NON-NLS-1$ + public static final String POPUP_MENU_IMPROVEMENT_ID = "org.eclipse.sirius.experimental.popupMenuImprovement"; //$NON-NLS-1$ /** * Constant used for POC of bugzilla 529992 to separate group and menu id in path.> @@ -121,6 +121,12 @@ public class PopupMenuContribution implements IContributionItemProvider { private static final String PATH_PREFIX = "path"; //$NON-NLS-1$ /** + * Constant used for POC of bugzilla 529992 to insert a group declared as a "Popup Menu" in a specific existing + * dropdown menu of tabbar. Currently only "Select" dropdown menu car be used ("tabbarPath=Select"). + */ + private static final String TABBAR_PATH_PREFIX = "tabbarPath"; //$NON-NLS-1$ + + /** * Constant used for POC of bugzilla 529992 to define a group in a Popup Menu. It is used in documentation field of * a Popup Menu with this kind of format:<BR/> * <code>group=mySpecificGroupId</code> @@ -133,12 +139,49 @@ public class PopupMenuContribution implements IContributionItemProvider { */ private static final String ROOT_MENU_ID = "/"; //$NON-NLS-1$ + /** + * Field used only in case of POC of bugzilla 529992.<BR/> + * True if this instance is called to contribute to tabbar, false otherwise. In case of tabbar contribution, only + * "Popup menu" with a tabbar path are considered. + */ + private boolean contributionToTabbar; + + /** + * Default constructor. + */ + public PopupMenuContribution() { + // Do nothing. + } + + /** + * Constructor to specify the contribution mode. + * + * @param contributionToTabbar + * True if this instance is called to contribute to tabbar, false otherwise + */ + public PopupMenuContribution(boolean contributionToTabbar) { + this.contributionToTabbar = contributionToTabbar; + } + @Override public void contributeToActionBars(final IActionBars arg0, final IWorkbenchPartDescriptor arg1) { // Nothing to contribute } + /** + * Method to do the same as {@link #contributeToPopupMenu(IMenuManager, IWorkbenchPart)} but out of the extension + * point context where it is originally used. Useful to use this kind of contribution in tabbar for example. + * + * @param menu + * The target popup menu manager + * @param part + * The context workbench part + */ + public static void contributeToPopupMenuProgrammatically(final IMenuManager menu, final IWorkbenchPart part) { + new PopupMenuContribution(true).contributeToPopupMenu(menu, part); + } + @Override public void contributeToPopupMenu(final IMenuManager menu, final IWorkbenchPart part) { if (part instanceof SiriusDiagramEditor) { @@ -613,7 +656,7 @@ public class PopupMenuContribution implements IContributionItemProvider { } } - private Optional<String> getPath(String documentationOptions) { + private Optional<String> getPropertyValueFromString(String documentationOptions, String key) { try { Properties docProps = new Properties(); StringReader docReader = new StringReader(documentationOptions); @@ -622,9 +665,9 @@ public class PopupMenuContribution implements IContributionItemProvider { } finally { docReader.close(); } - String path = docProps.getProperty(PATH_PREFIX); - if (path != null) { - return Optional.of(path); + String value = docProps.getProperty(key); + if (value != null) { + return Optional.of(value); } } catch (IOException e) { // Do nothing @@ -632,23 +675,16 @@ public class PopupMenuContribution implements IContributionItemProvider { return Optional.empty(); } + private Optional<String> getTabbarPath(String documentationOptions) { + return getPropertyValueFromString(documentationOptions, TABBAR_PATH_PREFIX); + } + + private Optional<String> getPath(String documentationOptions) { + return getPropertyValueFromString(documentationOptions, PATH_PREFIX); + } + private Optional<String> getGroupIdToCreate(String documentationOptions) { - try { - Properties docProps = new Properties(); - StringReader docReader = new StringReader(documentationOptions); - try { - docProps.load(docReader); - } finally { - docReader.close(); - } - String groupId = docProps.getProperty(GROUP_PREFIX); - if (groupId != null) { - return Optional.of(groupId); - } - } catch (IOException e) { - // Do nothing - } - return Optional.empty(); + return getPropertyValueFromString(documentationOptions, GROUP_PREFIX); } private IMenuManager getMenuManager(IMenuManager menu, Optional<String> optionalPath) { @@ -717,58 +753,68 @@ public class PopupMenuContribution implements IContributionItemProvider { final EObject semantic = selectedViews.iterator().next().getTarget(); // Search if a menu with the same id already exists. In this case, we reuse it. String menuId = popupMenu.getName(); - IMenuManager subMenu; - if (ROOT_MENU_ID.equals(menuId)) { - subMenu = parentMenu; + Optional<String> tabbarPath = getTabbarPath(popupMenu.getDocumentation()); + Option<? extends IContributionItem> result; + if (contributionToTabbar && !tabbarPath.isPresent()) { + // For tabbar contribution, ignore contribution without tabbar path. + result = Options.newNone(); } else { - subMenu = parentMenu.findMenuUsingPath(menuId); - if (subMenu == null) { - subMenu = new MenuManager(MessageTranslator.INSTANCE.getMessage(popupMenu, new IdentifiedElementQuery(popupMenu).getLabel()), menuId); - // Add a default "additions" group - subMenu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); + IMenuManager subMenu; + if (ROOT_MENU_ID.equals(menuId)) { + subMenu = parentMenu; + } else if (tabbarPath.isPresent() && tabbarPath.get().equals(parentMenu.getId())) { + subMenu = parentMenu; + } else { + subMenu = parentMenu.findMenuUsingPath(menuId); + if (subMenu == null) { + subMenu = new MenuManager(MessageTranslator.INSTANCE.getMessage(popupMenu, new IdentifiedElementQuery(popupMenu).getLabel()), menuId); + // Add a default "additions" group + subMenu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); + } } - } - // Add a separator group if asked - Optional<String> optionalGroupId = getGroupIdToCreate(popupMenu.getDocumentation()); - if (optionalGroupId.isPresent()) { - Separator separator = new Separator(optionalGroupId.get()); - subMenu.add(separator); - } + // Add a separator group if asked + Optional<String> optionalGroupId = getGroupIdToCreate(popupMenu.getDocumentation()); + if (optionalGroupId.isPresent()) { + Separator separator = new Separator(optionalGroupId.get()); + subMenu.add(separator); + } - final EList<MenuItemDescription> activatedActions = popupMenu.getMenuItemDescription(); + final EList<MenuItemDescription> activatedActions = popupMenu.getMenuItemDescription(); - IInterpreter interpreter = null; - if (semantic != null && semantic.eResource() != null) { - interpreter = SiriusPlugin.getDefault().getInterpreterRegistry().getInterpreter(semantic); - } else if (semantic instanceof DMappingBased) { - interpreter = SiriusPlugin.getDefault().getInterpreterRegistry().getInterpreter(((DMappingBased) semantic).getMapping()); - } + IInterpreter interpreter = null; + if (semantic != null && semantic.eResource() != null) { + interpreter = SiriusPlugin.getDefault().getInterpreterRegistry().getInterpreter(semantic); + } else if (semantic instanceof DMappingBased) { + interpreter = SiriusPlugin.getDefault().getInterpreterRegistry().getInterpreter(((DMappingBased) semantic).getMapping()); + } - final Boolean isMenuPreconditionValidated; - if (StringUtil.isEmpty(popupMenu.getPrecondition())) { - isMenuPreconditionValidated = true; - } else { - isMenuPreconditionValidated = RuntimeLoggerManager.INSTANCE.decorate(interpreter).evaluateBoolean(semantic, popupMenu, ToolPackage.eINSTANCE.getAbstractToolDescription_Precondition()); - } + final Boolean isMenuPreconditionValidated; + if (StringUtil.isEmpty(popupMenu.getPrecondition())) { + isMenuPreconditionValidated = true; + } else { + isMenuPreconditionValidated = RuntimeLoggerManager.INSTANCE.decorate(interpreter).evaluateBoolean(semantic, popupMenu, ToolPackage.eINSTANCE.getAbstractToolDescription_Precondition()); + } - if (isMenuPreconditionValidated) { - final Iterator<MenuItemDescription> mIterator = activatedActions.iterator(); - while (mIterator.hasNext()) { - final MenuItemDescription menuItemDescription = mIterator.next(); - Optional<IAction> optionalAction = buildActionToAdd(domain, selectedViews, menuItemDescription, emfCommandFactory, primarySelection, currentMouseLocation, interpreter); - addActionInMenu(subMenu, menuItemDescription.getDocumentation(), optionalAction); + if (isMenuPreconditionValidated) { + final Iterator<MenuItemDescription> mIterator = activatedActions.iterator(); + while (mIterator.hasNext()) { + final MenuItemDescription menuItemDescription = mIterator.next(); + Optional<IAction> optionalAction = buildActionToAdd(domain, selectedViews, menuItemDescription, emfCommandFactory, primarySelection, currentMouseLocation, interpreter); + addActionInMenu(subMenu, menuItemDescription.getDocumentation(), optionalAction); + } + } else { + subMenu.removeAll(); + } + // finalize + if (!(parentMenu.equals(subMenu)) && subMenu instanceof ContributionManager && ((ContributionManager) subMenu).getSize() > 0) { + subMenu.setVisible(true); + result = Options.newSome(subMenu); + } else { + result = Options.newNone(); } - } else { - subMenu.removeAll(); - } - // finalize - if (!(parentMenu.equals(subMenu)) && subMenu instanceof ContributionManager && ((ContributionManager) subMenu).getSize() > 0) { - subMenu.setVisible(true); - return Options.newSome(subMenu); - } else { - return Options.newNone(); } + return result; } /** |
