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;
/** 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<>();
Object getInput();
+ void setFilters(ViewerFilter[] filters);
+
+ ViewerFilter[] getFilters();
+
void redraw();
void update();
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();
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();
*/
@TmfSignalHandler
public void traceOpened(TmfTraceOpenedSignal signal) {
- fTrace = signal.getTrace();
- loadTrace();
+ loadTrace(signal.getTrace());
}
/**
if (signal.getTrace() == fTrace) {
return;
}
- fTrace = signal.getTrace();
- loadTrace();
+ loadTrace(signal.getTrace());
}
/**
synchronized (fEntryListMap) {
fEntryListMap.remove(signal.getTrace());
}
+ fFiltersMap.remove(signal.getTrace());
if (signal.getTrace() == fTrace) {
fTrace = null;
fStartTime = SWT.DEFAULT;
// 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) {
}
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();
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)
/** 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<>();
/**
/** 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 };
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
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);
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();
* @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()) {
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);
}
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.
*/