tmf: Bug 415707: Trace already opened should not be re-opened
authorPatrick Tasse <patrick.tasse@gmail.com>
Thu, 29 Aug 2013 17:29:33 +0000 (13:29 -0400)
committerPatrick Tasse <patrick.tasse@gmail.com>
Wed, 4 Sep 2013 16:07:25 +0000 (12:07 -0400)
Change-Id: I661e2d5fc27e456aa47e91bb6edeafd51d027e59
Signed-off-by: Patrick Tasse <patrick.tasse@gmail.com>
Reviewed-on: https://git.eclipse.org/r/15983
Tested-by: Hudson CI
Reviewed-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
IP-Clean: Bernd Hufmann <bernd.hufmann@ericsson.com>
Tested-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
org.eclipse.linuxtools.tmf.ui.tests/src/org/eclipse/linuxtools/tmf/ui/tests/project/model/ProjectModelTraceTest.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/Messages.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/OpenExperimentHandler.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/OpenTraceHandler.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/messages.properties
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/editors/TmfEventsEditor.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/Messages.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/TmfOpenTraceHelper.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/messages.properties

index 42dc258932b121d34db663d271103cb3ac104c4e..0d45af30b3fff0299321a84d1ca5e60faf064fe8 100644 (file)
@@ -12,7 +12,6 @@
 
 package org.eclipse.linuxtools.tmf.ui.tests.project.model;
 
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -94,8 +93,8 @@ public class ProjectModelTraceTest {
 
         ITmfTrace trace2 = TmfTraceManager.getInstance().getActiveTrace();
 
-        /* The trace was reopened, it is not the same as before */
-        assertFalse(trace2 == trace);
+        /* The trace was reopened, it should be the same as before */
+        assertTrue(trace2 == trace);
 
         /* Here, the getTrace() should return the same as active trace */
         trace = traceElement.getTrace();
index 5f9ac1c4146095623eb0a4d598c7a6a85f1424f8..c2b956e0d9a1ee9e23fb60529b386ee362ee69ad 100644 (file)
@@ -26,16 +26,6 @@ public class Messages extends NLS {
 
     private static final String BUNDLE_NAME = "org.eclipse.linuxtools.internal.tmf.ui.project.handlers.messages"; //$NON-NLS-1$
 
-    public static String OpenTraceHandler_Title;
-    public static String OpenTraceHandler_NoTraceType;
-    public static String OpenTraceHandler_InitError;
-    public static String OpenTraceHandler_Error;
-
-    public static String OpenExperimentHandler_Title;
-    public static String OpenExperimentHandler_NoTraceType;
-    public static String OpenExperimentHandler_InitError;
-    public static String OpenExperimentHandler_Error;
-
     public static String DeleteDialog_Title;
     public static String DeleteTraceHandler_Message;
     public static String DeleteTraceHandler_Error;
index 4b70c4a5b74d2815df9d88eb04e0a76846d652c9..4f4cde46928ea28d338552be7e4305add7f2dc7a 100644 (file)
 
 package org.eclipse.linuxtools.internal.tmf.ui.project.handlers;
 
-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.CoreException;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionProvider;
 import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.linuxtools.internal.tmf.ui.Activator;
-import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
-import org.eclipse.linuxtools.tmf.core.exceptions.TmfTraceException;
-import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
-import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment;
-import org.eclipse.linuxtools.tmf.ui.editors.TmfEditorInput;
-import org.eclipse.linuxtools.tmf.ui.editors.TmfEventsEditor;
 import org.eclipse.linuxtools.tmf.ui.project.model.TmfExperimentElement;
-import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceElement;
-import org.eclipse.linuxtools.tmf.ui.project.model.TraceUtils;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IReusableEditor;
-import org.eclipse.ui.IWorkbench;
+import org.eclipse.linuxtools.tmf.ui.project.model.TmfOpenTraceHelper;
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.FileEditorInput;
 
 /**
  * <b><u>OpenExperimentHandler</u></b>
@@ -102,111 +83,15 @@ public class OpenExperimentHandler extends AbstractHandler {
         // Check if we are closing down
         final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
         if (window == null) {
-            return false;
+            return null;
         }
 
-        final TmfExperimentElement experimentElement = fExperiment;
-
-        Thread thread = new Thread() {
-            @Override
-            public void run() {
-
-                final IFile file;
-                try {
-                    file = experimentElement.createBookmarksFile();
-                } catch (final CoreException e) {
-                    Activator.getDefault().logError("Error opening experiment " + experimentElement.getName(), e); //$NON-NLS-1$
-                    TraceUtils.displayErrorMsg(Messages.OpenExperimentHandler_Title, Messages.OpenExperimentHandler_Error + "\n\n" + e.getMessage()); //$NON-NLS-1$
-                    return;
-                }
-
-                /* Unlike traces, there is no instanceExperiment, so we call this function
-                 * here alone.  Maybe it would be better to do this on experiment's element
-                 * constructor?
-                 */
-                experimentElement.refreshSupplementaryFolder();
-
-                // Instantiate the experiment's traces
-                final List<TmfTraceElement> traceEntries = experimentElement.getTraces();
-                final int nbTraces = traceEntries.size();
-                int cacheSize = Integer.MAX_VALUE;
-                String commonEditorId = null;
-                final ITmfTrace[] traces = new ITmfTrace[nbTraces];
-                for (int i = 0; i < nbTraces; i++) {
-                    TmfTraceElement element = traceEntries.get(i);
-
-                    // Since trace is under an experiment, use the original trace from the traces folder
-                    element = element.getElementUnderTraceFolder();
-
-                    final ITmfTrace trace = element.instantiateTrace();
-                    final ITmfEvent traceEvent = element.instantiateEvent();
-                    if ((trace == null) || (traceEvent == null)) {
-                        TraceUtils.displayErrorMsg(Messages.OpenExperimentHandler_Title, Messages.OpenExperimentHandler_NoTraceType);
-                        for (int j = 0; j < i; j++) {
-                            traces[j].dispose();
-                        }
-                        if (trace != null) {
-                            trace.dispose();
-                        }
-                        return;
-                    }
-                    try {
-                        trace.initTrace(element.getResource(), element.getLocation().getPath(), traceEvent.getClass());
-                    } catch (final TmfTraceException e) {
-                        TraceUtils.displayErrorMsg(Messages.OpenExperimentHandler_Title, Messages.OpenTraceHandler_InitError + '\n'+'\n' + e);
-                        for (int j = 0; j < i; j++) {
-                            traces[j].dispose();
-                        }
-                        trace.dispose();
-                        return;
-                    }
-                    cacheSize = Math.min(cacheSize, trace.getCacheSize());
-
-                    // If all traces use the same editorId, use it, otherwise use the default
-                    final String editorId = element.getEditorId();
-                    if (commonEditorId == null) {
-                        commonEditorId = (editorId != null) ? editorId : TmfEventsEditor.ID;
-                    } else if (!commonEditorId.equals(editorId)) {
-                        commonEditorId = TmfEventsEditor.ID;
-                    }
-                    traces[i] = trace;
-                }
-
-                // Create the experiment
-                final TmfExperiment experiment = new TmfExperiment(ITmfEvent.class, experimentElement.getName(), traces, cacheSize, experimentElement.getResource());
-                experiment.setBookmarksFile(file);
-
-                final String editorId = commonEditorId;
-                Display.getDefault().asyncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        try {
-                            final IEditorInput editorInput = new TmfEditorInput(file, experiment);
-                            final IWorkbench wb = PlatformUI.getWorkbench();
-                            final IWorkbenchPage activePage = wb.getActiveWorkbenchWindow().getActivePage();
-
-                            final IEditorPart editor = activePage.findEditor(new FileEditorInput(file));
-                            if ((editor != null) && (editor instanceof IReusableEditor)) {
-                                activePage.reuseEditor((IReusableEditor) editor, editorInput);
-                                activePage.activate(editor);
-                            } else {
-                                activePage.openEditor(editorInput, editorId);
-                            }
-                            IDE.setDefaultEditor(file, editorId);
-                            // editor should dispose the experiment on close
-                        } catch (final CoreException e) {
-                            Activator.getDefault().logError("Error opening experiment " + experimentElement.getName(), e); //$NON-NLS-1$
-                            TraceUtils.displayErrorMsg(Messages.OpenExperimentHandler_Title, Messages.OpenExperimentHandler_Error + "\n\n" + e.getMessage()); //$NON-NLS-1$
-                            experiment.dispose();
-                            return;
-                        }
-                    }
-                });
-            }
-        };
-
-        thread.start();
+        // Check that the experiment is valid
+        if (fExperiment == null) {
+            return null;
+        }
 
