diff --git a/applications/opibuilder/opibuilder-features/org.csstudio.applications.opibuilder.feature/feature.xml b/applications/opibuilder/opibuilder-features/org.csstudio.applications.opibuilder.feature/feature.xml index f96e04df611..809a4cdaf93 100644 --- a/applications/opibuilder/opibuilder-features/org.csstudio.applications.opibuilder.feature/feature.xml +++ b/applications/opibuilder/opibuilder-features/org.csstudio.applications.opibuilder.feature/feature.xml @@ -180,11 +180,19 @@ For details, see http://www.eclipse.org/legal/epl-v10.html version="0.0.0" unpack="false"/> - + + diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.editor/src/org/csstudio/opibuilder/actions/EditOPIHandler.java b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.editor/src/org/csstudio/opibuilder/actions/EditOPIHandler.java index c67d8b62509..286d72fc01d 100644 --- a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.editor/src/org/csstudio/opibuilder/actions/EditOPIHandler.java +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.editor/src/org/csstudio/opibuilder/actions/EditOPIHandler.java @@ -4,7 +4,7 @@ import org.csstudio.opibuilder.runmode.OPIView; import org.csstudio.opibuilder.util.ErrorHandlerUtil; import org.csstudio.opibuilder.util.ResourceUtil; -import org.csstudio.opibuilder.util.SingleSourceHelper; +import org.csstudio.opibuilder.util.SingleSourceRuntimeTypeHelper; import org.csstudio.ui.util.perspective.PerspectiveHelper; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; @@ -25,7 +25,6 @@ import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.ide.FileStoreEditorInput; import org.eclipse.ui.part.FileEditorInput; @@ -44,16 +43,7 @@ public class EditOPIHandler extends AbstractHandler implements IHandler { @Override public Object execute(ExecutionEvent event) throws ExecutionException { - IOPIRuntime opiRuntime = SingleSourceHelper.getOPIShellForShell(HandlerUtil.getActiveShell(event)); - if (opiRuntime == null) { - // if the selected object isn't an OPIShell so grab the - // OPIView or OPIRunner currently selected - IWorkbenchPart part = HandlerUtil.getActivePart(event); - if (part instanceof IOPIRuntime) - { - opiRuntime = (IOPIRuntime)part; - } - } + IOPIRuntime opiRuntime = SingleSourceRuntimeTypeHelper.getOPIRuntimeForEvent(event); if (opiRuntime != null) { IPath path = opiRuntime.getDisplayModel().getOpiFilePath(); @@ -135,7 +125,7 @@ public void setEnabled(Object evaluationContext) { if (!PreferencesHelper.isNoEdit()) { if (evaluationContext instanceof IEvaluationContext) { IWorkbenchPart part = getActivePart((IEvaluationContext) evaluationContext); - IOPIRuntime opiShell = SingleSourceHelper.getOPIShellForShell( + IOPIRuntime opiShell = SingleSourceRuntimeTypeHelper.getOPIRuntimeForShell( getActiveShell((IEvaluationContext) evaluationContext)); IPath path = null; if (opiShell != null) { diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rap/src/org/csstudio/opibuilder/util/SingleSourceHelperImpl.java b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rap/src/org/csstudio/opibuilder/util/SingleSourceHelperImpl.java index d92b9c8604b..2796b6df8c0 100644 --- a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rap/src/org/csstudio/opibuilder/util/SingleSourceHelperImpl.java +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rap/src/org/csstudio/opibuilder/util/SingleSourceHelperImpl.java @@ -202,14 +202,4 @@ protected void iOpenEditor(IWorkbenchPage page, IPath path) String id = defaultEditor.getId(); page.openEditor(new PathEditorInput(path), id); } - - @Override - protected void iOpenOPIShell(IPath path, MacrosInput input) { - } - - @Override - protected IOPIRuntime iGetOPIShellForShell(Shell shell) { - return null; - } - } diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rap/src/org/csstudio/opibuilder/util/SingleSourceRuntimeTypeHelperImpl.java b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rap/src/org/csstudio/opibuilder/util/SingleSourceRuntimeTypeHelperImpl.java new file mode 100644 index 00000000000..672143a38bf --- /dev/null +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rap/src/org/csstudio/opibuilder/util/SingleSourceRuntimeTypeHelperImpl.java @@ -0,0 +1,41 @@ +package org.csstudio.opibuilder.util; + +import org.csstudio.opibuilder.runmode.IOPIRuntime; +import org.csstudio.opibuilder.runmode.OPIRunner; +import org.csstudio.opibuilder.runmode.RunModeService.DisplayMode; +import org.csstudio.opibuilder.runmode.RunnerInput; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.runtime.IPath; +import org.eclipse.osgi.util.NLS; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PartInitException; + +public class SingleSourceRuntimeTypeHelperImpl extends SingleSourceRuntimeTypeHelper { + + @Override + protected void iOpenOPIShell(IPath path, MacrosInput input) { + } + + @Override + protected IOPIRuntime iGetOPIRuntimeForShell(Shell shell) { + return null; + } + + @Override + protected IOPIRuntime iGetOPIRuntimeForEvent(ExecutionEvent event) { + return null; + } + + @Override + protected void iOpenDisplay(IWorkbenchPage page, RunnerInput input, DisplayMode mode) { + try + { + page.openEditor(input, OPIRunner.ID); + } + catch (PartInitException e) + { + ErrorHandlerUtil.handleError(NLS.bind("Failed to open {0}.", input.getPath()), e); + } + } +} diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/.classpath b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/.classpath new file mode 100644 index 00000000000..1fa3e6803d3 --- /dev/null +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/.project b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/.project new file mode 100644 index 00000000000..e132c4d2296 --- /dev/null +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/.project @@ -0,0 +1,28 @@ + + + org.csstudio.opibuilder.rcp.opiruntime + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/META-INF/MANIFEST.MF b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..330b0bb1176 --- /dev/null +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/META-INF/MANIFEST.MF @@ -0,0 +1,8 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Opiruntime +Bundle-SymbolicName: org.csstudio.opibuilder.rcp.opiruntime;singleton:=true +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: ITER +Fragment-Host: org.csstudio.opibuilder;bundle-version="4.0.104" +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/build.properties b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/build.properties new file mode 100644 index 00000000000..e3023e14e99 --- /dev/null +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/build.properties @@ -0,0 +1,5 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + fragment.xml diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/fragment.xml b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/fragment.xml new file mode 100644 index 00000000000..636dbf234cc --- /dev/null +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/fragment.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/pom.xml b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/pom.xml new file mode 100644 index 00000000000..c8c524c8522 --- /dev/null +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + org.csstudio + opibuilder-plugins + 0.0.1-SNAPSHOT + + org.csstudio.opibuilder.rcp.opiruntime + 1.0.0-SNAPSHOT + eclipse-plugin + diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/src/org/csstudio/opibuilder/runmode/OPIPerspective.java b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/src/org/csstudio/opibuilder/runmode/OPIPerspective.java new file mode 100644 index 00000000000..2bc9014e957 --- /dev/null +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/src/org/csstudio/opibuilder/runmode/OPIPerspective.java @@ -0,0 +1,20 @@ +package org.csstudio.opibuilder.runmode; + +import org.eclipse.ui.IPageLayout; + +/** + * + * OPIPerspective is an override of the original OPI Runtime perspective, + * which does not use the editor area. + * + * @author Jaka Bobnar + * + */ +public class OPIPerspective extends OPIRunnerPerspective { + + @Override + public void createInitialLayout(IPageLayout layout) { + super.createInitialLayout(layout); + layout.setEditorAreaVisible(true); + } +} diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/src/org/csstudio/opibuilder/util/SingleSourceRuntimeTypeHelperImpl.java b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/src/org/csstudio/opibuilder/util/SingleSourceRuntimeTypeHelperImpl.java new file mode 100644 index 00000000000..348032443f7 --- /dev/null +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.opiruntime/src/org/csstudio/opibuilder/util/SingleSourceRuntimeTypeHelperImpl.java @@ -0,0 +1,78 @@ +package org.csstudio.opibuilder.util; + +import org.csstudio.opibuilder.runmode.IOPIRuntime; +import org.csstudio.opibuilder.runmode.OPIRunner; +import org.csstudio.opibuilder.runmode.OPIRunnerPerspective; +import org.csstudio.opibuilder.runmode.RunModeService.DisplayMode; +import org.csstudio.opibuilder.runmode.RunnerInput; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.runtime.IPath; +import org.eclipse.osgi.util.NLS; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IPageListener; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.WorkbenchException; +import org.eclipse.ui.handlers.HandlerUtil; + +public class SingleSourceRuntimeTypeHelperImpl extends SingleSourceRuntimeTypeHelper { + + private IWorkbenchWindow runWindow; + + @Override + protected IOPIRuntime iGetOPIRuntimeForEvent(ExecutionEvent event) { + IWorkbenchPart part = HandlerUtil.getActivePart(event); + return part instanceof IOPIRuntime ? (IOPIRuntime)part : null; + } + + @Override + protected void iOpenOPIShell(IPath path, MacrosInput input) { + try { + if (runWindow == null) { + runWindow = PlatformUI.getWorkbench().openWorkbenchWindow( + OPIRunnerPerspective.ID, null); + runWindow.addPageListener(new IPageListener() { + public void pageClosed(IWorkbenchPage page) { + runWindow = null; + } + + public void pageActivated(IWorkbenchPage page) { + // NOP + } + + public void pageOpened(IWorkbenchPage page) { + // NOP + } + }); + } + IWorkbenchPage page = runWindow.getActivePage(); + Shell shell = runWindow.getShell(); + if (shell.getMinimized()) + shell.setMinimized(false); + shell.forceActive(); + shell.forceFocus(); + iOpenDisplay(page, new RunnerInput(path, null, input), DisplayMode.NEW_TAB); + shell.moveAbove(null); + } catch (WorkbenchException e) { + ErrorHandlerUtil.handleError(NLS.bind("Failed to open {0}", path), e); + } + } + + @Override + protected IOPIRuntime iGetOPIRuntimeForShell(Shell shell) { + return null; + } + + @Override + protected void iOpenDisplay(IWorkbenchPage page, RunnerInput input, DisplayMode mode) { + try { + page.openEditor(input, OPIRunner.ID); + } catch (PartInitException e) { + ErrorHandlerUtil.handleError(NLS.bind("Failed to open {0}", input.getPath()), e); + } + + } +} diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/.classpath b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/.classpath new file mode 100644 index 00000000000..1fa3e6803d3 --- /dev/null +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/.project b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/.project new file mode 100644 index 00000000000..6ac8fb6d60e --- /dev/null +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/.project @@ -0,0 +1,28 @@ + + + org.csstudio.opibuilder.rcp.view + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/META-INF/MANIFEST.MF b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..0bf4ed98aa6 --- /dev/null +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/META-INF/MANIFEST.MF @@ -0,0 +1,19 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: View +Bundle-SymbolicName: org.csstudio.opibuilder.rcp.view;singleton:=true +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: ITER +Fragment-Host: org.csstudio.opibuilder;bundle-version="4.0.104" +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Require-Bundle: org.eclipse.core.resources;bundle-version="3.4.0", + org.eclipse.ui.ide +Import-Package: javafx.beans.property;version="2.2.0", + javafx.collections;version="2.2.0", + javafx.event;version="2.2.0", + javafx.geometry;version="2.2.0", + javafx.scene;version="2.2.0", + javafx.scene.control;version="2.2.0", + javafx.scene.layout;version="2.2.0", + org.eclipse.fx.ui.workbench3, + org.eclipse.gef.ui.actions diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/build.properties b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/build.properties new file mode 100644 index 00000000000..e3023e14e99 --- /dev/null +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/build.properties @@ -0,0 +1,5 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + fragment.xml diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/fragment.xml b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/fragment.xml new file mode 100644 index 00000000000..c2b081c1af6 --- /dev/null +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/fragment.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/pom.xml b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/pom.xml new file mode 100644 index 00000000000..ce1d81aa897 --- /dev/null +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + org.csstudio + opibuilder-plugins + 0.0.1-SNAPSHOT + + org.csstudio.opibuilder.rcp.view + 1.0.0-SNAPSHOT + eclipse-plugin + diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/src/org/csstudio/opibuilder/runmode/DisplayLauncher.java b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/src/org/csstudio/opibuilder/runmode/DisplayLauncher.java similarity index 100% rename from applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/src/org/csstudio/opibuilder/runmode/DisplayLauncher.java rename to applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/src/org/csstudio/opibuilder/runmode/DisplayLauncher.java diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/src/org/csstudio/opibuilder/runmode/LauncherHelper.java b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/src/org/csstudio/opibuilder/runmode/LauncherHelper.java similarity index 100% rename from applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/src/org/csstudio/opibuilder/runmode/LauncherHelper.java rename to applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/src/org/csstudio/opibuilder/runmode/LauncherHelper.java diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/src/org/csstudio/opibuilder/runmode/OPIShell.java b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/src/org/csstudio/opibuilder/runmode/OPIShell.java similarity index 100% rename from applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/src/org/csstudio/opibuilder/runmode/OPIShell.java rename to applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/src/org/csstudio/opibuilder/runmode/OPIShell.java diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/src/org/csstudio/opibuilder/runmode/OPIShellSummary.java b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/src/org/csstudio/opibuilder/runmode/OPIShellSummary.java similarity index 100% rename from applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/src/org/csstudio/opibuilder/runmode/OPIShellSummary.java rename to applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/src/org/csstudio/opibuilder/runmode/OPIShellSummary.java diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/src/org/csstudio/opibuilder/runmode/OPIShellsChangedHandler.java b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/src/org/csstudio/opibuilder/runmode/OPIShellsChangedHandler.java similarity index 100% rename from applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/src/org/csstudio/opibuilder/runmode/OPIShellsChangedHandler.java rename to applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/src/org/csstudio/opibuilder/runmode/OPIShellsChangedHandler.java diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/src/org/csstudio/opibuilder/runmode/ShellLauncher.java b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/src/org/csstudio/opibuilder/runmode/ShellLauncher.java similarity index 100% rename from applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/src/org/csstudio/opibuilder/runmode/ShellLauncher.java rename to applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/src/org/csstudio/opibuilder/runmode/ShellLauncher.java diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/src/org/csstudio/opibuilder/util/SingleSourceRuntimeTypeHelperImpl.java b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/src/org/csstudio/opibuilder/util/SingleSourceRuntimeTypeHelperImpl.java new file mode 100644 index 00000000000..bde31ee7f67 --- /dev/null +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp.view/src/org/csstudio/opibuilder/util/SingleSourceRuntimeTypeHelperImpl.java @@ -0,0 +1,116 @@ +package org.csstudio.opibuilder.util; + +import java.util.logging.Level; + +import org.csstudio.opibuilder.OPIBuilderPlugin; +import org.csstudio.opibuilder.runmode.IOPIRuntime; +import org.csstudio.opibuilder.runmode.OPIShell; +import org.csstudio.opibuilder.runmode.OPIView; +import org.csstudio.opibuilder.runmode.RunnerInput; +import org.csstudio.opibuilder.runmode.OPIRunnerPerspective.Position; +import org.csstudio.opibuilder.runmode.RunModeService.DisplayMode; +import org.csstudio.utility.singlesource.SingleSourcePlugin; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.runtime.IPath; +import org.eclipse.osgi.util.NLS; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.IViewReference; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.handlers.HandlerUtil; + +/** + * + * SingleSourceRuntimeTypeHelperImpl is an implementation of the helper, which works with OPI shells + * and OPI views. + * + * @author Jaka Bobnar + * + */ +public class SingleSourceRuntimeTypeHelperImpl extends SingleSourceRuntimeTypeHelper { + + @Override + protected IOPIRuntime iGetOPIRuntimeForEvent(ExecutionEvent event) { + IOPIRuntime opiRuntime = iGetOPIRuntimeForShell(HandlerUtil.getActiveShell(event)); + if (opiRuntime == null) { + // if the selected object isn't an OPIShell so grab the + // OPIView or OPIRunner currently selected + IWorkbenchPart part = HandlerUtil.getActivePart(event); + if (part instanceof IOPIRuntime) + { + opiRuntime = (IOPIRuntime)part; + } + } + return opiRuntime; + } + + @Override + protected void iOpenOPIShell(IPath path, MacrosInput input) { + OPIShell.openOPIShell(path, input); + } + + @Override + protected IOPIRuntime iGetOPIRuntimeForShell(Shell shell) { + return OPIShell.getOPIShellForShell(shell); + } + + @Override + protected void iOpenDisplay(IWorkbenchPage page, RunnerInput input, DisplayMode mode) { + try + { + // Check for existing view with same input. + for (IViewReference viewReference : page.getViewReferences()) + { + if (viewReference.getId().startsWith(OPIView.ID)) + { + final IViewPart view = viewReference.getView(true); + if (view instanceof OPIView) + { + final OPIView opi_view = (OPIView)view; + if (input.equals(opi_view.getOPIInput())) + { + page.showView(viewReference.getId(), viewReference.getSecondaryId(), IWorkbenchPage.VIEW_ACTIVATE); + return; + } + } + else + OPIBuilderPlugin.getLogger().log(Level.WARNING, + "Found view " + view.getTitle() + " but its type is " + view.getClass().getName()); + } + } + // Open new View + // Create view ID that - when used with OPIRunnerPerspective - + // causes view to appear in desired location + final String secondID = OPIView.createSecondaryID(); + final Position position; + switch (mode) + { + case NEW_TAB_LEFT: position = Position.LEFT; break; + case NEW_TAB_RIGHT: position = Position.RIGHT; break; + case NEW_TAB_TOP: position = Position.TOP; break; + case NEW_TAB_BOTTOM: position = Position.BOTTOM; break; + case NEW_TAB_DETACHED: position = Position.DETACHED; break; + default: position = Position.DEFAULT_VIEW; + } + final IViewPart view = page.showView(position.getOPIViewID(), secondID, IWorkbenchPage.VIEW_ACTIVATE); + if (! (view instanceof OPIView)) + throw new PartInitException("Expected OPIView, got " + view); + final OPIView opiView = (OPIView) view; + + // Set content of view + opiView.setOPIInput(input); + + // Adjust position + if (position == Position.DETACHED) { + SingleSourcePlugin.getUIHelper().detachView(opiView); + opiView.positionFromModel(); + } + } + catch (Exception e) + { + ErrorHandlerUtil.handleError(NLS.bind("Failed to open {0} in view.", input.getPath()), e); + } + } +} diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/fragment.xml b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/fragment.xml index 247c5905bed..bb9af7fa8a0 100644 --- a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/fragment.xml +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/fragment.xml @@ -1,41 +1,6 @@ - - - - - - - - - - - - - - - diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/src/org/csstudio/opibuilder/util/SingleSourceHelperImpl.java b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/src/org/csstudio/opibuilder/util/SingleSourceHelperImpl.java index 08f8481f576..693edcfc0d5 100644 --- a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/src/org/csstudio/opibuilder/util/SingleSourceHelperImpl.java +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder.rcp/src/org/csstudio/opibuilder/util/SingleSourceHelperImpl.java @@ -11,7 +11,6 @@ import org.csstudio.opibuilder.actions.SendToElogAction; import org.csstudio.opibuilder.editparts.AbstractBaseEditPart; import org.csstudio.opibuilder.runmode.IOPIRuntime; -import org.csstudio.opibuilder.runmode.OPIShell; import org.csstudio.opibuilder.runmode.OPIView; import org.csstudio.opibuilder.widgetActions.OpenFileAction; import org.csstudio.ui.util.dialogs.ExceptionDetailsErrorDialog; @@ -36,7 +35,6 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; @@ -228,15 +226,4 @@ protected void iOpenEditor(IWorkbenchPage page, IPath path) throws Exception { SingleSourcePlugin.getUIHelper().openEditor(page, path); } - - @Override - protected void iOpenOPIShell(IPath path, MacrosInput input) { - OPIShell.openOPIShell(path, input); - } - - @Override - protected IOPIRuntime iGetOPIShellForShell(Shell shell) { - return OPIShell.getOPIShellForShell(shell); - } - } diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder/src/org/csstudio/opibuilder/runmode/OPIRunnerContextMenuProvider.java b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder/src/org/csstudio/opibuilder/runmode/OPIRunnerContextMenuProvider.java index 775bcd4f414..ef63878ab7f 100644 --- a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder/src/org/csstudio/opibuilder/runmode/OPIRunnerContextMenuProvider.java +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder/src/org/csstudio/opibuilder/runmode/OPIRunnerContextMenuProvider.java @@ -78,7 +78,7 @@ public void buildContextMenu(final IMenuManager menu) { // Only show 'full screen' and 'compact mode' options for OPIView, // not for OPIShell. - if (!OPIBuilderPlugin.isRAP() && opiRuntime instanceof OPIView) { + if (!OPIBuilderPlugin.isRAP() && (opiRuntime instanceof OPIView || opiRuntime instanceof OPIRunner)) { menu.appendToGroup(GEFActionConstants.GROUP_EDIT, WorkbenchWindowService.getInstance().getFullScreenAction(activeWindow)); menu.appendToGroup(GEFActionConstants.GROUP_EDIT, diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder/src/org/csstudio/opibuilder/runmode/RunModeService.java b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder/src/org/csstudio/opibuilder/runmode/RunModeService.java index db9a828cabe..92b083ba004 100644 --- a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder/src/org/csstudio/opibuilder/runmode/RunModeService.java +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder/src/org/csstudio/opibuilder/runmode/RunModeService.java @@ -15,6 +15,7 @@ import org.csstudio.opibuilder.util.ErrorHandlerUtil; import org.csstudio.opibuilder.util.MacrosInput; import org.csstudio.opibuilder.util.SingleSourceHelper; +import org.csstudio.opibuilder.util.SingleSourceRuntimeTypeHelper; import org.csstudio.ui.util.thread.UIBundlingThread; import org.csstudio.utility.singlesource.SingleSourcePlugin; import org.eclipse.core.runtime.IPath; @@ -122,7 +123,7 @@ public static void openDisplay(final IPath path, final Optional mac break; } case NEW_WINDOW: - if (SWT.getPlatform().startsWith("rap")) + if (OPIBuilderPlugin.isRAP()) SingleSourceHelper.rapOpenOPIInNewWindow(path); else { @@ -137,7 +138,7 @@ public static void openDisplay(final IPath path, final Optional mac } break; case NEW_SHELL: - SingleSourceHelper.openOPIShell(path, macros.orElse(null)); + SingleSourceRuntimeTypeHelper.openOPIShell(path, macros.orElse(null)); break; default: throw new Exception("Unknown display mode " + mode); @@ -176,71 +177,7 @@ public static void openDisplayInView(final IWorkbenchPage page, final RunnerInpu { UIBundlingThread.getInstance().addRunnable(() -> { - if (OPIBuilderPlugin.isRAP()) - { - try - { - page.openEditor(input, OPIRunner.ID); - } - catch (PartInitException e) - { - ErrorHandlerUtil.handleError(NLS.bind("Failed to open {0}.", input.getPath()), e); - } - } else { - try - { - // Check for existing view with same input. - for (IViewReference viewReference : page.getViewReferences()) - if (viewReference.getId().startsWith(OPIView.ID)) - { - final IViewPart view = viewReference.getView(true); - if (view instanceof OPIView) - { - final OPIView opi_view = (OPIView)view; - if (input.equals(opi_view.getOPIInput())) - { - page.showView(viewReference.getId(), viewReference.getSecondaryId(), IWorkbenchPage.VIEW_ACTIVATE); - return; - } - } - else - OPIBuilderPlugin.getLogger().log(Level.WARNING, - "Found view " + view.getTitle() + " but its type is " + view.getClass().getName()); - } - - // Open new View - // Create view ID that - when used with OPIRunnerPerspective - - // causes view to appear in desired location - final String secondID = OPIView.createSecondaryID(); - final Position position; - switch (mode) - { - case NEW_TAB_LEFT: position = Position.LEFT; break; - case NEW_TAB_RIGHT: position = Position.RIGHT; break; - case NEW_TAB_TOP: position = Position.TOP; break; - case NEW_TAB_BOTTOM: position = Position.BOTTOM; break; - case NEW_TAB_DETACHED: position = Position.DETACHED; break; - default: position = Position.DEFAULT_VIEW; - } - final IViewPart view = page.showView(position.getOPIViewID(), secondID, IWorkbenchPage.VIEW_ACTIVATE); - if (! (view instanceof OPIView)) - throw new PartInitException("Expected OPIView, got " + view); - final OPIView opiView = (OPIView) view; - - // Set content of view - opiView.setOPIInput(input); - - // Adjust position - if (position == Position.DETACHED) { - SingleSourcePlugin.getUIHelper().detachView(opiView); - opiView.positionFromModel(); - } - } - catch (Exception e) - { - ErrorHandlerUtil.handleError(NLS.bind("Failed to open {0} in view.", input.getPath()), e); - } - } + SingleSourceRuntimeTypeHelper.openDisplay(page, input, mode); }); } } diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder/src/org/csstudio/opibuilder/util/SingleSourceHelper.java b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder/src/org/csstudio/opibuilder/util/SingleSourceHelper.java index 2af0793af53..3c4bb6fdd00 100644 --- a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder/src/org/csstudio/opibuilder/util/SingleSourceHelper.java +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder/src/org/csstudio/opibuilder/util/SingleSourceHelper.java @@ -15,7 +15,6 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchPage; public abstract class SingleSourceHelper { @@ -27,26 +26,6 @@ public abstract class SingleSourceHelper { SingleSourceHelper.class); } - public static void openOPIShell(IPath path, MacrosInput input) { - if (IMPL != null) - IMPL.iOpenOPIShell(path, input); - else { - MessageDialog.openWarning(Display.getCurrent().getActiveShell(), "Not Implemented", - "Sorry, open OPI shell action is not implemented for WebOPI!"); - } - } - - protected abstract void iOpenOPIShell(IPath path, MacrosInput input); - - public static IOPIRuntime getOPIShellForShell(Shell shell) { - if (IMPL == null) - return null; - return IMPL.iGetOPIShellForShell(shell); - } - - protected abstract IOPIRuntime iGetOPIShellForShell(Shell shell); - - public static GC getImageGC(final Image image){ if(IMPL == null) return null; diff --git a/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder/src/org/csstudio/opibuilder/util/SingleSourceRuntimeTypeHelper.java b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder/src/org/csstudio/opibuilder/util/SingleSourceRuntimeTypeHelper.java new file mode 100644 index 00000000000..7272175070a --- /dev/null +++ b/applications/opibuilder/opibuilder-plugins/org.csstudio.opibuilder/src/org/csstudio/opibuilder/util/SingleSourceRuntimeTypeHelper.java @@ -0,0 +1,94 @@ +package org.csstudio.opibuilder.util; + +import org.csstudio.opibuilder.runmode.IOPIRuntime; +import org.csstudio.opibuilder.runmode.RunModeService.DisplayMode; +import org.csstudio.opibuilder.runmode.RunnerInput; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.runtime.IPath; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IWorkbenchPage; + +/** + * + * SingleSourceRuntimeTypeHelper provides methods required for opening an OPI file in runtime. The + * fragment that provides implementation of the runtime editors or views should also implement this helper class + * and perform those actions that can be performed in the running platform. + * + * @author Jaka Bobnar + * + */ +public abstract class SingleSourceRuntimeTypeHelper { + + private static final SingleSourceRuntimeTypeHelper IMPL; + + static { + IMPL = (SingleSourceRuntimeTypeHelper)ImplementationLoader.newInstance( + SingleSourceRuntimeTypeHelper.class); + } + + /** + * Opens a shell dedicated to displaying the OPI file specified by the given path. The macro input should be applied + * to the new opi. It is up to the implementor to decide which shell to use for the OPI and how to attach the OPI to + * the shell. THe implementor may even decide to share the shells among different OPIs. + * + * @param path the path to the OPI file that needs to be displayed in a shell + * @param input the macro input applied to the open OPI + */ + public static void openOPIShell(IPath path, MacrosInput input) { + if (IMPL != null) + IMPL.iOpenOPIShell(path, input); + else { + MessageDialog.openWarning(Display.getCurrent().getActiveShell(), "Not Implemented", + "Sorry, open OPI shell action is not implemented for WebOPI!"); + } + } + + protected abstract void iOpenOPIShell(IPath path, MacrosInput input); + + /** + * Returns the OPIRuntime that is open in the given shell. + * + * @param shell the shell for which the runtime is requested + * @return the opi runtime if found or null otherwise + */ + public static IOPIRuntime getOPIRuntimeForShell(Shell shell) { + if (IMPL == null) + return null; + return IMPL.iGetOPIRuntimeForShell(shell); + } + + protected abstract IOPIRuntime iGetOPIRuntimeForShell(Shell shell); + + /** + * Returns the OPIRuntime that is the best match for the given event. This can either be the runtime that matches + * the shell or runtime running in the workbench page which the event originated from. + * + * @param event the event describing where the call initiated from + * @return the opi runtime if found or null otherwise + */ + public static IOPIRuntime getOPIRuntimeForEvent(ExecutionEvent event) { + if (IMPL == null) + return null; + return IMPL.iGetOPIRuntimeForEvent(event); + } + + protected abstract IOPIRuntime iGetOPIRuntimeForEvent(ExecutionEvent event); + + /** + * Opens the OPI (defined by input) in the given page according to the display mode. The implementor can expect + * that page already exists and does not need to value the display mode. If displaying the OPI in the requested + * mode is not possible, other logic may be used to determine its location. + * + * @param page the page in which to open the OPI + * @param input the OPI input descriptor + * @param mode the display mode which defines the position of the new OPI + */ + public static void openDisplay(IWorkbenchPage page, RunnerInput input, DisplayMode mode) { + if (IMPL != null) + IMPL.iOpenDisplay(page,input,mode); + } + + protected abstract void iOpenDisplay(IWorkbenchPage page, RunnerInput input, DisplayMode mode); +} diff --git a/applications/opibuilder/opibuilder-plugins/pom.xml b/applications/opibuilder/opibuilder-plugins/pom.xml index c8ed26ff35c..0f1a399074c 100644 --- a/applications/opibuilder/opibuilder-plugins/pom.xml +++ b/applications/opibuilder/opibuilder-plugins/pom.xml @@ -26,6 +26,8 @@ org.csstudio.opibuilder.imagelib org.csstudio.opibuilder.rap org.csstudio.opibuilder.rcp + org.csstudio.opibuilder.rcp.opiruntime + org.csstudio.opibuilder.rcp.view org.csstudio.opibuilder.test org.csstudio.opibuilder.tools org.csstudio.opibuilder.widgets