KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > ui > views > tasklist > FiltersDialog


1 /*******************************************************************************
2  * Copyright (c) 2000, 2006 IBM Corporation and others.
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 Corporation - initial API and implementation
10  *******************************************************************************/

11
12 package org.eclipse.ui.views.tasklist;
13
14 import com.ibm.icu.text.Collator;
15 import java.util.ArrayList JavaDoc;
16 import java.util.Collections JavaDoc;
17 import java.util.Comparator JavaDoc;
18
19 import org.eclipse.core.resources.IMarker;
20 import org.eclipse.jface.dialogs.IDialogConstants;
21 import org.eclipse.jface.dialogs.TrayDialog;
22 import org.eclipse.jface.viewers.AbstractTreeViewer;
23 import org.eclipse.jface.viewers.CheckStateChangedEvent;
24 import org.eclipse.jface.viewers.CheckboxTreeViewer;
25 import org.eclipse.jface.viewers.ICheckStateListener;
26 import org.eclipse.jface.viewers.ILabelProvider;
27 import org.eclipse.jface.viewers.ITreeContentProvider;
28 import org.eclipse.jface.viewers.LabelProvider;
29 import org.eclipse.jface.viewers.Viewer;
30 import org.eclipse.jface.viewers.ViewerComparator;
31 import org.eclipse.jface.window.Window;
32 import org.eclipse.osgi.util.NLS;
33 import org.eclipse.swt.SWT;
34 import org.eclipse.swt.events.SelectionAdapter;
35 import org.eclipse.swt.events.SelectionEvent;
36 import org.eclipse.swt.events.SelectionListener;
37 import org.eclipse.swt.graphics.Font;
38 import org.eclipse.swt.graphics.Image;
39 import org.eclipse.swt.layout.FillLayout;
40 import org.eclipse.swt.layout.GridData;
41 import org.eclipse.swt.layout.GridLayout;
42 import org.eclipse.swt.widgets.Button;
43 import org.eclipse.swt.widgets.Combo;
44 import org.eclipse.swt.widgets.Composite;
45 import org.eclipse.swt.widgets.Control;
46 import org.eclipse.swt.widgets.Label;
47 import org.eclipse.swt.widgets.MessageBox;
48 import org.eclipse.swt.widgets.Shell;
49 import org.eclipse.swt.widgets.Text;
50 import org.eclipse.ui.IWorkingSet;
51 import org.eclipse.ui.PlatformUI;
52 import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog;
53 import org.eclipse.ui.internal.views.tasklist.TaskListMessages;
54
55 class FiltersDialog extends TrayDialog {
56     /**
57      * ID for the Reset button
58      */

59     static final int RESET_ID = IDialogConstants.CLIENT_ID;
60
61     static final int SELECT_ID = IDialogConstants.CLIENT_ID + 1;
62
63     private static class EnumValue {
64         private int value;
65
66         private String JavaDoc text;
67
68         private Image image;
69
70         EnumValue(int value, String JavaDoc text, Image image) {
71             this.value = value;
72             this.text = text;
73             this.image = image;
74         }
75
76         int getValue() {
77             return value;
78         }
79
80         String JavaDoc getText() {
81             return text;
82         }
83
84         Image getImage() {
85             return image;
86         }
87     }
88
89     private static class EnumType {
90         private EnumValue[] values;
91
92         EnumType(EnumValue[] values) {
93             this.values = values;
94         }
95
96         EnumValue[] getValues() {
97             return values;
98         }
99     }
100
101     private EnumType severityType;
102
103     private EnumType priorityType;
104
105     private EnumType completionType;
106
107     private class CheckboxEnumGroup {
108         private EnumType type;
109
110         private Button enableButton;
111
112         private Button[] valueButtons;
113
114         CheckboxEnumGroup(Composite parent, String JavaDoc text, EnumType type) {
115             this.type = type;
116             // although not needed for layout, this composite is needed to get the tab order right
117
Composite enableComposite = new Composite(parent, SWT.NONE);
118             enableComposite
119                     .setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
120             enableComposite.setLayout(new FillLayout());
121             enableButton = new Button(enableComposite, SWT.CHECK);
122             enableButton.addSelectionListener(selectionListener);
123             enableButton.setText(text);
124             Composite valueComposite = new Composite(parent, SWT.NONE);
125             valueComposite
126                     .setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
127             valueComposite.setLayout(new FillLayout());
128             EnumValue[] values = type.getValues();
129             valueButtons = new Button[values.length];
130             for (int i = 0; i < values.length; ++i) {
131                 Button valueButton = new Button(valueComposite, SWT.CHECK);
132                 valueButton.setText(values[i].getText());
133                 valueButtons[i] = valueButton;
134             }
135         }
136
137         boolean getEnabled() {
138             return enableButton.getEnabled();
139         }
140
141         void setEnabled(boolean enabled) {
142             enableButton.setEnabled(enabled);
143             updateEnabledState();
144         }
145
146         boolean getSelection() {
147             return enableButton.getSelection();
148         }
149
150         void setSelection(boolean selected) {
151             enableButton.setSelection(selected);
152             updateEnabledState();
153         }
154
155         void updateEnabledState() {
156             boolean enabled = enableButton.isEnabled()
157                     && enableButton.getSelection();
158             for (int i = 0; i < valueButtons.length; ++i) {
159                 valueButtons[i].setEnabled(enabled);
160             }
161         }
162
163         int getValueMask() {
164             int mask = 0;
165             EnumValue[] values = type.getValues();
166             for (int i = 0; i < valueButtons.length; ++i) {
167                 if (valueButtons[i].getSelection()) {
168                     mask |= (1 << values[i].getValue());
169                 }
170             }
171             return mask;
172         }
173
174         void setValueMask(int mask) {
175             EnumValue[] values = type.getValues();
176             for (int i = 0; i < values.length; ++i) {
177                 valueButtons[i]
178                         .setSelection((mask & (1 << values[i].getValue())) != 0);
179             }
180         }
181     }
182
183     private class LabelComboTextGroup {
184         Label label;
185
186         Combo combo;
187
188         Text text;
189
190         LabelComboTextGroup(Composite parent, String JavaDoc labelText,
191                 String JavaDoc[] comboStrings, String JavaDoc initialText, int widthHint) {
192             Font font = parent.getFont();
193             Composite group = new Composite(parent, SWT.NONE);
194             GridLayout layout = new GridLayout();
195             layout.numColumns = 3;
196             //Set the margin width to 0 in order to line up with other items
197
layout.marginWidth = 0;
198             group.setLayout(layout);
199             group.setFont(font);
200             label = new Label(group, SWT.NONE);
201             label.setText(labelText);
202             label.setFont(font);
203             combo = createCombo(group, comboStrings, 0);
204             text = new Text(parent, SWT.SINGLE | SWT.BORDER);
205             GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
206             gridData.widthHint = widthHint;
207             text.setLayoutData(gridData);
208             text.setFont(font);
209             text.setText(initialText);
210         }
211     }
212
213     /**
214      * Creates and manages a group of widgets for selecting a working
215      * set task filter.
216      */

217     private class WorkingSetGroup {
218         private Button button;
219
220         /**
221          * Creates the working set filter selection widgets.
222          *
223          * @param parent the parent composite of the working set widgets
224          */

225         WorkingSetGroup(Composite parent) {
226             // radio button has to be part of main radio button group
227
button = createRadioButton(parent, TaskListMessages.TaskList_noWorkingSet);
228             GridData data = new GridData(GridData.FILL_HORIZONTAL);
229             button.setLayoutData(data);
230
231             Composite composite = new Composite(parent, SWT.NONE);
232             composite.setFont(parent.getFont());
233             GridLayout layout = new GridLayout();
234             Button radio = new Button(parent, SWT.RADIO);
235             layout.marginWidth = radio.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
236             layout.marginHeight = 0;
237             radio.dispose();
238             composite.setLayout(layout);
239             createButton(composite, SELECT_ID, TaskListMessages.TaskList_workingSetSelect, false);
240         }
241
242         /**
243          * Returns wether or not a working set filter should be used
244          *
245          * @return
246          * true=a working set filter should be used
247          * false=a working set filter should not be used
248          */

249         boolean getSelection() {
250             return button.getSelection();
251         }
252
253         /**
254          * Returns the selected working set filter or null if none
255          * is selected.
256          *
257          * @return the selected working set filter or null if none
258          * is selected.
259          */

260         IWorkingSet getWorkingSet() {
261             return (IWorkingSet) button.getData();
262         }
263
264         /**
265          * Sets the working set filter selection.
266          *
267          * @param selected true=a working set filter should be used
268          * false=no working set filter should be used
269          */

270         void setSelection(boolean selected) {
271             button.setSelection(selected);
272             if (selected) {
273                 anyResourceButton.setSelection(false);
274                 anyResourceInSameProjectButton.setSelection(false);
275                 selectedResourceButton.setSelection(false);
276                 selectedResourceAndChildrenButton.setSelection(false);
277             }
278         }
279
280         /**
281          * Opens the working set selection dialog.
282          */

283         void selectPressed() {
284             IWorkingSetSelectionDialog dialog = PlatformUI.getWorkbench()
285                     .getWorkingSetManager().createWorkingSetSelectionDialog(
286                             getShell(), false);
287             IWorkingSet workingSet = getWorkingSet();
288
289             if (workingSet != null) {
290                 dialog.setSelection(new IWorkingSet[] { workingSet });
291             }
292             if (dialog.open() == Window.OK) {
293                 IWorkingSet[] result = dialog.getSelection();
294                 if (result != null && result.length > 0) {
295                     setWorkingSet(result[0]);
296                 } else {
297                     setWorkingSet(null);
298                 }
299                 if (getSelection() == false) {
300                     setSelection(true);
301                 }
302             }
303         }
304
305         /**
306          * Sets the specified working set.
307          *
308          * @param workingSet the working set
309          */

310         void setWorkingSet(IWorkingSet workingSet) {
311             button.setData(workingSet);
312             if (workingSet != null) {
313                 button.setText(NLS.bind(TaskListMessages.TaskList_workingSet, workingSet.getLabel()));
314             } else {
315                 button.setText(TaskListMessages.TaskList_noWorkingSet);
316             }
317         }
318     }
319
320     private TasksFilter filter;
321
322     MarkerTypesModel markerTypesModel = new MarkerTypesModel();
323
324     private MarkerType[] markerTypes;
325
326     private CheckboxTreeViewer typesViewer;
327
328     Button anyResourceButton;
329
330     Button anyResourceInSameProjectButton; // added by cagatayk@acm.org
331

332     Button selectedResourceButton;
333
334     Button selectedResourceAndChildrenButton;
335
336     private WorkingSetGroup workingSetGroup;
337
338     private LabelComboTextGroup descriptionGroup;
339
340     private CheckboxEnumGroup severityGroup;
341
342     private CheckboxEnumGroup priorityGroup;
343
344     private CheckboxEnumGroup completionGroup;
345
346     private Button filterOnMarkerLimit;
347
348     private Text markerLimit;
349
350     SelectionListener selectionListener = new SelectionAdapter() {
351         public void widgetSelected(SelectionEvent e) {
352             FiltersDialog.this.widgetSelected(e);
353         }
354     };
355
356     private ICheckStateListener checkStateListener = new ICheckStateListener() {
357         public void checkStateChanged(CheckStateChangedEvent event) {
358             FiltersDialog.this.checkStateChanged(event);
359         }
360     };
361
362     /**
363      * Creates a new filters dialog.
364      *
365      * @param parentShell the parent shell
366      */

367     public FiltersDialog(Shell parentShell) {
368         super(parentShell);
369         initTypes();
370     }
371
372     /* (non-Javadoc)
373      * Method declared on Dialog.
374      */

375     protected void buttonPressed(int buttonId) {
376         if (RESET_ID == buttonId) {
377             resetPressed();
378         } else if (SELECT_ID == buttonId) {
379             workingSetGroup.selectPressed();
380         } else {
381             super.buttonPressed(buttonId);
382         }
383     }
384
385     /**
386      * Check state change.
387      *
388      * @param event the event
389      */

390     public void checkStateChanged(CheckStateChangedEvent event) {
391         MarkerType type = (MarkerType) event.getElement();
392         typesViewer.setSubtreeChecked(type, event.getChecked());
393         MarkerType[] allSupertypes = type.getAllSupertypes();
394         for (int i = 0; i < allSupertypes.length; ++i) {
395             typesViewer.setChecked(allSupertypes[i], false);
396         }
397         updateEnabledState();
398     }
399
400     /* (non-Javadoc)
401      * Method declared on Window.
402      */

403     protected void configureShell(Shell newShell) {
404         super.configureShell(newShell);
405         newShell.setText(TaskListMessages.TaskList_filter);
406         PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell,
407                 ITaskListHelpContextIds.FILTERS_DIALOG);
408     }
409
410     /**
411      * Creates the area showing filtering criteria on attribute values.
412      *
413      * @param parent the parent composite
414      */

