diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings index 371aee6c799aa16250b46133a026bc8b3bc8a21e..8a7655448780769124d78c186c4ef5945cb61f89 100644 --- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings @@ -1,9 +1,9 @@ CurvedLinkLayoutedContentAnchorangeController.java 249629c966a1f92fc28294ef62117439799d7315 GREEN CurvedLinkLayoutedDiagramAnchorangeController.java de1ab32e11205435cf7a89d2dcc352683ef8b39e GREEN -EObjectDiagramController.java 45f5b1439f33685523b035d2603e8329b647b62a GREEN -EObjectEllipticResizableContentControllerBase.java f12e8f5a646a23fe428ed4768bf041c8b885ec81 GREEN +EObjectDiagramController.java 4b51e73023a8e5dd7f5ae12b495b25f22c1b58bd GREEN +EObjectEllipticResizableContentControllerBase.java 7021ae2cadf40bdd099964908cc881644ad9ffb3 GREEN EObjectModelChangeProvider.java f4b60cebb088a5c81ca92a41614e1a5d40030502 GREEN -EObjectRectangularResizableContentControllerBase.java cde6c13659611d927691c03ecd2621cff2414b03 GREEN +EObjectRectangularResizableContentControllerBase.java dbeb8371fdac0838c9a23b9dcff63f81aae1265b GREEN KernelServiceBasedModelChangeProviderBase.java 8d1f8ef79ecd383ff74e5a2bbcf24345aabe70af GREEN LayoutedContentAnchorageController.java 83f066a151dd2984c4bef64daf8165a0cd53b00f GREEN LayoutedCurveLinkBendPointController.java d963a5e227de7bd8ba910c733df2ac7acf4fa1fa GREEN @@ -12,5 +12,5 @@ LayoutedEllipticResizableContentController.java 00037188773eb65866863ab89331bc98 LayoutedLineLinkBendPointController.java 8022cc66c4d33d7bf357ceb4c9ca1694f4f2fda8 GREEN LayoutedLinkBendPointController.java d3f22ffb43426da62e849074a9d5a64e4d70a7ad GREEN LayoutedRectangularResizableContentController.java 341f4a7da0d69360d7026af6d9b3d44dfd7d9bb1 GREEN -ModelElementFXEditorUIProviderBase.java 6bdd31d033228315e99c973b4986cdabc135ec9f GREEN +ModelElementFXEditorUIProviderBase.java 1ab1d053029e14510ff97c84821a62ddeaf595e7 GREEN NamedCommentedLayoutModelChangeProvider.java 223e82c1b1cba842f6fae115182f5d0c6acb44b0 GREEN diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectDiagramController.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectDiagramController.java index 45f5b1439f33685523b035d2603e8329b647b62a..4b51e73023a8e5dd7f5ae12b495b25f22c1b58bd 100644 --- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectDiagramController.java +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectDiagramController.java @@ -85,6 +85,8 @@ public class EObjectDiagramController<T extends EObject> extends DefaultDiagramC IElementCompositionContext edc = createElementCompositionContext(modelParent, x, y, true, getViewer().getFeatures().getCurrentZoomFactor()); List<MenuItem> result = createPrototypeMenu(modelParent, edc); + // Adds all menu items from the context menu service. + result.addAll(IContextMenuService.getInstance().getFXMenuItemsForElement(modelParent, null)); // Adds "Display" and "Zoom" menus result.addAll(super.contextMenuContributions(node, diagramLocation)); if(modelParent instanceof IHierarchicElement && enableAutoLayout()) { diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectEllipticResizableContentControllerBase.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectEllipticResizableContentControllerBase.java index f12e8f5a646a23fe428ed4768bf041c8b885ec81..7021ae2cadf40bdd099964908cc881644ad9ffb3 100644 --- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectEllipticResizableContentControllerBase.java +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectEllipticResizableContentControllerBase.java @@ -38,6 +38,7 @@ import org.fortiss.tooling.kernel.extension.data.IElementCompositionContext; import org.fortiss.tooling.kernel.model.INamedCommentedElement; import org.fortiss.tooling.kernel.service.IElementCompositorService; import org.fortiss.tooling.kernel.ui.extension.IModelElementHandler; +import org.fortiss.tooling.kernel.ui.service.IContextMenuService; import org.fortiss.tooling.kernel.ui.service.IModelEditorBindingService; import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService; @@ -133,7 +134,10 @@ public abstract class EObjectEllipticResizableContentControllerBase<T extends IN EObject modelParent = (EObject)getModel(); IElementCompositionContext edc = createElementCompositionContext(modelParent, x, y, false, getViewer().getFeatures().getCurrentZoomFactor()); - return createPrototypeMenu(modelParent, edc); + List<MenuItem> menuItems = createPrototypeMenu(modelParent, edc); + menuItems.addAll( + IContextMenuService.getInstance().getFXMenuItemsForElement(modelParent, null)); + return menuItems; } /** {@inheritDoc} */ diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectRectangularResizableContentControllerBase.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectRectangularResizableContentControllerBase.java index cde6c13659611d927691c03ecd2621cff2414b03..dbeb8371fdac0838c9a23b9dcff63f81aae1265b 100644 --- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectRectangularResizableContentControllerBase.java +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectRectangularResizableContentControllerBase.java @@ -44,6 +44,7 @@ import org.fortiss.tooling.kernel.extension.data.IElementCompositionContext; import org.fortiss.tooling.kernel.model.INamedCommentedElement; import org.fortiss.tooling.kernel.service.IElementCompositorService; import org.fortiss.tooling.kernel.ui.extension.IModelElementHandler; +import org.fortiss.tooling.kernel.ui.service.IContextMenuService; import org.fortiss.tooling.kernel.ui.service.IModelEditorBindingService; import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService; @@ -164,7 +165,10 @@ public abstract class EObjectRectangularResizableContentControllerBase<T extends EObject modelParent = (EObject)getModel(); IElementCompositionContext edc = createElementCompositionContext(modelParent, x, y, false, getViewer().getFeatures().getCurrentZoomFactor()); - return createPrototypeMenu(modelParent, edc); + List<MenuItem> menuItems = createPrototypeMenu(modelParent, edc); + menuItems.addAll( + IContextMenuService.getInstance().getFXMenuItemsForElement(modelParent, null)); + return menuItems; } /** {@inheritDoc} */ diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/ModelElementFXEditorUIProviderBase.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/ModelElementFXEditorUIProviderBase.java index 6bdd31d033228315e99c973b4986cdabc135ec9f..1ab1d053029e14510ff97c84821a62ddeaf595e7 100644 --- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/ModelElementFXEditorUIProviderBase.java +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/ModelElementFXEditorUIProviderBase.java @@ -22,6 +22,7 @@ import org.eclipse.jface.viewers.StructuredSelection; import org.fortiss.tooling.base.model.element.IModelElement; import org.fortiss.tooling.common.ui.javafx.control.treetableview.DynamicTreeTableUIProviderBase; import org.fortiss.tooling.kernel.ui.extension.base.FXEditorBase; +import org.fortiss.tooling.kernel.ui.service.IContextMenuService; import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService; import javafx.scene.Node; @@ -60,6 +61,8 @@ public abstract class ModelElementFXEditorUIProviderBase<T extends IModelElement } ContextMenu contextMenu = new ContextMenu(); contextMenu.getItems().addAll(createPrototypeMenu(element, null)); + contextMenu.getItems() + .addAll(IContextMenuService.getInstance().getFXMenuItemsForElement(element, null)); return contextMenu; } diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/.ratings index ad72377a790650658c2f3dafe4a165f41877507f..3f867cc1ad2785fb30df12d20c67c992a0f6bde7 100644 --- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/.ratings +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/.ratings @@ -1,6 +1,6 @@ AbstractNameEditingSupport.java c57336a0e0da18711a1610ca667dfea76728807f GREEN ActionUtils.java 322f43d4f92f992daef8ac88eb0f9197c840c89b GREEN -ContextMenuUtils.java ac3ce102c5b0cf00ed6ef5d91078c91581d169de GREEN +ContextMenuUtils.java a55ceed42f2eb88ba263a6fbcb394ddb80b1eda0 GREEN EllipseLayoutUIUtils.java 0af2cfc038661828b1bb8c51c0a3816d453e8313 GREEN FXDNDUtils.java 6ce94e239e68f9e2b3cc0524b072606f4a120076 GREEN FontUtils.java a167a05bdaa8da9853705cc5134f30f6d81bc9f2 GREEN diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/ContextMenuUtils.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/ContextMenuUtils.java index ac3ce102c5b0cf00ed6ef5d91078c91581d169de..a55ceed42f2eb88ba263a6fbcb394ddb80b1eda0 100644 --- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/ContextMenuUtils.java +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/ContextMenuUtils.java @@ -21,9 +21,6 @@ import java.util.ArrayList; import java.util.List; import org.eclipse.emf.ecore.EObject; -import org.eclipse.jface.action.ActionContributionItem; -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.action.IContributionItem; import org.fortiss.tooling.base.dnd.ElementDropContext; import org.fortiss.tooling.base.layout.IAutoLayouter; import org.fortiss.tooling.base.layout.KielerAutoLayouter; @@ -36,8 +33,6 @@ import org.fortiss.tooling.kernel.service.ICommandStackService; import org.fortiss.tooling.kernel.service.IElementCompositorService; import org.fortiss.tooling.kernel.service.IPrototypeService; import org.fortiss.tooling.kernel.ui.extension.IModelEditor; -import org.fortiss.tooling.kernel.ui.extension.data.ContextMenuContextProvider; -import org.fortiss.tooling.kernel.ui.service.IContextMenuService; import org.fortiss.tooling.kernel.ui.service.IModelEditorBindingService; import javafx.scene.control.Menu; @@ -96,6 +91,7 @@ public final class ContextMenuUtils { if(!newMenu.getItems().isEmpty()) { result.add(newMenu); } + return result; } @@ -154,36 +150,4 @@ public final class ContextMenuUtils { Point loc = createPoint((int)x, (int)y, "CompositionPoint"); return new ElementDropContext(target, loc, isRoot, zoom); } - - /** - * Creates javafx context {@link MenuItem}s for the given 'target' {@link EObject}, using the - * {@link IContextMenuService}. - * - * @param target - * The {@link EObject} to create context {@link MenuItem}s. - * @param contextProvider - * The {@link ContextMenuContextProvider} to provide for the - * {@link IContextMenuService}. - * @return A {@link List} of {@link MenuItem}s for the given 'target' - */ - public static List<MenuItem> createContextMenuEntriesFromService(EObject target, - ContextMenuContextProvider contextProvider) { - List<MenuItem> ret = new ArrayList<MenuItem>(); - - List<IContributionItem> contributions = IContextMenuService.getInstance() - .getContextMenuContributions(target, contextProvider); - for(IContributionItem c : contributions) { - if(c instanceof ActionContributionItem) { - IAction action = ((ActionContributionItem)c).getAction(); - - MenuItem menuItem = new MenuItem(action.getText()); - menuItem.setOnAction(evt -> { - action.run(); - }); - ret.add(menuItem); - } - } - - return ret; - } } diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/controller/base/.ratings b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/controller/base/.ratings index 54e34439bd2d91deb8ae767d830deabb7088d647..fdb866d1694b6cdb55edc61c1dc9832229c8fb44 100644 --- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/controller/base/.ratings +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/controller/base/.ratings @@ -6,6 +6,6 @@ DefaultDiagramController.java 3f60229b2e0fe0b6ac40c617858cc5a0685a59eb GREEN DelegatingContentAnchorageController.java 1889628a346a2183082ffe213978f9d15a949494 GREEN DragControllerBase.java b15ff874304f679fe494d85f57cc8cbe4d0d1d15 GREEN DraggingUtils.java 95117e2ea4c36b6c6a31f8088bb95b484e0e6612 GREEN -LinkControllerBase.java b59796a87ac5d5e054c332d0867d5e3d308d9936 GREEN +LinkControllerBase.java 0fc15aa254831d741b6819d8b41a92e16e69141d GREEN MoveControllerBase.java 38d632e31f5e27d112ecdd4933e3a331378180d0 GREEN ResizableContentControllerBase.java 898500d389b035f8138308d496d2d24be501c719 GREEN diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/controller/base/LinkControllerBase.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/controller/base/LinkControllerBase.java index b59796a87ac5d5e054c332d0867d5e3d308d9936..0fc15aa254831d741b6819d8b41a92e16e69141d 100644 --- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/controller/base/LinkControllerBase.java +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/controller/base/LinkControllerBase.java @@ -138,14 +138,16 @@ public abstract class LinkControllerBase extends MVCBundlePartBase implements IC @Override public Change secondaryClick(MouseEvent event, Node node, DiagramCoordinate locationOnNode) { + DiagramViewer viewer = getViewer(); if(event.isControlDown()) { // link must be primary selected - DiagramViewer viewer = getViewer(); + if(viewer.isPrimarySelected(getMVCBundle())) { // control+right-click deletes the link return () -> deleteLink(); } } + viewer.showContextMenu(node, locationOnNode, getMVCBundle()); return null; } }; diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/.ratings index b76afd02c52eee68b89b4849bf72c4f5910a142e..de54d9f9f3313ce99f1e2b8f6d4c73d05018e281 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/.ratings +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/.ratings @@ -7,4 +7,4 @@ ITutorialStepUI.java b8aee2b95857484ab6ad9ecd55b5de9f0ea158e5 GREEN ITutorialUIProvider.java aa0ff5db4d7ba0953e34edeb99f3e8279567e18f GREEN ITutorialUIWhitelistProvider.java d703c1531c6ae7677c2d94cbc95d498dfa4a7e9b GREEN ModelEditorNotAvailableBinding.java ba0ea0fe9004cf16579d053d0ddf7eb3f35ed101 GREEN -RevealMenu.java e1c1a36da89ab3dac6e85c0d99425b4753a3da62 GREEN +RevealMenu.java 9a6ea3ec03ca9d9e762d7f7beee23d2a43991ea9 GREEN diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/RevealMenu.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/RevealMenu.java index e1c1a36da89ab3dac6e85c0d99425b4753a3da62..9a6ea3ec03ca9d9e762d7f7beee23d2a43991ea9 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/RevealMenu.java +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/RevealMenu.java @@ -30,6 +30,7 @@ import org.fortiss.tooling.kernel.ui.extension.data.ContextMenuContextProvider; import org.fortiss.tooling.kernel.ui.internal.views.NavigatorTreeContentProvider; import org.fortiss.tooling.kernel.ui.service.IModelEditorBindingService; import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService; +import org.fortiss.tooling.kernel.ui.service.INavigatorService; /** * Context menu entry to reveal an element in its editor. @@ -101,7 +102,7 @@ public class RevealMenu implements IContextMenuContributor { ContextMenuContextProvider contextProvider) { EObject element = openModelElementRequest(selection); - if(element == null) { + if(element == null || !INavigatorService.getInstance().isNavigatorView(contextProvider)) { return emptyList(); } Object parent = treeNavigatorTreeContentProvider.getParent(selection); diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings index 473d4378f0755d6597fb8c8a5f1baff1cb642eb7..47adba827d5c28212dc3ce96cf08e5762b4c7a17 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings @@ -1,5 +1,5 @@ ActionService.java e29126b5947c9fd2f1d82bb87001b9d0ead50c3b GREEN -ContextMenuService.java 16b469599cb8723a433bc97b88dc4a558b25568e GREEN +ContextMenuService.java 752ecb95721c4ff31583095bdb06b71ef28c4dcf GREEN MarkerService.java 0bfe2c67638db4e506ea5dc7680765f2a8d632e1 GREEN ModelEditorBindingService.java f304addb514cd2de443997e0b52cef7a3a9897bf GREEN ModelElementHandlerService.java 34adeef844bf98c69f1b9a7252f34d0a2b741b54 GREEN diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ContextMenuService.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ContextMenuService.java index 16b469599cb8723a433bc97b88dc4a558b25568e..752ecb95721c4ff31583095bdb06b71ef28c4dcf 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ContextMenuService.java +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ContextMenuService.java @@ -15,20 +15,27 @@ +--------------------------------------------------------------------------*/ package org.fortiss.tooling.kernel.ui.internal; +import static java.util.Arrays.asList; import static java.util.Collections.emptyList; +import static javafx.embed.swt.SWTFXUtils.toFXImage; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.function.Predicate; import java.util.stream.Collectors; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.emf.ecore.EObject; +import org.eclipse.jface.action.ActionContributionItem; +import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; +import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.IWorkbenchActionConstants; import org.fortiss.tooling.kernel.ToolingKernelActivator; import org.fortiss.tooling.kernel.introspection.IIntrospectionDetailsItem; @@ -48,6 +55,11 @@ import org.fortiss.tooling.kernel.utils.ExtensionPointUtils; import org.fortiss.tooling.kernel.utils.LoggingUtils; import org.osgi.framework.Bundle; +import javafx.scene.control.MenuItem; +import javafx.scene.control.SeparatorMenuItem; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; + /** * This class implements the {@link IContextMenuService} interface. * @@ -73,8 +85,13 @@ public class ContextMenuService implements IContextMenuService, IIntrospectiveKe private static final String HANDLER_CLASS_ATTRIBUTE_NAME = "contributor"; /** Stores the registered context menu contributors. */ - private final List<IContextMenuContributor> contextMenuContributorList = - new ArrayList<IContextMenuContributor>(); + private final List<IContextMenuContributor> contextMenuContributorList = new ArrayList<>(); + + /** An ordered list of all menu sections from top to bottom. */ + private static final String[] MENU_SECTIONS = {TOP_MOST_MENU_SECTION_ID, + BEFORE_GLOBAL_MENU_SECTION_ID, ActionService.GLOBAL_DEFAULT_MENU_SECTION_ID, + AFTER_GLOBAL_MENU_SECTION_ID, REPOSITORY_MENU_SECTION_ID, + IWorkbenchActionConstants.MB_ADDITIONS, BOTTOM_MOST_MENU_SECTION_ID}; /** Initializes the service. */ public void initializeService() { @@ -149,25 +166,20 @@ public class ContextMenuService implements IContextMenuService, IIntrospectiveKe if(!menu.isEmpty()) { return; } - addVisibleSectionSeparator(menu, TOP_MOST_MENU_SECTION_ID); - addVisibleSectionSeparator(menu, BEFORE_GLOBAL_MENU_SECTION_ID); - addVisibleSectionSeparator(menu, ActionService.GLOBAL_DEFAULT_MENU_SECTION_ID); - addVisibleSectionSeparator(menu, AFTER_GLOBAL_MENU_SECTION_ID); - addVisibleSectionSeparator(menu, REPOSITORY_MENU_SECTION_ID); - addVisibleSectionSeparator(menu, IWorkbenchActionConstants.MB_ADDITIONS); - addVisibleSectionSeparator(menu, BOTTOM_MOST_MENU_SECTION_ID); + for(String section : MENU_SECTIONS) { + addVisibleSectionSeparator(menu, section); + } addContributions(menu, contextProvider); + IActionService as = IActionService.getInstance(); if(!ITutorialService.getInstance().isTutorialActive()) { - IActionService.getInstance().addGlobalDefaultActionSectionToMenu(menu); + as.addGlobalDefaultActionSectionToMenu(menu); } else { - - IActionService.getInstance().addGlobalEditingActionsToMenu(menu, - ITutorialUIService.getInstance().globalCopyPasteActionsVisible(), - ITutorialUIService.getInstance().globalDeleteActionVisible(), - ITutorialUIService.getInstance().globalRenameActionVisible(), - ITutorialUIService.getInstance().globalSelectAllActionVisible()); + ITutorialUIService tsUI = ITutorialUIService.getInstance(); + as.addGlobalEditingActionsToMenu(menu, tsUI.globalCopyPasteActionsVisible(), + tsUI.globalDeleteActionVisible(), tsUI.globalRenameActionVisible(), + tsUI.globalSelectAllActionVisible()); } } } @@ -175,90 +187,145 @@ public class ContextMenuService implements IContextMenuService, IIntrospectiveKe /** Adds registered contributions to the given menu. */ private void addContributions(IMenuManager menu, ContextMenuContextProvider contextProvider) { List<EObject> selection = contextProvider.getSelectedModelElementList(); - if(selection == null) { - // do nothing - } else if(selection.size() == 1) { - singleSelectionElementContributions(menu, contextProvider); - } else if(selection.size() > 1) { - addMultiSelectionContributions(menu, contextProvider, selection); - } - } - /** Populates the menu with contributions to a single model element selection. */ - private void singleSelectionElementContributions(IMenuManager menu, - ContextMenuContextProvider contextProvider) { - EObject selectionElem = contextProvider.getSelectedModelElement(); - for(IContextMenuContributor contributor : contextMenuContributorList) { - if(!INavigatorService.getInstance().isExpertViewActive() && - contributor.hiddenInNonExpertView()) { + Map<String, List<IContributionItem>> contributions = + getContributionsForElements(selection, contextProvider); + + for(String menuSectionID : contributions.keySet()) { + List<IContributionItem> items = contributions.get(menuSectionID); + if(items == null) { continue; } - String menuSectionID = contributor.getMenuSectionID(); - if(menuSectionID == null) { - menuSectionID = IWorkbenchActionConstants.MB_ADDITIONS; + // populate menu + for(IContributionItem item : items) { + menu.appendToGroup(menuSectionID, item); } + } + } - // get contributions from contributor - List<IContributionItem> items = - contributor.getContributedItems(selectionElem, contextProvider); - if(items == null) { + /** {@inheritDoc} */ + @Override + public List<MenuItem> getFXMenuItemsForElements(List<EObject> elements, + ContextMenuContextProvider contextProvider) { + List<MenuItem> ret = new ArrayList<MenuItem>(); + + Map<String, List<IContributionItem>> contributions = + getContributionsForElements(elements, contextProvider); + + // Create menu items for all sections + for(String menuID : MENU_SECTIONS) { + List<IContributionItem> menuItems = contributions.get(menuID); + if(menuItems == null) { continue; } - // active tutorial may filter contributions - if(ITutorialService.getInstance().isTutorialActive()) { - ITutorialUIService service = ITutorialUIService.getInstance(); - Predicate<? super IContributionItem> isVisible = - i -> service.contextMenuContributionVisible(selectionElem, i); - items = items.stream().filter(isVisible).collect(Collectors.toList()); - } - if(items == null) { - continue; + for(IContributionItem c : menuItems) { + if(c instanceof ActionContributionItem) { + IAction action = ((ActionContributionItem)c).getAction(); + + // Create a wrapper MenuItem for the jface Action + MenuItem menuItem = new MenuItem(action.getText()); + menuItem.setOnAction(evt -> { + action.run(); + }); + + // Add Icon + ImageDescriptor imageDescriptor = action.getImageDescriptor(); + if(imageDescriptor != null) { + Image fxImage = + toFXImage(imageDescriptor.createImage().getImageData(), null); + ImageView icon = new ImageView(fxImage); + + menuItem.setGraphic(icon); + } + + ret.add(menuItem); + } } - // populate menu - for(IContributionItem item : items) { - menu.appendToGroup(menuSectionID, item); + // Add a separator after non-empty sections. + if(menuItems.size() > 0) { + ret.add(new SeparatorMenuItem()); } } + + // If the last menu item is a separator, it can be removed. + int retLastIndex = ret.size() - 1; + if(retLastIndex > 0 && ret.get(retLastIndex) instanceof SeparatorMenuItem) { + ret.remove(retLastIndex); + } + + return ret; } - /** Populates the menu with contributions to multiple model element selection. */ - private void addMultiSelectionContributions(IMenuManager menu, - ContextMenuContextProvider contextProvider, List<EObject> selection) { + /** {@inheritDoc} */ + @Override + public List<MenuItem> getFXMenuItemsForElement(EObject element, + ContextMenuContextProvider contextProvider) { + return getFXMenuItemsForElements(asList(element), contextProvider); + } + + /** + * Retrieves a map from menu section ids to a list {@link IContributionItem}s for the given + * selectedElements. + */ + private Map<String, List<IContributionItem>> getContributionsForElements( + List<EObject> selectedElements, ContextMenuContextProvider contextProvider) { + Map<String, List<IContributionItem>> ret = new HashMap<String, List<IContributionItem>>(); + for(IContextMenuContributor contributor : contextMenuContributorList) { - if(contributor instanceof IContextMenuMultiSelectionContributor) { - if(!INavigatorService.getInstance().isExpertViewActive() && - contributor.hiddenInNonExpertView()) { + if(!INavigatorService.getInstance().isExpertViewActive() && + contributor.hiddenInNonExpertView()) { + continue; + } + + // get contributions from contributor + List<IContributionItem> items = null; + boolean isTutorialActive = ITutorialService.getInstance().isTutorialActive(); + if(selectedElements.size() == 1) { + // Size checked. + EObject selectedElement = selectedElements.get(0); + items = contributor.getContributedItems(selectedElement, contextProvider); + + // active tutorial may filter contributions + if(isTutorialActive) { + ITutorialUIService service = ITutorialUIService.getInstance(); + Predicate<? super IContributionItem> isVisible = + i -> service.contextMenuContributionVisible(selectedElement, i); + items = items.stream().filter(isVisible).collect(Collectors.toList()); + } + } else if(selectedElements.size() > 1 && + contributor instanceof IContextMenuMultiSelectionContributor) { + // active tutorial does not support multiple selections + if(isTutorialActive) { continue; } - IContextMenuMultiSelectionContributor multicontributor = + IContextMenuMultiSelectionContributor multiContributor = (IContextMenuMultiSelectionContributor)contributor; - String menuSectionID = contributor.getMenuSectionID(); - if(menuSectionID == null) { - menuSectionID = IWorkbenchActionConstants.MB_ADDITIONS; - } + items = multiContributor.getContributedItems(selectedElements, contextProvider); + } - // get contributions from contributor - List<IContributionItem> items = - multicontributor.getContributedItems(selection, contextProvider); - if(items == null) { - continue; - } + if(items == null) { + continue; + } - // active tutorial does not support multiple selections - if(ITutorialService.getInstance().isTutorialActive()) { - continue; - } + String menuSectionID = contributor.getMenuSectionID(); + if(menuSectionID == null) { + menuSectionID = IWorkbenchActionConstants.MB_ADDITIONS; + } - // populate menu - for(IContributionItem item : items) { - menu.appendToGroup(menuSectionID, item); - } + List<IContributionItem> sectionItems = ret.get(menuSectionID); + if(sectionItems == null) { + sectionItems = new ArrayList<IContributionItem>(); + ret.put(menuSectionID, sectionItems); } + + sectionItems.addAll(items); } + + return ret; } /** Adds a visible section separator. */ @@ -291,22 +358,4 @@ public class ContextMenuService implements IContextMenuService, IIntrospectiveKe public IIntrospectionDetailsItem getDetailsItem() { return new ContextMenuKISSDetailsItem(contextMenuContributorList); } - - /** {@inheritDoc} */ - @Override - public List<IContributionItem> getContextMenuContributions(EObject element, - ContextMenuContextProvider contextProvider) { - List<IContributionItem> ret = new ArrayList<IContributionItem>(); - - // Iterate all ContextMenuContributors to collect menu items. - for(IContextMenuContributor contributor : contextMenuContributorList) { - List<IContributionItem> contributions = - contributor.getContributedItems(element, contextProvider); - if(contributions != null) { - ret.addAll(contributions); - } - } - - return ret; - } } diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/.ratings index 7b0c011d7d961e617bd33493159f8f7038cfa48a..d8e3a77f855d815aff3fcccb73ed5abc1745b7a2 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/.ratings +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/.ratings @@ -1,5 +1,5 @@ IActionService.java 22eafafc8708cbff7f855f7b1b9bef042c127f25 GREEN -IContextMenuService.java b28f2b7e7375901a88b420654317c61d3d58d02c GREEN +IContextMenuService.java 10fdd339b5e902c99578caa98d631f2d551a6e29 GREEN IMarkerService.java 82486a5656cd907926fcdf1ca1ab801290f8514c GREEN IModelEditorBindingService.java ce2ae1957e2232bb0fac1d1d262103f9adfc5266 GREEN IModelElementHandlerService.java 23353de6b85af0e9d44a1c926174fa4ed5152af0 GREEN diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/IContextMenuService.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/IContextMenuService.java index b28f2b7e7375901a88b420654317c61d3d58d02c..10fdd339b5e902c99578caa98d631f2d551a6e29 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/IContextMenuService.java +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/IContextMenuService.java @@ -18,7 +18,6 @@ package org.fortiss.tooling.kernel.ui.service; import java.util.List; import org.eclipse.emf.ecore.EObject; -import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.MenuManager; import org.eclipse.ui.IWorkbenchActionConstants; import org.fortiss.tooling.kernel.ui.extension.IContextMenuContributor; @@ -26,6 +25,8 @@ import org.fortiss.tooling.kernel.ui.extension.data.ContextMenuContextProvider; import org.fortiss.tooling.kernel.ui.internal.ActionService; import org.fortiss.tooling.kernel.ui.internal.ContextMenuService; +import javafx.scene.control.MenuItem; + /** * The context menu service allows registration for model element specific * context menus. The context menu consists of a stack of separated sections @@ -80,17 +81,26 @@ public interface IContextMenuService { void registerContextMenuContributor(IContextMenuContributor contributor); /** - * Retrieves all context menu {@link IContributionItem}s for the given 'element' and the given - * 'ContextProvider'. + * Retrieves JavaFX {@link MenuItem}s for the given elements. + * + * @param elements + * A {@link List} of {@link EObject}s to get context menu entries for. + * @param contextProvider + * The {@link ContextMenuContextProvider} to be used. + * @return A {@link List} of {@link MenuItem}s. + */ + public List<MenuItem> getFXMenuItemsForElements(List<EObject> elements, + ContextMenuContextProvider contextProvider); + + /** + * Retrieves JavaFX {@link MenuItem}s for the given element. * * @param element - * The {@link EObject} to get the menu contributions for. + * An {@link EObject}s to get context menu entries for. * @param contextProvider - * The {@link ContextMenuContextProvider} to adhere when getting the context menu - * contibutions. - * @return A {@link List} if {@link IContributionItem} for the given 'element' and the given - * 'contentProvider'. + * The {@link ContextMenuContextProvider} to be used. + * @return A {@link List} of {@link MenuItem}s. */ - public List<IContributionItem> getContextMenuContributions(EObject element, + public List<MenuItem> getFXMenuItemsForElement(EObject element, ContextMenuContextProvider contextProvider); }