From fb135805829e635d3dd8be7f8e27a4d089048efc Mon Sep 17 00:00:00 2001 From: Qemal Alliu Date: Mon, 27 Jan 2025 08:50:38 +0100 Subject: [PATCH] Added open type in editor on instance viewer screen --- .../plugin.xml | 32 +++--- .../application/handlers/OpenTypeHandler.java | 100 ++++++++++++++---- 2 files changed, 96 insertions(+), 36 deletions(-) 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