tmf: Support folders in tracing projects
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / project / model / TmfTraceTypeUIUtils.java
index 202b2b928008e30bac6cce84a46f792740b32410..fa0bd8291666ba3cfc6d5f77d5b62c8bafe40818 100644 (file)
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *   Alexandre Montplaisir - Initial API and implementation
+ *   Patrick Tasse - Add support for folder elements
  *******************************************************************************/
 
 package org.eclipse.linuxtools.tmf.ui.project.model;
@@ -30,9 +31,11 @@ import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.linuxtools.tmf.core.TmfCommonConstants;
 import org.eclipse.linuxtools.tmf.core.project.model.TmfTraceImportException;
 import org.eclipse.linuxtools.tmf.core.project.model.TmfTraceType;
+import org.eclipse.linuxtools.tmf.core.project.model.TmfTraceType.TraceElementType;
 import org.eclipse.linuxtools.tmf.core.project.model.TraceTypeHelper;
 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
 import org.eclipse.linuxtools.tmf.core.util.Pair;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
@@ -55,6 +58,12 @@ public final class TmfTraceTypeUIUtils {
     /** Extension point element 'type' (should match the type in TmfTraceType) */
     public static final String TYPE_ELEM = "type"; //$NON-NLS-1$
 
+    /**
+     * Extension point element 'experiment' (should match the type in
+     * TmfTraceType)
+     */
+    public static final String EXPERIMENT_ELEM = "experiment"; //$NON-NLS-1$
+
     /** Extension point element 'Default editor' */
     public static final String DEFAULT_EDITOR_ELEM = "defaultEditor"; //$NON-NLS-1$
 
@@ -72,7 +81,8 @@ public final class TmfTraceTypeUIUtils {
 
     private static final char SEPARATOR = ':';
 
-    private TmfTraceTypeUIUtils() {}
+    private TmfTraceTypeUIUtils() {
+    }
 
     private static List<Pair<Integer, TraceTypeHelper>> reduce(List<Pair<Integer, TraceTypeHelper>> candidates) {
         List<Pair<Integer, TraceTypeHelper>> retVal = new ArrayList<>();
@@ -107,7 +117,6 @@ public final class TmfTraceTypeUIUtils {
         return count == 0;
     }
 
-
     /**
      * Is the trace type id a custom (user-defined) trace type. These are the
      * traces like : text and xml defined by the custom trace wizard.
@@ -197,6 +206,9 @@ public final class TmfTraceTypeUIUtils {
         TreeSet<Pair<Integer, TraceTypeHelper>> validCandidates = new TreeSet<>(comparator);
         final Iterable<TraceTypeHelper> traceTypeHelpers = type.getTraceTypeHelpers();
         for (TraceTypeHelper traceTypeHelper : traceTypeHelpers) {
+            if (traceTypeHelper.isExperimentType()) {
+                continue;
+            }
             int confidence = traceTypeHelper.validateWithConfidence(path);
             if (confidence >= 0) {
                 // insert in the tree map, ordered by confidence (highest confidence first) then name
@@ -207,7 +219,7 @@ public final class TmfTraceTypeUIUtils {
 
         TraceTypeHelper traceTypeToSet = null;
         if (validCandidates.isEmpty()) {
-            final String errorMsg = Messages.TmfOpenTraceHelper_NoTraceTypeMatch + path;
+            final String errorMsg = NLS.bind(Messages.TmfOpenTraceHelper_NoTraceTypeMatch, path);
             throw new TmfTraceImportException(errorMsg);
         } else if (validCandidates.size() != 1) {
             List<Pair<Integer, TraceTypeHelper>> candidates = new ArrayList<>(validCandidates);
@@ -240,7 +252,6 @@ public final class TmfTraceTypeUIUtils {
         return traceTypeToSet;
     }
 
-
     /**
      * Set the trace type of a {@Link TraceTypeHelper}. Should only be
      * used internally by this project.
@@ -259,12 +270,22 @@ public final class TmfTraceTypeUIUtils {
         resource.setPersistentProperty(TmfCommonConstants.TRACETYPE, traceTypeId);
 
         TmfProjectElement tmfProject = TmfProjectRegistry.getProject(resource.getProject(), true);
-        if (resource.getParent().equals(tmfProject.getTracesFolder().getResource())) {
-            refreshTraceElement(tmfProject.getTracesFolder().getTraces(), resource.getName());
+        if (tmfProject.getTracesFolder().getPath().isPrefixOf(resource.getFullPath())) {
+            String elementPath = resource.getFullPath().makeRelativeTo(tmfProject.getTracesFolder().getPath()).toString();
+            refreshTraceElement(tmfProject.getTracesFolder().getTraces(), elementPath);
+        } else if (resource.getParent().equals(tmfProject.getExperimentsFolder().getResource())) {
+            /* The trace type to set is for an experiment */
+            for (TmfExperimentElement experimentElement : tmfProject.getExperimentsFolder().getExperiments()) {
+                if (resource.equals(experimentElement.getResource())) {
+                    experimentElement.refreshTraceType();
+                    break;
+                }
+            }
         } else {
             for (TmfExperimentElement experimentElement : tmfProject.getExperimentsFolder().getExperiments()) {
-                if (resource.getParent().equals(experimentElement.getResource())) {
-                    refreshTraceElement(experimentElement.getTraces(), resource.getName());
+                if (experimentElement.getPath().isPrefixOf(resource.getFullPath())) {
+                    String elementPath = resource.getFullPath().makeRelativeTo(experimentElement.getPath()).toString();
+                    refreshTraceElement(experimentElement.getTraces(), elementPath);
                     break;
                 }
             }
@@ -273,9 +294,9 @@ public final class TmfTraceTypeUIUtils {
         return Status.OK_STATUS;
     }
 
-    private static void refreshTraceElement(List<TmfTraceElement> traceElements, String traceName) {
+    private static void refreshTraceElement(List<TmfTraceElement> traceElements, String elementPath) {
         for (TmfTraceElement traceElement : traceElements) {
-            if (traceElement.getName().equals(traceName)) {
+            if (traceElement.getElementPath().equals(elementPath)) {
                 traceElement.refreshTraceType();
                 break;
             }
@@ -286,14 +307,20 @@ public final class TmfTraceTypeUIUtils {
      * Retrieves all configuration elements from the platform extension registry
      * for the trace type UI extension.
      *
+     * @param elType
+     *            The type of trace type requested, either TRACE or EXPERIMENT
      * @return An array of trace type configuration elements
      */
-    public static IConfigurationElement[] getTypeUIElements() {
+    public static IConfigurationElement[] getTypeUIElements(TraceElementType elType) {
+        String elementName = TYPE_ELEM;
+        if (elType == TraceElementType.EXPERIMENT) {
+            elementName = EXPERIMENT_ELEM;
+        }
         IConfigurationElement[] elements =
                 Platform.getExtensionRegistry().getConfigurationElementsFor(TMF_TRACE_TYPE_UI_ID);
         List<IConfigurationElement> typeElements = new LinkedList<>();
         for (IConfigurationElement element : elements) {
-            if (element.getName().equals(TYPE_ELEM)) {
+            if (element.getName().equals(elementName)) {
                 typeElements.add(element);
             }
         }
@@ -305,12 +332,14 @@ public final class TmfTraceTypeUIUtils {
      *
      * @param traceType
      *            The tracetype ID
+     * @param elType
+     *            The type of trace type requested, either TRACE or EXPERIMENT
      * @return The top-level configuration element (access its children with
      *         .getChildren()). Or null if there is no such element.
      */
     @Nullable
-    public static IConfigurationElement getTraceUIAttributes(String traceType) {
-        IConfigurationElement[] elements = getTypeUIElements();
+    public static IConfigurationElement getTraceUIAttributes(String traceType, TraceElementType elType) {
+        IConfigurationElement[] elements = getTypeUIElements(elType);
         for (IConfigurationElement ce : elements) {
             if (traceType.equals(ce.getAttribute(TRACETYPE_ATTR))) {
                 return ce;
This page took 0.025927 seconds and 5 git commands to generate.