+        TmfOpenTraceHelper.openExperimentFromElement(fExperiment);
         return null;
     }
 
index 233cedae81b74ba8827d7ae9042a607660c5a0a0..1eeb9f97b4f415166d2a9411913f69475f6c7574 100644 (file)
@@ -97,7 +97,8 @@ public class OpenTraceHandler extends AbstractHandler {
         }
 
         // If trace is under an experiment, use the original trace from the traces folder
-        return TmfOpenTraceHelper.openTraceFromElement(fTrace.getElementUnderTraceFolder());
+        TmfOpenTraceHelper.openTraceFromElement(fTrace.getElementUnderTraceFolder());
+        return null;
     }
 
 }
index 3161c0f95a042648845911044b932b36a6b93874..4d321ac25bb4514d5fc6fb5efccc40c44108723f 100644 (file)
 #     Ericsson - Initial API and implementation
 ###############################################################################
 
-# Open trace error messages
-OpenTraceHandler_Title = Open Trace
-OpenTraceHandler_NoTraceType = No trace type associated to that trace\nPlease select a valid type
-OpenTraceHandler_InitError = Error initializing trace.
-OpenTraceHandler_Error = Error opening trace.
-
-# Open experiment error messages
-OpenExperimentHandler_Title = Open Experiment
-OpenExperimentHandler_NoTraceType = No trace type associated to an experiment trace\nPlease select a valid type
-OpenExperimentHandler_InitError = Error initializing experiment.
-OpenExperimentHandler_Error = Error opening experiment.
-
 # Delete message
 DeleteDialog_Title = Confirm Delete
 DeleteTraceHandler_Message = Are you sure you want to delete this trace?
