tmf: Put analyses under their own node in the Project View
[deliverable/tracecompass.git] / tmf / org.eclipse.tracecompass.tmf.ui / src / org / eclipse / tracecompass / tmf / ui / project / model / TmfAnalysisElement.java
index 485196d80a5f59a5130d0167479147d416497c1f..859a8c42b897c5126596c59cc6ba62966787fd48 100644 (file)
@@ -14,6 +14,7 @@
 package org.eclipse.tracecompass.tmf.ui.project.model;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -24,19 +25,25 @@ import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jface.viewers.StyledString.Styler;
+import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.graphics.TextStyle;
 import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
 import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModuleHelper;
 import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisOutput;
+import org.eclipse.tracecompass.tmf.core.project.model.ITmfPropertiesProvider;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
+import org.eclipse.tracecompass.tmf.ui.properties.ReadOnlyTextPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource2;
 import org.osgi.framework.Bundle;
 
 /**
  * Class for project elements of type analysis modules
  *
  * @author Geneviève Bastien
+ * @since 2.0
  */
-public class TmfAnalysisElement extends TmfProjectModelElement implements ITmfStyledProjectModelElement {
+public class TmfAnalysisElement extends TmfProjectModelElement implements ITmfStyledProjectModelElement, IPropertySource2 {
 
     private static final Styler ANALYSIS_CANT_EXECUTE_STYLER = new Styler() {
         @Override
@@ -48,6 +55,9 @@ public class TmfAnalysisElement extends TmfProjectModelElement implements ITmfSt
     private final @NonNull IAnalysisModuleHelper fAnalysisHelper;
     private boolean fCanExecute = true;
 
+    private static final String ANALYSIS_PROPERTIES_CATEGORY = Messages.TmfAnalysisElement_AnalysisProperties;
+    private static final String HELPER_PROPERTIES_CATEGORY = Messages.TmfAnalysisElement_HelperProperties;
+
     /**
      * Constructor
      *
@@ -59,20 +69,32 @@ public class TmfAnalysisElement extends TmfProjectModelElement implements ITmfSt
      *            Parent of the analysis
      * @param module
      *            The analysis module helper
-     * @since 1.0
+     * @since 2.0
      */
-    protected TmfAnalysisElement(String name, IResource resource, ITmfProjectModelElement parent, @NonNull IAnalysisModuleHelper module) {
+    protected TmfAnalysisElement(String name, IResource resource,
+            TmfViewsElement parent, @NonNull IAnalysisModuleHelper module) {
         super(name, resource, parent);
         fAnalysisHelper = module;
-        parent.addChild(this);
     }
 
     // ------------------------------------------------------------------------
     // TmfProjectModelElement
     // ------------------------------------------------------------------------
 
+    /**
+     * @since 2.0
+     */
     @Override
-    void refreshChildren() {
+    public TmfViewsElement getParent() {
+        /* Type enforced at constructor */
+        return (TmfViewsElement) super.getParent();
+    }
+
+    /**
+     * @since 2.0
+     */
+    @Override
+    protected void refreshChildren() {
         fCanExecute = true;
 
         /* Refresh the outputs of this analysis */
@@ -83,49 +105,68 @@ public class TmfAnalysisElement extends TmfProjectModelElement implements ITmfSt
 
         /** Get base path for resource */
         IPath path = getProject().getTracesFolder().getPath();
-        if (fResource instanceof IFolder) {
-            path = ((IFolder) fResource).getFullPath();
+        IResource resource = getResource();
+        if (resource instanceof IFolder) {
+            path = ((IFolder) resource).getFullPath();
         }
 
         /*
          * We can get a list of available outputs once the analysis is
          * instantiated when the trace is opened
          */
-        ITmfProjectModelElement parent = getParent();
-        if (parent instanceof TmfCommonProjectElement) {
-            ITmfTrace trace = ((TmfCommonProjectElement) parent).getTrace();
-            if (trace == null) {
-                deleteOutputs();
-                return;
-            }
+        TmfCommonProjectElement parentTraceElement = getParent().getParent();
 
-            IAnalysisModule module = trace.getAnalysisModule(fAnalysisHelper.getId());
-            if (module == null) {
-                deleteOutputs();
-                /*
-                 * Trace is opened, but the analysis is null, so it does not
-                 * apply
-                 */
-                fCanExecute = false;
-                return;
-            }
+        ITmfTrace trace = parentTraceElement.getTrace();
+        if (trace == null) {
+            deleteOutputs();
+            return;
+        }
 
-            for (IAnalysisOutput output : module.getOutputs()) {
-                TmfAnalysisOutputElement outputElement = childrenMap.remove(output.getName());
-                if (outputElement == null) {
-                    IFolder newresource = ResourcesPlugin.getWorkspace().getRoot().getFolder(path.append(output.getName()));
-                    outputElement = new TmfAnalysisOutputElement(output.getName(), newresource, this, output);
-                }
-                outputElement.refreshChildren();
-            }
+        IAnalysisModule module = trace.getAnalysisModule(fAnalysisHelper.getId());
+        if (module == null) {
+            deleteOutputs();
+            /*
+             * Trace is opened, but the analysis is null, so it does not
+             * apply
+             */
+            fCanExecute = false;
+            return;
+        }
 
+        for (IAnalysisOutput output : module.getOutputs()) {
+            TmfAnalysisOutputElement outputElement = childrenMap.remove(output.getName());
+            if (outputElement == null) {
+                IFolder newresource = ResourcesPlugin.getWorkspace().getRoot().getFolder(path.append(output.getName()));
+                outputElement = new TmfAnalysisOutputElement(output.getName(), newresource, this, output);
+                addChild(outputElement);
+            }
+            outputElement.refreshChildren();
         }
+
         /* Remove outputs that are not children of this analysis anymore */
         for (TmfAnalysisOutputElement output : childrenMap.values()) {
             removeChild(output);
         }
     }
 
+    /**
+     * @since 2.0
+     */
+    @Override
+    public Image getIcon() {
+        String iconFile = getIconFile();
+        if (iconFile != null) {
+            Bundle bundle = getBundle();
+            if (bundle != null) {
+                Image icon = TmfProjectModelIcons.loadIcon(bundle, iconFile);
+                if (icon != null) {
+                    return icon;
+                }
+            }
+        }
+        return TmfProjectModelIcons.DEFAULT_ANALYSIS_ICON;
+    }
+
     // ------------------------------------------------------------------------
     // TmfProjectModelElement
     // ------------------------------------------------------------------------
@@ -173,11 +214,11 @@ public class TmfAnalysisElement extends TmfProjectModelElement implements ITmfSt
      * @return The help message
      */
     public String getHelpMessage() {
-        ITmfProjectModelElement parent = getParent();
+        TmfCommonProjectElement parentTrace = getParent().getParent();
 
         ITmfTrace trace = null;
-        if (parent instanceof TmfTraceElement) {
-            TmfTraceElement traceElement = (TmfTraceElement) parent;
+        if (parentTrace instanceof TmfTraceElement) {
+            TmfTraceElement traceElement = (TmfTraceElement) parentTrace;
             trace = traceElement.getTrace();
             if (trace != null) {
                 IAnalysisModule module = trace.getAnalysisModule(fAnalysisHelper.getId());
@@ -222,14 +263,139 @@ public class TmfAnalysisElement extends TmfProjectModelElement implements ITmfSt
     /**
      * Make sure the trace this analysis is associated to is the currently
      * selected one
+     * @since 2.0
      */
-    public void activateParent() {
-        ITmfProjectModelElement parent = getParent();
+    public void activateParentTrace() {
+        TmfCommonProjectElement parentTrace = getParent().getParent();
 
-        if (parent instanceof TmfTraceElement) {
-            TmfTraceElement traceElement = (TmfTraceElement) parent;
+        if (parentTrace instanceof TmfTraceElement) {
+            TmfTraceElement traceElement = (TmfTraceElement) parentTrace;
             TmfOpenTraceHelper.openTraceFromElement(traceElement);
         }
     }
 
+    // ------------------------------------------------------------------------
+    // IPropertySource2
+    // ------------------------------------------------------------------------
+
+    /**
+     * @since 2.0
+     */
+    @Override
+    public Object getEditableValue() {
+        return null;
+    }
+
+    /**
+     * Get the analysis properties of this analysisElement if the corresponding
+     * analysis exists for the current trace
+     *
+     * @return a map with the names and values of the trace properties
+     *         respectively as keys and values
+     */
+    private Map<String, String> getAnalysisProperties() {
+        ITmfProjectModelElement parent = getParent();
+
+        if (parent instanceof TmfCommonProjectElement) {
+            ITmfTrace trace = ((TmfCommonProjectElement) parent).getTrace();
+            if (trace == null) {
+                return Collections.EMPTY_MAP;
+            }
+            IAnalysisModule module = trace.getAnalysisModule(fAnalysisHelper.getId());
+            if (module instanceof ITmfPropertiesProvider) {
+                return ((ITmfPropertiesProvider) module).getProperties();
+            }
+        }
+
+        return Collections.EMPTY_MAP;
+    }
+
+    private Map<String, String> getAnalysisHelperProperties() {
+        if (fAnalysisHelper instanceof ITmfPropertiesProvider) {
+            ITmfPropertiesProvider analysisProperties = (ITmfPropertiesProvider) fAnalysisHelper;
+            return analysisProperties.getProperties();
+        }
+        return Collections.EMPTY_MAP;
+    }
+
+    /**
+     * @since 2.0
+     */
+    @Override
+    public IPropertyDescriptor[] getPropertyDescriptors() {
+        Map<String, String> helperProperties = getAnalysisHelperProperties();
+        Map<String, String> analysisProperties = getAnalysisProperties();
+        if (!analysisProperties.isEmpty() || !helperProperties.isEmpty()) {
+            List<IPropertyDescriptor> propertyDescriptorArray = new ArrayList<>(analysisProperties.size() + helperProperties.size());
+            for (Map.Entry<String, String> varName : helperProperties.entrySet()) {
+                ReadOnlyTextPropertyDescriptor descriptor = new ReadOnlyTextPropertyDescriptor(this.getName() + '_' + varName.getKey(), varName.getKey());
+                descriptor.setCategory(HELPER_PROPERTIES_CATEGORY);
+                propertyDescriptorArray.add(descriptor);
+            }
+            for (Map.Entry<String, String> varName : analysisProperties.entrySet()) {
+                ReadOnlyTextPropertyDescriptor descriptor = new ReadOnlyTextPropertyDescriptor(this.getName() + '_' + varName.getKey(), varName.getKey());
+                descriptor.setCategory(ANALYSIS_PROPERTIES_CATEGORY);
+                propertyDescriptorArray.add(descriptor);
+            }
+            return propertyDescriptorArray.toArray(new IPropertyDescriptor[analysisProperties.size() + helperProperties.size()]);
+        }
+        return new IPropertyDescriptor[0];
+    }
+
+    /**
+     * @since 2.0
+     */
+    @Override
+    public Object getPropertyValue(Object id) {
+        if (id == null) {
+            return null;
+        }
+        Map<String, String> properties = getAnalysisHelperProperties();
+        String key = (String) id;
+        /* Remove name from key */
+        key = key.substring(this.getName().length() + 1);
+        if (properties.containsKey(key)) {
+            String value = properties.get(key);
+            return value;
+        }
+
+        properties = getAnalysisProperties();
+        if (properties.containsKey(key)) {
+            String value = properties.get(key);
+            return value;
+        }
+
+        return null;
+    }
+
+    /**
+     * @since 2.0
+     */
+    @Override
+    public final void resetPropertyValue(Object id) {
+    }
+
+    /**
+     * @since 2.0
+     */
+    @Override
+    public final void setPropertyValue(Object id, Object value) {
+    }
+
+    /**
+     * @since 2.0
+     */
+    @Override
+    public final boolean isPropertyResettable(Object id) {
+        return false;
+    }
+
+    /**
+     * @since 2.0
+     */
+    @Override
+    public final boolean isPropertySet(Object id) {
+        return false;
+    }
+
 }
This page took 0.029789 seconds and 5 git commands to generate.