KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > ui > filters > CustomFiltersDialog


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 package org.eclipse.jdt.internal.ui.filters;
12
13 import java.util.ArrayList JavaDoc;
14 import java.util.Arrays JavaDoc;
15 import java.util.HashSet JavaDoc;
16 import java.util.Iterator JavaDoc;
17 import java.util.List JavaDoc;
18 import java.util.Set JavaDoc;
19 import java.util.Stack JavaDoc;
20 import java.util.StringTokenizer JavaDoc;
21
22 import org.eclipse.core.runtime.Assert;
23
24 import org.eclipse.swt.SWT;
25 import org.eclipse.swt.events.SelectionAdapter;
26 import org.eclipse.swt.events.SelectionEvent;
27 import org.eclipse.swt.events.SelectionListener;
28 import org.eclipse.swt.graphics.Image;
29 import org.eclipse.swt.layout.GridData;
30 import org.eclipse.swt.layout.GridLayout;
31 import org.eclipse.swt.widgets.Button;
32 import org.eclipse.swt.widgets.Composite;
33 import org.eclipse.swt.widgets.Control;
34 import org.eclipse.swt.widgets.Label;
35 import org.eclipse.swt.widgets.Shell;
36 import org.eclipse.swt.widgets.Text;
37
38 import org.eclipse.jface.dialogs.IDialogConstants;
39 import org.eclipse.jface.viewers.ArrayContentProvider;
40 import org.eclipse.jface.viewers.CheckStateChangedEvent;
41 import org.eclipse.jface.viewers.CheckboxTableViewer;
42 import org.eclipse.jface.viewers.ICheckStateListener;
43 import org.eclipse.jface.viewers.ILabelProvider;
44 import org.eclipse.jface.viewers.ISelection;
45 import org.eclipse.jface.viewers.ISelectionChangedListener;
46 import org.eclipse.jface.viewers.IStructuredSelection;
47 import org.eclipse.jface.viewers.LabelProvider;
48 import org.eclipse.jface.viewers.SelectionChangedEvent;
49
50 import org.eclipse.ui.PlatformUI;
51 import org.eclipse.ui.dialogs.SelectionDialog;
52
53 import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
54 import org.eclipse.jdt.internal.ui.util.SWTUtil;
55
56 public class CustomFiltersDialog extends SelectionDialog {
57
58     private static final String JavaDoc SEPARATOR= ","; //$NON-NLS-1$
59

60     private String JavaDoc fViewId;
61     private boolean fEnablePatterns;
62     private String JavaDoc[] fPatterns;
63     private String JavaDoc[] fEnabledFilterIds;
64
65     private FilterDescriptor[] fBuiltInFilters;
66
67     private CheckboxTableViewer fCheckBoxList;
68     private Button fEnableUserDefinedPatterns;
69     private Text fUserDefinedPatterns;
70
71     private Stack JavaDoc fFilterDescriptorChangeHistory;
72
73     
74     /**
75      * Creates a dialog to customize Java element filters.
76      *
77      * @param shell the parent shell
78      * @param viewId the id of the view
79      * @param enablePatterns <code>true</code> if pattern filters are enabled
80      * @param patterns the filter patterns
81      * @param enabledFilterIds the Ids of the enabled filters
82      */

83     public CustomFiltersDialog(
84             Shell shell,
85             String JavaDoc viewId,
86             boolean enablePatterns,
87             String JavaDoc[] patterns,
88             String JavaDoc[] enabledFilterIds) {
89
90         super(shell);
91         Assert.isNotNull(viewId);
92         Assert.isNotNull(patterns);
93         Assert.isNotNull(enabledFilterIds);
94
95         fViewId= viewId;
96         fPatterns= patterns;
97         fEnablePatterns= enablePatterns;
98         fEnabledFilterIds= enabledFilterIds;
99
100         fBuiltInFilters= FilterDescriptor.getFilterDescriptors(fViewId);
101         fFilterDescriptorChangeHistory= new Stack JavaDoc();
102         setShellStyle(getShellStyle() | SWT.RESIZE);
103     }
104
105     protected void configureShell(Shell shell) {
106         setTitle(FilterMessages.CustomFiltersDialog_title);
107         setMessage(FilterMessages.CustomFiltersDialog_filterList_label);
108         super.configureShell(shell);
109         PlatformUI.getWorkbench().getHelpSystem().setHelp(shell, IJavaHelpContextIds.CUSTOM_FILTERS_DIALOG);
110     }
111
112     /**
113      * Overrides method in Dialog
114      *
115      * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(Composite)
116      */

117     protected Control createDialogArea(Composite parent) {
118         initializeDialogUnits(parent);
119         // create a composite with standard margins and spacing
120
Composite composite= new Composite(parent, SWT.NONE);
121         GridLayout layout= new GridLayout();
122         layout.marginHeight= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
123         layout.marginWidth= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
124         layout.verticalSpacing= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
125         layout.horizontalSpacing= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
126         composite.setLayout(layout);
127         composite.setLayoutData(new GridData(GridData.FILL_BOTH));
128         composite.setFont(parent.getFont());
129         Composite group= composite;
130         
131         // Checkbox
132
fEnableUserDefinedPatterns= new Button(group, SWT.CHECK);
133         fEnableUserDefinedPatterns.setFocus();
134         fEnableUserDefinedPatterns.setText(FilterMessages.CustomFiltersDialog_enableUserDefinedPattern);
135         
136         // Pattern field
137
fUserDefinedPatterns= new Text(group, SWT.SINGLE | SWT.BORDER);
138         GridData data= new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
139         data.widthHint= convertWidthInCharsToPixels(59);
140         fUserDefinedPatterns.setLayoutData(data);
141         String JavaDoc patterns= convertToString(fPatterns, SEPARATOR);
142         fUserDefinedPatterns.setText(patterns);
143
144         // Info text
145
final Label info= new Label(group, SWT.LEFT);
146         info.setText(FilterMessages.CustomFiltersDialog_patternInfo);
147
148         // Enabling / disabling of pattern group
149
fEnableUserDefinedPatterns.setSelection(fEnablePatterns);
150         fUserDefinedPatterns.setEnabled(fEnablePatterns);
151         info.setEnabled(fEnablePatterns);
152         fEnableUserDefinedPatterns.addSelectionListener(new SelectionAdapter() {
153             public void widgetSelected(SelectionEvent e) {
154                 boolean state= fEnableUserDefinedPatterns.getSelection();
155                 fUserDefinedPatterns.setEnabled(state);
156                 info.setEnabled(fEnableUserDefinedPatterns.getSelection());
157                 if (state)
158                     fUserDefinedPatterns.setFocus();
159             }
160         });
161
162         // Filters provided by extension point
163
if (fBuiltInFilters.length > 0)
164             createCheckBoxList(group);
165                 
166         applyDialogFont(parent);
167         return parent;
168     }
169
170     private void createCheckBoxList(Composite parent) {
171         // Filler
172
new Label(parent, SWT.NONE);
173         
174         Label info= new Label(parent, SWT.LEFT);
175         info.setText(FilterMessages.CustomFiltersDialog_filterList_label);
176         
177         fCheckBoxList= CheckboxTableViewer.newCheckList(parent, SWT.BORDER);
178         GridData data= new GridData(GridData.FILL_BOTH);
179         data.heightHint= fCheckBoxList.getTable().getItemHeight() * 10;
180         fCheckBoxList.getTable().setLayoutData(data);
181
182         fCheckBoxList.setLabelProvider(createLabelPrivder());
183         fCheckBoxList.setContentProvider(new ArrayContentProvider());
184         Arrays.sort(fBuiltInFilters);
185         fCheckBoxList.setInput(fBuiltInFilters);
186         setInitialSelections(getEnabledFilterDescriptors());
187         
188         List JavaDoc initialSelection= getInitialElementSelections();
189         if (initialSelection != null && !initialSelection.isEmpty())
190             checkInitialSelections();
191
192         // Description
193
info= new Label(parent, SWT.LEFT);
194         info.setText(FilterMessages.CustomFiltersDialog_description_label);
195         final Text description= new Text(parent, SWT.LEFT | SWT.WRAP | SWT.MULTI | SWT.READ_ONLY | SWT.BORDER | SWT.V_SCROLL);
196         data = new GridData(GridData.FILL_HORIZONTAL);
197         data.heightHint= convertHeightInCharsToPixels(3);
198         description.setLayoutData(data);
199         fCheckBoxList.addSelectionChangedListener(new ISelectionChangedListener() {
200             public void selectionChanged(SelectionChangedEvent event) {
201                 ISelection selection= event.getSelection();
202                 if (selection instanceof IStructuredSelection) {
203                     Object JavaDoc selectedElement= ((IStructuredSelection)selection).getFirstElement();
204                     if (selectedElement instanceof FilterDescriptor)
205                         description.setText(((FilterDescriptor)selectedElement).getDescription());
206                 }
207             }
208         });
209         fCheckBoxList.addCheckStateListener(new ICheckStateListener() {
210             /*
211              * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
212              */

213             public void checkStateChanged(CheckStateChangedEvent event) {
214                 Object JavaDoc element= event.getElement();
215                 if (element instanceof FilterDescriptor) {
216                     // renew if already touched
217
if (fFilterDescriptorChangeHistory.contains(element))
218                         fFilterDescriptorChangeHistory.remove(element);
219                     fFilterDescriptorChangeHistory.push(element);
220                 }
221             }});
222
223         addSelectionButtons(parent);
224     }
225
226     private void addSelectionButtons(Composite composite) {
227         Composite buttonComposite= new Composite(composite, SWT.RIGHT);
228         GridLayout layout= new GridLayout();
229         layout.numColumns= 2;
230         buttonComposite.setLayout(layout);
231         GridData data= new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.GRAB_HORIZONTAL);
232         data.grabExcessHorizontalSpace= true;
233         composite.setData(data);
234
235         // Select All button
236
String JavaDoc label= FilterMessages.CustomFiltersDialog_SelectAllButton_label;
237         Button selectButton= createButton(buttonComposite, IDialogConstants.SELECT_ALL_ID, label, false);
238         SWTUtil.setButtonDimensionHint(selectButton);
239         SelectionListener listener= new SelectionAdapter() {
240             public void widgetSelected(SelectionEvent e) {
241                 fCheckBoxList.setAllChecked(true);
242                 fFilterDescriptorChangeHistory.clear();
243                 for (int i= 0; i < fBuiltInFilters.length; i++)
244                     fFilterDescriptorChangeHistory.push(fBuiltInFilters[i]);
245             }
246         };
247         selectButton.addSelectionListener(listener);
248
249         // De-select All button
250
label= FilterMessages.CustomFiltersDialog_DeselectAllButton_label;
251         Button deselectButton= createButton(buttonComposite, IDialogConstants.DESELECT_ALL_ID, label, false);
252         SWTUtil.setButtonDimensionHint(deselectButton);
253         listener= new SelectionAdapter() {
254             public void widgetSelected(SelectionEvent e) {
255                 fCheckBoxList.setAllChecked(false);
256                 fFilterDescriptorChangeHistory.clear();
257                 for (int i= 0; i < fBuiltInFilters.length; i++)
258                     fFilterDescriptorChangeHistory.push(fBuiltInFilters[i]);
259             }
260         };
261         deselectButton.addSelectionListener(listener);
262     }
263
264     private void checkInitialSelections() {
265         Iterator JavaDoc itemsToCheck= getInitialElementSelections().iterator();
266         while (itemsToCheck.hasNext())
267             fCheckBoxList.setChecked(itemsToCheck.next(),true);
268     }
269
270     protected void okPressed() {
271         if (fBuiltInFilters != null) {
272             ArrayList JavaDoc result= new ArrayList JavaDoc();
273             for (int i= 0; i < fBuiltInFilters.length; ++i) {
274                 if (fCheckBoxList.getChecked(fBuiltInFilters[i]))
275                     result.add(fBuiltInFilters[i]);
276             }
277             setResult(result);
278         }
279         super.okPressed();
280     }
281     
282     private ILabelProvider createLabelPrivder() {
283         return
284             new LabelProvider() {
285                 public Image getImage(Object JavaDoc element) {
286                     return null;
287                 }
288                 public String JavaDoc getText(Object JavaDoc element) {
289                     if (element instanceof FilterDescriptor)
290                         return ((FilterDescriptor)element).getName();
291                     else
292                         return null;
293                 }
294             };
295     }
296
297     // ---------- result handling ----------
298