index b9094b899536d8801d9bac1f726c90e321eb64f3..1dfa0916d85be40b75c55a391e98dd20e63a88e5 100644 (file)
@@ -41,7 +41,6 @@ import org.eclipse.linuxtools.internal.tmf.ui.Activator;
 import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomEventsTable;
 import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomTxtTrace;
 import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomXmlTrace;
-import org.eclipse.linuxtools.internal.tmf.ui.project.handlers.Messages;
 import org.eclipse.linuxtools.tmf.core.TmfCommonConstants;
 import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
 import org.eclipse.linuxtools.tmf.core.exceptions.TmfTraceException;
@@ -55,6 +54,7 @@ import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
 import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment;
 import org.eclipse.linuxtools.tmf.core.trace.TmfTrace;
 import org.eclipse.linuxtools.tmf.ui.project.model.ITmfProjectModelElement;
+import org.eclipse.linuxtools.tmf.ui.project.model.Messages;
 import org.eclipse.linuxtools.tmf.ui.project.model.TmfExperimentElement;
 import org.eclipse.linuxtools.tmf.ui.project.model.TmfNavigatorContentProvider;
 import org.eclipse.linuxtools.tmf.ui.project.model.TmfProjectElement;
@@ -122,7 +122,7 @@ public class TmfEventsEditor extends TmfEditor implements ITmfTraceEditor, IReus
             try {
                 final String traceTypeId = fFile.getPersistentProperty(TmfCommonConstants.TRACETYPE);
                 if (traceTypeId == null) {
-                    throw new PartInitException(Messages.OpenTraceHandler_NoTraceType);
+                    throw new PartInitException(Messages.TmfOpenTraceHelper_NoTraceType);
                 }
                 if (traceTypeId.equals(TmfExperiment.class.getCanonicalName())) {
                     // Special case: experiment bookmark resource
@@ -130,7 +130,7 @@ public class TmfEventsEditor extends TmfEditor implements ITmfTraceEditor, IReus
                     ncp.getChildren(fFile.getProject()); // force the model to be populated
                     final TmfProjectElement project = TmfProjectRegistry.getProject(fFile.getProject());
                     if (project == null) {
-                        throw new PartInitException(Messages.OpenExperimentHandler_NoTraceType);
+                        throw new PartInitException(Messages.TmfOpenTraceHelper_NoTraceType);
                     }
                     for (final ITmfProjectModelElement projectElement : project.getExperimentsFolder().getChildren()) {
                         final String traceName = fFile.getParent().getName();
@@ -149,12 +149,12 @@ public class TmfEventsEditor extends TmfEditor implements ITmfTraceEditor, IReus
                                     for (int j = 0; j < i; j++) {
                                         traces[j].dispose();
                                     }
-                                    throw new PartInitException(Messages.OpenExperimentHandler_NoTraceType);
+                                    throw new PartInitException(Messages.TmfOpenTraceHelper_NoTraceType);
                                 }
                                 try {
                                     trace.initTrace(traceElement.getResource(), traceElement.getLocation().getPath(), traceEvent.getClass());
                                 } catch (final TmfTraceException e) {
-                                    throw new PartInitException(Messages.OpenTraceHandler_InitError, e);
+                                    throw new PartInitException(Messages.TmfOpenTraceHelper_InitError, e);
                                 }
                                 cacheSize = Math.min(cacheSize, trace.getCacheSize());
                                 traces[i] = trace;
@@ -178,12 +178,12 @@ public class TmfEventsEditor extends TmfEditor implements ITmfTraceEditor, IReus
                             final ITmfTrace trace = traceElement.instantiateTrace();
                             final ITmfEvent traceEvent = traceElement.instantiateEvent();
                             if ((trace == null) || (traceEvent == null)) {
-                                throw new PartInitException(Messages.OpenTraceHandler_NoTraceType);
+                                throw new PartInitException(Messages.TmfOpenTraceHelper_NoTraceType);
                             }
                             try {
                                 trace.initTrace(traceElement.getResource(), traceElement.getLocation().getPath(), traceEvent.getClass());
                             } catch (final TmfTraceException e) {
-                                throw new PartInitException(Messages.OpenTraceHandler_InitError, e);
+                                throw new PartInitException(Messages.TmfOpenTraceHelper_InitError, e);
                             }
                             fTrace = trace;
                             break;
@@ -200,12 +200,12 @@ public class TmfEventsEditor extends TmfEditor implements ITmfTraceEditor, IReus
                             final ITmfTrace trace = traceElement.instantiateTrace();
                             final ITmfEvent traceEvent = traceElement.instantiateEvent();
                             if ((trace == null) || (traceEvent == null)) {
-                                throw new PartInitException(Messages.OpenTraceHandler_NoTraceType);
+                                throw new PartInitException(Messages.TmfOpenTraceHelper_NoTraceType);
                             }
                             try {
                                 trace.initTrace(traceElement.getResource(), traceElement.getLocation().getPath(), traceEvent.getClass());
                             } catch (final TmfTraceException e) {
-                                throw new PartInitException(Messages.OpenTraceHandler_InitError, e);
+                                throw new PartInitException(Messages.TmfOpenTraceHelper_InitError, e);
                             }
                             fTrace = trace;
                             break;
index 960bfdb1701a763894a2e9e2a546b2d3109d9c14..cce6f8e33fa487cfdcfca2de8360e10980707ee7 100644 (file)
@@ -47,20 +47,26 @@ public class Messages extends NLS {
 
     /** Error opening a trace */
     public static String TmfOpenTraceHelper_ErrorOpeningTrace;
+    /** Error opening an experiment */
+    public static String TmfOpenTraceHelper_ErrorOpeningExperiment;
     /** Could not link trace */
     public static String TmfOpenTraceHelper_LinkFailed;
     /** No trace type match */
     public static String TmfOpenTraceHelper_NoTraceTypeMatch;
     /** Open Trace*/
     public static String TmfOpenTraceHelper_OpenTrace;
+    /** Open Experiment*/
+    public static String TmfOpenTraceHelper_OpenExperiment;
     /** Reduce was too efficient, no candidates found! */
     public static String TmfOpenTraceHelper_ReduceError;
     /** No trace type */
     public static String TmfOpenTraceHelper_NoTraceType;
+    /** Error opening trace*/
+    public static String TmfOpenTraceHelper_ErrorTrace;
+    /** Error opening experiment */
+    public static String TmfOpenTraceHelper_ErrorExperiment;
     /** Init error */
     public static String TmfOpenTraceHelper_InitError;
-    /** Error */
-    public static String TmfOpenTraceHelper_Error;
 
     static {
         // initialize resource bundle
index b917c06f4d4fa0bb6d30bee09cc580d8069fae0d..f33febf3be398b442065bdb607540f68424b12c3 100644 (file)
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *   Matthew Khouzam - Initial API and implementation
+ *   Patrick Tasse - Update open trace and add open experiment
  **********************************************************************/
 
 package org.eclipse.linuxtools.tmf.ui.project.model;
@@ -33,6 +34,7 @@ import org.eclipse.linuxtools.internal.tmf.ui.project.model.TmfTraceImportExcept
 import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
 import org.eclipse.linuxtools.tmf.core.exceptions.TmfTraceException;
 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
+import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment;
 import org.eclipse.linuxtools.tmf.ui.editors.TmfEditorInput;
 import org.eclipse.linuxtools.tmf.ui.editors.TmfEventsEditor;
 import org.eclipse.swt.widgets.Display;
@@ -40,7 +42,6 @@ import org.eclipse.swt.widgets.MessageBox;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IReusableEditor;
 import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.PartInitException;
@@ -173,17 +174,36 @@ public class TmfOpenTraceHelper {
         if (found == null) {
             return new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.TmfOpenTraceHelper_ErrorOpeningTrace);
         }
-        return openTraceFromElement(found);
+        openTraceFromElement(found);
+        return Status.OK_STATUS;
     }
 
     /**
-     * Open a trace from a TmfTraceElement
+     * Open a trace from a trace element. If the trace is already opened,
+     * its editor is activated and brought to top.
      *
      * @param traceElement
      *            the {@link TmfTraceElement} to open
-     * @return Status.OK_STATUS
      */
-    public static IStatus openTraceFromElement(final TmfTraceElement traceElement) {
+    public static void openTraceFromElement(final TmfTraceElement traceElement) {
+
+        final IFile file;
+        try {
+            file = traceElement.createBookmarksFile();
+        } catch (final CoreException e) {
+            Activator.getDefault().logError(Messages.TmfOpenTraceHelper_ErrorOpeningTrace + ' ' + traceElement.getName());
+            TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenTrace, Messages.TmfOpenTraceHelper_ErrorTrace + ENDL + ENDL + e.getMessage());
+            return;
+        }
+
+        final IWorkbench wb = PlatformUI.getWorkbench();
+        final IWorkbenchPage activePage = wb.getActiveWorkbenchWindow().getActivePage();
+        final IEditorPart editor = activePage.findEditor(new FileEditorInput(file));
+        if (editor != null) {
+            activePage.activate(editor);
+            return;
+        }
+
         Thread thread = new Thread() {
             @Override
             public void run() {
@@ -191,16 +211,13 @@ public class TmfOpenTraceHelper {
                 final ITmfTrace trace = traceElement.instantiateTrace();
                 final ITmfEvent traceEvent = traceElement.instantiateEvent();
                 if ((trace == null) || (traceEvent == null)) {
+                    TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenTrace, Messages.TmfOpenTraceHelper_NoTraceType);
                     if (trace != null) {
-                        TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenTrace, Messages.TmfOpenTraceHelper_NoTraceType);
                         trace.dispose();
                     }
                     return;
                 }
 
-                // Get the editor_id from the extension point
-                String traceEditorId = traceElement.getEditorId();
-                final String editorId = (traceEditorId != null) ? traceEditorId : TmfEventsEditor.ID;
                 try {
                     trace.initTrace(traceElement.getResource(), traceElement.getLocation().getPath(), traceEvent.getClass());
                 } catch (final TmfTraceException e) {
@@ -209,35 +226,21 @@ public class TmfOpenTraceHelper {
                     return;
                 }
 
-                final IFile file;
-                try {
-                    file = traceElement.createBookmarksFile();
-                } catch (final CoreException e) {
-                    Activator.getDefault().logError(Messages.TmfOpenTraceHelper_ErrorOpeningTrace + traceElement.getName());
-                    TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenTrace, Messages.TmfOpenTraceHelper_Error + ENDL + ENDL + e.getMessage());
-                    trace.dispose();
-                    return;
-                }
+                // Get the editor id from the extension point
+                String traceEditorId = traceElement.getEditorId();
+                final String editorId = (traceEditorId != null) ? traceEditorId : TmfEventsEditor.ID;
+                final IEditorInput editorInput = new TmfEditorInput(file, trace);
 
                 Display.getDefault().asyncExec(new Runnable() {
                     @Override
                     public void run() {
                         try {
-                            final IEditorInput editorInput = new TmfEditorInput(file, trace);
-                            final IWorkbench wb = PlatformUI.getWorkbench();
-                            final IWorkbenchPage activePage = wb.getActiveWorkbenchWindow().getActivePage();
-                            final IEditorPart editor = activePage.findEditor(new FileEditorInput(file));
-                            if ((editor != null) && (editor instanceof IReusableEditor)) {
-                                activePage.reuseEditor((IReusableEditor) editor, editorInput);
-                                activePage.activate(editor);
-                            } else {
-                                activePage.openEditor(editorInput, editorId);
-                                IDE.setDefaultEditor(file, editorId);
-                                // editor should dispose the trace on close
-                            }
+                            activePage.openEditor(editorInput, editorId);
+                            IDE.setDefaultEditor(file, editorId);
+                            // editor should dispose the trace on close
                         } catch (final PartInitException e) {
                             TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenTrace, Messages.TmfOpenTraceHelper_ErrorOpeningTrace + ENDL + ENDL + e.getMessage());
-                            Activator.getDefault().logError(Messages.TmfOpenTraceHelper_ErrorOpeningTrace + traceElement.getName());
+                            Activator.getDefault().logError(Messages.TmfOpenTraceHelper_ErrorOpeningTrace + ' ' + traceElement.getName());
                             trace.dispose();
                         }
                     }
@@ -245,7 +248,114 @@ public class TmfOpenTraceHelper {
             }
         };
         thread.start();
-        return Status.OK_STATUS;
+    }
+
+    /**
+     * Open an experiment from an experiment element. If the experiment is already opened,
+     * its editor is activated and brought to top.
+     *
+     * @param experimentElement
+     *            the {@link TmfExperimentElement} to open
+     */
+    public static void openExperimentFromElement(final TmfExperimentElement experimentElement) {
+
+        final IFile file;
+        try {
+            file = experimentElement.createBookmarksFile();
+        } catch (final CoreException e) {
+            Activator.getDefault().logError(Messages.TmfOpenTraceHelper_ErrorOpeningExperiment + ' ' + experimentElement.getName());
+            TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenExperiment, Messages.TmfOpenTraceHelper_ErrorExperiment + ENDL + ENDL + e.getMessage());
+            return;
+        }
+
+        final IWorkbench wb = PlatformUI.getWorkbench();
+        final IWorkbenchPage activePage = wb.getActiveWorkbenchWindow().getActivePage();
+        final IEditorPart editor = activePage.findEditor(new FileEditorInput(file));
+        if (editor != null) {
+            activePage.activate(editor);
+            return;
+        }
+
+        Thread thread = new Thread() {
+            @Override
+            public void run() {
+
+                /* Unlike traces, there is no instanceExperiment, so we call this function
+                 * here alone.  Maybe it would be better to do this on experiment's element
+                 * constructor?
+                 */
+                experimentElement.refreshSupplementaryFolder();
+
+                // Instantiate the experiment's traces
+                final List<TmfTraceElement> traceEntries = experimentElement.getTraces();
+                final int nbTraces = traceEntries.size();
+                int cacheSize = Integer.MAX_VALUE;
+                String commonEditorId = null;
+                final ITmfTrace[] traces = new ITmfTrace[nbTraces];
+                for (int i = 0; i < nbTraces; i++) {
+                    TmfTraceElement element = traceEntries.get(i);
+
+                    // Since trace is under an experiment, use the original trace from the traces folder
+                    element = element.getElementUnderTraceFolder();
+
+                    final ITmfTrace trace = element.instantiateTrace();
+                    final ITmfEvent traceEvent = element.instantiateEvent();
+                    if ((trace == null) || (traceEvent == null)) {
+                        TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenExperiment, Messages.TmfOpenTraceHelper_NoTraceType);
+                        for (int j = 0; j < i; j++) {
+                            traces[j].dispose();
+                        }
+                        if (trace != null) {
+                            trace.dispose();
+                        }
+                        return;
+                    }
+                    try {
+                        trace.initTrace(element.getResource(), element.getLocation().getPath(), traceEvent.getClass());
+                    } catch (final TmfTraceException e) {
+                        TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenExperiment, Messages.TmfOpenTraceHelper_InitError + ENDL + ENDL + e);
+                        for (int j = 0; j < i; j++) {
+                            traces[j].dispose();
+                        }
+                        trace.dispose();
+                        return;
+                    }
+                    cacheSize = Math.min(cacheSize, trace.getCacheSize());
+
+                    // If all traces use the same editorId, use it, otherwise use the default
+                    final String editorId = element.getEditorId();
+                    if (commonEditorId == null) {
+                        commonEditorId = (editorId != null) ? editorId : TmfEventsEditor.ID;
+                    } else if (!commonEditorId.equals(editorId)) {
+                        commonEditorId = TmfEventsEditor.ID;
+                    }
+                    traces[i] = trace;
+                }
+
+                // Create the experiment
+                final TmfExperiment experiment = new TmfExperiment(ITmfEvent.class, experimentElement.getName(), traces, cacheSize, experimentElement.getResource());
+                experiment.setBookmarksFile(file);
+
+                final String editorId = commonEditorId;
+                final IEditorInput editorInput = new TmfEditorInput(file, experiment);
+
+                Display.getDefault().asyncExec(new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            activePage.openEditor(editorInput, editorId);
+                            IDE.setDefaultEditor(file, editorId);
+                            // editor should dispose the trace on close
+                        } catch (final PartInitException e) {
+                            TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenExperiment, Messages.TmfOpenTraceHelper_ErrorOpeningExperiment + ENDL + ENDL + e.getMessage());
+                            Activator.getDefault().logError(Messages.TmfOpenTraceHelper_ErrorOpeningExperiment + ' ' + experimentElement.getName());
+                            experiment.dispose();
+                        }
+                    }
+                });
+            }
+        };
+        thread.start();
     }
 
 }
