X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.ui%2Fsrc%2Forg%2Fsimantics%2Fui%2Fworkbench%2Fe4%2FE4WorkbenchUtils.java;h=6d7daeb3c6ff191f8e04e444240bf99776f699d3;hb=560d8aa2e37cb6b0249aec6d7e96e67d5a64c59f;hp=901772ba7b68f88a8f25e3d7c7a01b6c13794c7d;hpb=96bb7ef9cbe42d82eb58306d8f9b62392cc29ba8;p=simantics%2Fplatform.git
diff --git a/bundles/org.simantics.ui/src/org/simantics/ui/workbench/e4/E4WorkbenchUtils.java b/bundles/org.simantics.ui/src/org/simantics/ui/workbench/e4/E4WorkbenchUtils.java
index 901772ba7..6d7daeb3c 100644
--- a/bundles/org.simantics.ui/src/org/simantics/ui/workbench/e4/E4WorkbenchUtils.java
+++ b/bundles/org.simantics.ui/src/org/simantics/ui/workbench/e4/E4WorkbenchUtils.java
@@ -1,167 +1,201 @@
-package org.simantics.ui.workbench.e4;
-
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.e4.core.contexts.IEclipseContext;
-import org.eclipse.e4.ui.model.application.MApplication;
-import org.eclipse.e4.ui.model.application.ui.MUIElement;
-import org.eclipse.e4.ui.model.application.ui.advanced.MArea;
-import org.eclipse.e4.ui.model.application.ui.advanced.MPlaceholder;
-import org.eclipse.e4.ui.model.application.ui.basic.MPart;
-import org.eclipse.e4.ui.model.application.ui.basic.MPartSashContainerElement;
-import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
-import org.eclipse.e4.ui.workbench.modeling.EModelService;
-import org.eclipse.e4.ui.workbench.modeling.EPartService;
-import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState;
-import org.eclipse.ui.PlatformUI;
-import org.simantics.db.Resource;
-import org.simantics.utils.datastructures.ArrayMap;
-
-/**
- * @author Tuukka Lehtonen
- *
- */
-public class E4WorkbenchUtils {
-
- private static final String[] KEYS_RESOURCE = { E4ResourceEditorConstants.KEY_RESOURCE };
-
- /**
- *
- */
- private static final String TAG_EDITOR = "Editor";
-
- /**
- * The Legacy IDE application ID for the "editor area" partstack. In E3
- * compatibility mode legacy application the {@link MPartStack} lies under
- * the shared {@link MArea} (org.eclipse.ui.editorss).
- *
- *
- * In a pure E4 application this needs to be changed.
- */
- public static final String EDITOR_PART_STACK_ID = "org.eclipse.e4.primaryDataStack";
-
- public static final String EDITOR_AREA_ID = "org.eclipse.ui.editorss";
-
- /**
- * @param editorId
- * @param contributionURI
- * @param iconURI
- * @param inputId
- * @param inputMap
- */
- public static MPart openEditor(String editorId, String contributionURI, String iconURI, String inputId, Map inputMap) {
- if (editorId == null)
- throw new NullPointerException("null editor ID");
- if (contributionURI == null)
- throw new NullPointerException("null contributionURI");
- if (inputId == null)
- throw new NullPointerException("null input ID");
- if (inputMap == null)
- throw new NullPointerException("null input map");
-
- IEclipseContext context = PlatformUI.getWorkbench().getService(IEclipseContext.class);
- EModelService modelService = context.get(EModelService.class);
- EPartService partService = context.get(EPartService.class);
- MApplication app = context.get(MApplication.class);
-
- String editorID = editorId + "_" + inputId;
-
- List parts = modelService.findElements(app, editorID, MPart.class, null);
- MPart editor = null;
- if (parts == null || parts.isEmpty()) {
- editor = modelService.createModelElement(MPart.class);
- editor.setElementId(editorID);
- editor.setContributionURI(contributionURI);
- if (iconURI != null)
- editor.setIconURI(iconURI);
- editor.setCloseable(true);
- editor.getTags().add(TAG_EDITOR);
- editor.getTransientData().putAll(inputMap);
-
- MPartStack stack = getEditorPartStack(modelService, app);
- stack.getChildren().add(editor);
- } else {
- editor = parts.get(0);
- }
-
- partService.showPart(editor, PartState.ACTIVATE);
- return editor;
- }
-
- /**
- * @param editorId
- * @param contributionURI
- * @param iconURI
- * @param input
- */
- public static MPart openEditor(String editorId, String contributionURI, String iconURI, Resource input) {
- String inputId = Long.toString(input.getResourceId());
- Map inputMap = ArrayMap.make(KEYS_RESOURCE, input);
- return openEditor(editorId, contributionURI, iconURI, inputId, inputMap);
- }
-
- /**
- * @param editorElementId the unique element ID of the part (editor)
- */
- public static void closeEditor(String editorElementId) {
- IEclipseContext context = PlatformUI.getWorkbench().getService(IEclipseContext.class);
- EModelService modelService = context.get(EModelService.class);
- MApplication app = context.get(MApplication.class);
- modelService
- .findElements(app, editorElementId, MPart.class, null)
- .forEach(p -> p.getContext().get(EPartService.class).hidePart(p));
- }
-
- public static void activatePart(MPart part) {
- EPartService partService = part.getContext().get(EPartService.class);
- partService.activate(part);
- }
-
- public static MPartStack getEditorPartStack(EModelService modelService, MApplication app) {
- MPartStack stack = (MPartStack) modelService.find(E4WorkbenchUtils.EDITOR_PART_STACK_ID, app);
- if (stack == null) {
- MArea editorArea = null;
- MUIElement area = modelService.find(E4WorkbenchUtils.EDITOR_AREA_ID, app);
- if (area instanceof MPlaceholder) {
- editorArea = (MArea) ((MPlaceholder) area).getRef();
- } else if (area instanceof MArea) {
- editorArea = (MArea) area;
- }
- if (editorArea == null)
- throw new IllegalStateException("Shared editor area (" + E4WorkbenchUtils.EDITOR_AREA_ID + ") not found in application model");
- for (MPartSashContainerElement container : editorArea.getChildren()) {
- if (container instanceof MPartStack) {
- stack = (MPartStack) container;
- break;
- }
- }
- }
- if (stack == null)
- throw new IllegalStateException("Could not find part stack under editor area.");
- return stack;
- }
-
- public static void openAndShowPart(MPart part) {
- IEclipseContext context = PlatformUI.getWorkbench().getService(IEclipseContext.class);
- EPartService partService = context.get(EPartService.class);
- if (!partService.isPartVisible(part))
- partService.showPart(part, PartState.ACTIVATE);
- else
- partService.activate(part);
- }
-
-
- public static void openAndShowPart(String partId) {
- IEclipseContext context = PlatformUI.getWorkbench().getService(IEclipseContext.class);
- EPartService partService = context.get(EPartService.class);
- partService.showPart(partId, PartState.ACTIVATE);
- }
-
- public static MPart getMPartById(String partId) {
- IEclipseContext context = PlatformUI.getWorkbench().getService(IEclipseContext.class);
- EPartService partService = context.get(EPartService.class);
- return partService.findPart(partId);
- }
-
-}
+package org.simantics.ui.workbench.e4;
+
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.commands.MCommand;
+import org.eclipse.e4.ui.model.application.ui.MUIElement;
+import org.eclipse.e4.ui.model.application.ui.advanced.MArea;
+import org.eclipse.e4.ui.model.application.ui.advanced.MPlaceholder;
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+import org.eclipse.e4.ui.model.application.ui.basic.MPartSashContainerElement;
+import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
+import org.eclipse.e4.ui.workbench.modeling.EModelService;
+import org.eclipse.e4.ui.workbench.modeling.EPartService;
+import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.e4.compatibility.CompatibilityEditor;
+import org.simantics.db.Resource;
+import org.simantics.utils.datastructures.ArrayMap;
+import org.simantics.utils.ui.workbench.WorkbenchUtils;
+
+/**
+ * @author Tuukka Lehtonen
+ *
+ */
+public class E4WorkbenchUtils {
+
+ private static final String[] KEYS_RESOURCE = { E4ResourceEditorConstants.KEY_RESOURCE };
+
+ /**
+ *
+ */
+ private static final String TAG_EDITOR = "Editor";
+
+ /**
+ * The Legacy IDE application ID for the "editor area" partstack. In E3
+ * compatibility mode legacy application the {@link MPartStack} lies under
+ * the shared {@link MArea} (org.eclipse.ui.editorss).
+ *
+ *
+ * In a pure E4 application this needs to be changed.
+ */
+ public static final String EDITOR_PART_STACK_ID = "org.eclipse.e4.primaryDataStack";
+
+ public static final String EDITOR_AREA_ID = "org.eclipse.ui.editorss";
+
+ /**
+ * @param editorId
+ * @param contributionURI
+ * @param iconURI
+ * @param inputId
+ * @param inputMap
+ */
+ public static MPart openEditor(String editorId, String contributionURI, String iconURI, String inputId, Map inputMap) {
+ if (editorId == null)
+ throw new NullPointerException("null editor ID");
+ if (contributionURI == null)
+ throw new NullPointerException("null contributionURI");
+ if (inputId == null)
+ throw new NullPointerException("null input ID");
+ if (inputMap == null)
+ throw new NullPointerException("null input map");
+
+ IEclipseContext context = PlatformUI.getWorkbench().getService(IEclipseContext.class);
+ EModelService modelService = context.get(EModelService.class);
+ EPartService partService = context.get(EPartService.class);
+ MApplication app = context.get(MApplication.class);
+
+ String editorID = editorId + "_" + inputId;
+
+ List parts = modelService.findElements(app, editorID, MPart.class, null);
+ MPart editor = null;
+ if (parts == null || parts.isEmpty()) {
+ editor = modelService.createModelElement(MPart.class);
+ editor.setElementId(editorID);
+ editor.setContributionURI(contributionURI);
+ if (iconURI != null)
+ editor.setIconURI(iconURI);
+ editor.setCloseable(true);
+ editor.getTags().add(TAG_EDITOR);
+ editor.getTransientData().putAll(inputMap);
+
+ MPartStack stack = getEditorPartStack(modelService, app);
+ stack.getChildren().add(editor);
+ } else {
+ editor = parts.get(0);
+ }
+
+ partService.showPart(editor, PartState.ACTIVATE);
+ return editor;
+ }
+
+ /**
+ * @param editorId
+ * @param contributionURI
+ * @param iconURI
+ * @param input
+ */
+ public static MPart openEditor(String editorId, String contributionURI, String iconURI, Resource input) {
+ String inputId = Long.toString(input.getResourceId());
+ Map inputMap = ArrayMap.make(KEYS_RESOURCE, input);
+ return openEditor(editorId, contributionURI, iconURI, inputId, inputMap);
+ }
+
+ /**
+ * @param editorElementId the unique element ID of the part (editor)
+ */
+ public static void closeEditor(String editorElementId) {
+ IEclipseContext context = PlatformUI.getWorkbench().getService(IEclipseContext.class);
+ EModelService modelService = context.get(EModelService.class);
+ MApplication app = context.get(MApplication.class);
+ modelService
+ .findElements(app, editorElementId, MPart.class, null)
+ .forEach(p -> p.getContext().get(EPartService.class).hidePart(p));
+ }
+
+ public static void activatePart(MPart part) {
+ EPartService partService = part.getContext().get(EPartService.class);
+ partService.activate(part);
+ }
+
+ public static MPartStack getEditorPartStack(EModelService modelService, MApplication app) {
+ MPartStack stack = (MPartStack) modelService.find(E4WorkbenchUtils.EDITOR_PART_STACK_ID, app);
+ if (stack == null) {
+ MArea editorArea = null;
+ MUIElement area = modelService.find(E4WorkbenchUtils.EDITOR_AREA_ID, app);
+ if (area instanceof MPlaceholder) {
+ editorArea = (MArea) ((MPlaceholder) area).getRef();
+ } else if (area instanceof MArea) {
+ editorArea = (MArea) area;
+ }
+ if (editorArea == null)
+ throw new IllegalStateException("Shared editor area (" + E4WorkbenchUtils.EDITOR_AREA_ID + ") not found in application model");
+ for (MPartSashContainerElement container : editorArea.getChildren()) {
+ if (container instanceof MPartStack) {
+ stack = (MPartStack) container;
+ break;
+ }
+ }
+ }
+ if (stack == null)
+ throw new IllegalStateException("Could not find part stack under editor area.");
+ return stack;
+ }
+
+ public static void openAndShowPart(MPart part) {
+ IEclipseContext context = PlatformUI.getWorkbench().getService(IEclipseContext.class);
+ EPartService partService = context.get(EPartService.class);
+ if (!partService.isPartVisible(part))
+ partService.showPart(part, PartState.ACTIVATE);
+ else
+ partService.activate(part);
+ }
+
+
+ public static void openAndShowPart(String partId) {
+ IEclipseContext context = PlatformUI.getWorkbench().getService(IEclipseContext.class);
+ EPartService partService = context.get(EPartService.class);
+ partService.showPart(partId, PartState.ACTIVATE);
+ }
+
+ public static MPart getMPartById(String partId) {
+ IEclipseContext context = PlatformUI.getWorkbench().getService(IEclipseContext.class);
+ EPartService partService = context.get(EPartService.class);
+ MPart part = partService.findPart(partId);
+ if (part == null)
+ part = partService.createPart(partId);
+ return part;
+ }
+
+ public static MCommand getMCommandById(String id) {
+ IEclipseContext context = PlatformUI.getWorkbench().getService(IEclipseContext.class);
+ MApplication application = context.get(MApplication.class);
+ for (MCommand command : application.getCommands()) {
+ if (id.equals(command.getElementId())) {
+ return command;
+ }
+ }
+ return null;
+ }
+
+ @SuppressWarnings("restriction")
+ public static IEditorPart getActiveIEditorPart(MPart mActiveEditorPart) {
+ // TODO: Fix this when we get rid of CompatibilityEditors
+ IEditorPart activeEditor = null;
+ if (mActiveEditorPart != null) {
+ Object editor = mActiveEditorPart.getObject();
+ if (editor instanceof CompatibilityEditor) {
+ CompatibilityEditor compEditor = (CompatibilityEditor) editor;
+ activeEditor = compEditor.getEditor();
+ } else {
+ // TODO: This is not good practice with E4 but an OK fallback for now
+ activeEditor = WorkbenchUtils.getActiveEditor();
+ }
+ }
+ return activeEditor;
+ }
+}