299     protected void setResult(List JavaDoc newResult) {
300         super.setResult(newResult);
301         if (fUserDefinedPatterns.getText().length() > 0) {
302             fEnablePatterns= fEnableUserDefinedPatterns.getSelection();
303             fPatterns= convertFromString(fUserDefinedPatterns.getText(), SEPARATOR);
304         } else {
305             fEnablePatterns= false;
306             fPatterns= new String JavaDoc[0];
307         }
308     }
309
310
311     /**
312      * @return the patterns which have been entered by the user
313      */

314     public String JavaDoc[] getUserDefinedPatterns() {
315         return fPatterns;
316     }
317
318     /**
319      * @return the Ids of the enabled built-in filters
320      */

321     public String JavaDoc[] getEnabledFilterIds() {
322         Object JavaDoc[] result= getResult();
323         Set JavaDoc enabledIds= new HashSet JavaDoc(result.length);
324         for (int i= 0; i < result.length; i++)
325             enabledIds.add(((FilterDescriptor)result[i]).getId());
326         return (String JavaDoc[]) enabledIds.toArray(new String JavaDoc[enabledIds.size()]);
327     }
328
329     /**
330      * @return <code>true</code> if the user-defined patterns are disabled
331      */

332     public boolean areUserDefinedPatternsEnabled() {
333         return fEnablePatterns;
334     }
335     
336     /**
337      * @return a stack with the filter descriptor check history
338      * @since 3.0
339      */