415     void createAttributesArea(Composite parent) {
416         Composite composite = new Composite(parent, SWT.NONE);
417         GridLayout layout = new GridLayout();
418         layout.numColumns = 2;
419         composite.setLayout(layout);
420         composite.setFont(parent.getFont());
421
422         String JavaDoc[] filters = {
423                 TaskListMessages.TaskList_contains, TaskListMessages.TaskList_doesNotContain };
424         descriptionGroup = new LabelComboTextGroup(composite, TaskListMessages.TaskList_whereDescription, filters, "", 200);//$NON-NLS-1$
425
severityGroup = new CheckboxEnumGroup(composite, TaskListMessages.TaskList_severity_label, severityType);
426         priorityGroup = new CheckboxEnumGroup(composite, TaskListMessages.TaskList_priority_label, priorityType);
427         completionGroup = new CheckboxEnumGroup(composite, TaskListMessages.TaskList_status_label, completionType);
428     }
429
430     void createResetArea(Composite parent) {
431         Composite composite = new Composite(parent, SWT.NONE);
432         composite.setFont(parent.getFont());
433         composite.setLayout(new GridLayout());
434         composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
435
436         Button reset = new Button(composite, SWT.PUSH);
437         reset.setText(TaskListMessages.TaskList_resetText);
438         reset.setData(new Integer JavaDoc(RESET_ID));
439
440         reset.addSelectionListener(new SelectionAdapter() {
441             public void widgetSelected(SelectionEvent event) {
442                 buttonPressed(((Integer JavaDoc) event.widget.getData()).intValue());
443             }
444         });
445
446         reset.setFont(composite.getFont());
447         setButtonLayoutData(reset);
448     }
449
450     /**
451      * Creates a check box button with the given parent and text.
452      *
453      * @param parent the parent composite
454      * @param text the text for the check box
455      * @param grabRow <code>true</code>to grab the remaining horizontal space, <code>false</code> otherwise
456      * @return the check box button
457      */

