1 11 package org.eclipse.jdt.internal.ui.filters; 12 13 import java.util.ArrayList ; 14 import java.util.Arrays ; 15 import java.util.HashSet ; 16 import java.util.Iterator ; 17 import java.util.List ; 18 import java.util.Set ; 19 import java.util.Stack ; 20 import java.util.StringTokenizer ; 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 SEPARATOR= ","; 60 private String fViewId; 61 private boolean fEnablePatterns; 62 private String [] fPatterns; 63 private String [] fEnabledFilterIds; 64 65 private FilterDescriptor[] fBuiltInFilters; 66 67 private CheckboxTableViewer fCheckBoxList; 68 private Button fEnableUserDefinedPatterns; 69 private Text fUserDefinedPatterns; 70 71 private Stack fFilterDescriptorChangeHistory; 72 73 74 83 public CustomFiltersDialog( 84 Shell shell, 85 String viewId, 86 boolean enablePatterns, 87 String [] patterns, 88 String [] 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 (); 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 117 protected Control createDialogArea(Composite parent) { 118 initializeDialogUnits(parent); 119 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 fEnableUserDefinedPatterns= new Button(group, SWT.CHECK); 133 fEnableUserDefinedPatterns.setFocus(); 134 fEnableUserDefinedPatterns.setText(FilterMessages.CustomFiltersDialog_enableUserDefinedPattern); 135 136 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 patterns= convertToString(fPatterns, SEPARATOR); 142 fUserDefinedPatterns.setText(patterns); 143 144 final Label info= new Label(group, SWT.LEFT); 146 info.setText(FilterMessages.CustomFiltersDialog_patternInfo); 147 148 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 if (fBuiltInFilters.length > 0) 164 createCheckBoxList(group); 165 166 applyDialogFont(parent); 167 return parent; 168 } 169 170 private void createCheckBoxList(Composite parent) { 171 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 initialSelection= getInitialElementSelections(); 189 if (initialSelection != null && !initialSelection.isEmpty()) 190 checkInitialSelections(); 191 192 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 selectedElement= ((IStructuredSelection)selection).getFirstElement(); 204 if (selectedElement instanceof FilterDescriptor) 205 description.setText(((FilterDescriptor)selectedElement).getDescription()); 206 } 207 } 208 }); 209 fCheckBoxList.addCheckStateListener(new ICheckStateListener() { 210 213 public void checkStateChanged(CheckStateChangedEvent event) { 214 Object element= event.getElement(); 215 if (element instanceof FilterDescriptor) { 216 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 String 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 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 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 result= new ArrayList (); 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 element) { 286 return null; 287 } 288 public String getText(Object element) { 289 if (element instanceof FilterDescriptor) 290 return ((FilterDescriptor)element).getName(); 291 else 292 return null; 293 } 294 }; 295 } 296 297 299 protected void setResult(List 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 [0]; 307 } 308 } 309 310 311 314 public String [] getUserDefinedPatterns() { 315 return fPatterns; 316 } 317 318 321 public String [] getEnabledFilterIds() { 322 Object [] result= getResult(); 323 Set enabledIds= new HashSet (result.length); 324 for (int i= 0; i < result.length; i++) 325 enabledIds.add(((FilterDescriptor)result[i]).getId()); 326 return (String []) enabledIds.toArray(new String [enabledIds.size()]); 327 } 328 329 332 public boolean areUserDefinedPatternsEnabled() { 333 return fEnablePatterns; 334 } 335 336 340 public Stack getFilterDescriptorChangeHistory() { 341 return fFilterDescriptorChangeHistory; 342 } 343 344 private FilterDescriptor[] getEnabledFilterDescriptors() { 345 FilterDescriptor[] filterDescs= fBuiltInFilters; 346 List result= new ArrayList (filterDescs.length); 347 List enabledFilterIds= Arrays.asList(fEnabledFilterIds); 348 for (int i= 0; i < filterDescs.length; i++) { 349 String 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 [] convertFromString(String patterns, String separator) { 358 StringTokenizer tokenizer= new StringTokenizer (patterns, separator, true); 359 int tokenCount= tokenizer.countTokens(); 360 List result= new ArrayList (tokenCount); 361 boolean escape= false; 362 boolean append= false; 363 while (tokenizer.hasMoreTokens()) { 364 String 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 [])result.toArray(new String [result.size()]); 382 } 383 384 private static void addPattern(List list, String pattern) { 385 if (list.isEmpty()) 386 list.add(pattern); 387 else { 388 int index= list.size() - 1; 389 list.set(index, ((String )list.get(index)) + pattern); 390 } 391 } 392 393 public static String convertToString(String [] patterns, String separator) { 394 int length= patterns.length; 395 StringBuffer strBuf= new StringBuffer (); 396 if (length > 0) 397 strBuf.append(escapeSeparator(patterns[0], separator)); 398 else 399 return ""; int i= 1; 401 while (i < length) { 402 strBuf.append(separator); 403 strBuf.append(" "); strBuf.append(escapeSeparator(patterns[i++], separator)); 405 } 406 return strBuf.toString(); 407 } 408 409 private static String escapeSeparator(String pattern, String separator) { 410 int length= pattern.length(); 411 StringBuffer buf= new StringBuffer (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 |