KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > ui > internal > navigator > filters > CommonFiltersTab


1 /*******************************************************************************
2  * Copyright (c) 2006, 2007 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.internal.navigator.filters;
13
14 import java.util.Arrays JavaDoc;
15 import java.util.Comparator JavaDoc;
16 import java.util.Iterator JavaDoc;
17 import java.util.Set JavaDoc;
18
19 import org.eclipse.jface.viewers.ILabelProvider;
20 import org.eclipse.jface.viewers.ISelection;
21 import org.eclipse.jface.viewers.Viewer;
22 import org.eclipse.jface.viewers.ViewerFilter;
23 import org.eclipse.jface.viewers.ViewerSorter;
24 import org.eclipse.swt.SWT;
25 import org.eclipse.swt.accessibility.AccessibleAdapter;
26 import org.eclipse.swt.accessibility.AccessibleEvent;
27 import org.eclipse.swt.events.FocusAdapter;
28 import org.eclipse.swt.events.FocusEvent;
29 import org.eclipse.swt.events.KeyAdapter;
30 import org.eclipse.swt.events.KeyEvent;
31 import org.eclipse.swt.events.ModifyEvent;
32 import org.eclipse.swt.events.ModifyListener;
33 import org.eclipse.swt.events.MouseAdapter;
34 import org.eclipse.swt.events.MouseEvent;
35 import org.eclipse.swt.events.TraverseEvent;
36 import org.eclipse.swt.events.TraverseListener;
37 import org.eclipse.swt.layout.GridData;
38 import org.eclipse.swt.widgets.Composite;
39 import org.eclipse.swt.widgets.Display;
40 import org.eclipse.swt.widgets.TableItem;
41 import org.eclipse.swt.widgets.Text;
42 import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
43 import org.eclipse.ui.internal.navigator.StringMatcher;
44 import org.eclipse.ui.navigator.ICommonFilterDescriptor;
45 import org.eclipse.ui.navigator.INavigatorContentService;
46 import org.eclipse.ui.navigator.INavigatorFilterService;
47
48 /**
49  * @since 3.2
50  *
51  */

