1 11 12 package org.eclipse.ui.internal.navigator.filters; 13 14 import java.util.Arrays ; 15 import java.util.Comparator ; 16 import java.util.Iterator ; 17 import java.util.Set ; 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 52 public class CommonFiltersTab extends CustomizationTab { 53 54 private static final String ALL = "*"; 56 private String 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 105 public void getName(AccessibleEvent e) { 106 String 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 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 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 148 public void keyPressed(KeyEvent e) { 149 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 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 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 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 checkedItems = getCheckedItems(); 215 for (Iterator iterator = checkedItems.iterator(); iterator.hasNext();) { 216 getTableViewer().setChecked(iterator.next(), true); 217 } 218 } 219 220 private void updateFiltersCheckState() { 221 Object [] 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 247 public boolean select(Viewer viewer, Object parentElement, 248 Object element) { 249 return match(filterLabelProvider.getText(element)); 250 } 251 252 protected void setPattern(String newPattern) { 253 if (newPattern == null || newPattern.trim().length() == 0) { 254 matcher = new StringMatcher(ALL, true, false); 255 } else { 256 String patternString = ALL + newPattern + ALL; 257 matcher = new StringMatcher(patternString, true, false); 258 } 259 260 } 261 262 270 protected boolean match(String 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 290 public void sort(Viewer viewer, Object [] elements) { 291 Arrays.sort(elements, new Comparator () { 292 295 public int compare(Object o1, Object 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 |