tmf: add way to not refresh project when adding a trace to experiment
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / project / wizards / SelectTracesWizardPage.java
CommitLineData
12c155f5 1/*******************************************************************************
60ae41e1 2 * Copyright (c) 2009, 2014 Ericsson, École Polytechnique de Montréal
abbdd66a 3 *
12c155f5
FC
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
abbdd66a 8 *
12c155f5
FC
9 * Contributors:
10 * Francois Chouinard - Initial API and implementation
beb19106 11 * Geneviève Bastien - Moved the add and remove code to the experiment class
339d539c 12 * Patrick Tasse - Add support for folder elements
6039bcf3 13 * Marc-Andre Laperle - Convert to tree structure and add select/deselect all
12c155f5
FC
14 *******************************************************************************/
15
16package org.eclipse.linuxtools.tmf.ui.project.wizards;
17
18import java.util.HashMap;
19import java.util.Map;
20import java.util.Set;
21import java.util.Vector;
22
12c155f5 23import org.eclipse.core.resources.IFolder;
12c155f5 24import org.eclipse.core.runtime.CoreException;
6039bcf3
MAL
25import org.eclipse.jface.viewers.CheckStateChangedEvent;
26import org.eclipse.jface.viewers.CheckboxTreeViewer;
27import org.eclipse.jface.viewers.ColumnLabelProvider;
28import org.eclipse.jface.viewers.ICheckStateListener;
29import org.eclipse.jface.viewers.TreeViewer;
30import org.eclipse.jface.viewers.TreeViewerColumn;
339d539c 31import org.eclipse.jface.viewers.ViewerSorter;
12c155f5 32import org.eclipse.jface.wizard.WizardPage;
8fd82db5 33import org.eclipse.linuxtools.internal.tmf.ui.Activator;
12c155f5
FC
34import org.eclipse.linuxtools.tmf.ui.project.model.ITmfProjectModelElement;
35import org.eclipse.linuxtools.tmf.ui.project.model.TmfExperimentElement;
6039bcf3
MAL
36import org.eclipse.linuxtools.tmf.ui.project.model.TmfNavigatorContentProvider;
37import org.eclipse.linuxtools.tmf.ui.project.model.TmfNavigatorLabelProvider;
12c155f5
FC
38import org.eclipse.linuxtools.tmf.ui.project.model.TmfProjectElement;
39import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceElement;
40import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceFolder;
12c155f5 41import org.eclipse.swt.SWT;
6039bcf3
MAL
42import org.eclipse.swt.events.SelectionAdapter;
43import org.eclipse.swt.events.SelectionEvent;
44import org.eclipse.swt.graphics.Image;
45import org.eclipse.swt.layout.FillLayout;
46import org.eclipse.swt.layout.GridData;
47import org.eclipse.swt.layout.GridLayout;
48import org.eclipse.swt.widgets.Button;
12c155f5 49import org.eclipse.swt.widgets.Composite;
6039bcf3
MAL
50import org.eclipse.swt.widgets.Tree;
51import org.eclipse.ui.dialogs.FilteredTree;
52import org.eclipse.ui.dialogs.PatternFilter;
12c155f5
FC
53
54/**
b544077e 55 * Implementation of a wizard page for selecting trace for an experiment.
12c155f5 56 * <p>
abbdd66a 57 *
b544077e
BH
58 * @version 1.0
59 * @author Francois Chouinard
12c155f5
FC
60 */
61public class SelectTracesWizardPage extends WizardPage {
62
63 // ------------------------------------------------------------------------
64 // Attributes
65 // ------------------------------------------------------------------------
66
67 private final TmfProjectElement fProject;
68 private final TmfExperimentElement fExperiment;
9fa32496 69 private Map<String, TmfTraceElement> fPreviousTraces;
6039bcf3
MAL
70 private CheckboxTreeViewer fCheckboxTreeViewer;
71 private TmfNavigatorContentProvider fContentProvider;
72 private TmfNavigatorLabelProvider fLabelProvider;
73
74 private static final int COLUMN_WIDTH = 200;
75 private static final int BUTTON_SPACING = 4;
12c155f5
FC
76
77 // ------------------------------------------------------------------------
78 // Constructor
79 // ------------------------------------------------------------------------
b544077e
BH
80 /**
81 * Constructor
82 * @param project The project model element.
83 * @param experiment The experiment model experiment.
84 */
12c155f5
FC
85 protected SelectTracesWizardPage(TmfProjectElement project, TmfExperimentElement experiment) {
86 super(""); //$NON-NLS-1$
87 setTitle(Messages.SelectTracesWizardPage_WindowTitle);
88 setDescription(Messages.SelectTracesWizardPage_Description);
89 fProject = project;
90 fExperiment = experiment;
91 }
92
93 // ------------------------------------------------------------------------
94 // Dialog
95 // ------------------------------------------------------------------------
11252342 96
12c155f5
FC
97 @Override
98 public void createControl(Composite parent) {
99 Composite container = new Composite(parent, SWT.NULL);
6039bcf3 100 container.setLayout(new GridLayout(2, false));
12c155f5
FC
101 setControl(container);
102
6039bcf3
MAL
103 new FilteredTree(container, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, new PatternFilter(), true) {
104 @Override
105 protected TreeViewer doCreateTreeViewer(Composite aparent, int style) {
106 return SelectTracesWizardPage.this.doCreateTreeViewer(aparent);
107 }
108 };
109
110 Composite buttonComposite = new Composite(container, SWT.NONE);
111 FillLayout layout = new FillLayout(SWT.VERTICAL);
112 layout.spacing = BUTTON_SPACING;
113 buttonComposite.setLayout(layout);
114 GridData gd = new GridData();
115 gd.verticalAlignment = SWT.CENTER;
116 buttonComposite.setLayoutData(gd);
117
118 Button selectAllButton = new Button(buttonComposite, SWT.PUSH);
119 selectAllButton.setText(org.eclipse.linuxtools.internal.tmf.ui.project.dialogs.Messages.Dialog_SelectAll);
120 selectAllButton.addSelectionListener(new SelectionAdapter() {
121 @Override
122 public void widgetSelected(SelectionEvent e) {
123 setAllChecked(true);
124 }
125 });
126
127 Button deselectAllButton = new Button(buttonComposite, SWT.PUSH);
128 deselectAllButton.setText(org.eclipse.linuxtools.internal.tmf.ui.project.dialogs.Messages.Dialog_DeselectAll);
129 deselectAllButton.addSelectionListener(new SelectionAdapter() {
130 @Override
131 public void widgetSelected(SelectionEvent e) {
132 setAllChecked(false);
133 }
134 });
135 }
136
137 private TreeViewer doCreateTreeViewer(Composite parent) {
138 fCheckboxTreeViewer = new CheckboxTreeViewer(parent, SWT.BORDER);
139 fContentProvider = new TmfNavigatorContentProvider() {
140
141 @Override
142 public Object[] getElements(Object inputElement) {
143 return super.getChildren(inputElement);
144 }
145
146 @Override
147 public synchronized Object[] getChildren(Object parentElement) {
148 // We only care about the content of trace folders
149 if (parentElement instanceof TmfTraceFolder) {
150 return super.getChildren(parentElement);
151 }
152 return null;
153 }
12c155f5 154
6039bcf3
MAL
155 @Override
156 public boolean hasChildren(Object element) {
157 return getChildren(element) != null;
158 }
159 };
160 fCheckboxTreeViewer.setContentProvider(fContentProvider);
161 fLabelProvider = new TmfNavigatorLabelProvider();
162 fCheckboxTreeViewer.setLabelProvider(fLabelProvider);
163 fCheckboxTreeViewer.setSorter(new ViewerSorter());
12c155f5 164
6039bcf3
MAL
165 final Tree tree = fCheckboxTreeViewer.getTree();
166 GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
167 tree.setLayoutData(gd);
168 tree.setHeaderVisible(true);
169
170 final TreeViewerColumn column = new TreeViewerColumn(fCheckboxTreeViewer, SWT.NONE);
171 column.getColumn().setWidth(COLUMN_WIDTH);
172 column.getColumn().setText(Messages.SelectTracesWizardPage_TraceColumnHeader);
173 column.setLabelProvider(new ColumnLabelProvider() {
174 @Override
175 public String getText(Object element) {
176 return fLabelProvider.getText(element);
177 }
178 @Override
179 public Image getImage(Object element) {
180 return fLabelProvider.getImage(element);
181 }
182 });
12c155f5
FC
183
184 // Get the list of traces already part of the experiment
507b1336 185 fPreviousTraces = new HashMap<>();
12c155f5
FC
186 for (ITmfProjectModelElement child : fExperiment.getChildren()) {
187 if (child instanceof TmfTraceElement) {
188 TmfTraceElement trace = (TmfTraceElement) child;
339d539c 189 String name = trace.getElementPath();
12c155f5
FC
190 fPreviousTraces.put(name, trace);
191 }
192 }
193
194 // Populate the list of traces to choose from
195 Set<String> keys = fPreviousTraces.keySet();
196 TmfTraceFolder traceFolder = fProject.getTracesFolder();
6039bcf3 197 fCheckboxTreeViewer.setInput(traceFolder);
12c155f5
FC
198
199 // Set the checkbox for the traces already included
6039bcf3
MAL
200 setCheckedAlreadyIncludedTraces(keys, fContentProvider.getElements(fCheckboxTreeViewer.getInput()));
201
202 fCheckboxTreeViewer.addCheckStateListener(new ICheckStateListener() {
203 @Override
204 public void checkStateChanged(CheckStateChangedEvent event) {
205 Object element = event.getElement();
206 setSubtreeChecked(element, event.getChecked());
207 maintainCheckIntegrity(element);
208 }
209 });
210
211 return fCheckboxTreeViewer;
212 }
213
214 private void maintainCheckIntegrity(final Object element) {
215 Object parentElement = fContentProvider.getParent(element);
216 boolean allChecked = true;
217 boolean oneChecked = false;
218 boolean oneGrayed = false;
219 if (parentElement != null) {
220 if (fContentProvider.getChildren(parentElement) != null) {
221 for (Object child : fContentProvider.getChildren(parentElement)) {
222 boolean checked = fCheckboxTreeViewer.getChecked(child);
223 oneChecked |= checked;
224 allChecked &= checked;
225 oneGrayed |= fCheckboxTreeViewer.getGrayed(child);
226 }
227 }
228 if (oneGrayed || oneChecked && !allChecked) {
229 fCheckboxTreeViewer.setGrayChecked(parentElement, true);
230 } else {
231 fCheckboxTreeViewer.setGrayed(parentElement, false);
232 fCheckboxTreeViewer.setChecked(parentElement, allChecked);
233 }
234 maintainCheckIntegrity(parentElement);
235 }
236 }
237
238 private void setCheckedAlreadyIncludedTraces(Set<String> alreadyIncludedTraces, Object[] elements) {
239 for (Object element : elements) {
12c155f5
FC
240 if (element instanceof TmfTraceElement) {
241 TmfTraceElement trace = (TmfTraceElement) element;
6039bcf3
MAL
242 String elementPath = trace.getElementPath();
243 if (alreadyIncludedTraces.contains(elementPath)) {
244 fCheckboxTreeViewer.setChecked(element, true);
245 maintainCheckIntegrity(element);
12c155f5
FC
246 }
247 }
6039bcf3
MAL
248 Object[] children = fContentProvider.getChildren(element);
249 if (children != null) {
250 setCheckedAlreadyIncludedTraces(alreadyIncludedTraces, children);
251 }
252 }
253 }
254
255 /**
256 * Sets all items in the element viewer to be checked or unchecked
257 *
258 * @param checked
259 * whether or not items should be checked
260 */
261 private void setAllChecked(boolean checked) {
262 for (Object element : fContentProvider.getChildren(fCheckboxTreeViewer.getInput())) {
263 setSubtreeChecked(element, checked);
264 }
265 }
266
267 /**
268 * A version of setSubtreeChecked that also handles the grayed state
269 *
270 * @param element
271 * the element
272 * @param checked
273 * true if the item should be checked, and false if it should be
274 * unchecked
275 */
276 private void setSubtreeChecked(Object element, boolean checked) {
277 fCheckboxTreeViewer.setChecked(element, checked);
278 if (checked) {
279 fCheckboxTreeViewer.setGrayed(element, false);
280 }
281 Object[] children = fContentProvider.getChildren(element);
282 if (children != null) {
283 for (Object child : children) {
284 setSubtreeChecked(child, checked);
285 }
12c155f5
FC
286 }
287 }
288
b544077e
BH
289 /**
290 * Method to finalize the select operation.
291 * @return <code>true</code> if successful else <code>false</code>
292 */
12c155f5
FC
293 public boolean performFinish() {
294
295 IFolder experiment = fExperiment.getResource();
639181ba 296 boolean changed = false;
12c155f5
FC
297
298 // Add the selected traces to the experiment
299 Set<String> keys = fPreviousTraces.keySet();
300 TmfTraceElement[] traces = getSelection();
301 for (TmfTraceElement trace : traces) {
339d539c 302 String name = trace.getElementPath();
12c155f5
FC
303 if (keys.contains(name)) {
304 fPreviousTraces.remove(name);
305 } else {
beb19106 306 fExperiment.addTrace(trace);
639181ba 307 changed = true;
12c155f5
FC
308 }
309 }
310
311 // Remove traces that were unchecked (thus left in fPreviousTraces)
312 keys = fPreviousTraces.keySet();
313 for (String key : keys) {
12c155f5 314 try {
beb19106 315 fExperiment.removeTrace(fPreviousTraces.get(key));
12c155f5 316 } catch (CoreException e) {
8fd82db5 317 Activator.getDefault().logError("Error selecting traces for experiment " + experiment.getName(), e); //$NON-NLS-1$
12c155f5 318 }
639181ba 319 changed = true;
12c155f5 320 }
639181ba
PT
321 if (changed) {
322 fExperiment.closeEditors();
dc8f67c6 323 fExperiment.deleteSupplementaryResources();
639181ba 324 }
12c155f5
FC
325
326 return true;
327 }
328
12c155f5
FC
329 /**
330 * Get the list of selected traces
331 */
332 private TmfTraceElement[] getSelection() {
507b1336 333 Vector<TmfTraceElement> traces = new Vector<>();
6039bcf3 334 Object[] selection = fCheckboxTreeViewer.getCheckedElements();
12c155f5 335 for (Object sel : selection) {
abbdd66a 336 if (sel instanceof TmfTraceElement) {
12c155f5 337 traces.add((TmfTraceElement) sel);
abbdd66a 338 }
12c155f5
FC
339 }
340 TmfTraceElement[] result = new TmfTraceElement[traces.size()];
341 traces.toArray(result);
342 return result;
343 }
344
345}
This page took 0.069372 seconds and 5 git commands to generate.