tmf: API clean-up of sequence diagram framework
[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 // filters = provider.getCurrentFilters();
108 setShellStyle(SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
109 }
110
111 // ------------------------------------------------------------------------
112 // Methods
113 // ------------------------------------------------------------------------
114 /**
115 * Adds a criteria to the table
116 *
117 * @param criteria A criteria to add
118 * @param checked A flag whether criteria is checked (selected) or not
119 * @param positive A flag whether criteria is for positive filter or not
120 * @param loaderClassName A loader class name for the filters
121 */
122 protected void addCriteria(Criteria criteria, boolean checked, boolean positive, String loaderClassName) {
123 CriteriaTableItem cti = new CriteriaTableItem(fTable, checked, positive, loaderClassName);
124 cti.setCriteria(criteria);
125 }
126
127 /**
128 * Replaces a selected criteria with a new criteria.
129 *
130 * @param newCriteria A new criteria.
131 */
132 protected void replaceSelectedCriteria(Criteria newCriteria) {
133 CriteriaTableItem cti = (CriteriaTableItem) fTable.getSelection()[0].getData();
134 cti.setCriteria(newCriteria);
135 }
136
137 /**
138 * Handles table selection count.
139 */
140 protected void handleTableSelectionCount() {
141 int count = fTable.getSelectionCount();
142 fEdit.setEnabled(count == 1);
143 fRemove.setEnabled(count > 0);
144 }
145
146 @Override
147 public Control createDialogArea(Composite parent) {
148
149 Group ret = new Group(parent, SWT.NONE);
150 ret.setText(Messages.SequenceDiagram_ListOfHideDisplayPatterns);
151 RowLayout rowLayout = new RowLayout();
152 rowLayout.wrap = false;
153 rowLayout.pack = true;
154 rowLayout.justify = false;
155 rowLayout.type = SWT.HORIZONTAL;
156 rowLayout.marginLeft = 4;
157 rowLayout.marginTop = 4;
158 rowLayout.marginRight = 4;
159 rowLayout.marginBottom = 4;
160 rowLayout.spacing = 8;
161 ret.setLayout(rowLayout);
162
163 fTable = new Table(ret, SWT.MULTI | SWT.CHECK);
164 fTable.setLayoutData(new RowData(220, 84));
165 fTable.setHeaderVisible(false);
166 fTable.addSelectionListener(new SelectionListener() {
167
168 @Override
169 public void widgetDefaultSelected(SelectionEvent e) {
170 int count = fTable.getSelectionCount();
171 if (count == 1) {
172 Criteria criteria = openFilterDialog(((CriteriaTableItem) fTable.getSelection()[0].getData()).getCriteria(), Messages.SequenceDiagram_Update);
173 if (criteria != null) {
174 replaceSelectedCriteria(criteria);
175 }
176 }
177 }
178
179 @Override
180 public void widgetSelected(SelectionEvent e) {
181 handleTableSelectionCount();
182 }
183 });
184 if (fFilters != null) {
185 for (Iterator<FilterCriteria> i = fFilters.iterator(); i.hasNext();) {
186 FilterCriteria filterCriteria = i.next();
187 addCriteria(filterCriteria.getCriteria(), filterCriteria.isActive(), filterCriteria.isPositive(), filterCriteria.getLoaderClassName());
188 }
189 }
190
191 Composite commands = new Composite(ret, SWT.NONE);
192 RowLayout rowLayoutCommands = new RowLayout();
193 rowLayoutCommands.wrap = false;
194 rowLayoutCommands.pack = false;
195 rowLayoutCommands.justify = true;
196 rowLayoutCommands.type = SWT.VERTICAL;
197 rowLayoutCommands.marginLeft = 0;
198 rowLayoutCommands.marginTop = 4;
199 rowLayoutCommands.marginRight = 0;
200 rowLayoutCommands.marginBottom = 4;
201 rowLayoutCommands.spacing = 8;
202 commands.setLayout(rowLayoutCommands);
203 fAdd = new Button(commands, SWT.NONE);
204 fAdd.setText(Messages.SequenceDiagram_Add);
205 fAdd.addSelectionListener(new SelectionListener() {
206
207 @Override
208 public void widgetDefaultSelected(SelectionEvent e) {
209 // Nothing to do
210 }
211
212 @Override
213 public void widgetSelected(SelectionEvent e) {
214 Criteria init = new Criteria();
215 Criteria c = openFilterDialog(init, Messages.SequenceDiagram_Create);
216 if (c != null) {
217 addCriteria(c, true, false, null);
218 }
219 }
220 });
221
222 fEdit = new Button(commands, SWT.NONE);
223 fEdit.setText(Messages.SequenceDiagram_EditIt);
224 fEdit.addSelectionListener(new SelectionListener() {
225
226 @Override
227 public void widgetDefaultSelected(SelectionEvent e) {
228 // Nothing to do
229 }
230
231 @Override
232 public void widgetSelected(SelectionEvent e) {
233 Criteria c = openFilterDialog(((CriteriaTableItem) fTable.getSelection()[0].getData()).getCriteria(), Messages.SequenceDiagram_Update);
234 if (c != null) {
235 replaceSelectedCriteria(c);
236 }
237 }
238 });
239 fEdit.setEnabled(false);
240
241 fRemove = new Button(commands, SWT.NONE);
242 fRemove.setText(Messages.SequenceDiagram_Remove);
243 fRemove.addSelectionListener(new SelectionListener() {
244
245 @Override
246 public void widgetDefaultSelected(SelectionEvent e) {
247 // Nothing to do
248 }
249
250 @Override
251 public void widgetSelected(SelectionEvent e) {
252 fTable.remove(fTable.getSelectionIndices());
253 handleTableSelectionCount();
254 }
255 });
256 fRemove.setEnabled(false);
257
258 getShell().setText(Messages.SequenceDiagram_SequenceDiagramHidePatterns);
259 /*
260 * for (int i=0;i<filters.size();i++) { if (filters.get(i) instanceof FilterCriteria)
261 * addCriteria(((FilterCriteria)filters.get(i)).getCriteria(),true); }
262 */
263 return ret;
264 }
265
266 /**
267 * Opens the filter dialog box with given parameter.
268 *
269 * @param criteria The criteria reference to pass
270 * @param action to distinguish between "Update" and "Create"
271 * @return the criteria that has been updated or created
272 */
273 protected Criteria openFilterDialog(Criteria criteria, String action) {
274 SearchFilterDialog filter = new SearchFilterDialog((SDView) fViewer, fProvider, true, SWT.APPLICATION_MODAL);
275 filter.setCriteria(criteria);
276 filter.setOkText(action);
277 filter.setTitle(Messages.SequenceDiagram_DefinitionOfHidePattern);
278 filter.open();
279 return filter.getCriteria();
280 }
281
282 @Override
283 public int open() {
284 create();
285 getShell().pack();
286 getShell().setLocation(getShell().getDisplay().getCursorLocation());
287 loadFiltersCriteria();
288 return super.open();
289 }
290
291 @Override
292 public void okPressed() {
293 if (fTable.getItemCount() > 0) {
294 fFilters = new ArrayList<FilterCriteria>();
295 } else {
296 fFilters = null;
297 }
298 for (int i = 0; i < fTable.getItemCount(); i++) {
299 TableItem item = fTable.getItem(i);
300 CriteriaTableItem cti = (CriteriaTableItem) item.getData();
301 FilterCriteria fc = new FilterCriteria(cti.getCriteria(), item.getChecked(), cti.isPositive(), cti.getLoaderClassName());
302 FilterCriteria efc = FilterCriteria.find(fc, fFilters);
303 if (efc == null) {
304 fFilters.add(fc);
305 } else {
306 efc.setActive(efc.isActive() || fc.isActive());
307 }
308 }
309 super.close();
310 fProvider.filter(fFilters);
311 saveFiltersCriteria(fFilters);
312 }
313
314 /**
315 * Sets the list of filters.
316 *
317 * @param filters The list of filters to set.
318 */
319 public void setFilters(List<FilterCriteria> filters) {
320 fFilters = filters;
321 }
322
323 /**
324 * Returns the filters list after editing.
325 *
326 * @return the filters list after editing
327 */
328 public List<FilterCriteria> getFilters() {
329 return fFilters;
330 }
331
332 /**
333 * Loads the filter criteria from global filters which are saved in the dialog settings.
334 */
335 protected void loadFiltersCriteria() {
336 List<FilterCriteria> globalFilters = getGlobalFilters();
337 for (Iterator<FilterCriteria> i = globalFilters.iterator(); i.hasNext();) {
338 FilterCriteria filterCriteria = i.next();
339 addCriteria(filterCriteria.getCriteria(), filterCriteria.isActive(), filterCriteria.isPositive(), filterCriteria.getLoaderClassName());
340 }
341 }
342
343 /**
344 * Returns the global filters which are saved in the dialog settings..
345 *
346 * @return the saved global filters
347 */
348
349 public static List<FilterCriteria> getGlobalFilters() {
350 DialogSettings settings = (DialogSettings) Activator.getDefault().getDialogSettings().getSection(FILTERS_LIST_CRITERIA);
351 int i = 0;
352 DialogSettings section = null;
353 int size = 0;
354 List<FilterCriteria> globalFilters = new ArrayList<FilterCriteria>();
355 if (settings != null) {
356 try {
357 size = settings.getInt(FILTERS_LIST_SIZE);
358 } catch (NumberFormatException e) {
359 // This is not a problem
360 size = 0;
361 }
362 section = (DialogSettings) settings.getSection(FILTERS_LIST_CRITERIA + i);
363
364 while ((section != null) && (i < size)) {
365 FilterCriteria criteria = new FilterCriteria();
366 criteria.setCriteria(new Criteria());
367 criteria.load(section);
368 globalFilters.add(criteria);
369 section = (DialogSettings) settings.getSection(FILTERS_LIST_CRITERIA + (++i));
370 }
371 }
372
373 return globalFilters;
374 }
375
376 /**
377 * Saves the filter criteria in the dialog settings.
378 *
379 * @param globalFilters A list of filters to save.
380 */
381 public static void saveFiltersCriteria(List<FilterCriteria> globalFilters) {
382 DialogSettings settings = (DialogSettings) Activator.getDefault().getDialogSettings();
383 DialogSettings section = (DialogSettings) settings.getSection(FILTERS_LIST_CRITERIA);
384 if (section == null) {
385 section = (DialogSettings) settings.addNewSection(FILTERS_LIST_CRITERIA);
386 }
387
388 if (globalFilters == null) {
389 section.put(FILTERS_LIST_SIZE, 0);
390 return;
391 }
392
393 section.put(FILTERS_LIST_SIZE, globalFilters.size());
394
395 FilterCriteria criteria;
396
397 for (int j = 0; j < globalFilters.size(); j++) {
398 if (globalFilters.get(j) == null) {
399 return;
400 }
401
402 criteria = globalFilters.get(j);
403 DialogSettings subSection = (DialogSettings) section.getSection(FILTERS_LIST_CRITERIA + j);
404
405 if (subSection == null) {
406 subSection = (DialogSettings) section.addNewSection(FILTERS_LIST_CRITERIA + j);
407 }
408 criteria.save(subSection);
409 }
410 }
411
412 /**
413 * Deactivates the saved global filters.
414 */
415 public static void deactivateSavedGlobalFilters() {
416 // Deactivate all filters
417 List<FilterCriteria> filters = getGlobalFilters();
418 for(FilterCriteria criteria : filters) {
419 criteria.setActive(false);
420 }
421 // Save settings
422 FilterListDialog.saveFiltersCriteria(filters);
423 }
424
425 // ------------------------------------------------------------------------
426 // Helper classes
427 // ------------------------------------------------------------------------
428 /**
429 * A class to map TableItems that can be toggled active or inactive and Criteria
430 */
431 protected class CriteriaTableItem {
432
433 /**
434 * The criteria reference
435 */
436 protected Criteria fCriteria;
437 /**
438 * The "positive" value.
439 */
440 protected boolean fIsPositive;
441 /**
442 * The loader class name
443 */
444 protected String fLoaderClassName;
445 /**
446 * The actual table item.
447 */
448 protected TableItem fTableItem;
449
450 /**
451 * Constructor
452 *
453 * @param parent The parent table
454 * @param isActive <code>true</code> if filter criteria is active else <code>false</code>
455 * @param isPositive <code>true</code> for positive filter else <code>false</code>
456 * @param loaderClassName The loader class name
457 */
458 public CriteriaTableItem(Table parent, boolean isActive, boolean isPositive, String loaderClassName) {
459 fTableItem = new TableItem(parent, SWT.NONE);
460 fTableItem.setData(this);
461 fTableItem.setChecked(isActive);
462 fIsPositive = isPositive;
463 fLoaderClassName = loaderClassName;
464 }
465
466 /**
467 * Constructor
468 *
469 * @param parent The parent table
470 * @param isActive <code>true</code> if filter criteria is active else <code>false</code>
471 * @param isPositive <code>true</code> for positive filter else <code>false</code>
472 * @param loaderClassName The loader class name
473 * @param index The table item index
474 */
475 public CriteriaTableItem(Table parent, boolean isActive, boolean isPositive, String loaderClassName, int index) {
476 fTableItem = new TableItem(parent, SWT.NONE, index);
477 fTableItem.setChecked(isActive);
478 fIsPositive = isPositive;
479 fLoaderClassName = loaderClassName;
480 }
481
482 /**
483 * Sets the criteria.
484 *
485 * @param criteria The criteria to set
486 */
487 public void setCriteria(Criteria criteria) {
488 fCriteria = criteria;
489 fTableItem.setText((fIsPositive ? Messages.SequenceDiagram_display : Messages.SequenceDiagram_hide) + " " + fCriteria.getExpression() + " " + fCriteria.getGraphNodeSummary(fProvider, fLoaderClassName)); //$NON-NLS-1$ //$NON-NLS-2$
490 }
491
492 /**
493 * Returns the criteria.
494 * @return the criteria
495 */
496 public Criteria getCriteria() {
497 return fCriteria;
498 }
499
500 /**
501 * Returns whether positive filtering is active or not.
502 *
503 * @return <code>true</code> for positive filter else <code>false</code>
504 */
505 public boolean isPositive() {
506 return fIsPositive;
507 }
508
509 /**
510 * Returns the loader class name.
511 *
512 * @return the loader class name
513 */
514 public String getLoaderClassName() {
515 return fLoaderClassName;
516 }
517 }
518
519 }
This page took 0.043879 seconds and 5 git commands to generate.