458     Button createCheckbox(Composite parent, String JavaDoc text, boolean grabRow) {
459         Button button = new Button(parent, SWT.CHECK);
460         if (grabRow) {
461             GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
462             button.setLayoutData(gridData);
463         }
464         button.setText(text);
465         button.addSelectionListener(selectionListener);
466         button.setFont(parent.getFont());
467         return button;
468     }
469
470     /**
471      * Creates a combo box with the given parent, items, and selection
472      *
473      * @param parent the parent composite
474      * @param items the items for the combo box
475      * @param selectionIndex the index of the item to select
476      * @return the combo box
477      */

478     Combo createCombo(Composite parent, String JavaDoc[] items, int selectionIndex) {
479         Combo combo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
480         combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
481         combo.setFont(parent.getFont());
482         combo.setItems(items);
483         combo.select(selectionIndex);
484         combo.addSelectionListener(selectionListener);
485         return combo;
486     }
487
488     /* (non-Javadoc)
489      * Method declared on Dialog.
490      */

491     protected Control createDialogArea(Composite parent) {
492         Composite composite = (Composite) super.createDialogArea(parent);
493         createMarkerLimitArea(composite);
494         createTypesArea(composite);
495         createResourceArea(composite);
496         createAttributesArea(composite);
497         createResetArea(composite);
498         createSeparatorLine(composite);
499
500         updateUIFromFilter(getFilter());
501
502         return composite;
503     }
504
505     /**
506      * Creates a separator line above the OK/Cancel buttons bar
507      *
508      * @param parent the parent composite
509      */

