Fix for Bug338151
authorFrancois Chouinard <fchouinard@gmail.com>
Mon, 14 Mar 2011 15:14:16 +0000 (11:14 -0400)
committerFrancois Chouinard <fchouinard@gmail.com>
Mon, 14 Mar 2011 15:14:16 +0000 (11:14 -0400)
19 files changed:
org.eclipse.linuxtools.lttng.ui.tests/stubs/org/eclipse/linuxtools/lttng/stubs/LTTngTraceStub.java
org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/model/trange/TimeRangeComponent.java
org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/model/trange/TimeRangeComposite.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/trace/LTTngTextTrace.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/trace/LTTngTrace.java
org.eclipse.linuxtools.tmf.ui/META-INF/MANIFEST.MF
org.eclipse.linuxtools.tmf.ui/icons/eview16/colors_view.gif [new file with mode: 0644]
org.eclipse.linuxtools.tmf.ui/icons/eview16/filters_view.gif [new file with mode: 0644]
org.eclipse.linuxtools.tmf.ui/plugin.properties
org.eclipse.linuxtools.tmf.ui/plugin.xml
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/parsers/IParserProvider.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/parsers/ParserProviderManager.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/parsers/custom/CustomParserProvider.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterDialog.java [new file with mode: 0644]
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterManager.java [new file with mode: 0644]
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterTreeContentProvider.java [new file with mode: 0644]
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterTreeLabelProvider.java [new file with mode: 0644]
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterView.java [new file with mode: 0644]
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterViewer.java [new file with mode: 0644]

index bb9916cb69ff2e107f43626a7d480078cf85a4b2..7a3f84e1a3bd978b3762fa94bd242dfdc30cecd2 100644 (file)
@@ -115,6 +115,18 @@ public class LTTngTraceStub extends TmfTrace<LttngEvent> {
         return context;
     }
 
