+ }
+
+ /**
+ * 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();