510     void createSeparatorLine(Composite parent) {
511         // Build the separator line
512
Label separator = new Label(parent, SWT.HORIZONTAL | SWT.SEPARATOR);
513         GridData gd = new GridData(GridData.FILL_HORIZONTAL);
514         gd.horizontalSpan = 1;
515         separator.setLayoutData(gd);
516     }
517
518     /**
519      * Creates a radio button with the given parent and text.
520      *
521      * @param parent the parent composite
522      * @param text the text for the check box
523      * @return the radio box button
524      */

525     Button createRadioButton(Composite parent, String JavaDoc text) {
526         Button button = new Button(parent, SWT.RADIO);
527         button.setText(text);
528         button.setFont(parent.getFont());
529         button.addSelectionListener(selectionListener);
530         return button;
531     }
532
533     /**
534      * Creates the area showing which resources should be considered.
535      *
536      * @param parent the parent composite
537      */

538     void createResourceArea(Composite parent) {
539         Composite group = new Composite(parent, SWT.NONE);
540         group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
541         group.setLayout(new GridLayout());
542         group.setFont(parent.getFont());
543         anyResourceButton = createRadioButton(group, TaskListMessages.TaskList_anyResource);
544         anyResourceInSameProjectButton = createRadioButton(group,
545                 TaskListMessages.TaskList_anyResourceInSameProject);// added by cagatayk@acm.org
546
selectedResourceButton = createRadioButton(group, TaskListMessages.TaskList_selectedResource);
547         selectedResourceAndChildrenButton = createRadioButton(group,
548                 TaskListMessages.TaskList_selectedAndChildren);
549         workingSetGroup = new WorkingSetGroup(group);
550     }
551
552     /**
553      * Creates the area showing which marker types should be included.
554      *
555      * @param parent the parent composite
556      */

