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