From: Patrick Tasse Date: Thu, 29 Aug 2013 17:29:33 +0000 (-0400) Subject: tmf: Bug 415707: Trace already opened should not be re-opened X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=67c53011404a7be4be4aa7649b768d7190257cb9;hp=6debe8aac94cfe2c19cbdec0ff156264a37438de;p=deliverable%2Ftracecompass.git tmf: Bug 415707: Trace already opened should not be re-opened Change-Id: I661e2d5fc27e456aa47e91bb6edeafd51d027e59 Signed-off-by: Patrick Tasse Reviewed-on: https://git.eclipse.org/r/15983 Tested-by: Hudson CI Reviewed-by: Bernd Hufmann IP-Clean: Bernd Hufmann Tested-by: Bernd Hufmann --- diff --git a/org.eclipse.linuxtools.tmf.ui.tests/src/org/eclipse/linuxtools/tmf/ui/tests/project/model/ProjectModelTraceTest.java b/org.eclipse.linuxtools.tmf.ui.tests/src/org/eclipse/linuxtools/tmf/ui/tests/project/model/ProjectModelTraceTest.java index 42dc258932..0d45af30b3 100644 --- a/org.eclipse.linuxtools.tmf.ui.tests/src/org/eclipse/linuxtools/tmf/ui/tests/project/model/ProjectModelTraceTest.java +++ b/org.eclipse.linuxtools.tmf.ui.tests/src/org/eclipse/linuxtools/tmf/ui/tests/project/model/ProjectModelTraceTest.java @@ -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(); diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/Messages.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/Messages.java index 5f9ac1c414..c2b956e0d9 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/Messages.java +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/Messages.java @@ -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; diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/OpenExperimentHandler.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/OpenExperimentHandler.java index 4b70c4a5b7..4f4cde4692 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/OpenExperimentHandler.java +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/OpenExperimentHandler.java @@ -12,37 +12,18 @@ 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; /** * OpenExperimentHandler @@ -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 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; } diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/OpenTraceHandler.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/OpenTraceHandler.java index 233cedae81..1eeb9f97b4 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/OpenTraceHandler.java +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/OpenTraceHandler.java @@ -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; } } diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/messages.properties b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/messages.properties index 3161c0f95a..4d321ac25b 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/messages.properties +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/messages.properties @@ -10,18 +10,6 @@ # 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? diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/editors/TmfEventsEditor.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/editors/TmfEventsEditor.java index b9094b8995..1dfa0916d8 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/editors/TmfEventsEditor.java +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/editors/TmfEventsEditor.java @@ -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; diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/Messages.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/Messages.java index 960bfdb170..cce6f8e33f 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/Messages.java +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/Messages.java @@ -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 diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/TmfOpenTraceHelper.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/TmfOpenTraceHelper.java index b917c06f4d..f33febf3be 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/TmfOpenTraceHelper.java +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/TmfOpenTraceHelper.java @@ -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 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(); } } diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/messages.properties b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/messages.properties index e1cddc5ef3..51325d69f4 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/messages.properties +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/messages.properties @@ -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