557     void createTypesArea(Composite parent) {
558         Composite composite = new Composite(parent, SWT.NONE);
559         composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
560         GridLayout layout = new GridLayout();
561         composite.setLayout(layout);
562
563         Label label = new Label(composite, SWT.NONE);
564         label.setText(TaskListMessages.TaskList_showItemsOfType);
565
566         typesViewer = new CheckboxTreeViewer(composite);
567         GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
568         gridData.heightHint = 100;
569         typesViewer.getControl().setLayoutData(gridData);
570         typesViewer.setContentProvider(getContentProvider());
571         typesViewer.setLabelProvider(getLabelProvider());
572         typesViewer.setComparator(getViewerComparator());
573         typesViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
574         typesViewer.addCheckStateListener(checkStateListener);
575         typesViewer.setInput(getMarkerTypes());
576     }
577
578     ITreeContentProvider getContentProvider() {
579         return new ITreeContentProvider() {
580             public void inputChanged(Viewer viewer, Object JavaDoc oldInput,
581                     Object JavaDoc newInput) {
582             }
583
584             public void dispose() {
585             }
586
587             public Object JavaDoc[] getElements(Object JavaDoc inputElement) {
588                 return new Object JavaDoc[] {
589                         markerTypesModel.getType(IMarker.PROBLEM),
590                         markerTypesModel.getType(IMarker.TASK) };
591             }
592
593             public Object JavaDoc[] getChildren(Object JavaDoc parentElement) {
594                 MarkerType type = (MarkerType) parentElement;
595                 return type.getSubtypes();
596             }
597
598             public Object JavaDoc getParent(Object JavaDoc element) {
599                 return null;
600             }
601
602             public boolean hasChildren(Object JavaDoc element) {
603                 return getChildren(element).length > 0;
604             }
605         };
606     }
607
608     void createMarkerLimitArea(Composite parent) {
609         Font font = parent.getFont();
610         Composite composite = new Composite(parent, SWT.NONE);
611         composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
612         composite.setFont(font);
613         GridLayout layout = new GridLayout();
614         layout.numColumns = 2;
615         composite.setLayout(layout);
616         filterOnMarkerLimit = createCheckbox(composite, TaskListMessages.TaskList_limitVisibleTasksTo, false);
617         filterOnMarkerLimit.setLayoutData(new GridData());
618         markerLimit = new Text(composite, SWT.SINGLE | SWT.BORDER);
619         markerLimit.setTextLimit(6);
620         GridData gridData = new GridData();
621         gridData.widthHint = convertWidthInCharsToPixels(10);
622         markerLimit.setLayoutData(gridData);
623         markerLimit.setFont(font);
624     }
625
626     /**
627      * Returns the filter which this dialog is configuring.
628      *
629      * @return the filter
630      */