+    @Override
+    public TmfContext seekLocation(double ratio) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public double getLocationRatio(ITmfLocation<?> location) {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
     /* (non-Javadoc)
      * @see org.eclipse.linuxtools.tmf.eventlog.ITmfStreamLocator#getCurrentLocation()
      */
index e4c8dec30f1cd39a8c153b9dbe9bef9c2f8a1977..64c51df0cfe57ee832fb099efd08af4a42cbc065 100644 (file)
  *******************************************************************************/
 package org.eclipse.linuxtools.lttng.ui.model.trange;
 
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITimeEvent;
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry;
+
 
 /**
  * @author alvaro
  * 
  */
-public abstract class TimeRangeComponent implements ITimeRangeComponent {
+public abstract class TimeRangeComponent implements ITimeRangeComponent, ITimeEvent {
 
        // ========================================================================
        // Data
@@ -98,6 +101,21 @@ public abstract class TimeRangeComponent implements ITimeRangeComponent {
                return visible;
        }
 
+       @Override
+       public ITmfTimeAnalysisEntry getEntry() {
+               return eventParent;
+       }
+
+       @Override
+       public long getTime() {
+               return startTime;
+       }
+
+       @Override
+       public long getDuration() {
+               return stopTime - startTime;
+       }
+
     @Override
     @SuppressWarnings("nls")
     public String toString() {
index 3a299f09b4b21dad9c297f304569b35fb479e4f7..c5e364362dfa90cedd5e90027d4da8dbb2ed1a24 100644 (file)
  *******************************************************************************/
 package org.eclipse.linuxtools.lttng.ui.model.trange;
 
+import java.util.Iterator;
 import java.util.Vector;
 
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITimeEvent;
 import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry;
 
 public class TimeRangeComposite extends TimeRangeComponent implements
@@ -157,11 +159,28 @@ ITmfTimeAnalysisEntry {
         */
        @Override
        @SuppressWarnings("unchecked")
-       public Vector<TimeRangeComponent> getTraceEvents() {
+       @Deprecated public Vector<TimeRangeComponent> getTraceEvents() {
                return ChildEventLeafs;
        }
 
-       /**
+       @Override
+       public Iterator<TimeRangeComponent> getTraceEventsIterator() {
+               return ChildEventLeafs.iterator();
+       }
+
+       @Override
+       public Iterator<TimeRangeComponent> getTraceEventsIterator(long startTime, long stopTime, long visibleDuration) {
+               return ChildEventLeafs.iterator();
+       }
+
+       @Override
+       public void addTraceEvent(ITimeEvent event) {
+               if (event instanceof TimeRangeComponent) {
+                       ChildEventLeafs.add((TimeRangeComponent) event);
+               }
+       }
+
+    /**
         * @return
         */
        public Vector<TimeRangeComponent> getChildEventComposites() {
index e2e8c4e890ccf0674773620bd4f697946433e87e..0a01c454a1b3242caf60ea583e8aafafbd490066 100644 (file)
@@ -192,7 +192,19 @@ public class LTTngTextTrace extends TmfTrace<LttngEvent> implements ITmfTrace {
        return tmpTraceContext;
     }
     
-     private LttngEvent parseMyNextEvent(TmfContext context) {
+    @Override
+    public TmfContext seekLocation(double ratio) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public double getLocationRatio(ITmfLocation<?> location) {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    private LttngEvent parseMyNextEvent(TmfContext context) {
        
        // All parsing variables declared here so to be able to print them into the catch if needed
        String tmpContent = null;
index 8d2e6701fefd1c434f4e7d695d8c64ea1855113e..01026ce102b7d148e4924c22f739ffbae5ce2ae3 100644 (file)
@@ -604,6 +604,18 @@ public class LTTngTrace extends TmfTrace<LttngEvent> {
                return new TmfContext(curLocation);
        }
 
+       @Override
+       public TmfContext seekLocation(double ratio) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public double getLocationRatio(ITmfLocation<?> location) {
+               // TODO Auto-generated method stub
+               return 0;
+       }
+
        /**
         * Return the event in the trace according to the given context. Read it if
         * necessary.
index 4d77a653ecb1c334f11fb2f8e532c10977af4f5e..67976142e5ef54724dc60c43142af7ce9a3f628e 100644 (file)
@@ -24,6 +24,7 @@ Export-Package: org.eclipse.linuxtools.tmf.ui,
  org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets,
  org.eclipse.linuxtools.tmf.ui.views,
  org.eclipse.linuxtools.tmf.ui.views.colors,
+ org.eclipse.linuxtools.tmf.ui.views.filter,
  org.eclipse.linuxtools.tmf.ui.views.project,
  org.eclipse.linuxtools.tmf.ui.views.timechart,
  org.eclipse.linuxtools.tmf.ui.widgets
diff --git a/org.eclipse.linuxtools.tmf.ui/icons/eview16/colors_view.gif b/org.eclipse.linuxtools.tmf.ui/icons/eview16/colors_view.gif
new file mode 100644 (file)
index 0000000..cc168a4
Binary files /dev/null and b/org.eclipse.linuxtools.tmf.ui/icons/eview16/colors_view.gif differ
diff --git a/org.eclipse.linuxtools.tmf.ui/icons/eview16/filters_view.gif b/org.eclipse.linuxtools.tmf.ui/icons/eview16/filters_view.gif
new file mode 100644 (file)
index 0000000..24e8e86
Binary files /dev/null and b/org.eclipse.linuxtools.tmf.ui/icons/eview16/filters_view.gif differ
index 8ca37b6b4405cf8ad89d58c2b40a1e935cd767e5..d14e5de04154b86ea10f0e3a850183c802d77d46 100644 (file)
@@ -6,6 +6,7 @@ Bundle-Name = Tracing and Monitoring Framework (TMF) UI (Incubation)
 views.category.name = TMF
 project.view.name = Projects
 events.view.name = Events
+filters.view.name = Filters
 colors.view.name = Colors
 timechart.view.name = Time Chart
 events.editor.name = Events
index acf5a7d5eba384556effb05a3e5547ef23aadc4a..9baaa1229d7ca2dcf004dfc313a55fedc67101d2 100644 (file)
             name="%colors.view.name"\r
             restorable="true">\r
       </view> \r
+      <view\r
+            allowMultiple="false"\r
+            category="org.eclipse.linuxtools.tmf.ui.views.category"\r
+            class="org.eclipse.linuxtools.tmf.ui.views.filter.FilterView"\r
+            icon="icons/eview16/filters_view.gif"\r
+            id="org.eclipse.linuxtools.tmf.ui.views.filter"\r
+            name="%filters.view.name"\r
+            restorable="true">\r
+      </view>\r
    </extension>\r
    <extension\r
          point="org.eclipse.ui.editors">\r
index 099653272da9165b66850ef41cff240a07dd0ff3..c47964c0bf2dacb8b978f15a3aedff5ceab52087 100644 (file)
@@ -21,16 +21,75 @@ import org.eclipse.swt.widgets.Composite;
 \r
 public interface IParserProvider {\r
 \r
+       /**\r
+        * Return the readable category name for this parser provider\r
+        * \r
+        * @return the category name\r
+        */\r
     public String getCategory();\r
     \r
+       /**\r
+        * Return a trace instance for a resource given a parser id\r
+        * \r
+        * @param parser the parser id\r
+        * @param resource the resource\r
+        * @return a trace instance or null if the parser id is not handled by this parser provider\r
+        */\r
     public ITmfTrace getTraceForParser(String parser, IResource resource);\r
     \r
+       /**\r
+        * Return a trace instance for a resource given a content type id\r
+        * \r
+        * @param contentTypeId the content type id\r
+        * @param resource the resource\r
+        * @return a trace instance or null if the content type id is not handled by this parser provider\r
+        */\r
     public ITmfTrace getTraceForContentType(String contentTypeId, IResource resource);\r
     \r
-    public String getEditorIdForParser(String parser);\r
-    \r
+       /**\r
+        * Return the parser map for this parser provider\r
+        * Map key: readable parser name\r
+        * Map value: unique parser id\r
+        * \r
+        * @return the parser map\r
+        */\r
     public Map<String, String> getParserMap();\r
 \r
+       /**\r
+        * Return the event type map given a parser id\r
+        * Map key: readable event type name\r
+        * Map value: unique event type id\r
+        * \r
+        * @param parser the parser id\r
+        * @return the event type map or null if the parser id is not handled by this parser provider\r
+        */\r
+    public Map<String, String> getEventTypeMapForParser(String parser);\r
+    \r
+       /**\r
+        * Return the field label array given an event type id\r
+        * Array value: readable field label\r
+        * \r
+        * @param eventType the event type id\r
+        * @return the field label array or null if the event type id is not handled by this parser provider\r
+        */\r
+    public String[] getFieldLabelsForEventType(String eventType);\r
+    \r
+       /**\r
+        * Return the editor id given a parser id\r
+        * \r
+        * @param parser the parser id\r
+        * @return an editor id or null to use the default trace editor\r
+        */\r
+    public String getEditorIdForParser(String parser);\r
+\r
+       /**\r
+        * Return an events table instance for a given trace\r
+        * \r
+        * @param parser the parser id\r
+        * @param parent the parent composite for the table\r
+        * @param cacheSize the desired cache size for the table\r
+        * @return an events table instance or null if the trace is not handled by this parser provider\r
+        */\r
     public TmfEventsTable getEventsTable(ITmfTrace trace, Composite parent, int cacheSize);\r
 \r
 }\r
index ada2a704e7c0d101715d9c6845d07ac44d99c67c..a48cd703736415bb7288aa44a1cec74c31163769 100644 (file)
@@ -123,6 +123,26 @@ public class ParserProviderManager {
         return parserMap;\r
     }\r
 \r
+    public static Map<String, String> getEventTypeMapForParser(String parser) {\r
+        for (IParserProvider parserProvider : fParserProviders) {\r
+               Map<String, String> map = parserProvider.getEventTypeMapForParser(parser);\r
+               if (map != null) {\r
+                       return map;\r
+               }\r
+        }\r
+        return new LinkedHashMap<String, String>(0);\r
+    }\r
+    \r
+    public static String[] getFieldLabelsForEventType(String eventType) {\r
+        for (IParserProvider parserProvider : fParserProviders) {\r
+               String[] fieldLabels = parserProvider.getFieldLabelsForEventType(eventType);\r
+               if (fieldLabels != null) {\r
+                       return fieldLabels;\r
+               }\r
+        }\r
+        return new String[0];\r
+    }\r
+\r
     public static TmfEventsTable getEventsTable(ITmfTrace trace, Composite parent, int cacheSize) {\r
         for (IParserProvider parserProvider : fParserProviders) {\r
             if (parserProvider != null) {\r
index d70f135e3ad86dd5e4f00dbd849766291ec8f593..04761eef7d9077fd739fd61c782fd3ea0ee8d195 100644 (file)
@@ -60,6 +60,48 @@ public class CustomParserProvider implements IParserProvider {
         return null;\r
     }\r
 \r
+       @Override\r
+    public Map<String, String> getEventTypeMapForParser(String parser) {\r
+        for (CustomTxtTraceDefinition def : CustomTxtTraceDefinition.loadAll()) {\r
+            if (parser.equals(CustomTxtTrace.class.getCanonicalName() + "." + def.definitionName)) { //$NON-NLS-1$\r
+                Map<String, String> eventTypeMap = new LinkedHashMap<String, String>();\r
+                eventTypeMap.put(def.definitionName, CustomTxtEventType.class.getCanonicalName() + "." + def.definitionName); //$NON-NLS-1$\r
+                return eventTypeMap;\r
+            }\r
+        }\r
+        for (CustomXmlTraceDefinition def : CustomXmlTraceDefinition.loadAll()) {\r
+            if (parser.equals(CustomXmlTrace.class.getCanonicalName() + "." + def.definitionName)) { //$NON-NLS-1$\r
+                Map<String, String> eventTypeMap = new LinkedHashMap<String, String>();\r
+                eventTypeMap.put(def.definitionName, CustomXmlEventType.class.getCanonicalName() + "." + def.definitionName); //$NON-NLS-1$\r
+                return eventTypeMap;\r
+            }\r
+        }\r
+               return null;\r
+       }\r
+\r
+       @Override\r
+    public String[] getFieldLabelsForEventType(String eventType) {\r
+        for (CustomTxtTraceDefinition def : CustomTxtTraceDefinition.loadAll()) {\r
+            if (eventType.equals(CustomTxtEventType.class.getCanonicalName() + "." + def.definitionName)) { //$NON-NLS-1$\r
+                String[] labels = new String[def.outputs.size()];\r
+                for (int i = 0; i < labels.length; i++) {\r
+                    labels[i] = def.outputs.get(i).name;\r
+                }\r
+                return labels;\r
+            }\r
+        }\r
+        for (CustomXmlTraceDefinition def : CustomXmlTraceDefinition.loadAll()) {\r
+            if (eventType.equals(CustomXmlEventType.class.getCanonicalName() + "." + def.definitionName)) { //$NON-NLS-1$\r
+                String[] labels = new String[def.outputs.size()];\r
+                for (int i = 0; i < labels.length; i++) {\r
+                    labels[i] = def.outputs.get(i).name;\r
+                }\r
+                return labels;\r
+            }\r
+        }\r
+        return null;\r
+       }\r
+\r
        @Override\r
     public Map<String, String> getParserMap() {\r
         Map<String, String> parserMap = new LinkedHashMap<String, String>();\r
diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterDialog.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterDialog.java
new file mode 100644 (file)
index 0000000..a1d8c0c
--- /dev/null
@@ -0,0 +1,71 @@
+/*******************************************************************************\r
+ * Copyright (c) 2010 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ *   Patrick Tasse - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.views.filter;\r
+\r
+import org.eclipse.jface.dialogs.Dialog;\r
+import org.eclipse.linuxtools.tmf.filter.model.ITmfFilterTreeNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterNode;\r
+import org.eclipse.linuxtools.tmf.ui.internal.Messages;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.swt.widgets.Shell;\r
+\r
+public class FilterDialog extends Dialog {\r
+\r
+       TmfFilterNode fRoot;\r
+       FilterViewer fViewer;\r
+       \r
+       public FilterDialog(Shell shell) {\r
+               super(shell);\r
+               setShellStyle(getShellStyle() | SWT.RESIZE | SWT.MAX);\r
+       }\r
+\r
+       /* (non-Javadoc)\r
+        * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)\r
+        */\r
+       @Override\r
+       protected Control createDialogArea(Composite parent) {\r
+        getShell().setText(Messages.FilterDialog_FilterDialogTitle);\r
+               getShell().setMinimumSize(getShell().computeSize(500, 200));\r
+        Composite composite = (Composite) super.createDialogArea(parent);\r
+        \r
+        fViewer = new FilterViewer(composite, SWT.BORDER);\r
+        fViewer.setInput(fRoot);\r
+        return composite;\r
+       }\r
+\r
+       /**\r
+        * @param fFilter the filter to set\r
+        */\r
+       public void setFilter(ITmfFilterTreeNode filter) {\r
+               fRoot = new TmfFilterNode(null);\r
+               if (filter != null) {\r
+                       fRoot.addChild(filter.clone());\r
+               }\r
+               if (fViewer != null) {\r
+                       fViewer.setInput(fRoot);\r
+               }\r
+       }\r
+       \r
+       /**\r
+        * @return the fFilter\r
+        */\r
+       public ITmfFilterTreeNode getFilter() {\r
+               if (fRoot != null && fRoot.hasChildren()) {\r
+                       return fRoot.getChild(0).clone();\r
+               }\r
+               return null;\r
+       }\r
+\r
+}\r
diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterManager.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterManager.java
new file mode 100644 (file)
index 0000000..a1849aa
--- /dev/null
@@ -0,0 +1,63 @@
+/*******************************************************************************\r
+ * Copyright (c) 2010 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ *   Patrick Tasse - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.views.filter;\r
+\r
+import java.io.FileNotFoundException;\r
+import java.io.IOException;\r
+\r
+import javax.xml.parsers.ParserConfigurationException;\r
+\r
+import org.eclipse.linuxtools.tmf.filter.model.ITmfFilterTreeNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterRootNode;\r
+import org.eclipse.linuxtools.tmf.filter.xml.TmfFilterXMLParser;\r
+import org.eclipse.linuxtools.tmf.filter.xml.TmfFilterXMLWriter;\r
+import org.eclipse.linuxtools.tmf.ui.TmfUiPlugin;\r
+import org.xml.sax.SAXException;\r
+\r
+public class FilterManager {\r
+\r
+       private static final String SAVED_FILTERS_FILE_NAME = "saved_filters.xml"; //$NON-NLS-1$\r
+       private static final String SAVED_FILTERS_PATH_NAME =\r
+        TmfUiPlugin.getDefault().getStateLocation().addTrailingSeparator().append(SAVED_FILTERS_FILE_NAME).toString();\r
+       \r
+    private static ITmfFilterTreeNode fRoot = new TmfFilterRootNode();\r
+    static {\r
+       try {\r
+               fRoot = new TmfFilterXMLParser(SAVED_FILTERS_PATH_NAME).getTree();\r
+        } catch (FileNotFoundException e) {\r
+        } catch (SAXException e) {\r
+               e.printStackTrace();\r
+        } catch (IOException e) {\r
+               e.printStackTrace();\r
+        }\r
+    }\r
+    \r
+    public static ITmfFilterTreeNode[] getSavedFilters() {\r
+       return fRoot.clone().getChildren();\r
+    }\r
+    \r
+    public static void setSavedFilters(ITmfFilterTreeNode[] filters) {\r
+       fRoot = new TmfFilterRootNode();\r
+       for (ITmfFilterTreeNode filter : filters) {\r
+               fRoot.addChild(filter.clone());\r
+       }\r
+               try {\r
+               TmfFilterXMLWriter writerXML = new TmfFilterXMLWriter(fRoot);\r
+               writerXML.saveTree(SAVED_FILTERS_PATH_NAME);\r
+        } catch (IOException e) {\r
+               e.printStackTrace();\r
+        } catch (ParserConfigurationException e) {\r
+               e.printStackTrace();\r
+        }\r
+    }\r
+}\r
diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterTreeContentProvider.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterTreeContentProvider.java
new file mode 100644 (file)
index 0000000..d5e3497
--- /dev/null
@@ -0,0 +1,95 @@
+/*******************************************************************************\r
+ * Copyright (c) 2010 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ *   Yuriy Vashchuk - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.views.filter;\r
+\r
+import java.util.ArrayList;\r
+\r
+import org.eclipse.jface.viewers.ITreeContentProvider;\r
+import org.eclipse.jface.viewers.Viewer;\r
+import org.eclipse.linuxtools.tmf.filter.model.ITmfFilterTreeNode;\r
+\r
+/**\r
+ * <b><u>FilterTreeContentProvider</u></b>\r
+ * <p>\r
+ * This is the Content Provider of our tree\r
+ * <p>\r
+ */\r
+public class FilterTreeContentProvider implements ITreeContentProvider {\r
+\r
+       /*\r
+        * (non-Javadoc)\r
+        * @see org.eclipse.jface.viewers.IContentProvider#dispose()\r
+        */\r
+       @Override\r
+    public void dispose() {\r
+               // TODO Auto-generated method stub\r
+       }\r
+\r
+       /*\r
+        * (non-Javadoc)\r
+        * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)\r
+        */\r
+       @Override\r
+    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
+               // TODO Auto-generated method stub\r
+       }\r
+\r
+       /*\r
+        * (non-Javadoc)\r
+        * @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(java.lang.Object)\r
+        */\r
+       @Override\r
+    public Object[] getElements(Object inputElement) {\r
+               if (inputElement instanceof ITmfFilterTreeNode) {\r
+                       ArrayList<ITmfFilterTreeNode> result = new ArrayList<ITmfFilterTreeNode>();\r
+                       for(int i = 0; i < ((ITmfFilterTreeNode)inputElement).getChildrenCount(); i++) {\r
+                               result.add(((ITmfFilterTreeNode)inputElement).getChild(i));\r
+                       }\r
+                       \r
+                       return result.toArray();\r
+               }\r
+        return null;\r
+       }\r
+\r
+       /*\r
+        * (non-Javadoc)\r
+        * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)\r
+        */\r
+       @Override\r
+    public Object[] getChildren(Object parentElement) {\r
+               ArrayList<ITmfFilterTreeNode> result = new ArrayList<ITmfFilterTreeNode>();\r
+               for(int i = 0; i < ((ITmfFilterTreeNode)parentElement).getChildrenCount(); i++) {\r
+                       result.add(((ITmfFilterTreeNode)parentElement).getChild(i));\r
+               }\r
+               return result.toArray();\r
+       }\r
+\r
+       /*\r
+        * (non-Javadoc)\r
+        * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)\r
+        */\r
+       @Override\r
+    public Object getParent(Object element) {\r
+               return ((ITmfFilterTreeNode) element).getParent();\r
+       }\r
+\r
+       /*\r
+        * (non-Javadoc)\r
+        * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)\r
+        */\r
+       @Override\r
+    public boolean hasChildren(Object element) {\r
+               return ((ITmfFilterTreeNode) element).hasChildren();\r
+       }\r
+\r
+}\r
diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterTreeLabelProvider.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterTreeLabelProvider.java
new file mode 100644 (file)
index 0000000..fc61d2c
--- /dev/null
@@ -0,0 +1,150 @@
+/*******************************************************************************\r
+ * Copyright (c) 2010 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ *   Yuriy Vashchuk - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.views.filter;\r
+\r
+import org.eclipse.jface.viewers.ILabelProvider;\r
+import org.eclipse.jface.viewers.ILabelProviderListener;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterAndNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterCompareNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterCompareNode.Type;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterContainsNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterEqualsNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterEventTypeNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterMatchesNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterOrNode;\r
+import org.eclipse.swt.graphics.Image;\r
+\r
+/**\r
+ * <b><u>FilterTreeLabelProvider</u></b>\r
+ * <p>\r
+ * This is the Label Provider for our Filter Tree\r
+ * <p>\r
+ */\r
+public class FilterTreeLabelProvider implements ILabelProvider {\r
+\r
+       /*\r
+        * (non-Javadoc)\r
+        * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)\r
+        */\r
+       @Override\r
+    public void addListener(ILabelProviderListener listener) {\r
+               // TODO Auto-generated method stub\r
+       }\r
+\r
+       /*\r
+        * (non-Javadoc)\r
+        * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()\r
+        */\r
+       @Override\r
+    public void dispose() {\r
+               // TODO Auto-generated method stub\r
+       }\r
+\r
+       /*\r
+        * (non-Javadoc)\r
+        * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)\r
+        */\r
+       @Override\r
+    public boolean isLabelProperty(Object element, String property) {\r
+               // TODO Auto-generated method stub\r
+               return false;\r
+       }\r
+\r
+       /*\r
+        * (non-Javadoc)\r
+        * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)\r
+        */\r
+       @Override\r
+    public void removeListener(ILabelProviderListener listener) {\r
+               // TODO Auto-generated method stub\r
+       }\r
+\r
+       /*\r
+        * (non-Javadoc)\r
+        * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)\r
+        */\r
+       @Override\r
+    public Image getImage(Object element) {\r
+               // TODO Auto-generated method stub\r
+               return null;\r
+       }\r
+\r
+       /*\r
+        * (non-Javadoc)\r
+        * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)\r
+        */\r
+       @Override\r
+    public String getText(Object element) {\r
+               String label = null;\r
+               \r
+               if (element instanceof TmfFilterNode) {\r
+                       \r
+                       TmfFilterNode node = (TmfFilterNode) element;\r
+                       label = node.getNodeName() + " " + node.getFilterName(); //$NON-NLS-1$\r
+                       \r
+               } else if (element instanceof TmfFilterEventTypeNode) {\r
+                       \r
+                       TmfFilterEventTypeNode node = (TmfFilterEventTypeNode) element;\r
+                       label = "WITH " + node.getNodeName() + (node.getName() != null ? " " + node.getName() : ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$\r
+                       \r
+               } else if (element instanceof TmfFilterAndNode) {\r
+                       \r
+                       TmfFilterAndNode node = (TmfFilterAndNode) element;\r
+                       label = (node.isNot() ? "NOT " : "") + node.getNodeName(); //$NON-NLS-1$ //$NON-NLS-2$\r
+                       \r
+               } else if (element instanceof TmfFilterOrNode) {\r
+                       \r
+                       TmfFilterOrNode node = (TmfFilterOrNode) element;\r
+                       label = (node.isNot() ? "NOT " : "") + node.getNodeName(); //$NON-NLS-1$ //$NON-NLS-2$\r
+                       \r
+               } else if (element instanceof TmfFilterContainsNode) {\r
+                       \r
+                       TmfFilterContainsNode node = (TmfFilterContainsNode) element;\r
+                       label = (node.isNot() ? "NOT " : "") + //$NON-NLS-1$ //$NON-NLS-2$\r
+                                       (node.getField() != null ? node.getField() + " " : "") + //$NON-NLS-1$ //$NON-NLS-2$\r
+                                       node.getNodeName() +\r
+                                       (node.getValue() != null && node.getValue().length() > 0 ? " \"" + node.getValue() + "\"" : ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$\r
+                       \r
+               } else if (element instanceof TmfFilterEqualsNode) {\r
+                       \r
+                       TmfFilterEqualsNode node = (TmfFilterEqualsNode) element;\r
+                       label = (node.isNot() ? "NOT " : "") + //$NON-NLS-1$ //$NON-NLS-2$\r
+                                       (node.getField() != null ? node.getField() + " " : "") + //$NON-NLS-1$ //$NON-NLS-2$\r
+                                       node.getNodeName() +\r
+                                       (node.getValue() != null && node.getValue().length() > 0 ? " \"" + node.getValue() + "\"" : ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$\r
+                       \r
+               } else if (element instanceof TmfFilterMatchesNode) {\r
+                       \r
+                       TmfFilterMatchesNode node = (TmfFilterMatchesNode) element;\r
+                       label = (node.isNot() ? "NOT " : "") + //$NON-NLS-1$ //$NON-NLS-2$\r
+                                       (node.getField() != null ? node.getField() + " " : "") + //$NON-NLS-1$ //$NON-NLS-2$\r
+                                       node.getNodeName() +\r
+                                       (node.getRegex() != null && node.getRegex().length() > 0 ? " \"" + node.getRegex() + "\"" : ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$\r
+                       \r
+               } else if (element instanceof TmfFilterCompareNode) {\r
+                       \r
+                       TmfFilterCompareNode node = (TmfFilterCompareNode) element;\r
+                       label = (node.isNot() ? "NOT " : "") + //$NON-NLS-1$ //$NON-NLS-2$\r
+                                       (node.getField() != null ? node.getField() + " " : "") + //$NON-NLS-1$ //$NON-NLS-2$\r
+                                       (node.getResult() < 0 ? "<" : (node.getResult() > 0 ? ">" : "=")) + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$\r
+                                       (node.getValue() != null && node.getValue().length() > 0 ?\r
+                                                       (node.getType() == Type.ALPHA ? " \"" + node.getValue() + "\"" : //$NON-NLS-1$ //$NON-NLS-2$\r
+                                                       (node.getType() == Type.TIMESTAMP ? " [" + node.getValue() + "]" : //$NON-NLS-1$ //$NON-NLS-2$\r
+                                                               " " + node.getValue())) : "");  //$NON-NLS-1$//$NON-NLS-2$\r
+                       \r
+               }\r
+               return label;\r
+       }\r
+\r
+}\r
diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterView.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterView.java
new file mode 100644 (file)
index 0000000..ea7cd81
--- /dev/null
@@ -0,0 +1,301 @@
+/*******************************************************************************\r
+ * Copyright (c) 2010 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ *   Yuriy Vashchuk - Initial API and implementation\r
+ *   based on Francois Chouinard ProjectView code.\r
+ */\r
+\r
+package org.eclipse.linuxtools.tmf.ui.views.filter;\r
+\r
+import java.io.IOException;\r
+\r
+import javax.xml.parsers.ParserConfigurationException;\r
+\r
+import org.eclipse.core.resources.IResource;\r
+import org.eclipse.core.resources.IWorkspace;\r
+import org.eclipse.core.resources.ResourcesPlugin;\r
+import org.eclipse.core.runtime.CoreException;\r
+import org.eclipse.jface.action.Action;\r
+import org.eclipse.jface.action.IToolBarManager;\r
+import org.eclipse.jface.action.Separator;\r
+import org.eclipse.jface.resource.ImageDescriptor;\r
+import org.eclipse.jface.viewers.ISelectionChangedListener;\r
+import org.eclipse.jface.viewers.IStructuredSelection;\r
+import org.eclipse.jface.viewers.SelectionChangedEvent;\r
+import org.eclipse.linuxtools.tmf.filter.model.ITmfFilterTreeNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterRootNode;\r
+import org.eclipse.linuxtools.tmf.filter.xml.TmfFilterXMLParser;\r
+import org.eclipse.linuxtools.tmf.filter.xml.TmfFilterXMLWriter;\r
+import org.eclipse.linuxtools.tmf.ui.TmfUiPlugin;\r
+import org.eclipse.linuxtools.tmf.ui.internal.Messages;\r
+import org.eclipse.linuxtools.tmf.ui.views.TmfView;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.FileDialog;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.eclipse.ui.IActionBars;\r
+import org.xml.sax.SAXException;\r
+\r
+/**\r
+ * <b><u>FilterView</u></b>\r
+ * <p>\r
+ * View that contain UI to the TMF filter.\r
+ */\r
+public class FilterView extends TmfView {\r
+\r
+       public static final String ID = "org.eclipse.linuxtools.tmf.ui.views.filter"; //$NON-NLS-1$\r
+\r
+       private static final Image SAVE_IMAGE = TmfUiPlugin.getDefault().getImageFromPath("/icons/elcl16/save_button.gif"); //$NON-NLS-1$\r
+    private static final Image ADD_IMAGE = TmfUiPlugin.getDefault().getImageFromPath("/icons/elcl16/add_button.gif"); //$NON-NLS-1$\r
+    private static final Image DELETE_IMAGE = TmfUiPlugin.getDefault().getImageFromPath("/icons/elcl16/delete_button.gif"); //$NON-NLS-1$\r
+    private static final Image IMPORT_IMAGE = TmfUiPlugin.getDefault().getImageFromPath("/icons/elcl16/import_button.gif"); //$NON-NLS-1$\r
+    private static final Image EXPORT_IMAGE = TmfUiPlugin.getDefault().getImageFromPath("/icons/elcl16/export_button.gif"); //$NON-NLS-1$\r
+    \r
+    // ------------------------------------------------------------------------\r
+    // Main data structures\r
+    // ------------------------------------------------------------------------\r
+\r
+       private FilterViewer fViewer;\r
+    private ITmfFilterTreeNode fRoot;\r
+\r
+    private IWorkspace fWorkspace;\r
+\r
+    private SaveAction fSaveAction;\r
+       private AddAction fAddAction;\r
+       private DeleteAction fDeleteAction;\r
+       private ExportAction fExportAction;\r
+       private ImportAction fImportAction;\r
+\r
+    /**\r
+     * Getter for the Filter Tree Root\r
+     * \r
+     * @return The root of builded tree\r
+     */\r
+    public ITmfFilterTreeNode getFilterRoot() {\r
+       return fRoot;\r
+    }\r
+\r
+    \r
+    // ------------------------------------------------------------------------\r
+    // Constructor\r
+    // ------------------------------------------------------------------------\r
+\r
+    /**\r
+     *  Default Constructor\r
+     */\r
+       public FilterView() {\r
+               super("Filter"); //$NON-NLS-1$\r
+               \r
+               fWorkspace = ResourcesPlugin.getWorkspace();\r
+               try {\r
+            fWorkspace.getRoot().refreshLocal(IResource.DEPTH_INFINITE, null);\r
+        } catch (CoreException e) {\r
+            e.printStackTrace();\r
+        }\r
+        \r
+        fRoot = new TmfFilterRootNode();\r
+        for (ITmfFilterTreeNode node : FilterManager.getSavedFilters()) {\r
+               fRoot.addChild(node);\r
+        }\r
+       }\r
+\r
+       \r
+       /**\r
+        * Refresh the tree widget\r
+        */\r
+       public void refresh() {\r
+               fViewer.refresh();\r
+       }\r
+       \r
+       /**\r
+        * Setter for selection\r
+        * \r
+        * @param node The node to select\r
+        */\r
+       public void setSelection(ITmfFilterTreeNode node) {\r
+               fViewer.setSelection(node, true);\r
+       }\r
+\r
+       /*\r
+        * (non-Javadoc)\r
+        * @see org.eclipse.linuxtools.tmf.ui.views.TmfView#createPartControl(org.eclipse.swt.widgets.Composite)\r
+        */\r
+       @Override\r
+       public void createPartControl(Composite parent) {\r
+\r
+               fViewer = new FilterViewer(parent, SWT.NONE);\r
+               fViewer.setInput(fRoot);\r
+               \r
+               contributeToActionBars();\r
+               \r
+               fViewer.addSelectionChangedListener(new ISelectionChangedListener() {\r
+                       @Override\r
+                       public void selectionChanged(SelectionChangedEvent event) {\r
+                               if (!(event.getSelection().isEmpty()) && event.getSelection() instanceof IStructuredSelection) {\r
+                                       fDeleteAction.setEnabled(true);\r
+                                       fExportAction.setEnabled(true);\r
+                               } else {\r
+                                       fDeleteAction.setEnabled(false);\r
+                                       fExportAction.setEnabled(false);\r
+                               }\r
+                       }\r
+               });\r
+       }\r
+\r
+       \r
+       // ------------------------------------------------------------------------\r
+    // ViewPart\r
+    // ------------------------------------------------------------------------\r
+       \r
+       /*\r
+        * (non-Javadoc)\r
+        * @see java.lang.Object#toString()\r
+        */\r
+       @Override\r
+       public String toString() {\r
+               return "[FilterView]"; //$NON-NLS-1$\r
+       }       \r
+\r
+       \r
+    /**\r
+     * Builds the menu toolbar\r
+     */\r
+       private void contributeToActionBars() {\r
+               IActionBars bars = getViewSite().getActionBars();\r
+               //fillLocalPullDown(bars.getMenuManager());\r
+               fillLocalToolBar(bars.getToolBarManager());\r
+       }\r
+\r
+       \r
+       /**\r
+        * Build the popup menu\r
+        * \r
+        * @param manager The manager to build\r
+        */\r
+       private void fillLocalToolBar(IToolBarManager manager) {\r
+               \r
+               fSaveAction = new SaveAction();\r
+               fSaveAction.setImageDescriptor(ImageDescriptor.createFromImage(SAVE_IMAGE));\r
+               fSaveAction.setToolTipText(Messages.FilterView_SaveActionToolTipText);\r
+               \r
+               fAddAction = new AddAction();\r
+               fAddAction.setImageDescriptor(ImageDescriptor.createFromImage(ADD_IMAGE));\r
+               fAddAction.setToolTipText(Messages.FilterView_AddActionToolTipText);    \r
+\r
+               fDeleteAction = new DeleteAction();\r
+               fDeleteAction.setImageDescriptor(ImageDescriptor.createFromImage(DELETE_IMAGE));\r
+               fDeleteAction.setToolTipText(Messages.FilterView_DeleteActionToolTipText);\r
+               fDeleteAction.setEnabled(false);\r
+\r
+               fExportAction = new ExportAction();\r
+               fExportAction.setImageDescriptor(ImageDescriptor.createFromImage(EXPORT_IMAGE));\r
+               fExportAction.setToolTipText(Messages.FilterView_ExportActionToolTipText);\r
+\r
+               fImportAction = new ImportAction();\r
+               fImportAction.setImageDescriptor(ImageDescriptor.createFromImage(IMPORT_IMAGE));\r
+               fImportAction.setToolTipText(Messages.FilterView_ImportActionToolTipText);\r
+\r
+               manager.add(fSaveAction);\r
+               manager.add(new Separator());\r
+               manager.add(fAddAction);\r
+               manager.add(fDeleteAction);\r
+               manager.add(new Separator());\r
+               manager.add(fExportAction);\r
+               manager.add(fImportAction);\r
+       }\r
+\r
+       private class SaveAction extends Action {\r
+               @Override\r
+               public void run() {\r
+                       FilterManager.setSavedFilters(fRoot.getChildren());\r
+               }\r
+       }\r
+       \r
+       private class AddAction extends Action {\r
+               @Override\r
+               public void run() {\r
+                       \r
+                       TmfFilterNode newNode = new TmfFilterNode(fRoot, ""); //$NON-NLS-1$\r
+                       refresh();\r
+                       setSelection(newNode);\r
+               }\r
+       }\r
+       \r
+       private class DeleteAction extends Action {\r
+               @Override\r
+               public void run() {\r
+                       ITmfFilterTreeNode node = fViewer.getSelection();\r
+                       if (node != null) {\r
+                               node.remove();\r
+                       }\r
+                       refresh();\r
+               }\r
+       }\r
+       \r
+       private class ExportAction extends Action {\r
+               @Override\r
+               public void run() {\r
+                       try {\r
+                               FileDialog dlg = new FileDialog(new Shell(), SWT.SAVE);\r
+                               dlg.setFilterNames(new String[] {Messages.FilterView_FileDialogFilterName + " (*.filter.xml)"}); //$NON-NLS-1$\r
+                               dlg.setFilterExtensions(new String[] {"*.filter.xml"}); //$NON-NLS-1$\r
+                               \r
+                               String fn = dlg.open();\r
+                       if (fn != null) {\r
+                                       TmfFilterXMLWriter writerXML = new TmfFilterXMLWriter(fRoot);\r
+                                       writerXML.saveTree(fn);\r
+                       }\r
+                               \r
+                       } catch (ParserConfigurationException e) {\r
+                               e.printStackTrace();\r
+                       } catch (IOException e) {\r
+                               e.printStackTrace();\r
+                       }\r
+               }\r
+       }\r
+       \r
+       private class ImportAction extends Action {\r
+               @Override\r
+               public void run() {\r
+                       if (fViewer != null) {\r
+                               ITmfFilterTreeNode root = null;\r
+                               try {\r
+                                       FileDialog dlg = new FileDialog(new Shell(), SWT.OPEN);\r
+                                       dlg.setFilterNames(new String[] {Messages.FilterView_FileDialogFilterName + " (*.filter.xml)"}); //$NON-NLS-1$\r
+                                       dlg.setFilterExtensions(new String[] {"*.filter.xml"}); //$NON-NLS-1$\r
+                                       \r
+                                       TmfFilterXMLParser parserXML = null;\r
+                                       String fn = dlg.open();\r
+                               if (fn != null) {\r
+                                       parserXML = new TmfFilterXMLParser(fn);\r
+                                               root = parserXML.getTree();\r
+                               }\r
+                                       \r
+                               } catch (SAXException e) {\r
+                                       e.printStackTrace();\r
+                               } catch (IOException e) {\r
+                                       e.printStackTrace();\r
+                               }\r
+\r
+                               if (root != null) {\r
+                               for (ITmfFilterTreeNode node : root.getChildren()) {\r
+                                       if (node instanceof TmfFilterNode) {\r
+                                               fRoot.addChild(node);\r
+                                               refresh();\r
+                                               fViewer.setSelection(node);\r
+                                       }\r
+                               }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       \r
+}
\ No newline at end of file
diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterViewer.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/filter/FilterViewer.java
new file mode 100644 (file)
index 0000000..db8a97f
--- /dev/null
@@ -0,0 +1,970 @@
+/*******************************************************************************\r
+ * Copyright (c) 2010 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ *   Patrick Tasse - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.views.filter;\r
+\r
+import java.util.ArrayList;\r
+import java.util.LinkedHashMap;\r
+import java.util.Map;\r
+import java.util.Map.Entry;\r
+\r
+import org.eclipse.jface.action.Action;\r
+import org.eclipse.jface.action.IMenuListener;\r
+import org.eclipse.jface.action.IMenuManager;\r
+import org.eclipse.jface.action.MenuManager;\r
+import org.eclipse.jface.action.Separator;\r
+import org.eclipse.jface.viewers.ISelection;\r
+import org.eclipse.jface.viewers.ISelectionChangedListener;\r
+import org.eclipse.jface.viewers.IStructuredSelection;\r
+import org.eclipse.jface.viewers.SelectionChangedEvent;\r
+import org.eclipse.jface.viewers.StructuredSelection;\r
+import org.eclipse.jface.viewers.TreeViewer;\r
+import org.eclipse.linuxtools.tmf.filter.model.ITmfFilterTreeNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterAndNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterCompareNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterCompareNode.Type;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterContainsNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterEqualsNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterEventTypeNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterMatchesNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterOrNode;\r
+import org.eclipse.linuxtools.tmf.filter.model.TmfFilterRootNode;\r
+import org.eclipse.linuxtools.tmf.ui.internal.Messages;\r
+import org.eclipse.linuxtools.tmf.ui.parsers.ParserProviderManager;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.custom.SashForm;\r
+import org.eclipse.swt.events.FocusEvent;\r
+import org.eclipse.swt.events.FocusListener;\r
+import org.eclipse.swt.events.ModifyEvent;\r
+import org.eclipse.swt.events.ModifyListener;\r
+import org.eclipse.swt.events.SelectionAdapter;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.layout.FillLayout;\r
+import org.eclipse.swt.layout.GridData;\r
+import org.eclipse.swt.layout.GridLayout;\r
+import org.eclipse.swt.widgets.Button;\r
+import org.eclipse.swt.widgets.Combo;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.swt.widgets.Label;\r
+import org.eclipse.swt.widgets.Menu;\r
+import org.eclipse.swt.widgets.Text;\r
+import org.eclipse.swt.widgets.TreeItem;\r
+\r
+class FilterViewer extends Composite {\r
+\r
+       private static final Map<String, Entry<String, String>> EVENT_TYPES_MAP;\r
+       static {\r
+               Map<String, Entry<String, String>> eventTypesMap = new LinkedHashMap<String, Entry<String, String>>();\r
+               for (Entry<String, Map<String, String>> categoryEntry : ParserProviderManager.getParserMap().entrySet()) {\r
+               for (Entry<String, String> parserEntry : categoryEntry.getValue().entrySet()) {\r
+                       String prefix = categoryEntry.getKey() + " - " + parserEntry.getKey() + " - "; //$NON-NLS-1$ //$NON-NLS-2$\r
+                       for (Entry<String, String> eventTypeEntry : ParserProviderManager.getEventTypeMapForParser(parserEntry.getValue()).entrySet()) {\r
+                               eventTypesMap.put(prefix + eventTypeEntry.getKey(), eventTypeEntry);\r
+                       }\r
+               }\r
+               }\r
+               EVENT_TYPES_MAP = eventTypesMap;\r
+       }\r
+       \r
+       private static final String[] FIELDS_LIST;\r
+       static {\r
+               ArrayList<String> fieldsList = new ArrayList<String>();\r
+               for (Entry<String, Map<String, String>> categoryEntry : ParserProviderManager.getParserMap().entrySet()) {\r
+                       for (Entry<String, String> parserEntry : categoryEntry.getValue().entrySet()) {\r
+                               fieldsList.add(""); //$NON-NLS-1$\r
+                               fieldsList.add("["+ categoryEntry.getKey() +" - " + parserEntry.getKey() +"]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$\r
+                               for (String eventType : ParserProviderManager.getEventTypeMapForParser(parserEntry.getValue()).values()) {\r
+                                       for (String field : ParserProviderManager.getFieldLabelsForEventType(eventType)) {\r
+                                               fieldsList.add(field);\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               FIELDS_LIST = fieldsList.toArray(new String[0]);\r
+       }\r
+       \r
+    private TreeViewer fViewer;\r
+    private Composite fComposite;\r
+    \r
+       public FilterViewer(Composite parent, int style) {\r
+               super(parent, style);\r
+\r
+               setLayout(new FillLayout());\r
+               GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);\r
+               setLayoutData(gd);\r
+               \r
+        final SashForm sash = new SashForm(this, SWT.HORIZONTAL);\r
+\r
+           // Create the tree viewer to display the filter tree\r
+               fViewer = new TreeViewer(sash, SWT.NONE);\r
+               fViewer.setContentProvider(new FilterTreeContentProvider());\r
+               fViewer.setLabelProvider(new FilterTreeLabelProvider());\r
+               fViewer.setInput(new TmfFilterRootNode());\r
+               \r
+               // Create the empty filter node properties panel\r
+               fComposite = new Composite(sash, SWT.NONE);\r
+               GridLayout gl = new GridLayout();\r
+               gl.marginHeight = 0;\r
+               gl.marginWidth = 0;\r
+               fComposite.setLayout(gl);\r
+\r
+               createContextMenu();\r
+               \r
+               fViewer.addSelectionChangedListener(new ISelectionChangedListener() {\r
+                       @Override\r
+            public void selectionChanged(SelectionChangedEvent event) {\r
+                               if (!(event.getSelection().isEmpty()) && event.getSelection() instanceof IStructuredSelection) {\r
+                                       // Update the filter node properties panel to the selection\r
+                                       IStructuredSelection selection = (IStructuredSelection) event.getSelection();\r
+                                       ITmfFilterTreeNode node = (ITmfFilterTreeNode) selection.getFirstElement();\r
+                                       updateFilterNodeComposite(node);\r
+                                       // Highlight the selection's children\r
+                                       highlightTreeItems(fViewer.getTree().getSelection()[0].getItems());\r
+                               } else {\r
+                                       updateFilterNodeComposite(null);\r
+                               }\r
+                       }\r
+               });\r
+       }\r
+       \r
+       /**\r
+        * Create the context menu for the tree viewer\r
+        */\r
+       private void createContextMenu() {\r
+               // Adds root context menu\r
+               MenuManager menuManager = new MenuManager();\r
+               menuManager.setRemoveAllWhenShown(true);\r
+               menuManager.addMenuListener(new IMenuListener() {\r
+                       @Override\r
+            public void menuAboutToShow(IMenuManager manager) {\r
+                               fillContextMenu(manager);\r
+                       }\r
+               });\r
+\r
+               // Context\r
+               Menu contextMenu = menuManager.createContextMenu(fViewer.getTree());\r
+\r
+               // Publish it\r
+               fViewer.getTree().setMenu(contextMenu);\r
+       }\r
+       \r
+       /**\r
+        * Fill the context menu for the tree viewer\r
+        */\r
+       protected void fillContextMenu(IMenuManager manager) {\r
+               final ISelection selection = fViewer.getSelection();\r
+               ITmfFilterTreeNode filterTreeNode = null;\r
+               if (selection instanceof StructuredSelection) {\r
+                       Object element = ((StructuredSelection) selection).getFirstElement();\r
+                       if (element instanceof ITmfFilterTreeNode) {\r
+                               filterTreeNode = (ITmfFilterTreeNode) element;\r
+                       }\r
+               }\r
+\r
+               final ITmfFilterTreeNode selectedNode = filterTreeNode;\r
+               \r
+               if (selectedNode != null) {\r
+                       \r
+                       fillContextMenuForNode(selectedNode, manager);\r
+                       \r
+                       if (selectedNode.getValidChildren().size() > 0) {\r
+                               manager.add(new Separator());\r
+                       }\r
+\r
+                       Action deleteAction = new Action() {\r
+                               @Override\r
+                               public void run() {\r
+                                       selectedNode.remove();\r
+                                       fViewer.refresh();\r
+                               }\r
+                       };\r
+                       deleteAction.setText(Messages.FilterViewer_DeleteActionText);\r
+                       manager.add(deleteAction);\r
+                       \r
+                       manager.add(new Separator());\r
+               }\r
+\r
+               if (fViewer.getInput() instanceof TmfFilterRootNode || selectedNode == null) {\r
+                       final ITmfFilterTreeNode root = (ITmfFilterTreeNode) fViewer.getInput();\r
+                       \r
+                       fillContextMenuForNode(root, manager);\r
+               }\r
+       }\r
+       \r
+       /**\r
+        * Fill the context menu with the valid children of the provided node\r
+        */\r
+       protected void fillContextMenuForNode(final ITmfFilterTreeNode node, IMenuManager manager) {\r
+               for (final String child : node.getValidChildren()) {\r
+                       final Action action = new Action() {\r
+                               @Override\r
+                               public void run() {\r
+                                       ITmfFilterTreeNode newNode = null;\r
+                                       if (TmfFilterNode.NODE_NAME.equals(child)) {\r
+                                               newNode = new TmfFilterNode(node, ""); //$NON-NLS-1$\r
+                                       } else if (TmfFilterEventTypeNode.NODE_NAME.equals(child)) {\r
+                                               newNode = new TmfFilterEventTypeNode(node);\r
+                                       } else if (TmfFilterAndNode.NODE_NAME.equals(child)) {\r
+                                               newNode = new TmfFilterAndNode(node);\r
+                                       } else if (TmfFilterOrNode.NODE_NAME.equals(child)) {\r
+                                               newNode = new TmfFilterOrNode(node);\r
+                                       } else if (TmfFilterContainsNode.NODE_NAME.equals(child)) {\r
+                                               newNode = new TmfFilterContainsNode(node);\r
+                                       } else if (TmfFilterEqualsNode.NODE_NAME.equals(child)) {\r
+                                               newNode = new TmfFilterEqualsNode(node);\r
+                                       } else if (TmfFilterMatchesNode.NODE_NAME.equals(child)) {\r
+                                               newNode = new TmfFilterMatchesNode(node);\r
+                                       } else if (TmfFilterCompareNode.NODE_NAME.equals(child)) {\r
+                                               newNode = new TmfFilterCompareNode(node);\r
+                                       }\r
+                                       if (newNode != null) {\r
+                                               fViewer.refresh();\r
+                                               fViewer.setSelection(new StructuredSelection(newNode), true);\r
+                                       }\r
+                               }\r
+                       };\r
+                       if (TmfFilterNode.NODE_NAME.equals(child)) {\r
+                               action.setText(Messages.FilterViewer_NewPrefix + " " + child); //$NON-NLS-1$\r
+                       } else {\r
+                               action.setText(child);\r
+                       }\r
+                       manager.add(action);\r
+               }\r
+       }\r
+       \r
+       /**\r
+        * Create the appropriate filter node properties composite\r
+        */\r
+       private void updateFilterNodeComposite(ITmfFilterTreeNode node) {\r
+               for (Control control : fComposite.getChildren()) {\r
+                       control.dispose();\r
+               }\r
+               \r
+               if (node instanceof TmfFilterNode) {\r
+                       new FilterNodeComposite(fComposite, (TmfFilterNode) node);\r
+               } else if (node instanceof TmfFilterEventTypeNode) {\r
+                       new FilterEventTypeNodeComposite(fComposite, (TmfFilterEventTypeNode) node);\r
+               } else if (node instanceof TmfFilterAndNode) {\r
+                       new FilterAndNodeComposite(fComposite, (TmfFilterAndNode) node);\r
+               } else if (node instanceof TmfFilterOrNode) {\r
+                       new FilterOrNodeComposite(fComposite, (TmfFilterOrNode) node);\r
+               } else if (node instanceof TmfFilterContainsNode) {\r
+                       new FilterContainsNodeComposite(fComposite, (TmfFilterContainsNode) node);\r
+               } else if (node instanceof TmfFilterEqualsNode) {\r
+                       new FilterEqualsNodeComposite(fComposite, (TmfFilterEqualsNode) node);\r
+               } else if (node instanceof TmfFilterMatchesNode) {\r
+                       new FilterMatchesNodeComposite(fComposite, (TmfFilterMatchesNode) node);\r
+               } else if (node instanceof TmfFilterCompareNode) {\r
+                       new FilterCompareNodeComposite(fComposite, (TmfFilterCompareNode) node);\r
+               } else {\r
+                       new FilterBaseNodeComposite(fComposite);\r
+               }\r
+               fComposite.layout();\r
+       }\r
+       \r
+       /**\r
+        * Highlight the provided tree items\r
+        */\r
+       private void highlightTreeItems(TreeItem[] items) {\r
+               resetTreeItems(fViewer.getTree().getItems());\r
+               for (TreeItem item : items) {\r
+                       item.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));\r
+               }\r
+\r
+       }\r
+       \r
+       /**\r
+        * Reset the provided tree items (remove highlight)\r
+        */\r
+       private void resetTreeItems(TreeItem[] items) {\r
+               for (TreeItem item : items) {\r
+                       item.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));\r
+                       resetTreeItems(item.getItems());\r
+               }\r
+       }\r
+       \r
+       public void setInput(ITmfFilterTreeNode root) {\r
+               fViewer.setInput(root);\r
+               fViewer.expandAll();\r
+               \r
+               updateFilterNodeComposite(null);\r
+       }\r
+       \r
+       public ITmfFilterTreeNode getInput() {\r
+               return (ITmfFilterTreeNode) fViewer.getInput();\r
+       }\r
+       \r
+       public void refresh() {\r
+               fViewer.refresh();\r
+       }\r
+\r
+       public void setSelection(ITmfFilterTreeNode node, boolean reveal) {\r
+               fViewer.setSelection(new StructuredSelection(node), reveal);\r
+       }\r
+\r
+       public void setSelection(ITmfFilterTreeNode node) {\r
+               fViewer.setSelection(new StructuredSelection(node));\r
+       }\r
+       \r
+       public ITmfFilterTreeNode getSelection() {\r
+               final ISelection selection = fViewer.getSelection();\r
+               ITmfFilterTreeNode filterTreeNode = null;\r
+               if (selection instanceof StructuredSelection) {\r
+                       Object element = ((StructuredSelection) selection).getFirstElement();\r
+                       if (element instanceof ITmfFilterTreeNode) {\r
+                               filterTreeNode = (ITmfFilterTreeNode) element;\r
+                       }\r
+               }\r
+\r
+               final ITmfFilterTreeNode selectedNode = filterTreeNode;\r
+               return selectedNode;\r
+       }\r
+       \r
+       public void addSelectionChangedListener(ISelectionChangedListener listener) {\r
+               fViewer.addSelectionChangedListener(listener);\r
+       }\r
+       \r
+       public void removeSelectionChangedListener(ISelectionChangedListener listener) {\r
+               fViewer.removeSelectionChangedListener(listener);\r
+       }\r
+       \r
+       private class FilterBaseNodeComposite extends Composite {\r
+               \r
+               FilterBaseNodeComposite(Composite parent) {\r
+                       super(parent, SWT.NONE);\r
+                       setLayout(new GridLayout(2, false));\r
+                       setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r
+                       setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+               }\r
+               \r
+               protected String[] getFieldsList(ITmfFilterTreeNode node) {\r
+                       while (node != null) {\r
+                               if (node instanceof TmfFilterEventTypeNode) {\r
+                                       TmfFilterEventTypeNode eventTypeNode = (TmfFilterEventTypeNode) node;\r
+                                       return ParserProviderManager.getFieldLabelsForEventType(eventTypeNode.getEventType());\r
+                               }\r
+                               node = node.getParent();\r
+                       }\r
+                       return FIELDS_LIST;\r
+               }\r
+       }\r
+\r
+       private class FilterNodeComposite extends FilterBaseNodeComposite {\r
+               TmfFilterNode fNode;\r
+               Text fNameText;\r
+               \r
+               FilterNodeComposite(Composite parent, TmfFilterNode node) {\r
+                       super(parent);\r
+                       fNode = node;\r
+                       \r
+                       Label label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_NameLabel);\r
+                       \r
+                       fNameText = new Text(this, SWT.BORDER);\r
+                       fNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));\r
+                       if (node.getFilterName() != null && node.getFilterName().length() > 0) {\r
+                               fNameText.setText(node.getFilterName());\r
+                       } else {\r
+                               fNameText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));\r
+                               fNameText.setText(Messages.FilterViewer_FilterNameHint);\r
+                       }\r
+                       fNameText.addFocusListener(new FocusListener() {\r
+                               @Override\r
+                public void focusLost(FocusEvent e) {\r
+                                       if (fNode.getFilterName() == null || fNode.getFilterName().length() == 0) {\r
+                                               fNameText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));\r
+                                               fNameText.setText(Messages.FilterViewer_FilterNameHint);\r
+                                       }\r
+                               }\r
+                               @Override\r
+                public void focusGained(FocusEvent e) {\r
+                                       if (fNameText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {\r
+                                               fNameText.setText(""); //$NON-NLS-1$\r
+                                       }\r
+                                       fNameText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));\r
+                               }\r
+                       });\r
+                       fNameText.addModifyListener(new ModifyListener() {\r
+                               @Override\r
+                public void modifyText(ModifyEvent e) {\r
+                                       if (! fNameText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {\r
+                                               fNode.setFilterName(fNameText.getText());\r
+                                               fViewer.refresh(fNode);\r
+                                       }\r
+                               }\r
+                       });\r
+               }\r
+       }\r
+\r
+       private class FilterEventTypeNodeComposite extends FilterBaseNodeComposite {\r
+               TmfFilterEventTypeNode fNode;\r
+               Combo fTypeCombo;\r
+               \r
+               FilterEventTypeNodeComposite(Composite parent, TmfFilterEventTypeNode node) {\r
+                       super(parent);\r
+                       fNode = node;\r
+\r
+                       Label label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_TypeLabel);\r
+                       \r
+                       fTypeCombo = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY);\r
+                       fTypeCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));\r
+                       fTypeCombo.setItems(EVENT_TYPES_MAP.keySet().toArray(new String[0]));\r
+                       if (fNode.getEventType() != null) {\r
+                               for (Entry <String, Entry<String, String>> eventTypeEntry : EVENT_TYPES_MAP.entrySet()) {\r
+                                       if (eventTypeEntry.getValue().getValue().equals(fNode.getEventType())) {\r
+                                               fTypeCombo.setText(eventTypeEntry.getKey());\r
+                                       }\r
+                               }\r
+                       }\r
+                       fTypeCombo.addModifyListener(new ModifyListener() {\r
+                               @Override\r
+                public void modifyText(ModifyEvent e) {\r
+                                       for (Entry <String, Entry<String, String>> eventTypeEntry : EVENT_TYPES_MAP.entrySet()) {\r
+                                               if (eventTypeEntry.getKey().equals(fTypeCombo.getText())) {\r
+                                                       fNode.setEventType(eventTypeEntry.getValue().getValue());\r
+                                                       fNode.setName(eventTypeEntry.getValue().getKey());\r
+                                                       fViewer.refresh(fNode);\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       });\r
+               }\r
+       }\r
+       \r
+       private class FilterAndNodeComposite extends FilterBaseNodeComposite {\r
+               TmfFilterAndNode fNode;\r
+               Button fNotButton;\r
+               \r
+               FilterAndNodeComposite(Composite parent, TmfFilterAndNode node) {\r
+                       super(parent);\r
+                       fNode = node;\r
+                       \r
+                       Label label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_NotLabel);\r
+                       \r
+                       fNotButton = new Button(this, SWT.CHECK);\r
+                       fNotButton.setSelection(fNode.isNot());\r
+                       fNotButton.addSelectionListener(new SelectionAdapter() {\r
+                               @Override\r
+                               public void widgetSelected(SelectionEvent e) {\r
+                                       fNode.setNot(fNotButton.getSelection());\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+               }\r
+       }\r
+\r
+       private class FilterOrNodeComposite extends FilterBaseNodeComposite {\r
+               TmfFilterOrNode fNode;\r
+               Button fNotButton;\r
+               \r
+               FilterOrNodeComposite(Composite parent, TmfFilterOrNode node) {\r
+                       super(parent);\r
+                       fNode = node;\r
+                       \r
+                       Label label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_NotLabel);\r
+                       \r
+                       fNotButton = new Button(this, SWT.CHECK);\r
+                       fNotButton.setSelection(fNode.isNot());\r
+                       fNotButton.addSelectionListener(new SelectionAdapter() {\r
+                               @Override\r
+                               public void widgetSelected(SelectionEvent e) {\r
+                                       fNode.setNot(fNotButton.getSelection());\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+               }\r
+       }\r
+       \r
+       private class FilterContainsNodeComposite extends FilterBaseNodeComposite {\r
+               TmfFilterContainsNode fNode;\r
+               Button fNotButton;\r
+               Combo fFieldCombo;\r
+               Text fValueText;\r
+               Button fIgnoreCaseButton;\r
+               \r
+               FilterContainsNodeComposite(Composite parent, TmfFilterContainsNode node) {\r
+                       super(parent);\r
+                       fNode = node;\r
+                       \r
+                       Label label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_NotLabel);\r
+                       \r
+                       fNotButton = new Button(this, SWT.CHECK);\r
+                       fNotButton.setSelection(fNode.isNot());\r
+                       fNotButton.addSelectionListener(new SelectionAdapter() {\r
+                               @Override\r
+                               public void widgetSelected(SelectionEvent e) {\r
+                                       fNode.setNot(fNotButton.getSelection());\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+                       \r
+                       label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_FieldLabel);\r
+                       \r
+                       fFieldCombo = new Combo(this, SWT.DROP_DOWN);\r
+                       fFieldCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));\r
+                       fFieldCombo.setItems(getFieldsList(fNode));\r
+                       if (fNode.getField() != null) {\r
+                               fFieldCombo.setText(fNode.getField());\r
+                       }\r
+                       fFieldCombo.addModifyListener(new ModifyListener() {\r
+                               @Override\r
+                public void modifyText(ModifyEvent e) {\r
+                                       fNode.setField(fFieldCombo.getText());\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+                       \r
+                       label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_ValueLabel);\r
+                       \r
+                       fValueText = new Text(this, SWT.BORDER);\r
+                       fValueText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));\r
+                       if (node.getValue() != null && node.getValue().length() > 0) {\r
+                               fValueText.setText(node.getValue());\r
+                       } else {\r
+                               fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));\r
+                               fValueText.setText(Messages.FilterViewer_ValueHint);\r
+                       }\r
+                       fValueText.addFocusListener(new FocusListener() {\r
+                               @Override\r
+                public void focusLost(FocusEvent e) {\r
+                                       if (fNode.getValue() == null || fNode.getValue().length() == 0) {\r
+                                               fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));\r
+                                               fValueText.setText(Messages.FilterViewer_ValueHint);\r
+                                       }\r
+                               }\r
+                               @Override\r
+                public void focusGained(FocusEvent e) {\r
+                                       if (fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {\r
+                                               fValueText.setText(""); //$NON-NLS-1$\r
+                                       }\r
+                                       fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));\r
+                               }\r
+                       });\r
+                       fValueText.addModifyListener(new ModifyListener() {\r
+                               @Override\r
+                public void modifyText(ModifyEvent e) {\r
+                                       if (! fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {\r
+                                               fNode.setValue(fValueText.getText());\r
+                                               fViewer.refresh(fNode);\r
+                                       }\r
+                               }\r
+                       });\r
+                       \r
+                       label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       \r
+                       fIgnoreCaseButton = new Button(this, SWT.CHECK);\r
+                       fIgnoreCaseButton.setSelection(fNode.isIgnoreCase());\r
+                       fIgnoreCaseButton.setText(Messages.FilterViewer_IgnoreCaseButtonText);\r
+                       fIgnoreCaseButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       fIgnoreCaseButton.addSelectionListener(new SelectionAdapter() {\r
+                               @Override\r
+                               public void widgetSelected(SelectionEvent e) {\r
+                                       fNode.setIgnoreCase(fIgnoreCaseButton.getSelection());\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+               }\r
+       }\r
+\r
+       private class FilterEqualsNodeComposite extends FilterBaseNodeComposite {\r
+               TmfFilterEqualsNode fNode;\r
+               Button fNotButton;\r
+               Combo fFieldCombo;\r
+               Text fValueText;\r
+               Button fIgnoreCaseButton;\r
+               \r
+               FilterEqualsNodeComposite(Composite parent, TmfFilterEqualsNode node) {\r
+                       super(parent);\r
+                       fNode = node;\r
+                       \r
+                       Label label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_NotLabel);\r
+                       \r
+                       fNotButton = new Button(this, SWT.CHECK);\r
+                       fNotButton.setSelection(fNode.isNot());\r
+                       fNotButton.addSelectionListener(new SelectionAdapter() {\r
+                               @Override\r
+                               public void widgetSelected(SelectionEvent e) {\r
+                                       fNode.setNot(fNotButton.getSelection());\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+                       \r
+                       label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_FieldLabel);\r
+                       \r
+                       fFieldCombo = new Combo(this, SWT.DROP_DOWN);\r
+                       fFieldCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));\r
+                       fFieldCombo.setItems(getFieldsList(fNode));\r
+                       if (fNode.getField() != null) {\r
+                               fFieldCombo.setText(fNode.getField());\r
+                       }\r
+                       fFieldCombo.addModifyListener(new ModifyListener() {\r
+                               @Override\r
+                public void modifyText(ModifyEvent e) {\r
+                                       fNode.setField(fFieldCombo.getText());\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+                       \r
+                       label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_ValueLabel);\r
+                       \r
+                       fValueText = new Text(this, SWT.BORDER);\r
+                       fValueText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));\r
+                       if (node.getValue() != null && node.getValue().length() > 0) {\r
+                               fValueText.setText(node.getValue());\r
+                       } else {\r
+                               fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));\r
+                               fValueText.setText(Messages.FilterViewer_ValueHint);\r
+                       }\r
+                       fValueText.addFocusListener(new FocusListener() {\r
+                               @Override\r
+                public void focusLost(FocusEvent e) {\r
+                                       if (fNode.getValue() == null || fNode.getValue().length() == 0) {\r
+                                               fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));\r
+                                               fValueText.setText(Messages.FilterViewer_ValueHint);\r
+                                       }\r
+                               }\r
+                               @Override\r
+                public void focusGained(FocusEvent e) {\r
+                                       if (fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {\r
+                                               fValueText.setText(""); //$NON-NLS-1$\r
+                                       }\r
+                                       fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));\r
+                               }\r
+                       });\r
+                       fValueText.addModifyListener(new ModifyListener() {\r
+                               @Override\r
+                public void modifyText(ModifyEvent e) {\r
+                                       if (! fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {\r
+                                               fNode.setValue(fValueText.getText());\r
+                                               fViewer.refresh(fNode);\r
+                                       }\r
+                               }\r
+                       });\r
+                       \r
+                       label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       \r
+                       fIgnoreCaseButton = new Button(this, SWT.CHECK);\r
+                       fIgnoreCaseButton.setSelection(fNode.isIgnoreCase());\r
+                       fIgnoreCaseButton.setText(Messages.FilterViewer_IgnoreCaseButtonText);\r
+                       fIgnoreCaseButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       fIgnoreCaseButton.addSelectionListener(new SelectionAdapter() {\r
+                               @Override\r
+                               public void widgetSelected(SelectionEvent e) {\r
+                                       fNode.setIgnoreCase(fIgnoreCaseButton.getSelection());\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+               }\r
+       }\r
+\r
+       private class FilterMatchesNodeComposite extends FilterBaseNodeComposite {\r
+               TmfFilterMatchesNode fNode;\r
+               Button fNotButton;\r
+               Combo fFieldCombo;\r
+               Text fRegexText;\r
+               \r
+               FilterMatchesNodeComposite(Composite parent, TmfFilterMatchesNode node) {\r
+                       super(parent);\r
+                       fNode = node;\r
+                       \r
+                       Label label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_NotLabel);\r
+                       \r
+                       fNotButton = new Button(this, SWT.CHECK);\r
+                       fNotButton.setSelection(fNode.isNot());\r
+                       fNotButton.addSelectionListener(new SelectionAdapter() {\r
+                               @Override\r
+                               public void widgetSelected(SelectionEvent e) {\r
+                                       fNode.setNot(fNotButton.getSelection());\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+                       \r
+                       label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_FieldLabel);\r
+                       \r
+                       fFieldCombo = new Combo(this, SWT.DROP_DOWN);\r
+                       fFieldCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));\r
+                       fFieldCombo.setItems(getFieldsList(fNode));\r
+                       if (fNode.getField() != null) {\r
+                               fFieldCombo.setText(fNode.getField());\r
+                       }\r
+                       fFieldCombo.addModifyListener(new ModifyListener() {\r
+                               @Override\r
+                public void modifyText(ModifyEvent e) {\r
+                                       fNode.setField(fFieldCombo.getText());\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+                       \r
+                       label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_RegexLabel);\r
+                       \r
+                       fRegexText = new Text(this, SWT.BORDER);\r
+                       fRegexText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));\r
+                       if (node.getRegex() != null && node.getRegex().length() > 0) {\r
+                               fRegexText.setText(node.getRegex());\r
+                       } else {\r
+                               fRegexText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));\r
+                               fRegexText.setText(Messages.FilterViewer_RegexHint);\r
+                       }\r
+                       fRegexText.addFocusListener(new FocusListener() {\r
+                               @Override\r
+                public void focusLost(FocusEvent e) {\r
+                                       if (fNode.getRegex() == null || fNode.getRegex().length() == 0) {\r
+                                               fRegexText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));\r
+                                               fRegexText.setText(Messages.FilterViewer_RegexHint);\r
+                                       }\r
+                               }\r
+                               @Override\r
+                public void focusGained(FocusEvent e) {\r
+                                       if (fRegexText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {\r
+                                               fRegexText.setText(""); //$NON-NLS-1$\r
+                                       }\r
+                                       fRegexText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));\r
+                               }\r
+                       });\r
+                       fRegexText.addModifyListener(new ModifyListener() {\r
+                               @Override\r
+                public void modifyText(ModifyEvent e) {\r
+                                       if (! fRegexText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {\r
+                                               fNode.setRegex(fRegexText.getText());\r
+                                               fViewer.refresh(fNode);\r
+                                       }\r
+                               }\r
+                       });\r
+               }\r
+       }\r
+\r
+       private class FilterCompareNodeComposite extends FilterBaseNodeComposite {\r
+               TmfFilterCompareNode fNode;\r
+               Button fNotButton;\r
+               Combo fFieldCombo;\r
+               Text fValueText;\r
+               Button fLTButton;\r
+               Button fEQButton;\r
+               Button fGTButton;\r
+               Button fNumButton;\r
+               Button fAlphaButton;\r
+               Button fTimestampButton;\r
+               \r
+               FilterCompareNodeComposite(Composite parent, TmfFilterCompareNode node) {\r
+                       super(parent);\r
+                       fNode = node;\r
+                       \r
+                       Label label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_NotLabel);\r
+                       \r
+                       fNotButton = new Button(this, SWT.CHECK);\r
+                       fNotButton.setSelection(fNode.isNot());\r
+                       fNotButton.addSelectionListener(new SelectionAdapter() {\r
+                               @Override\r
+                               public void widgetSelected(SelectionEvent e) {\r
+                                       fNode.setNot(fNotButton.getSelection());\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+                       \r
+                       label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_FieldLabel);\r
+                       \r
+                       fFieldCombo = new Combo(this, SWT.DROP_DOWN);\r
+                       fFieldCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));\r
+                       fFieldCombo.setItems(getFieldsList(fNode));\r
+                       if (fNode.getField() != null) {\r
+                               fFieldCombo.setText(fNode.getField());\r
+                       }\r
+                       fFieldCombo.addModifyListener(new ModifyListener() {\r
+                               @Override\r
+                public void modifyText(ModifyEvent e) {\r
+                                       fNode.setField(fFieldCombo.getText());\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+                       \r
+                       label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_ResultLabel);\r
+                       \r
+               Composite resultGroup = new Composite(this, SWT.NONE);\r
+               GridLayout rggl = new GridLayout(3, true);\r
+               rggl.marginHeight = 0;\r
+               rggl.marginWidth = 0;\r
+               resultGroup.setLayout(rggl);\r
+                       resultGroup.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+               \r
+                       fLTButton = new Button(resultGroup, SWT.RADIO);\r
+                       fLTButton.setSelection(fNode.getResult() < 0);\r
+                       fLTButton.setText("<"); //$NON-NLS-1$\r
+                       fLTButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       fLTButton.addSelectionListener(new SelectionAdapter() {\r
+                               @Override\r
+                               public void widgetSelected(SelectionEvent e) {\r
+                                       if (fLTButton.getSelection()) {\r
+                                               fNode.setResult(-1);\r
+                                       }\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+                       \r
+                       fEQButton = new Button(resultGroup, SWT.RADIO);\r
+                       fEQButton.setSelection(fNode.getResult() == 0);\r
+                       fEQButton.setText("="); //$NON-NLS-1$\r
+                       fEQButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       fEQButton.addSelectionListener(new SelectionAdapter() {\r
+                               @Override\r
+                               public void widgetSelected(SelectionEvent e) {\r
+                                       if (fEQButton.getSelection()) {\r
+                                               fNode.setResult(0);\r
+                                       }\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+                       \r
+                       fGTButton = new Button(resultGroup, SWT.RADIO);\r
+                       fGTButton.setSelection(fNode.getResult() > 0);\r
+                       fGTButton.setText(">"); //$NON-NLS-1$\r
+                       fGTButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       fGTButton.addSelectionListener(new SelectionAdapter() {\r
+                               @Override\r
+                               public void widgetSelected(SelectionEvent e) {\r
+                                       if (fGTButton.getSelection()) {\r
+                                               fNode.setResult(1);\r
+                                       }\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+                       \r
+                       label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_TypeLabel);\r
+                       \r
+               Composite typeGroup = new Composite(this, SWT.NONE);\r
+               GridLayout tggl = new GridLayout(3, false);\r
+               tggl.marginHeight = 0;\r
+               tggl.marginWidth = 0;\r
+               typeGroup.setLayout(tggl);\r
+                       typeGroup.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+               \r
+                       fNumButton = new Button(typeGroup, SWT.RADIO);\r
+                       fNumButton.setSelection(fNode.getType() == Type.NUM);\r
+                       fNumButton.setText(Messages.FilterViewer_NumButtonText);\r
+                       fNumButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       fNumButton.addSelectionListener(new SelectionAdapter() {\r
+                               @Override\r
+                               public void widgetSelected(SelectionEvent e) {\r
+                                       if (fNumButton.getSelection()) {\r
+                                               fNode.setType(Type.NUM);\r
+                                       }\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+                       \r
+                       fAlphaButton = new Button(typeGroup, SWT.RADIO);\r
+                       fAlphaButton.setSelection(fNode.getType() == Type.ALPHA);\r
+                       fAlphaButton.setText(Messages.FilterViewer_AlphaButtonText);\r
+                       fAlphaButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       fAlphaButton.addSelectionListener(new SelectionAdapter() {\r
+                               @Override\r
+                               public void widgetSelected(SelectionEvent e) {\r
+                                       if (fAlphaButton.getSelection()) {\r
+                                               fNode.setType(Type.ALPHA);\r
+                                       }\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+                       \r
+                       fTimestampButton = new Button(typeGroup, SWT.RADIO);\r
+                       fTimestampButton.setSelection(fNode.getType() == Type.TIMESTAMP);\r
+                       fTimestampButton.setText(Messages.FilterViewer_TimestampButtonText);\r
+                       fTimestampButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       fTimestampButton.addSelectionListener(new SelectionAdapter() {\r
+                               @Override\r
+                               public void widgetSelected(SelectionEvent e) {\r
+                                       if (fTimestampButton.getSelection()) {\r
+                                               fNode.setType(Type.TIMESTAMP);\r
+                                       }\r
+                                       fViewer.refresh(fNode);\r
+                               }\r
+                       });\r
+                       \r
+                       label = new Label(this, SWT.NONE);\r
+                       label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+                       label.setText(Messages.FilterViewer_ValueLabel);\r
+                       \r
+                       fValueText = new Text(this, SWT.BORDER);\r
+                       fValueText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));\r
+                       if (node.getValue() != null && node.getValue().length() > 0) {\r
+                               fValueText.setText(node.getValue());\r
+                       } else {\r
+                               fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));\r
+                               fValueText.setText(Messages.FilterViewer_ValueHint);\r
+                       }\r
+                       fValueText.addFocusListener(new FocusListener() {\r
+                               @Override\r
+                public void focusLost(FocusEvent e) {\r
+                                       if (fNode.getValue() == null || fNode.getValue().length() == 0) {\r
+                                               fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));\r
+                                               fValueText.setText(Messages.FilterViewer_ValueHint);\r
+                                       }\r
+                               }\r
+                               @Override\r
+                public void focusGained(FocusEvent e) {\r
+                                       if (fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {\r
+                                               fValueText.setText(""); //$NON-NLS-1$\r
+                                       }\r
+                                       fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));\r
+                               }\r
+                       });\r
+                       fValueText.addModifyListener(new ModifyListener() {\r
+                               @Override\r
+                public void modifyText(ModifyEvent e) {\r
+                                       if (! fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {\r
+                                               fNode.setValue(fValueText.getText());\r
+                                               fViewer.refresh(fNode);\r
+                                       }\r
+                               }\r
+                       });\r
+               }\r
+       }\r
+\r
+}\r
This page took 0.064961 seconds and 5 git commands to generate.