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