631     public TasksFilter getFilter() {
632         if (filter == null) {
633             filter = new TasksFilter();
634         }
635         return filter;
636     }
637
638     ILabelProvider getLabelProvider() {
639         return new LabelProvider() {
640             public String JavaDoc getText(Object JavaDoc element) {
641                 MarkerType type = (MarkerType) element;
642                 return type.getLabel();
643             }
644         };
645     }
646
647     /**
648      * Returns the marker types to display.
649      *
650      * @return the marker types to display
651      */

652     MarkerType[] getMarkerTypes() {
653         if (markerTypes == null) {
654             ArrayList JavaDoc typesList = new ArrayList JavaDoc();
655             MarkerType[] types = markerTypesModel.getTypes();
656             for (int i = 0; i < types.length; ++i) {
657                 MarkerType type = types[i];
658                 if (type.getLabel().length() > 0) {
659                     if (type.isSubtypeOf(markerTypesModel
660                             .getType(IMarker.PROBLEM))
661                             || type.isSubtypeOf(markerTypesModel
662                                     .getType(IMarker.TASK))) {
663                         typesList.add(type);
664                     }
665                 }
666             }
667             Collections.sort(typesList, new Comparator JavaDoc() {
668                 Collator collator = Collator.getInstance();
669
670                 public int compare(Object JavaDoc o1, Object JavaDoc o2) {
671                     return collator.compare(((MarkerType) o1).getLabel(),
672                             ((MarkerType) o2).getLabel());
673                 }
674             });
675             markerTypes = new MarkerType[typesList.size()];
676             typesList.toArray(markerTypes);
677         }
678         return markerTypes;
679     }
680
681     /**
682      * Returns the ids of the selected marker types.
683      *
684      * @return the ids of the selected marker types
685      */

686     String JavaDoc[] getSelectedTypes() {
687         Object JavaDoc[] checked = typesViewer.getCheckedElements();
688         ArrayList JavaDoc list = new ArrayList JavaDoc();
689         for (int i = 0; i < checked.length; ++i) {
690             MarkerType type = (MarkerType) checked[i];
691             // Skip it if any supertypes have already been included.
692
// Relies on getCheckedElements() using a pre-order traversal
693
// so parents are earlier in the list.
694
boolean found = false;
695             for (int j = list.size(); --j >= 0;) {
696                 if (type.isSubtypeOf((MarkerType) list.get(j))) {
697                     found = true;
698                     break;
699                 }
700             }
701             if (!found) {
702                 list.add(type);
703             }
704         }
705         String JavaDoc[] types = new String JavaDoc[list.size()];
706         for (int i = 0; i < list.size(); ++i) {
707             types[i] = ((MarkerType) list.get(i)).getId();
708         }
709         return types;
710     }
711
712     private ViewerComparator getViewerComparator() {
713         return new ViewerComparator() {
714             public int compare(Viewer viewer, Object JavaDoc e1, Object JavaDoc e2) {
715                 MarkerType t1 = (MarkerType) e1;
716                 MarkerType t2 = (MarkerType) e2;
717                 return getComparator().compare(t1.getLabel(), t2.getLabel());
718             }
719         };
720     }
721
722     /**
723      * Returns the id of the marker type at the given index
724      *
725      * @param typeIndex the index of the marker type in the UI list
726      * @return the id of the marker type at the given index
727      */

728     String JavaDoc getTypeId(int typeIndex) {
729         return getMarkerTypes()[typeIndex].getId();
730     }
731
732     /**
733      * Returns the index of the given marker type
734      *
735      * @param markerType the marker type id
736      * @return the index of the marker type
737      */

