Updated fix for bug 366089: Interface to provide trace name.
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / project / handlers / OpenExperimentHandler.java
index 7700bad2be0cbb8a8d137d9d0f20d9b74cd39443..6ed576928b0ca75b79a324d856e7ac5050984e3d 100644 (file)
 
 package org.eclipse.linuxtools.tmf.ui.project.handlers;
 
+import java.io.ByteArrayInputStream;
 import java.io.FileNotFoundException;
+import java.io.InputStream;
 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.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionProvider;
 import org.eclipse.jface.viewers.TreeSelection;
@@ -26,13 +31,22 @@ import org.eclipse.linuxtools.tmf.core.experiment.TmfExperiment;
 import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentSelectedSignal;
 import org.eclipse.linuxtools.tmf.core.signal.TmfSignalManager;
 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
+import org.eclipse.linuxtools.tmf.core.trace.TmfTrace;
+import org.eclipse.linuxtools.tmf.ui.editors.EventsViewEditor;
+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.swt.widgets.MessageBox;
+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.IWorkbenchPart;
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
 
 /**
  * <b><u>OpenExperimentHandler</u></b>
@@ -40,6 +54,8 @@ import org.eclipse.ui.PlatformUI;
  */
 public class OpenExperimentHandler extends AbstractHandler {
 
+    private static final String BOOKMARKS_HIDDEN_FILE = ".bookmarks"; //$NON-NLS-1$
+
     private TmfExperimentElement fExperiment = null;
 
     // ------------------------------------------------------------------------
@@ -90,39 +106,97 @@ public class OpenExperimentHandler extends AbstractHandler {
         if (window == null)
             return false;
 
-        // Close the current experiment, if any
-        TmfExperiment<?> currentExperiment = TmfExperiment.getCurrentExperiment();
-        if (currentExperiment != null) {
-            currentExperiment.dispose();
-        }
+        try {
+            IFile bookmarksFile = fExperiment.getProject().getExperimentsFolder().getResource().getFile(BOOKMARKS_HIDDEN_FILE);
+            if (!bookmarksFile.exists()) {
+                InputStream source = new ByteArrayInputStream(new byte[0]);
+                bookmarksFile.create(source, true, null);
+            }
+            bookmarksFile.setHidden(true);
 
-        // Instantiate the experiment's traces
-        List<TmfTraceElement> traceEntries = fExperiment.getTraces();
-        int nbTraces = traceEntries.size();
-        ITmfTrace<?>[] traces = new ITmfTrace[nbTraces];
-        for (int i = 0; i < nbTraces; i++) {
-            TmfTraceElement element = traceEntries.get(i);
-            ITmfTrace trace = element.instantiateTrace();
-            TmfEvent traceEvent = element.instantiateEvent();
-            try {
-                trace.initTrace(element.getLocation().getPath(), traceEvent.getClass());
-            } catch (FileNotFoundException e) {
-                displayErrorMsg(""); //$NON-NLS-1$
+            IFile file = fExperiment.getResource().getFile(fExperiment.getName() + '_');
+            if (!file.exists()) {
+                file.createLink(bookmarksFile.getLocation(), IResource.REPLACE, null);
+            }
+            file.setHidden(true);
+            file.setPersistentProperty(TmfTraceElement.TRACETYPE, TmfExperiment.class.getCanonicalName());
+
+            // Instantiate the experiment's traces
+            List<TmfTraceElement> traceEntries = fExperiment.getTraces();
+            int nbTraces = traceEntries.size();
+            int cacheSize = Integer.MAX_VALUE;
+            boolean useEditor = true;
+            String experimentEditorId = null;
+            ITmfTrace<?>[] traces = new ITmfTrace[nbTraces];
+            for (int i = 0; i < nbTraces; i++) {
+                TmfTraceElement element = traceEntries.get(i);
+                ITmfTrace trace = element.instantiateTrace();
+                TmfEvent traceEvent = element.instantiateEvent();
+                if (trace == null || traceEvent == null) {
+                    displayErrorMsg(Messages.OpenExperimentHandler_NoTraceType);
+                    for (int j = 0; j < i; j++) {
+                        traces[j].dispose();
+                    }
+                    return null;
+                }
+                try {
+                    trace.initTrace(fExperiment.getName(), element.getLocation().getPath(), traceEvent.getClass(), false);
+                } catch (FileNotFoundException e) {
+                    displayErrorMsg(""); //$NON-NLS-1$
+                }
+                if (trace instanceof TmfTrace) {
+                    ((TmfTrace) trace).setResource(element.getResource());
+                }
+                cacheSize = Math.min(cacheSize, trace.getCacheSize());
+                String editorId = element.getEditorId();
+                if (editorId == null) {
+                    useEditor = false;
+                    experimentEditorId = null;
+                } else if (useEditor) {
+                    if (experimentEditorId == null) {
+                        experimentEditorId = editorId;
+                    } else if (!editorId.equals(experimentEditorId)) {
+                        useEditor = false;
+                    }
+                }
+                traces[i] = trace;
             }
-            traces[i] = trace;
-        }
 
-        // Create the experiment and signal
-        TmfExperiment experiment = new TmfExperiment(traces[0].getClass(), fExperiment.getName(), traces, traces[0].getCacheSize());
-        TmfExperiment.setCurrentExperiment(experiment);
-        TmfSignalManager.dispatchSignal(new TmfExperimentSelectedSignal(this, experiment));
+            // Create the experiment
+            TmfExperiment experiment = new TmfExperiment(TmfEvent.class, fExperiment.getName(), traces, cacheSize);
+            experiment.setResource(file);
+
+            if (useEditor) {
+                IEditorInput editorInput = new TmfEditorInput(file, experiment);
+                IWorkbench wb = PlatformUI.getWorkbench();
+                IWorkbenchPage activePage = wb.getActiveWorkbenchWindow().getActivePage();
+    
+                String editorId = TmfEventsEditor.ID;
+                IEditorPart editor = activePage.findEditor(editorInput);
+                if (editor != null && editor instanceof IReusableEditor) {
+                    activePage.reuseEditor((IReusableEditor) editor, editorInput);
+                    activePage.activate(editor);
+                } else {
+                    editor = activePage.openEditor(editorInput, editorId);
+                }
+                experiment.initTrace(null, null, null, true);
+                IDE.setDefaultEditor(file, editorId);
+                // editor should dispose the experiment on close
+            } else {
+                TmfExperiment.setCurrentExperiment(experiment);
+                TmfSignalManager.dispatchSignal(new TmfExperimentSelectedSignal(this, experiment));
+                IDE.setDefaultEditor(file, EventsViewEditor.ID);
+            }
+        } catch (CoreException e) {
+            displayErrorMsg(e.getMessage());
+        }
 
         return null;
     }
 
     private void displayErrorMsg(String errorMsg) {
         MessageBox mb = new MessageBox(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
-        mb.setText(Messages.OpenTraceHandler_Title);
+        mb.setText(Messages.OpenExperimentHandler_Title);
         mb.setMessage(errorMsg);
         mb.open();
     }
This page took 0.026942 seconds and 5 git commands to generate.