Fix latest batch of null warnings
[deliverable/tracecompass.git] / tmf / org.eclipse.tracecompass.tmf.ui / src / org / eclipse / tracecompass / tmf / ui / widgets / timegraph / dialogs / ShowFilterDialogAction.java
CommitLineData
cfcfd964
PT
1/*******************************************************************************
2 * Copyright (c) 2015 Ericsson
3 *
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
9 * Contributors:
10 * Patrick Tasse - Initial API and implementation
11 *******************************************************************************/
12
13package org.eclipse.tracecompass.tmf.ui.widgets.timegraph.dialogs;
14
15import java.util.ArrayList;
16import java.util.Arrays;
17import java.util.List;
18
367e2932 19import org.eclipse.jdt.annotation.NonNull;
cfcfd964
PT
20import org.eclipse.jface.action.Action;
21import org.eclipse.jface.viewers.Viewer;
22import org.eclipse.jface.viewers.ViewerFilter;
23import org.eclipse.tracecompass.internal.tmf.ui.Activator;
24import org.eclipse.tracecompass.internal.tmf.ui.ITmfImageConstants;
25import org.eclipse.tracecompass.internal.tmf.ui.Messages;
26import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphViewer;
27import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;
28
29/**
30 * Action to show the time graph filter dialog and add a filter to hide the
31 * unselected elements in the time graph viewer. The filter is removed if all
32 * elements are selected.
33 *
34 * @since 2.0
35 */
36public class ShowFilterDialogAction extends Action {
37
38 /** The filter dialog */
39 private final TimeGraphFilterDialog fFilterDialog;
40
41 /** The time graph viewer */
42 private final TimeGraphViewer fTimeGraphViewer;
43
44 /**
45 * This filter simply keeps a list of elements that should be filtered out.
46 * All the other elements will be shown.
47 * By default and when the list is set to null, all elements are shown.
48 */
49 private class RawViewerFilter extends ViewerFilter {
50
51 private List<? extends ITimeGraphEntry> fFiltered = null;
52
53 public RawViewerFilter(List<? extends ITimeGraphEntry> filteredElements) {
54 fFiltered = filteredElements;
55 }
56
57 public void setFiltered(List<? extends ITimeGraphEntry> objects) {
58 fFiltered = objects;
59 }
60
61 public List<? extends ITimeGraphEntry> getFiltered() {
62 return fFiltered;
63 }
64
65 @Override
66 public boolean select(Viewer viewer, Object parentElement, Object element) {
67 if (fFiltered == null) {
68 return true;
69 }
70 return !fFiltered.contains(element);
71 }
72 }
73
74 /**
75 * Constructor
76 *
77 * @param timeGraphViewer
78 * the time graph viewer
79 */
80 public ShowFilterDialogAction(TimeGraphViewer timeGraphViewer) {
81 fFilterDialog = new TimeGraphFilterDialog(timeGraphViewer.getControl().getShell());
82 fTimeGraphViewer = timeGraphViewer;
83 setText(Messages.ShowFilterDialogAction_FilterActionNameText);
84 setToolTipText(Messages.ShowFilterDialogAction_FilterActionToolTipText);
85 setImageDescriptor(Activator.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_FILTERS));
86 }
87
88 @Override
89 public void run() {
90 ITimeGraphEntry[] topInput = fTimeGraphViewer.getTimeGraphContentProvider().getElements(fTimeGraphViewer.getInput());
91 if (topInput != null) {
92 List<? extends ITimeGraphEntry> allElements = listAllInputs(Arrays.asList(topInput));
93 fFilterDialog.setInput(fTimeGraphViewer.getInput());
94 fFilterDialog.setTitle(Messages.TmfTimeFilterDialog_WINDOW_TITLE);
95 fFilterDialog.setMessage(Messages.TmfTimeFilterDialog_MESSAGE);
96 fFilterDialog.setExpandedElements(allElements.toArray());
97 RawViewerFilter rawViewerFilter = null;
98 for (ViewerFilter filter : fTimeGraphViewer.getFilters()) {
99 if (filter instanceof RawViewerFilter) {
100 rawViewerFilter = (RawViewerFilter) filter;
101 }
102 }
103 if (rawViewerFilter != null && rawViewerFilter.getFiltered() != null) {
104 ArrayList<? extends ITimeGraphEntry> nonFilteredElements = new ArrayList<>(allElements);
105 nonFilteredElements.removeAll(rawViewerFilter.getFiltered());
106 fFilterDialog.setInitialElementSelections(nonFilteredElements);
107 } else {
108 fFilterDialog.setInitialElementSelections(allElements);
109 }
110 fFilterDialog.open();
111 if (fFilterDialog.getResult() != null) {
112 if (fFilterDialog.getResult().length != allElements.size()) {
113 List<? extends ITimeGraphEntry> filteredElements = new ArrayList<>(allElements);
114 filteredElements.removeAll(Arrays.asList(fFilterDialog.getResult()));
115 if (rawViewerFilter == null) {
116 rawViewerFilter = new RawViewerFilter(filteredElements);
117 addFilter(rawViewerFilter);
118 } else {
119 rawViewerFilter.setFiltered(filteredElements);
120 refresh();
121 }
122 } else if (rawViewerFilter != null) {
123 removeFilter(rawViewerFilter);
124 }
125 }
126 }
127 }
128
129 /**
130 * Get the filter dialog.
131 *
132 * @return the filter dialog
133 */
134 public TimeGraphFilterDialog getFilterDialog() {
135 return fFilterDialog;
136 }
137
138 /**
139 * Add a viewer filter.
140 *
141 * @param filter
142 * The filter object to be added to the viewer
143 */
367e2932 144 protected void addFilter(@NonNull ViewerFilter filter) {
cfcfd964
PT
145 fTimeGraphViewer.addFilter(filter);
146 }
147
148 /**
149 * Remove a viewer filter.
150 *
151 * @param filter
152 * The filter object to be removed from the viewer
153 */
367e2932 154 protected void removeFilter(@NonNull ViewerFilter filter) {
cfcfd964
PT
155 fTimeGraphViewer.removeFilter(filter);
156 }
157
158 /**
159 * Refresh the viewer.
160 */
161 protected void refresh() {
162 fTimeGraphViewer.refresh();
163 }
164
165 /**
166 * Explores the list of top-level inputs and returns all the inputs.
167 *
168 * @param inputs
169 * The top-level inputs
170 * @return All the inputs
171 */
172 private List<? extends ITimeGraphEntry> listAllInputs(List<? extends ITimeGraphEntry> inputs) {
173 ArrayList<ITimeGraphEntry> items = new ArrayList<>();
174 for (ITimeGraphEntry entry : inputs) {
175 items.add(entry);
176 if (entry.hasChildren()) {
177 items.addAll(listAllInputs(entry.getChildren()));
178 }
179 }
180 return items;
181 }
182}
This page took 0.034652 seconds and 5 git commands to generate.