1 /*******************************************************************************
2 * Copyright (c) 2015 Ericsson
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
10 * Patrick Tasse - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.tracecompass
.tmf
.ui
.widgets
.timegraph
.dialogs
;
15 import java
.util
.ArrayList
;
16 import java
.util
.Arrays
;
17 import java
.util
.List
;
19 import org
.eclipse
.jdt
.annotation
.NonNull
;
20 import org
.eclipse
.jface
.action
.Action
;
21 import org
.eclipse
.jface
.viewers
.Viewer
;
22 import org
.eclipse
.jface
.viewers
.ViewerFilter
;
23 import org
.eclipse
.tracecompass
.internal
.tmf
.ui
.Activator
;
24 import org
.eclipse
.tracecompass
.internal
.tmf
.ui
.ITmfImageConstants
;
25 import org
.eclipse
.tracecompass
.internal
.tmf
.ui
.Messages
;
26 import org
.eclipse
.tracecompass
.tmf
.ui
.widgets
.timegraph
.TimeGraphViewer
;
27 import org
.eclipse
.tracecompass
.tmf
.ui
.widgets
.timegraph
.model
.ITimeGraphEntry
;
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.
36 public class ShowFilterDialogAction
extends Action
{
38 /** The filter dialog */
39 private final TimeGraphFilterDialog fFilterDialog
;
41 /** The time graph viewer */
42 private final TimeGraphViewer fTimeGraphViewer
;
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.
49 private class RawViewerFilter
extends ViewerFilter
{
51 private List
<?
extends ITimeGraphEntry
> fFiltered
= null;
53 public RawViewerFilter(List
<?
extends ITimeGraphEntry
> filteredElements
) {
54 fFiltered
= filteredElements
;
57 public void setFiltered(List
<?
extends ITimeGraphEntry
> objects
) {
61 public List
<?
extends ITimeGraphEntry
> getFiltered() {
66 public boolean select(Viewer viewer
, Object parentElement
, Object element
) {
67 if (fFiltered
== null) {
70 return !fFiltered
.contains(element
);
77 * @param timeGraphViewer
78 * the time graph viewer
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
));
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
;
103 if (rawViewerFilter
!= null && rawViewerFilter
.getFiltered() != null) {
104 ArrayList
<?
extends ITimeGraphEntry
> nonFilteredElements
= new ArrayList
<>(allElements
);
105 nonFilteredElements
.removeAll(rawViewerFilter
.getFiltered());
106 fFilterDialog
.setInitialElementSelections(nonFilteredElements
);
108 fFilterDialog
.setInitialElementSelections(allElements
);
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
);
119 rawViewerFilter
.setFiltered(filteredElements
);
122 } else if (rawViewerFilter
!= null) {
123 removeFilter(rawViewerFilter
);
130 * Get the filter dialog.
132 * @return the filter dialog
134 public TimeGraphFilterDialog
getFilterDialog() {
135 return fFilterDialog
;
139 * Add a viewer filter.
142 * The filter object to be added to the viewer
144 protected void addFilter(@NonNull ViewerFilter filter
) {
145 fTimeGraphViewer
.addFilter(filter
);
149 * Remove a viewer filter.
152 * The filter object to be removed from the viewer
154 protected void removeFilter(@NonNull ViewerFilter filter
) {
155 fTimeGraphViewer
.removeFilter(filter
);
159 * Refresh the viewer.
161 protected void refresh() {
162 fTimeGraphViewer
.refresh();
166 * Explores the list of top-level inputs and returns all the inputs.
169 * The top-level inputs
170 * @return All the inputs
172 private List
<?
extends ITimeGraphEntry
> listAllInputs(List
<?
extends ITimeGraphEntry
> inputs
) {
173 ArrayList
<ITimeGraphEntry
> items
= new ArrayList
<>();
174 for (ITimeGraphEntry entry
: inputs
) {
176 if (entry
.hasChildren()) {
177 items
.addAll(listAllInputs(entry
.getChildren()));