tmf: Persist filters of opened traces in AbstractTimeGraphView
authorPatrick Tasse <patrick.tasse@gmail.com>
Fri, 11 Sep 2015 14:50:17 +0000 (10:50 -0400)
committerPatrick Tasse <patrick.tasse@gmail.com>
Tue, 15 Sep 2015 20:47:31 +0000 (16:47 -0400)
The filters of each opened trace are stored in a map and restored when
switching from one trace to another.

Change-Id: I101961009eaf9123aca0995cc1e7ea862f13d262
Signed-off-by: Patrick Tasse <patrick.tasse@gmail.com>
Reviewed-on: https://git.eclipse.org/r/55749
Reviewed-by: Hudson CI
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/AbstractTimeGraphView.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/TimeGraphCombo.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/TimeGraphViewer.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/widgets/TimeGraphControl.java

index 3a59f8fcaa8b9de2f67c546592c43849c2387236..b532a240156808a5f57a0d88b6c70946a9cbf680 100644 (file)
@@ -39,6 +39,7 @@ import org.eclipse.jface.viewers.ILabelProviderListener;
 import org.eclipse.jface.viewers.ISelectionProvider;
 import org.eclipse.jface.viewers.ITableLabelProvider;
 import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.ViewerFilter;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Composite;
@@ -113,6 +114,9 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA
     /** The trace to entry list hash map */
     private final Map<ITmfTrace, List<TimeGraphEntry>> fEntryListMap = new HashMap<>();
 
+    /** The trace to filters hash map */
+    private final Map<ITmfTrace, ViewerFilter[]> fFiltersMap = new HashMap<>();
+
     /** The trace to build thread hash map */
     private final Map<ITmfTrace, BuildThread> fBuildThreadMap = new HashMap<>();
 
@@ -193,6 +197,10 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA
 
         Object getInput();
 
+        void setFilters(ViewerFilter[] filters);
+
+        ViewerFilter[] getFilters();
+
         void redraw();
 
         void update();
@@ -253,6 +261,16 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA
             return viewer.getInput();
         }
 
+        @Override
+        public void setFilters(ViewerFilter[] filters) {
+            viewer.setFilters(filters);
+        }
+
+        @Override
+        public ViewerFilter[] getFilters() {
+            return viewer.getFilters();
+        }
+
         @Override
         public void refresh() {
             viewer.refresh();
@@ -336,6 +354,16 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA
             return combo.getInput();
         }
 
