ss: Move plugins to Trace Compass namespace
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / views / uml2sd / dialogs / FilterListDialog.java
1 /**********************************************************************
2 * Copyright (c) 2005, 2013 IBM Corporation, Ericsson
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * IBM - Initial API and implementation
10 * Bernd Hufmann - Updated for TMF
11 **********************************************************************/
12
13 package org.eclipse.linuxtools.tmf.ui.views.uml2sd.dialogs;
14
15 import java.util.ArrayList;
16 import java.util.Iterator;
17 import java.util.List;
18
19 import org.eclipse.jface.dialogs.Dialog;
20 import org.eclipse.jface.dialogs.DialogSettings;
21 import org.eclipse.linuxtools.internal.tmf.ui.Activator;
22 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.SDView;
23 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDFilterProvider;
24 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.util.Messages;
25 import org.eclipse.swt.SWT;
26 import org.eclipse.swt.events.SelectionEvent;
27 import org.eclipse.swt.events.SelectionListener;
28 import org.eclipse.swt.layout.RowData;
29 import org.eclipse.swt.layout.RowLayout;
30 import org.eclipse.swt.widgets.Button;
31 import org.eclipse.swt.widgets.Composite;
32 import org.eclipse.swt.widgets.Control;
33 import org.eclipse.swt.widgets.Group;
34 import org.eclipse.swt.widgets.Table;
35 import org.eclipse.swt.widgets.TableItem;
36 import org.eclipse.ui.IViewPart;
37
38 /**
39 * This is the filters list dialog.<br>
40 * It is associated to an SDView and to a ISDFilterProvider.<br>
41 *
42 * @version 1.0
43 * @author sveyrier
44 */
45 public class FilterListDialog extends Dialog {
46
47 // ------------------------------------------------------------------------
48 // Constants
49 // ------------------------------------------------------------------------
50 /**
51 * Filter list criteria property name
52 */
53 protected static final String FILTERS_LIST_CRITERIA = "filtersListsCriteria"; //$NON-NLS-1$
54 /**
55 * Filter list size property name
56 */
57 protected static final String FILTERS_LIST_SIZE = "filtersListSize"; //$NON-NLS-1$
58
59 // ------------------------------------------------------------------------
60 // Attributes
61 // ------------------------------------------------------------------------
62
63 /**
64 * The viewer and provided are kept here as attributes
65 */
66 private final IViewPart fViewer;
67 /**
68 * The filter provider implementation
69 */
70 private final ISDFilterProvider fProvider;
71 /**
72 * The filters are the result of editing this list
73 */
74 private List<FilterCriteria> fFilters;
75 /**
76 * The add button.
77 */
78 private Button fAdd;
79 /**
80 * The remove button.
81 */
82 private Button fRemove;
83 /**
84 * The edit button.
85 */
86 private Button fEdit;
87 /**
88 * The table with list of filters.
89 */
90 private Table fTable;
91
92 // ------------------------------------------------------------------------
93 // Constructor
94 // ------------------------------------------------------------------------
95
96 /**
97 * Standard constructor
98 *
99 * @param view The view reference
100 * @param loader The filter provider implementation
101 */
102 public FilterListDialog(IViewPart view, ISDFilterProvider loader) {
103 super(view.getSite().getShell());
104 fViewer = view;
105 fProvider = loader;
106 fFilters = null;
107 setShellStyle(SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
108 }
109
110 // ------------------------------------------------------------------------
111 // Methods
112 // ------------------------------------------------------------------------
113 /**
114 * Adds a criteria to the table
115 *
116 * @param criteria A criteria to add
117 * @param checked A flag whether criteria is checked (selected) or not
118 * @param positive A flag whether criteria is for positive filter or not
119 * @param loaderClassName A loader class name for the filters
120 */
121 protected void addCriteria(Criteria criteria, boolean checked, boolean positive, String loaderClassName) {
122 CriteriaTableItem cti = new CriteriaTableItem(fTable, checked, positive, loaderClassName);
123 cti.setCriteria(criteria);
124 }
125
126 /**
127 * Replaces a selected criteria with a new criteria.
128 *
129 * @param newCriteria A new criteria.
130 */
131 protected void replaceSelectedCriteria(Criteria newCriteria) {
132 CriteriaTableItem cti = (CriteriaTableItem) fTable.getSelection()[0].getData();
133 cti.setCriteria(newCriteria);
134 }
135
136 /**
137 * Handles table selection count.
138 */
139 protected void handleTableSelectionCount() {
140 int count = fTable.getSelectionCount();
141 fEdit.setEnabled(count == 1);
142 fRemove.setEnabled(count > 0);
143 }
144
145 @Override
146 public Control createDialogArea(Composite parent) {
147
148 Group ret = new Group(parent, SWT.NONE);
149 ret.setText(Messages.SequenceDiagram_ListOfHideDisplayPatterns);
150 RowLayout rowLayout = new RowLayout();
151 rowLayout.wrap = false;
152 rowLayout.pack = true;
153 rowLayout.justify = false;
154 rowLayout.type = SWT.HORIZONTAL;
155 rowLayout.marginLeft = 4;
156 rowLayout.marginTop = 4;
157 rowLayout.marginRight = 4;
158 rowLayout.marginBottom = 4;
159 rowLayout.spacing = 8;
160 ret.setLayout(rowLayout);
161
162 fTable = new Table(ret, SWT.MULTI | SWT.CHECK);
163 fTable.setLayoutData(new RowData(220, 84));
164 fTable.setHeaderVisible(false);
165 fTable.addSelectionListener(new SelectionListener() {
166
167 @Override
168 public void widgetDefaultSelected(SelectionEvent e) {
169 int count = fTable.getSelectionCount();
170 if (count == 1) {
171 Criteria criteria = openFilterDialog(((CriteriaTableItem) fTable.getSelection()[0].getData()).getCriteria(), Messages.SequenceDiagram_Update);
172 if (criteria != null) {
173 replaceSelectedCriteria(criteria);
174 }
175 }
176 }
177
178 @Override
179 public void widgetSelected(SelectionEvent e) {
180 handleTableSelectionCount();
181 }
182 });
183 if (fFilters != null) {
184 for (Iterator<FilterCriteria> i = fFilters.iterator(); i.hasNext();) {
185 FilterCriteria filterCriteria = i.next();
186 addCriteria(filterCriteria.getCriteria(), filterCriteria.isActive(), filterCriteria.isPositive(), filterCriteria.getLoaderClassName());
187 }
188 }
189
190 Composite commands = new Composite(ret, SWT.NONE);
191 RowLayout rowLayoutCommands = new RowLayout();
192 rowLayoutCommands.wrap = false;
193 rowLayoutCommands.pack = false;
194 rowLayoutCommands.justify = true;
195 rowLayoutCommands.type = SWT.VERTICAL;
196 rowLayoutCommands.marginLeft = 0;
197 rowLayoutCommands.marginTop = 4;
198 rowLayoutCommands.marginRight = 0;
199 rowLayoutCommands.marginBottom = 4;
200 rowLayoutCommands.spacing = 8;
201 commands.setLayout(rowLayoutCommands);
202 fAdd = new Button(commands, SWT.NONE);
203 fAdd.setText(Messages.SequenceDiagram_Add);
204 fAdd.addSelectionListener(new SelectionListener() {
205
206 @Override
207 public void widgetDefaultSelected(SelectionEvent e) {
208 // Nothing to do
209 }
210
211 @Override
212 public void widgetSelected(SelectionEvent e) {
213 Criteria init = new Criteria();
214 Criteria c = openFilterDialog(init, Messages.SequenceDiagram_Create);
215 if (c != null) {
216 addCriteria(c, true, false, null);
217 }
218 }
219 });
220
221 fEdit = new Button(commands, SWT.NONE);
222 fEdit.setText(Messages.SequenceDiagram_EditIt);
223 fEdit.addSelectionListener(new SelectionListener() {
224
225 @Override
226 public void widgetDefaultSelected(SelectionEvent e) {
227 // Nothing to do
228 }
229
230 @Override
231 public void widgetSelected(SelectionEvent e) {
232 Criteria c = openFilterDialog(((CriteriaTableItem) fTable.getSelection()[0].getData()).getCriteria(), Messages.SequenceDiagram_Update);
233 if (c != null) {
234 replaceSelectedCriteria(c);
235 }
236 }
237 });
238 fEdit.setEnabled(false);
239
240 fRemove = new Button(commands, SWT.NONE);
241 fRemove.setText(Messages.SequenceDiagram_Remove);
242 fRemove.addSelectionListener(new SelectionListener() {
243
244 @Override
245 public void widgetDefaultSelected(SelectionEvent e) {
246 // Nothing to do
247 }
248
249 @Override
250 public void widgetSelected(SelectionEvent e) {
251 fTable.remove(fTable.getSelectionIndices());
252 handleTableSelectionCount();
253 }
254 });
255 fRemove.setEnabled(false);
256
257 getShell().setText(Messages.SequenceDiagram_SequenceDiagramHidePatterns);
258 /*
259 * for (int i=0;i<filters.size();i++) { if (filters.get(i) instanceof FilterCriteria)
260 * addCriteria(((FilterCriteria)filters.get(i)).getCriteria(),true); }
261 */
262 return ret;
263 }
264
265 /**
266 * Opens the filter dialog box with given parameter.
267 *
268 * @param criteria The criteria reference to pass
269 * @param action to distinguish between "Update" and "Create"
270 * @return the criteria that has been updated or created
271 */
272 protected Criteria openFilterDialog(Criteria criteria, String action) {
273 SearchFilterDialog filter = new SearchFilterDialog((SDView) fViewer, fProvider, true, SWT.APPLICATION_MODAL);
274 filter.setCriteria(criteria);
275 filter.setOkText(action);
276 filter.setTitle(Messages.SequenceDiagram_DefinitionOfHidePattern);
277 filter.open();
278 return filter.getCriteria();
279 }
280
281 @Override
282 public int open() {
283 create();
284 getShell().pack();
285 getShell().setLocation(getShell().getDisplay().getCursorLocation());
286 loadFiltersCriteria();
287 return super.open();
288 }
289
290 @Override
291 public void okPressed() {
292 if (fTable.getItemCount() > 0) {
293 fFilters = new ArrayList<>();
294 } else {
295 fFilters = null;
296 }
297 for (int i = 0; i < fTable.getItemCount(); i++) {
298 TableItem item = fTable.getItem(i);
299 CriteriaTableItem cti = (CriteriaTableItem) item.getData();
300 FilterCriteria fc = new FilterCriteria(cti.getCriteria(), item.getChecked(), cti.isPositive(), cti.getLoaderClassName());
301 FilterCriteria efc = FilterCriteria.find(fc, fFilters);
302 if (efc == null) {
303 fFilters.add(fc);
304 } else {
305 efc.setActive(efc.isActive() || fc.isActive());
306 }
307 }
308 super.close();
309 fProvider.filter(fFilters);
310 saveFiltersCriteria(fFilters);
311 }
312
313 /**
314 * Sets the list of filters.
315 *
316 * @param filters The list of filters to set.
317 */
318 public void setFilters(List<FilterCriteria> filters) {
319 fFilters = filters;
320 }
321
322 /**
323 * Returns the filters list after editing.
324 *
325 * @return the filters list after editing
326 */
327 public List<FilterCriteria> getFilters() {
328 return fFilters;
329 }
330
331 /**
332 * Loads the filter criteria from global filters which are saved in the dialog settings.
333 */
334 protected void loadFiltersCriteria() {
335 List<FilterCriteria> globalFilters = getGlobalFilters();
336 for (Iterator<FilterCriteria> i = globalFilters.iterator(); i.hasNext();) {
337 FilterCriteria filterCriteria = i.next();
338 addCriteria(filterCriteria.getCriteria(), filterCriteria.isActive(), filterCriteria.isPositive(), filterCriteria.getLoaderClassName());
339 }
340 }
341
342 /**
343 * Returns the global filters which are saved in the dialog settings..
344 *
345 * @return the saved global filters
346 */
347
348 public static List<FilterCriteria> getGlobalFilters() {
349 DialogSettings settings = (DialogSettings) Activator.getDefault().getDialogSettings().getSection(FILTERS_LIST_CRITERIA);
350 int i = 0;
351 DialogSettings section = null;
352 int size = 0;
353 List<FilterCriteria> globalFilters = new ArrayList<>();
354 if (settings != null) {
355 try {
356 size = settings.getInt(FILTERS_LIST_SIZE);
357 } catch (NumberFormatException e) {
358 // This is not a problem
359 size = 0;
360 }
361 section = (DialogSettings) settings.getSection(FILTERS_LIST_CRITERIA + i);
362
363 while ((section != null) && (i < size)) {
364 FilterCriteria criteria = new FilterCriteria();
365 criteria.setCriteria(new Criteria());
366 criteria.load(section);
367 globalFilters.add(criteria);
368 section = (DialogSettings) settings.getSection(FILTERS_LIST_CRITERIA + (++i));
369 }
370 }
371
372 return globalFilters;
373 }
374
375 /**
376 * Saves the filter criteria in the dialog settings.
377 *
378 * @param globalFilters A list of filters to save.
379 */
380 public static void saveFiltersCriteria(List<FilterCriteria> globalFilters) {
381 DialogSettings settings = (DialogSettings) Activator.getDefault().getDialogSettings();
382 DialogSettings section = (DialogSettings) settings.getSection(FILTERS_LIST_CRITERIA);
383 if (section == null) {
384 section = (DialogSettings) settings.addNewSection(FILTERS_LIST_CRITERIA);
385 }
386
387 if (globalFilters == null) {
388 section.put(FILTERS_LIST_SIZE, 0);
389 return;
390 }
391
392 section.put(FILTERS_LIST_SIZE, globalFilters.size());
393
394 FilterCriteria criteria;
395
396 for (int j = 0; j < globalFilters.size(); j++) {
397 if (globalFilters.get(j) == null) {
398 return;
399 }
400
401 criteria = globalFilters.get(j);
402 DialogSettings subSection = (DialogSettings) section.getSection(FILTERS_LIST_CRITERIA + j);
403
404 if (subSection == null) {
405 subSection = (DialogSettings) section.addNewSection(FILTERS_LIST_CRITERIA + j);
406 }
407 criteria.save(subSection);
408 }
409 }
410
411 /**
412 * Deactivates the saved global filters.
413 */
414 public static void deactivateSavedGlobalFilters() {
415 // Deactivate all filters
416 List<FilterCriteria> filters = getGlobalFilters();
417 for(FilterCriteria criteria : filters) {
418 criteria.setActive(false);
419 }
420 // Save settings
421 FilterListDialog.saveFiltersCriteria(filters);
422 }
423
424 // ------------------------------------------------------------------------
425 // Helper classes
426 // ------------------------------------------------------------------------
427 /**
428 * A class to map TableItems that can be toggled active or inactive and Criteria
429 */
430 protected class CriteriaTableItem {
431
432 /**
433 * The criteria reference
434 */
435 protected Criteria fCriteria;
436 /**
437 * The "positive" value.
438 */
439 protected boolean fIsPositive;
440 /**
441 * The loader class name
442 */
443 protected String fLoaderClassName;
444 /**
445 * The actual table item.
446 */
447 protected TableItem fTableItem;
448
449 /**
450 * Constructor
451 *
452 * @param parent The parent table
453 * @param isActive <code>true</code> if filter criteria is active else <code>false</code>
454 * @param isPositive <code>true</code> for positive filter else <code>false</code>
455 * @param loaderClassName The loader class name
456 */
457 public CriteriaTableItem(Table parent, boolean isActive, boolean isPositive, String loaderClassName) {
458 fTableItem = new TableItem(parent, SWT.NONE);
459 fTableItem.setData(this);
460 fTableItem.setChecked(isActive);
461 fIsPositive = isPositive;
462 fLoaderClassName = loaderClassName;
463 }
464
465 /**
466 * Constructor
467 *
468 * @param parent The parent table
469 * @param isActive <code>true</code> if filter criteria is active else <code>false</code>
470 * @param isPositive <code>true</code> for positive filter else <code>false</code>
471 * @param loaderClassName The loader class name
472 * @param index The table item index
473 */
474 public CriteriaTableItem(Table parent, boolean isActive, boolean isPositive, String loaderClassName, int index) {
475 fTableItem = new TableItem(parent, SWT.NONE, index);
476 fTableItem.setChecked(isActive);
477 fIsPositive = isPositive;
478 fLoaderClassName = loaderClassName;
479 }
480
481 /**
482 * Sets the criteria.
483 *
484 * @param criteria The criteria to set
485 */
486 public void setCriteria(Criteria criteria) {
487 fCriteria = criteria;
488 fTableItem.setText((fIsPositive ? Messages.SequenceDiagram_display : Messages.SequenceDiagram_hide) + " " + fCriteria.getExpression() + " " + fCriteria.getGraphNodeSummary(fProvider, fLoaderClassName)); //$NON-NLS-1$ //$NON-NLS-2$
489 }
490
491 /**
492 * Returns the criteria.
493 * @return the criteria
494 */
495 public Criteria getCriteria() {
496 return fCriteria;
497 }
498
499 /**
500 * Returns whether positive filtering is active or not.
501 *
502 * @return <code>true</code> for positive filter else <code>false</code>
503 */
504 public boolean isPositive() {
505 return fIsPositive;
506 }
507
508 /**
509 * Returns the loader class name.
510 *
511 * @return the loader class name
512 */
513 public String getLoaderClassName() {
514 return fLoaderClassName;
515 }
516 }
517
518 }
This page took 0.044009 seconds and 5 git commands to generate.