diff --git a/plugins/org.eclipse.fordiac.ide.application/plugin.xml b/plugins/org.eclipse.fordiac.ide.application/plugin.xml
index 8e6cb1a46e..93285ab2a1 100644
--- a/plugins/org.eclipse.fordiac.ide.application/plugin.xml
+++ b/plugins/org.eclipse.fordiac.ide.application/plugin.xml
@@ -1499,19 +1499,25 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
@@ -1783,4 +1789,4 @@
type="java.lang.Object">
-
+
\ No newline at end of file
diff --git a/plugins/org.eclipse.fordiac.ide.application/src/org/eclipse/fordiac/ide/application/handlers/OpenTypeHandler.java b/plugins/org.eclipse.fordiac.ide.application/src/org/eclipse/fordiac/ide/application/handlers/OpenTypeHandler.java
index 447bd7e9b5..a1a50fbd3d 100644
--- a/plugins/org.eclipse.fordiac.ide.application/src/org/eclipse/fordiac/ide/application/handlers/OpenTypeHandler.java
+++ b/plugins/org.eclipse.fordiac.ide.application/src/org/eclipse/fordiac/ide/application/handlers/OpenTypeHandler.java
@@ -12,49 +12,54 @@
*******************************************************************************/
package org.eclipse.fordiac.ide.application.handlers;
+import java.util.ArrayList;
+import java.util.List;
+
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.fordiac.ide.model.libraryElement.FBNetwork;
import org.eclipse.fordiac.ide.model.libraryElement.FBNetworkElement;
import org.eclipse.fordiac.ide.model.libraryElement.IInterfaceElement;
-import org.eclipse.fordiac.ide.model.libraryElement.LibraryElement;
+import org.eclipse.fordiac.ide.model.libraryElement.INamedElement;
+import org.eclipse.fordiac.ide.model.libraryElement.SubApp;
+import org.eclipse.fordiac.ide.model.libraryElement.SubAppType;
+import org.eclipse.fordiac.ide.model.libraryElement.TypedSubApp;
+import org.eclipse.fordiac.ide.model.libraryElement.UntypedSubApp;
+import org.eclipse.fordiac.ide.model.ui.actions.OpenListenerManager;
import org.eclipse.fordiac.ide.ui.FordiacLogHelper;
import org.eclipse.gef.EditPart;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.ISources;
import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
-import org.eclipse.ui.part.FileEditorInput;
public class OpenTypeHandler extends AbstractHandler {
@Override
public Object execute(final ExecutionEvent event) throws ExecutionException {
+
final IStructuredSelection sel = HandlerUtil.getCurrentStructuredSelection(event);
- final IFile typeFile = getSelectedTypeFile(sel);
- if (typeFile != null) {
- openTypeEditor(typeFile);
+ final EObject object = getSelectedObject(sel);
+
+ if (object != null) {
+ openTypeEditor(object);
}
- return Status.OK_STATUS;
+
+ return null;
}
- private static void openTypeEditor(final IFile file) {
+ private static void openTypeEditor(final EObject object) {
final IWorkbench workbench = PlatformUI.getWorkbench();
- if (null != workbench) {
+ if (workbench != null) {
final IWorkbenchWindow activeWorkbenchWindow = workbench.getActiveWorkbenchWindow();
- if (null != activeWorkbenchWindow) {
- final IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
- final IEditorDescriptor desc = PlatformUI.getWorkbench().getEditorRegistry()
- .getDefaultEditor(file.getName());
+ if (activeWorkbenchWindow != null) {
try {
- activePage.openEditor(new FileEditorInput(file), desc.getId());
+ OpenListenerManager.openEditor(object);
} catch (final Exception e) {
FordiacLogHelper.logError(e.getMessage(), e);
}
@@ -66,27 +71,76 @@ private static void openTypeEditor(final IFile file) {
public void setEnabled(final Object evaluationContext) {
final ISelection sel = (ISelection) HandlerUtil.getVariable(evaluationContext,
ISources.ACTIVE_CURRENT_SELECTION_NAME);
- setBaseEnabled(getSelectedTypeFile(sel) != null);
+
+ setBaseEnabled(getSelectedObject(sel) != null);
}
- private static IFile getSelectedTypeFile(final ISelection sel) {
+ private static EObject getSelectedObject(final ISelection sel) {
if ((sel instanceof final IStructuredSelection structSel) && !sel.isEmpty() && (structSel.size() == 1)) {
Object obj = structSel.getFirstElement();
+
if (obj instanceof final EditPart ep) {
obj = ep.getModel();
}
- final LibraryElement type = switch (obj) {
+ final EObject eObject = switch (obj) {
+ case final FBNetwork fbn -> getEObjectForOpening(fbn);
case final FBNetworkElement fbnEl -> fbnEl.getType();
case final IInterfaceElement ie -> ie.getType();
default -> null;
};
- if ((type != null) && (type.getTypeEntry() != null)) {
- return type.getTypeEntry().getFile();
+ if ((eObject != null)) {
+ return eObject;
}
}
+
return null;
}
-}
+ private static EObject getEObjectForOpening(final FBNetwork fbn) {
+
+ if (fbn.eContainer() instanceof final UntypedSubApp usa) {
+ EObject element = usa;
+
+ final List subAppNames = new ArrayList<>();
+
+ while (element != null) {
+ if (element instanceof final INamedElement ine) {
+ subAppNames.add(ine.getName());
+ }
+
+ if (element.eContainer() instanceof final TypedSubApp tsa) {
+ subAppNames.add(tsa.getName());
+
+ return getMatchingSubAppFromType(subAppNames.reversed(), tsa.getType());
+ }
+
+ element = element.eContainer();
+ }
+ }
+
+ if (fbn.eContainer() instanceof final TypedSubApp tsa) {
+ return tsa.getType();
+ }
+
+ return null;
+ }
+
+ private static SubApp getMatchingSubAppFromType(final List subAppNames, final SubAppType type) {
+ FBNetwork fb = type.getFBNetwork();
+ SubApp lastSubapp = null;
+
+ for (final String subAppName : subAppNames) {
+ final SubApp sa = fb.getSubAppNamed(subAppName);
+
+ if (sa != null) {
+ lastSubapp = sa;
+ fb = sa.getSubAppNetwork();
+ }
+ }
+
+ return lastSubapp;
+ }
+
+}
\ No newline at end of file