+        @Override
+        public void setFilters(ViewerFilter[] filters) {
+            combo.setFilters(filters);
+        }
+
+        @Override
+        public ViewerFilter[] getFilters() {
+            return combo.getFilters();
+        }
+
         @Override
         public void refresh() {
             combo.refresh();
@@ -976,8 +1004,7 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA
      */
     @TmfSignalHandler
     public void traceOpened(TmfTraceOpenedSignal signal) {
-        fTrace = signal.getTrace();
-        loadTrace();
+        loadTrace(signal.getTrace());
     }
 
     /**
@@ -991,8 +1018,7 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA
         if (signal.getTrace() == fTrace) {
             return;
         }
-        fTrace = signal.getTrace();
-        loadTrace();
+        loadTrace(signal.getTrace());
     }
 
     /**
@@ -1014,6 +1040,7 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA
         synchronized (fEntryListMap) {
             fEntryListMap.remove(signal.getTrace());
         }
+        fFiltersMap.remove(signal.getTrace());
         if (signal.getTrace() == fTrace) {
             fTrace = null;
             fStartTime = SWT.DEFAULT;
@@ -1098,11 +1125,16 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA
     // Internal
     // ------------------------------------------------------------------------
 
-    private void loadTrace() {
+    private void loadTrace(final ITmfTrace trace) {
         if (fZoomThread != null) {
             fZoomThread.cancel();
             fZoomThread = null;
         }
+        if (fTrace != null) {
+            /* save the filters of the previous trace */
+            fFiltersMap.put(fTrace, fTimeGraphWrapper.getFilters());
+        }
+        fTrace = trace;
         synchronized (fEntryListMap) {
             fEntryList = fEntryListMap.get(fTrace);
             if (fEntryList == null) {
@@ -1244,6 +1276,8 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA
                 }
                 if (fEntryList != fTimeGraphWrapper.getInput()) {
                     fTimeGraphWrapper.setInput(fEntryList);
+                    /* restore the previously saved filters, if any */
+                    fTimeGraphWrapper.setFilters(fFiltersMap.get(fTrace));
                     fTimeGraphWrapper.getTimeGraphViewer().setLinks(null);
                 } else {
                     fTimeGraphWrapper.refresh();
index 0ad5bac571da639a471e155ae5978219842b8467..acb505ab9347e3191855124d3bcb511c856be8fd 100644 (file)
@@ -76,6 +76,8 @@ import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.dialogs.TimeGraphFilter
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ILinkEvent;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;
 
+import com.google.common.collect.Iterables;
+
 /**
  * Time graph "combo" view (with the list/tree on the left and the gantt chart
  * on the right)
@@ -106,7 +108,7 @@ public class TimeGraphCombo extends Composite {
     /** The selection listener map */
     private final Map<ITimeGraphSelectionListener, SelectionListenerWrapper> fSelectionListenerMap = new HashMap<>();
 
-    /** The map of viewer filters */
+    /** The map of viewer filters to viewer filter wrappers */
     private final Map<ViewerFilter, ViewerFilter> fViewerFilterMap = new HashMap<>();
 
     /**
@@ -127,9 +129,6 @@ public class TimeGraphCombo extends Composite {
     /** The filter dialog */
     private TimeGraphFilterDialog fFilterDialog;
 
-    /** The filter generated from the filter dialog */
-    private RawViewerFilter fFilter;
-
     /** Default weight of each part of the sash */
     private static final int[] DEFAULT_WEIGHTS = { 1, 1 };
 
@@ -386,9 +385,6 @@ public class TimeGraphCombo extends Composite {
         fTimeGraphViewer.setBorderWidth(tree.getBorderWidth());
         fTimeGraphViewer.setNameWidthPref(0);
 
-        fFilter = new RawViewerFilter();
-        addFilter(fFilter);
-
         fFilterDialog = new TimeGraphFilterDialog(getShell());
 
         // Feature in Windows. The tree vertical bar reappears when
@@ -704,9 +700,15 @@ public class TimeGraphCombo extends Composite {
             fFilterDialog.setTitle(Messages.TmfTimeFilterDialog_WINDOW_TITLE);
             fFilterDialog.setMessage(Messages.TmfTimeFilterDialog_MESSAGE);
             fFilterDialog.setExpandedElements(allElements.toArray());
-            if (fFilter.getFiltered() != null) {
+            RawViewerFilter rawViewerFilter = null;
+            for (ViewerFilter filter : fTimeGraphViewer.getFilters()) {
+                if (filter instanceof RawViewerFilter) {
+                    rawViewerFilter = (RawViewerFilter) filter;
+                }
+            }
+            if (rawViewerFilter != null && rawViewerFilter.getFiltered() != null) {
                 ArrayList<? extends ITimeGraphEntry> nonFilteredElements = new ArrayList<>(allElements);
-                nonFilteredElements.removeAll(fFilter.getFiltered());
+                nonFilteredElements.removeAll(rawViewerFilter.getFiltered());
                 fFilterDialog.setInitialElementSelections(nonFilteredElements);
             } else {
                 fFilterDialog.setInitialElementSelections(allElements);
@@ -719,9 +721,13 @@ public class TimeGraphCombo extends Composite {
                 if (fFilterDialog.getResult().length != allElements.size()) {
                     ArrayList<Object> filteredElements = new ArrayList<Object>(allElements);
                     filteredElements.removeAll(Arrays.asList(fFilterDialog.getResult()));
-                    fFilter.setFiltered(filteredElements);
-                } else {
-                    fFilter.setFiltered(null);
+                    if (rawViewerFilter == null) {
+                        rawViewerFilter = new RawViewerFilter();
+                        addFilter(rawViewerFilter);
+                    }
+                    rawViewerFilter.setFiltered(filteredElements);
+                } else if (rawViewerFilter != null) {
+                    removeFilter(rawViewerFilter);
                 }
                 fTreeViewer.refresh();
                 fTreeViewer.expandAll();
@@ -880,7 +886,6 @@ public class TimeGraphCombo extends Composite {
      * @param input the input of this time graph combo, or <code>null</code> if none
      */
     public void setInput(Object input) {
-        fFilter.setFiltered(null);
         fInhibitTreeSelection = true;
         fTreeViewer.setInput(input);
         for (SelectionListenerWrapper listenerWrapper : fSelectionListenerMap.values()) {
@@ -925,7 +930,7 @@ public class TimeGraphCombo extends Composite {
     public void addFilter(ViewerFilter filter) {
         ViewerFilter wrapper = new ViewerFilterWrapper(filter);
         fTreeViewer.addFilter(wrapper);
-        fTimeGraphViewer.addFilter(wrapper);
+        fTimeGraphViewer.addFilter(filter);
         fViewerFilterMap.put(filter, wrapper);
         alignTreeItems(true);
     }
@@ -936,11 +941,45 @@ public class TimeGraphCombo extends Composite {
     public void removeFilter(ViewerFilter filter) {
         ViewerFilter wrapper = fViewerFilterMap.get(filter);
         fTreeViewer.removeFilter(wrapper);
-        fTimeGraphViewer.removeFilter(wrapper);
+        fTimeGraphViewer.removeFilter(filter);
         fViewerFilterMap.remove(filter);
         alignTreeItems(true);
     }
 
+    /**
+     * Returns this viewer's filters.
+     *
+     * @return an array of viewer filters
+     * @since 2.0
+     */
+    public ViewerFilter[] getFilters() {
+        return fTimeGraphViewer.getFilters();
+    }
+
+    /**
+     * Sets the filters, replacing any previous filters, and triggers
+     * refiltering of the elements.
+     *
+     * @param filters
+     *            an array of viewer filters, or null
+     * @since 2.0
+     */
+    public void setFilters(ViewerFilter[] filters) {
+        fViewerFilterMap.clear();
+        if (filters == null) {
+            fTreeViewer.resetFilters();
+        } else {
+            for (ViewerFilter filter : filters) {
+                ViewerFilter wrapper = new ViewerFilterWrapper(filter);
+                fViewerFilterMap.put(filter, wrapper);
+            }
+            ViewerFilter[] wrappers = Iterables.toArray(fViewerFilterMap.values(), ViewerFilter.class);
+            fTreeViewer.setFilters(wrappers);
+        }
+        fTimeGraphViewer.setFilters(filters);
+        alignTreeItems(true);
+    }
+
     /**
      * Refreshes this time graph completely with information freshly obtained from its model.
      */
index 4d63431a471b8dbad802d39456996a91482c4608..6baa0f98dcb00118d576e008f7662c91680c8777 100644 (file)
@@ -1894,6 +1894,29 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
         refresh();
     }
 
+    /**
+     * Returns this viewer's filters.
+     *
+     * @return an array of viewer filters
+     * @since 2.0
+     */
+    public ViewerFilter[] getFilters() {
+        return fTimeGraphCtrl.getFilters();
+    }
+
+    /**
+     * Sets the filters, replacing any previous filters, and triggers
+     * refiltering of the elements.
+     *
+     * @param filters
+     *            an array of viewer filters, or null
+     * @since 2.0
+     */
+    public void setFilters(ViewerFilter[] filters) {
+        fTimeGraphCtrl.setFilters(filters);
+        refresh();
+    }
+
     /**
      * Return the time alignment information
      *
index 41b13ab511d818f5ed40196273ba59c677ab679f..ef18c1c60947b818e61839b8adeb0a3ff2d111d7 100644 (file)
@@ -82,6 +82,8 @@ import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.Utils.Resolution;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.Utils.TimeFormat;
 
+import com.google.common.collect.Iterables;
+
 /**
  * Time graph control implementation
  *
@@ -2589,6 +2591,30 @@ public class TimeGraphControl extends TimeGraphBaseControl
         fFilters.remove(filter);
     }
 
+    /**
+     * Returns this control's filters.
+     *
+     * @return an array of viewer filters
+     * @since 2.0
+     */
+    public ViewerFilter[] getFilters() {
+        return Iterables.toArray(fFilters, ViewerFilter.class);
+    }
+
+    /**
+     * Sets the filters, replacing any previous filters.
+     *
+     * @param filters
+     *            an array of viewer filters, or null
+     * @since 2.0
+     */
+    public void setFilters(ViewerFilter[] filters) {
+        fFilters.clear();
+        if (filters != null) {
+            fFilters.addAll(Arrays.asList(filters));
+        }
+    }
+
     @Override
     public void colorSettingsChanged(StateItem[] stateItems) {
         /* Destroy previous colors from the resource manager */
This page took 0.043196 seconds and 5 git commands to generate.