X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.district.network.ui%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fnetwork%2Fui%2Fcontributions%2FSetFocusableDynamicMenuContribution.java;fp=org.simantics.district.network.ui%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fnetwork%2Fui%2Fcontributions%2FSetFocusableDynamicMenuContribution.java;h=d2c2ed5ca799e26ab284c64b6842008d8c77d066;hb=16ee01dc5a40981c58fd5b478b89552e5814e8bb;hp=0000000000000000000000000000000000000000;hpb=9dace20146d19dd0541480a80fd289de45b6cfc8;p=simantics%2Fdistrict.git diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/SetFocusableDynamicMenuContribution.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/SetFocusableDynamicMenuContribution.java new file mode 100644 index 00000000..d2c2ed5c --- /dev/null +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/SetFocusableDynamicMenuContribution.java @@ -0,0 +1,93 @@ +package org.simantics.district.network.ui.contributions; + +import java.awt.geom.Point2D; +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Named; + +import org.eclipse.e4.core.contexts.IEclipseContext; +import org.eclipse.e4.ui.di.AboutToHide; +import org.eclipse.e4.ui.di.AboutToShow; +import org.eclipse.e4.ui.model.application.ui.basic.MPart; +import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem; +import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement; +import org.eclipse.e4.ui.model.application.ui.menu.MMenuFactory; +import org.eclipse.e4.ui.services.IServiceConstants; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.ui.IEditorPart; +import org.simantics.g2d.canvas.ICanvasContext; +import org.simantics.g2d.diagram.DiagramHints; +import org.simantics.g2d.diagram.IDiagram; +import org.simantics.g2d.diagram.handler.PickContext; +import org.simantics.g2d.diagram.handler.PickRequest; +import org.simantics.g2d.element.IElement; +import org.simantics.g2d.element.handler.ElementLayers; +import org.simantics.g2d.layers.ILayer; +import org.simantics.g2d.layers.ILayersEditor; +import org.simantics.ui.workbench.e4.E4WorkbenchUtils; + +public class SetFocusableDynamicMenuContribution { + + public static final String SET_FOCUSABLE_ID = "org.simantics.district.network.ui.setFocusable"; + public static final String FOCUSABLE_ELEMENTS = "org.simantics.district.network.ui.focusableElements"; + + @AboutToShow + public void aboutToShow(IEclipseContext popupContext, @Named(IServiceConstants.ACTIVE_SELECTION) ISelection selection, List items, @Named(IServiceConstants.ACTIVE_PART) MPart part) { + + IEditorPart editorPart = E4WorkbenchUtils.getActiveIEditorPart(part); + IDiagram diagram = editorPart.getAdapter(IDiagram.class); + if (diagram == null) + return; + + PickContext pick = diagram.getDiagramClass().getSingleItem(PickContext.class); + if (pick == null) + return; + + ICanvasContext ctx = (ICanvasContext) editorPart.getAdapter(ICanvasContext.class); + if (ctx == null) + return; + + Point2D canvasPosition = ctx.getHintStack().getHint(DiagramHints.POPUP_MENU_CANVAS_POSITION); + if (canvasPosition == null) + return; + + List result = new ArrayList<>(); + + ILayersEditor le = diagram.getHint(DiagramHints.KEY_LAYERS_EDITOR); + // Quite hackish solution.. + boolean oldIgnore = le.getIgnoreFocusSettings(); + le.setIgnoreFocusSettings(true); + pick.pick(diagram, new PickRequest(canvasPosition.getX(), canvasPosition.getY()), result); + le.setIgnoreFocusSettings(oldIgnore); + + boolean allow = false; + + for (IElement elem : result) { + ElementLayers el = elem.getElementClass().getAtMostOneItemOfClass(ElementLayers.class); + for (ILayer layer : le.getVisibleLayers()) { + boolean focusable = el.isFocusable(elem, layer); + if (!focusable) + allow = true; + } + } + + MHandledMenuItem dynamicItem = MMenuFactory.INSTANCE.createHandledMenuItem(); + if (allow) + dynamicItem.setLabel("Allow focusing"); + else + dynamicItem.setLabel("Disallow focusing"); + + dynamicItem.setContributorURI("platform:/plugin/org.simantics.district.network.ui"); + dynamicItem.setIconURI("platform:/plugin/org.simantics.modeling.ui/icons/shape_handles.png"); + dynamicItem.setCommand(E4WorkbenchUtils.getMCommandById(SET_FOCUSABLE_ID)); + items.add(dynamicItem); + + popupContext.set(FOCUSABLE_ELEMENTS, result); + } + + @AboutToHide + public void aboutToHide(IEclipseContext popupContext) { + popupContext.remove(FOCUSABLE_ELEMENTS); + } +}