index e1cddc5ef3b8b57c714ee2a66700bd3c1890fd21..51325d69f45a4019e50ce16dee73e42229e3d389 100644 (file)
@@ -21,10 +21,13 @@ TmfTraceElement_IsLinked = linked
 
 # Open trace error messages
 TmfOpenTraceHelper_ErrorOpeningTrace=Error opening trace
+TmfOpenTraceHelper_ErrorOpeningExperiment=Error opening experiment
 TmfOpenTraceHelper_LinkFailed=Link creation failed
 TmfOpenTraceHelper_NoTraceTypeMatch=No trace types found to match location
 TmfOpenTraceHelper_OpenTrace=Open Trace
+TmfOpenTraceHelper_OpenExperiment=Open Experiment
 TmfOpenTraceHelper_ReduceError=Something went wrong
 TmfOpenTraceHelper_NoTraceType=No trace type associated to that trace\nPlease select a valid type
-TmfOpenTraceHelper_Error=Error opening trace.
+TmfOpenTraceHelper_ErrorTrace=Error opening trace.
+TmfOpenTraceHelper_ErrorExperiment=Error opening experiment.
 TmfOpenTraceHelper_InitError = Error initializing trace.
\ No newline at end of file
This page took 0.035334 seconds and 5 git commands to generate.