340     public Stack JavaDoc getFilterDescriptorChangeHistory() {
341         return fFilterDescriptorChangeHistory;
342     }
343
344     private FilterDescriptor[] getEnabledFilterDescriptors() {
345         FilterDescriptor[] filterDescs= fBuiltInFilters;
346         List JavaDoc result= new ArrayList JavaDoc(filterDescs.length);
347         List JavaDoc enabledFilterIds= Arrays.asList(fEnabledFilterIds);
348         for (int i= 0; i < filterDescs.length; i++) {
349             String JavaDoc id= filterDescs[i].getId();
350             if (enabledFilterIds.contains(id))
351                 result.add(filterDescs[i]);
352         }
353         return (FilterDescriptor[])result.toArray(new FilterDescriptor[result.size()]);
354     }
355
356
357     public static String JavaDoc[] convertFromString(String JavaDoc patterns, String JavaDoc separator) {
358         StringTokenizer JavaDoc tokenizer= new StringTokenizer JavaDoc(patterns, separator, true);
359         int tokenCount= tokenizer.countTokens();
360         List JavaDoc result= new ArrayList JavaDoc(tokenCount);
361         boolean escape= false;
362         boolean append= false;
363         while (tokenizer.hasMoreTokens()) {
364             String JavaDoc token= tokenizer.nextToken().trim();
365             if (separator.equals(token)) {
366                 if (!escape)
367                     escape= true;
368                 else {
369                     addPattern(result, separator);
370                     append= true;
371                 }
372             } else {
373                 if (!append)
374                     result.add(token);
375                 else
376                     addPattern(result, token);
377                 append= false;
378                 escape= false;
379             }
380         }
381         return (String JavaDoc[])result.toArray(new String JavaDoc[result.size()]);
382     }
383     
384     private static void addPattern(List JavaDoc list, String JavaDoc pattern) {
385         if (list.isEmpty())
386             list.add(pattern);
387         else {
388             int index= list.size() - 1;
389             list.set(index, ((String JavaDoc)list.get(index)) + pattern);
390         }
391     }
392
393     public static String JavaDoc convertToString(String JavaDoc[] patterns, String JavaDoc separator) {
394         int length= patterns.length;
395         StringBuffer JavaDoc strBuf= new StringBuffer JavaDoc();
396         if (length > 0)
397             strBuf.append(escapeSeparator(patterns[0], separator));
398         else
399             return ""; //$NON-NLS-1$
400
int i= 1;
401         while (i < length) {
402             strBuf.append(separator);
403             strBuf.append(" "); //$NON-NLS-1$
404
strBuf.append(escapeSeparator(patterns[i++], separator));
405         }
406         return strBuf.toString();
407     }
408     
409     private static String JavaDoc escapeSeparator(String JavaDoc pattern, String JavaDoc separator) {
410         int length= pattern.length();
411         StringBuffer JavaDoc buf= new StringBuffer JavaDoc(length);
412         for (int i= 0; i < length; i++) {
413             char ch= pattern.charAt(i);
414             if (separator.equals(String.valueOf(ch)))
415                 buf.append(ch);
416             buf.append(ch);
417         }
418         return buf.toString();
419         
420     }
421 }
422
Popular Tags