738     int getTypeIndex(String JavaDoc markerType) {
739         MarkerType[] types = getMarkerTypes();
740         for (int i = 0; i < types.length; ++i) {
741             String JavaDoc id = types[i].getId();
742             if (id == null ? markerType == null : id.equals(markerType)) {
743                 return i;
744             }
745         }
746         return -1;
747     }
748
749     void initTypes() {
750         severityType = new EnumType(
751                 new EnumValue[] {
752                         new EnumValue(
753                                 IMarker.SEVERITY_ERROR,
754                                 TaskListMessages.TaskList_severity_error, MarkerUtil.getImage("error")),//$NON-NLS-1$
755
new EnumValue(
756                                 IMarker.SEVERITY_WARNING,
757                                 TaskListMessages.TaskList_severity_warning, MarkerUtil.getImage("warn")),//$NON-NLS-1$
758
new EnumValue(
759                                 IMarker.SEVERITY_INFO,
760                                 TaskListMessages.TaskList_severity_info, MarkerUtil.getImage("info")) //$NON-NLS-1$
761
});
762
763         priorityType = new EnumType(
764                 new EnumValue[] {
765                         new EnumValue(
766                                 IMarker.PRIORITY_HIGH,
767                                 TaskListMessages.TaskList_priority_high, MarkerUtil.getImage("hprio")), //$NON-NLS-1$
768
new EnumValue(IMarker.PRIORITY_NORMAL, TaskListMessages.TaskList_priority_normal, null),
769                         new EnumValue(
770                                 IMarker.PRIORITY_LOW,
771                                 TaskListMessages.TaskList_priority_low, MarkerUtil.getImage("lprio")) //$NON-NLS-1$
772
});
773
774         completionType = new EnumType(new EnumValue[] {
775                 new EnumValue(1, TaskListMessages.TaskList_status_completed, null),
776                 new EnumValue(0, TaskListMessages.TaskList_status_notCompleted, null)
777                 });
778     }
779
780     /**
781      * Updates the filter from the UI state.
782      * Must be done here rather than by extending open()
783      * because after super.open() is called, the widgetry is disposed.
784      */

785     protected void okPressed() {
786         try {
787             int parseResult = Integer.parseInt(this.markerLimit.getText());
788
789             if (parseResult < 1) {
790                 throw new NumberFormatException JavaDoc();
791             }
792
793             updateFilterFromUI(getFilter());
794             super.okPressed();
795         } catch (NumberFormatException JavaDoc eNumberFormat) {
796             MessageBox messageBox = new MessageBox(getShell(), SWT.OK
797                     | SWT.APPLICATION_MODAL | SWT.ICON_ERROR);
798             messageBox.setText(TaskListMessages.TaskList_titleMarkerLimitInvalid);
799             messageBox.setMessage(TaskListMessages.TaskList_messageMarkerLimitInvalid);
800             messageBox.open();
801
802             if (markerLimit.forceFocus()) {
803                 markerLimit.setSelection(0, markerLimit.getCharCount());
804                 markerLimit.showSelection();
805             }
806         }
807     }
808
809     /**
810      * Handles a press of the Reset button.
811      * Updates the UI state to correspond to a reset filter,
812      * but doesn't actually reset our filter.
813      */

814     void resetPressed() {
815         updateUIFromFilter(new TasksFilter());
816     }
817
818     /**
819      * Returns whether any of the selected types are a subtype of the given type.
820      */

821     boolean selectionIncludesSubtypeOf(String JavaDoc type) {
822         MarkerType superType = markerTypesModel.getType(type);
823         if (superType == null) {
824             return false;
825         }
826         Object JavaDoc[] checked = typesViewer.getCheckedElements();
827         for (int i = 0; i < checked.length; ++i) {
828             if (((MarkerType) checked[i]).isSubtypeOf(superType)) {
829                 return true;
830             }
831         }
832         return false;
833     }
834
835     /**
836      * Sets the filter which this dialog is to configure.
837      *
838      * @param filter the filter
839      */

840     public void setFilter(TasksFilter filter) {
841         this.filter = filter;
842     }
843
844     /**
845      * Sets the selected marker types.
846      *
847      * @param typeIds the ids of the marker types to select
848      */

849     void setSelectedTypes(String JavaDoc[] typeIds) {
850         typesViewer.setCheckedElements(new MarkerType[0]);
851         for (int i = 0; i < typeIds.length; ++i) {
852             MarkerType type = markerTypesModel.getType(typeIds[i]);
853             if (type != null) {
854                 typesViewer.setSubtreeChecked(type, true);
855             }
856         }
857     }
858
859     /**
860      * Updates the enabled state of the widgetry.
861      */

862     void updateEnabledState() {
863         markerLimit.setEnabled(filterOnMarkerLimit.getSelection());
864         boolean isProblemSelected = selectionIncludesSubtypeOf(IMarker.PROBLEM);
865         boolean isTaskSelected = selectionIncludesSubtypeOf(IMarker.TASK);
866         severityGroup.setEnabled(isProblemSelected);
867         priorityGroup.setEnabled(isTaskSelected);
868         completionGroup.setEnabled(isTaskSelected);
869     }
870
871     /**
872      * Updates the given filter from the UI state.
873      *
874      * @param tasksFilter the filter to update
875      */