52 public class CommonFiltersTab extends CustomizationTab {
53  
54     private static final String JavaDoc ALL = "*"; //$NON-NLS-1$
55

56     private String JavaDoc initialFilterTextValue = CommonNavigatorMessages.CommonFilterSelectionDialog_enter_name_of_filte_;
57
58     private Text filterText;
59
60     private ILabelProvider filterLabelProvider = new CommonFilterLabelProvider();
61
62     private CommonFilterContentProvider filterContentProvider = new CommonFilterContentProvider();
63
64     private TablePatternFilter patternFilter = new TablePatternFilter();
65
66     protected CommonFiltersTab(Composite parent,
67             INavigatorContentService aContentService) {
68         super(parent, aContentService);
69         createControl();
70     }
71       
72     private void createControl() {
73
74         createInstructionsLabel(CommonNavigatorMessages.CommonFilterSelectionDialog_Select_the_filters_to_apply);
75         
76         createPatternFilterText(this);
77         
78         createTable();
79
80         getTableViewer().setContentProvider(filterContentProvider);
81         getTableViewer().setLabelProvider(filterLabelProvider);
82         getTableViewer().setSorter(new CommonFilterSorter());
83         getTableViewer().setInput(getContentService());
84         
85         getTableViewer().addFilter(patternFilter);
86         
87         updateFiltersCheckState();
88
89     }
90
91     private void createPatternFilterText(Composite composite) {
92         filterText = new Text(composite, SWT.SINGLE | SWT.BORDER);
93         GridData filterTextGridData = new GridData(GridData.FILL_HORIZONTAL);
94         filterText.setLayoutData(filterTextGridData);
95         filterText.setText(initialFilterTextValue);
96         filterText.setFont(composite.getFont());
97
98         filterText.getAccessible().addAccessibleListener(
99                 new AccessibleAdapter() {
100                     /*
101                      * (non-Javadoc)
102                      *
103                      * @see org.eclipse.swt.accessibility.AccessibleListener#getName(org.eclipse.swt.accessibility.AccessibleEvent)
104                      */

105                     public void getName(AccessibleEvent e) {
106                         String JavaDoc filterTextString = filterText.getText();
107                         if (filterTextString.length() == 0) {
108                             e.result = initialFilterTextValue;
109                         } else {
110                             e.result = filterTextString;
111                         }
112                     }
113                 });
114
115         filterText.addFocusListener(new FocusAdapter() {
116             /*
117              * (non-Javadoc)
118              *
119              * @see org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt.events.FocusEvent)
120              */

121             public void focusGained(FocusEvent e) {
122                 if (initialFilterTextValue.equals(filterText.getText().trim())) {
123                     filterText.selectAll();
124                 }
125             }
126         });
127
128         filterText.addMouseListener(new MouseAdapter() {
129             /*
130              * (non-Javadoc)
131              *
132              * @see org.eclipse.swt.events.MouseAdapter#mouseUp(org.eclipse.swt.events.MouseEvent)
133              */

134             public void mouseUp(MouseEvent e) {
135                 super.mouseUp(e);
136                 if (initialFilterTextValue.equals(filterText.getText().trim())) {
137                     filterText.selectAll();
138                 }
139             }
140         });
141
142         filterText.addKeyListener(new KeyAdapter() {
143             /*
144              * (non-Javadoc)
145              *
146              * @see org.eclipse.swt.events.KeyAdapter#keyReleased(org.eclipse.swt.events.KeyEvent)
147              */

148             public void keyPressed(KeyEvent e) {
149                 // on a CR we want to transfer focus to the list
150
boolean hasItems = getTable().getItemCount() > 0;
151                 if (hasItems && e.keyCode == SWT.ARROW_DOWN) {
152                     getTable().setFocus();
153                 } else if (e.character == SWT.CR) {
154                     return;
155                 }
156             }
157         });
158
159         // enter key set focus to tree
160
filterText.addTraverseListener(new TraverseListener() {
161             public void keyTraversed(TraverseEvent e) {
162                 if (e.detail == SWT.TRAVERSE_RETURN) {
163                     e.doit = false;
164                     if (getTableViewer().getTable().getItemCount() == 0) {
165                         Display.getCurrent().beep();
166                     } else {
167                         // if the initial filter text hasn't changed, do not try
168
// to match
169
boolean hasFocus = getTable().setFocus();
170                         boolean textChanged = !initialFilterTextValue
171                                 .equals(filterText.getText().trim());
172                         if (hasFocus && textChanged
173                                 && filterText.getText().trim().length() > 0) {
174                             TableItem item = getFirstHighlightedItem(getTable()
175                                     .getItems());
176                             if (item != null) {
177                                 getTable().setSelection(
178                                         new TableItem[] { item });
179                                 ISelection sel = getTableViewer()
180                                         .getSelection();
181                                 getTableViewer().setSelection(sel, true);
182                             }
183                         }
184                     }
185                 }
186             }
187
188             private TableItem getFirstHighlightedItem(TableItem[] items) {
189                 for (int i = 0; i < items.length; i++) {
190                     if (patternFilter.match(items[i].getText())) {
191                         return items[i];
192                     }
193                 }
194                 return null;
195             }
196         });
197
198         filterText.addModifyListener(new ModifyListener() {
199             /*
200              * (non-Javadoc)
201              *
202              * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
203              */

204             public void modifyText(ModifyEvent e) {
205                 textChanged();
206             }
207         });
208     }
209
210     private void textChanged() {
211         patternFilter.setPattern(filterText.getText());
212         getTableViewer().refresh();
213         
214         Set JavaDoc checkedItems = getCheckedItems();
215         for (Iterator JavaDoc iterator = checkedItems.iterator(); iterator.hasNext();) {
216             getTableViewer().setChecked(iterator.next(), true);
217         }
218     }
219
220     private void updateFiltersCheckState() {
221         Object JavaDoc[] children = filterContentProvider
222                 .getElements(getContentService());
223         ICommonFilterDescriptor filterDescriptor;
224         INavigatorFilterService filterService = getContentService()
225                 .getFilterService();
226         for (int i = 0; i < children.length; i++) {
227             filterDescriptor = (ICommonFilterDescriptor) children[i];
228             if(filterService.isActive(filterDescriptor.getId())) {
229                 getTableViewer().setChecked(children[i], true);
230                 getCheckedItems().add(children[i]);
231             } else {
232                 getTableViewer().setChecked(children[i], false);
233             }
234         }
235     }
236
237     private class TablePatternFilter extends ViewerFilter {
238
239         private StringMatcher matcher = null;
240
241         /*
242          * (non-Javadoc)
243          *
244          * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
245          * java.lang.Object, java.lang.Object)
246          */

247         public boolean select(Viewer viewer, Object JavaDoc parentElement,
248                 Object JavaDoc element) {
249             return match(filterLabelProvider.getText(element));
250         }
251
252         protected void setPattern(String JavaDoc newPattern) {
253             if (newPattern == null || newPattern.trim().length() == 0) {
254                 matcher = new StringMatcher(ALL, true, false);
255             } else {
256                 String JavaDoc patternString = ALL + newPattern + ALL;
257                 matcher = new StringMatcher(patternString, true, false);
258             }
259
260         }
261
262         /**
263          * Answers whether the given String matches the pattern.
264          *
265          * @param input
266          * the String to test
267          *
268          * @return whether the string matches the pattern
269          */

270         protected boolean match(String JavaDoc input) {
271             if (input == null) {
272                 return false;
273             }
274             return matcher == null || matcher.match(input);
275         }
276
277         protected boolean match(TableItem tableItem) {
278             if (tableItem == null || tableItem.getData() == null) {
279                 return false;
280             }
281             return match(filterLabelProvider.getText(tableItem.getData()));
282         }
283     }
284  
285     private class CommonFilterSorter extends ViewerSorter {
286         
287         /* (non-Javadoc)
288          * @see org.eclipse.jface.viewers.ViewerSorter#sort(org.eclipse.jface.viewers.Viewer, java.lang.Object[])
289          */

290         public void sort(Viewer viewer, Object JavaDoc[] elements) {
291             Arrays.sort(elements, new Comparator JavaDoc() {
292                 /* (non-Javadoc)
293                  * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
294                  */

295                 public int compare(Object JavaDoc o1, Object JavaDoc o2) {
296                     ICommonFilterDescriptor lvalue = (ICommonFilterDescriptor) o1;
297                     ICommonFilterDescriptor rvalue = (ICommonFilterDescriptor) o2;
298                     
299                     return lvalue.getName().compareTo(rvalue.getName());
300                 }
301             });
302         
303         }
304
305     }
306
307 }
308
Popular Tags