876     void updateFilterFromUI(TasksFilter tasksFilter) {
877
878         tasksFilter.types = getSelectedTypes();
879
880         if (selectedResourceButton.getSelection()) {
881             tasksFilter.onResource = TasksFilter.ON_SELECTED_RESOURCE_ONLY;
882         } else if (selectedResourceAndChildrenButton.getSelection()) {
883             tasksFilter.onResource = TasksFilter.ON_SELECTED_RESOURCE_AND_CHILDREN;
884         } else if (anyResourceInSameProjectButton.getSelection()) {
885             tasksFilter.onResource = TasksFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT;
886         } else if (workingSetGroup.getSelection()) {
887             tasksFilter.onResource = TasksFilter.ON_WORKING_SET;
888         } else {
889             tasksFilter.onResource = TasksFilter.ON_ANY_RESOURCE;
890         }
891
892         tasksFilter.workingSet = workingSetGroup.getWorkingSet();
893         tasksFilter.descriptionFilterKind = descriptionGroup.combo
894                 .getSelectionIndex();
895         tasksFilter.descriptionFilter = descriptionGroup.text.getText();
896         tasksFilter.filterOnDescription = !tasksFilter.descriptionFilter
897                 .equals("");//$NON-NLS-1$
898

899         tasksFilter.filterOnSeverity = severityGroup.getSelection();
900         tasksFilter.severityFilter = severityGroup.getValueMask();
901
902         tasksFilter.filterOnPriority = priorityGroup.getSelection();
903         tasksFilter.priorityFilter = priorityGroup.getValueMask();
904
905         tasksFilter.filterOnCompletion = completionGroup.getSelection();
906         tasksFilter.completionFilter = completionGroup.getValueMask();
907
908         int limit = TasksFilter.DEFAULT_MARKER_LIMIT;
909
910         try {
911             limit = Integer.parseInt(this.markerLimit.getText());
912         } catch (NumberFormatException JavaDoc eNumberFormat) {
913         }
914
915         tasksFilter.setMarkerLimit(limit);
916         tasksFilter.setFilterOnMarkerLimit(filterOnMarkerLimit.getSelection());
917     }
918
919     /**
920      * Updates the UI state from the given filter.
921      *
922      * @param tasksFilter the filter to use
923      */

924     void updateUIFromFilter(TasksFilter tasksFilter) {
925
926         setSelectedTypes(tasksFilter.types);
927
928         int on = tasksFilter.onResource;
929         anyResourceButton.setSelection(on == TasksFilter.ON_ANY_RESOURCE);
930         anyResourceInSameProjectButton
931                 .setSelection(on == TasksFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT); // added by cagatayk@acm.org
932
selectedResourceButton
933                 .setSelection(on == TasksFilter.ON_SELECTED_RESOURCE_ONLY);
934         selectedResourceAndChildrenButton
935                 .setSelection(on == TasksFilter.ON_SELECTED_RESOURCE_AND_CHILDREN);
936         workingSetGroup.setSelection(on == TasksFilter.ON_WORKING_SET);
937         workingSetGroup.setWorkingSet(tasksFilter.workingSet);
938
939         descriptionGroup.combo.select(tasksFilter.descriptionFilterKind);
940         descriptionGroup.text.setText(tasksFilter.descriptionFilter);
941
942         severityGroup.setSelection(tasksFilter.filterOnSeverity);
943         severityGroup.setValueMask(tasksFilter.severityFilter);
944
945         priorityGroup.setSelection(tasksFilter.filterOnPriority);
946         priorityGroup.setValueMask(tasksFilter.priorityFilter);
947
948         completionGroup.setSelection(tasksFilter.filterOnCompletion);
949         completionGroup.setValueMask(tasksFilter.completionFilter);
950
951         markerLimit.setText("" + tasksFilter.getMarkerLimit()); //$NON-NLS-1$
952
filterOnMarkerLimit.setSelection(tasksFilter.getFilterOnMarkerLimit());
953
954         updateEnabledState();
955     }
956
957     /**
958      * Handles selection on a check box or combo box.
959      */

960     void widgetSelected(SelectionEvent e) {
961         updateEnabledState();
962     }
963 }
964
Popular Tags