1 11 12 package org.eclipse.ui.views.markers.internal; 13 14 import java.util.ArrayList ; 15 import java.util.Collection ; 16 import java.util.HashMap ; 17 import java.util.List ; 18 19 import org.eclipse.jface.dialogs.ErrorDialog; 20 import org.eclipse.jface.dialogs.IDialogConstants; 21 import org.eclipse.jface.dialogs.IInputValidator; 22 import org.eclipse.jface.dialogs.InputDialog; 23 import org.eclipse.jface.dialogs.TrayDialog; 24 import org.eclipse.jface.viewers.CheckStateChangedEvent; 25 import org.eclipse.jface.viewers.CheckboxTableViewer; 26 import org.eclipse.jface.viewers.CheckboxTreeViewer; 27 import org.eclipse.jface.viewers.ColumnWeightData; 28 import org.eclipse.jface.viewers.ICheckStateListener; 29 import org.eclipse.jface.viewers.ILabelProvider; 30 import org.eclipse.jface.viewers.ISelection; 31 import org.eclipse.jface.viewers.ISelectionChangedListener; 32 import org.eclipse.jface.viewers.IStructuredContentProvider; 33 import org.eclipse.jface.viewers.IStructuredSelection; 34 import org.eclipse.jface.viewers.ITableLabelProvider; 35 import org.eclipse.jface.viewers.ITreeContentProvider; 36 import org.eclipse.jface.viewers.LabelProvider; 37 import org.eclipse.jface.viewers.SelectionChangedEvent; 38 import org.eclipse.jface.viewers.StructuredSelection; 39 import org.eclipse.jface.viewers.TableLayout; 40 import org.eclipse.jface.viewers.Viewer; 41 import org.eclipse.jface.viewers.ViewerComparator; 42 import org.eclipse.jface.window.Window; 43 import org.eclipse.osgi.util.NLS; 44 import org.eclipse.swt.SWT; 45 import org.eclipse.swt.events.SelectionAdapter; 46 import org.eclipse.swt.events.SelectionEvent; 47 import org.eclipse.swt.graphics.Image; 48 import org.eclipse.swt.graphics.Point; 49 import org.eclipse.swt.layout.GridData; 50 import org.eclipse.swt.layout.GridLayout; 51 import org.eclipse.swt.widgets.Button; 52 import org.eclipse.swt.widgets.Combo; 53 import org.eclipse.swt.widgets.Composite; 54 import org.eclipse.swt.widgets.Control; 55 import org.eclipse.swt.widgets.Label; 56 import org.eclipse.swt.widgets.Shell; 57 import org.eclipse.swt.widgets.Tree; 58 import org.eclipse.swt.widgets.TreeColumn; 59 import org.eclipse.ui.IWorkingSet; 60 import org.eclipse.ui.PlatformUI; 61 import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog; 62 63 68 public abstract class DialogMarkerFilter extends TrayDialog { 69 70 static final int SELECT_ALL_FILTERS_ID = IDialogConstants.CLIENT_ID + 4; 71 72 static final int DESELECT_ALL_FILTERS_ID = IDialogConstants.CLIENT_ID + 5; 73 74 77 static final int RESET_ID = IDialogConstants.CLIENT_ID; 78 79 static final int SELECT_WORKING_SET_ID = IDialogConstants.CLIENT_ID + 1; 80 81 static final int SELECT_ALL_ID = IDialogConstants.CLIENT_ID + 2; 82 83 static final int DESELECT_ALL_ID = IDialogConstants.CLIENT_ID + 3; 84 85 private class TypesLabelProvider extends LabelProvider implements 86 ITableLabelProvider { 87 88 94 public Image getColumnImage(Object element, int columnIndex) { 95 return null; 96 } 97 98 104 public String getColumnText(Object element, int columnIndex) { 105 return ((AbstractNode) element).getName(); 106 } 107 } 108 109 113 private class WorkingSetGroup { 114 115 private Button button; 116 117 private Button selectButton; 118 119 125 WorkingSetGroup(Composite parent) { 126 button = createRadioButton(parent, 128 MarkerMessages.filtersDialog_noWorkingSet); 129 GridData data = new GridData(GridData.FILL_HORIZONTAL); 130 button.setLayoutData(data); 131 132 Composite composite = new Composite(parent, SWT.NONE); 133 composite.setFont(parent.getFont()); 134 GridLayout layout = new GridLayout(); 135 Button radio = new Button(parent, SWT.RADIO); 136 layout.marginWidth = radio.computeSize(SWT.DEFAULT, SWT.DEFAULT).x; 137 layout.marginHeight = 0; 138 radio.dispose(); 139 composite.setLayout(layout); 140 selectButton = createButton(composite, SELECT_WORKING_SET_ID, 141 MarkerMessages.filtersDialog_workingSetSelect, false); 142 } 143 144 150 boolean getSelection() { 151 return button.getSelection(); 152 } 153 154 159 IWorkingSet getWorkingSet() { 160 return (IWorkingSet) button.getData(); 161 } 162 163 170 void setSelection(boolean selected) { 171 button.setSelection(selected); 172 if (selected) { 173 anyResourceButton.setSelection(false); 174 anyResourceInSameProjectButton.setSelection(false); 175 selectedResourceButton.setSelection(false); 176 selectedResourceAndChildrenButton.setSelection(false); 177 } 178 } 179 180 183 void selectPressed() { 184 IWorkingSetSelectionDialog dialog = PlatformUI.getWorkbench() 185 .getWorkingSetManager().createWorkingSetSelectionDialog( 186 getShell(), false); 187 IWorkingSet workingSet = getWorkingSet(); 188 189 if (workingSet != null) { 190 dialog.setSelection(new IWorkingSet[] { workingSet }); 191 } 192 if (dialog.open() == Window.OK) { 193 markDirty(); 194 IWorkingSet[] result = dialog.getSelection(); 195 if (result != null && result.length > 0) { 196 setWorkingSet(result[0]); 197 } else { 198 setWorkingSet(null); 199 } 200 if (getSelection() == false) { 201 setSelection(true); 202 } 203 } 204 } 205 206 212 void setWorkingSet(IWorkingSet workingSet) { 213 button.setData(workingSet); 214 if (workingSet != null) { 215 button.setText(NLS.bind( 216 MarkerMessages.filtersDialog_workingSet, workingSet 217 .getLabel())); 218 } else { 219 button.setText(MarkerMessages.filtersDialog_noWorkingSet); 220 } 221 } 222 223 void setEnabled(boolean enabled) { 224 button.setEnabled(enabled); 225 selectButton.setEnabled(enabled); 226 } 227 } 228 229 234 private abstract class AbstractNode { 235 236 241 public abstract Object getParent(); 242 243 248 public abstract String getName(); 249 250 255 public abstract boolean hasChildren(); 256 257 262 public abstract Object [] getChildren(); 263 264 269 public abstract boolean isCategory(); 270 271 } 272 273 277 private class MarkerTypeNode extends AbstractNode { 278 279 MarkerType type; 280 281 MarkerCategory category; 282 283 288 public MarkerTypeNode(MarkerType markerType) { 289 type = markerType; 290 nodeToTypeMapping.put(markerType.getId(), this); 291 } 292 293 298 public void setCategory(MarkerCategory category) { 299 this.category = category; 300 } 301 302 307 public MarkerCategory getCategory() { 308 return category; 309 } 310 311 316 public Object [] getChildren() { 317 return new Object [0]; 318 } 319 320 325 public Object getParent() { 326 return category; 327 } 328 329 334 public boolean hasChildren() { 335 return false; 336 } 337 338 343 public String getName() { 344 return type.getLabel(); 345 } 346 347 352 public boolean isCategory() { 353 return false; 354 } 355 356 361 public Object getMarkerType() { 362 return type; 363 } 364 } 365 366 371 private class MarkerCategory extends AbstractNode { 372 373 String name; 374 375 Collection types = new ArrayList (); 376 377 382 public MarkerCategory(String categoryName) { 383 name = categoryName; 384 } 385 386 391 public String getName() { 392 return name; 393 } 394 395 400 public void add(MarkerTypeNode markerType) { 401 types.add(markerType); 402 markerType.setCategory(this); 403 } 404 405 410 public Object [] getMarkerTypes() { 411 return types.toArray(); 412 } 413 414 419 public Object [] getChildren() { 420 return getMarkerTypes(); 421 } 422 423 428 public Object getParent() { 429 return null; 430 } 431 432 437 public boolean hasChildren() { 438 return true; 439 } 440 441 446 public boolean isCategory() { 447 return true; 448 } 449 450 } 451 452 private MarkerFilter[] filters; 453 454 private CheckboxTreeViewer typesViewer; 455 456 private Button anyResourceButton; 457 458 private Button anyResourceInSameProjectButton; 459 460 private Button selectedResourceButton; 461 462 private Button selectedResourceAndChildrenButton; 463 464 private Button selectAllButton; 465 466 private Button deselectAllButton; 467 468 private WorkingSetGroup workingSetGroup; 469 470 private boolean dirty = false; 471 472 private CheckboxTableViewer filtersList; 473 474 private MarkerFilter[] selectedFilters; 475 476 private HashMap nodeToTypeMapping = new HashMap (); 477 478 private ITreeContentProvider typesContentProvider; 479 480 486 DialogMarkerFilter(Shell parentShell, MarkerFilter[] filtersList) { 487 super(parentShell); 488 setFilters(filtersList); 489 setShellStyle(getShellStyle() | SWT.RESIZE); 490 } 491 492 497 private void setFilters(MarkerFilter[] initialFilters) { 498 MarkerFilter[] newMarkers = new MarkerFilter[initialFilters.length]; 499 for (int i = 0; i < initialFilters.length; i++) { 500 MarkerFilter newFilter; 501 try { 502 newFilter = initialFilters[i].makeClone(); 503 } catch (CloneNotSupportedException exception) { 504 ErrorDialog.openError(getShell(), 505 MarkerMessages.MarkerFilterDialog_errorTitle, 506 MarkerMessages.MarkerFilterDialog_failedFilterMessage, 507 Util.errorStatus(exception)); 508 return; 509 } 510 511 newMarkers[i] = newFilter; 512 513 } 514 filters = newMarkers; 515 516 } 517 518 521 protected void buttonPressed(int buttonId) { 522 523 switch (buttonId) { 524 case RESET_ID: 525 resetPressed(); 526 markDirty(); 527 break; 528 case SELECT_WORKING_SET_ID: 529 workingSetGroup.selectPressed(); 530 break; 531 case SELECT_ALL_ID: 532 typesViewer.setAllChecked(true); 533 break; 534 case DESELECT_ALL_ID: 535 typesViewer.setAllChecked(false); 536 break; 537 case SELECT_ALL_FILTERS_ID: 538 filtersList.setAllChecked(true); 539 break; 540 case DESELECT_ALL_FILTERS_ID: 541 filtersList.setAllChecked(false); 542 break; 543 default: 544 break; 545 } 546 super.buttonPressed(buttonId); 547 } 548 549 552 protected void configureShell(Shell newShell) { 553 super.configureShell(newShell); 554 newShell.setText(MarkerMessages.filtersDialog_title); 555 } 556 557 protected void createResetArea(Composite parent) { 558 559 Button reset = new Button(parent, SWT.PUSH); 560 reset.setText(MarkerMessages.restoreDefaults_text); 561 reset.setData(new Integer (RESET_ID)); 562 563 reset.addSelectionListener(new SelectionAdapter() { 564 public void widgetSelected(SelectionEvent event) { 565 buttonPressed(((Integer ) event.widget.getData()).intValue()); 566 } 567 }); 568 569 GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END); 570 int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); 571 Point minSize = reset.computeSize(SWT.DEFAULT, SWT.DEFAULT, true); 572 data.widthHint = Math.max(widthHint, minSize.x); 573 data.horizontalSpan = 2; 574 reset.setLayoutData(data); 575 } 576 577 589 protected Button createCheckbox(Composite parent, String text, 590 boolean grabRow) { 591 Button button = new Button(parent, SWT.CHECK); 592 if (grabRow) { 593 GridData gridData = new GridData(GridData.FILL_HORIZONTAL); 594 button.setLayoutData(gridData); 595 } 596 button.setText(text); 597 button.addSelectionListener(new SelectionAdapter() { 598 public void widgetSelected(SelectionEvent e) { 599 updateForSelection(); 600 } 601 }); 602 button.setFont(parent.getFont()); 603 return button; 604 } 605 606 617 protected Combo createCombo(Composite parent, String [] items, 618 int selectionIndex) { 619 Combo combo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY); 620 combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); 621 combo.setFont(parent.getFont()); 622 combo.setItems(items); 623 combo.select(selectionIndex); 624 combo.addSelectionListener(new SelectionAdapter() { 625 public void widgetSelected(SelectionEvent e) { 626 updateForSelection(); 627 } 628 }); 629 return combo; 630 } 631 632 635 protected Control createDialogArea(Composite parent) { 636 Composite dialogArea = (Composite) super.createDialogArea(parent); 637 638 dialogArea.setLayout(new GridLayout(2, false)); 639 640 createFiltersArea(dialogArea); 641 642 Composite selectedComposite = createSelectedFilterArea(dialogArea); 643 selectedComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, 644 true)); 645 updateUIFromFilter(); 646 647 filtersList.setSelection(new StructuredSelection(filters[0])); 648 649 createResetArea(dialogArea); 650 createSeparatorLine(dialogArea); 651 652 applyDialogFont(dialogArea); 653 return dialogArea; 654 } 655 656 661 664 void createFiltersArea(Composite dialogArea) { 665 666 Composite listArea = new Composite(dialogArea, SWT.NONE); 667 listArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 668 listArea.setLayout(new GridLayout()); 669 670 createUserFiltersArea(listArea); 671 createFilterSelectButtons(listArea); 672 } 673 674 679 void createUserFiltersArea(Composite listArea) { 680 681 Composite userComposite = new Composite(listArea, SWT.NONE); 682 userComposite.setLayout(new GridLayout(2, false)); 683 userComposite 684 .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 685 686 Label title = new Label(userComposite, SWT.NONE); 687 title.setText(MarkerMessages.MarkerFilter_filtersTitle); 688 GridData titleData = new GridData(); 689 titleData.horizontalSpan = 2; 690 title.setLayoutData(titleData); 691 692 filtersList = CheckboxTableViewer.newCheckList(userComposite, 693 SWT.BORDER); 694 filtersList.setContentProvider(new IStructuredContentProvider() { 695 700 public Object [] getElements(Object inputElement) { 701 return filters; 702 } 703 704 709 public void dispose() { 710 } 712 713 719 public void inputChanged(Viewer viewer, Object oldInput, 720 Object newInput) { 721 } 723 }); 724 725 filtersList.setLabelProvider(new LabelProvider() { 726 731 public String getText(Object element) { 732 return ((MarkerFilter) element).getName(); 733 } 734 }); 735 736 selectedFilters = new MarkerFilter[] { filters[0] }; 737 filtersList.setSelection(new StructuredSelection(selectedFilters)); 738 739 filtersList 740 .addSelectionChangedListener(new ISelectionChangedListener() { 741 742 747 public void selectionChanged(SelectionChangedEvent event) { 748 updateFilterFromUI(); 749 setSelectedFilter(event); 750 751 } 752 }); 753 754 filtersList.setInput(this); 755 for (int i = 0; i < filters.length; i++) { 756 filtersList.setChecked(filters[i], filters[i].isEnabled()); 757 } 758 759 GridData listData = new GridData(SWT.FILL, SWT.FILL, true, true); 760 listData.widthHint = convertHorizontalDLUsToPixels(100); 761 filtersList.getControl().setLayoutData(listData); 762 763 Composite buttons = new Composite(userComposite, SWT.NONE); 764 GridLayout buttonLayout = new GridLayout(); 765 buttonLayout.marginWidth = 0; 766 buttons.setLayout(buttonLayout); 767 GridData buttonsData = new GridData(); 768 buttonsData.verticalAlignment = GridData.BEGINNING; 769 buttons.setLayoutData(buttonsData); 770 771 Button addNew = new Button(buttons, SWT.PUSH); 772 addNew.setText(MarkerMessages.MarkerFilter_addFilterName); 773 addNew.addSelectionListener(new SelectionAdapter() { 774 public void widgetSelected(SelectionEvent e) { 775 InputDialog newDialog = new InputDialog(getShell(), 776 MarkerMessages.MarkerFilterDialog_title, 777 MarkerMessages.MarkerFilterDialog_message, 778 MarkerMessages.MarkerFilter_newFilterName, 779 new IInputValidator() { 780 785 public String isValid(String newText) { 786 if (newText.length() == 0) 787 return MarkerMessages.MarkerFilterDialog_emptyMessage; 788 for (int i = 0; i < filters.length; i++) { 789 if (filters[i].getName().equals(newText)) 790 return NLS 791 .bind( 792 MarkerMessages.filtersDialog_conflictingName, 793 newText); 794 795 } 796 return null; 797 } 798 }); 799 newDialog.open(); 800 String newName = newDialog.getValue(); 801 if (newName != null) { 802 createNewFilter(newName); 803 } 804 } 805 }); 806 setButtonLayoutData(addNew); 807 808 Button remove = new Button(buttons, SWT.PUSH); 809 remove.setText(MarkerMessages.MarkerFilter_deleteSelectedName); 810 remove.addSelectionListener(new SelectionAdapter() { 811 public void widgetSelected(SelectionEvent e) { 812 removeFilters(filtersList.getSelection()); 813 } 814 }); 815 setButtonLayoutData(remove); 816 } 817 818 823 protected void setSelectedFilter(SelectionChangedEvent event) { 824 825 ISelection selection = event.getSelection(); 826 if (selection instanceof IStructuredSelection) { 827 Collection list = ((IStructuredSelection) selection).toList(); 828 MarkerFilter[] selected = new MarkerFilter[list.size()]; 829 list.toArray(selected); 830 selectedFilters = selected; 831 832 } else { 833 selectedFilters = new MarkerFilter[0]; 834 } 835 updateUIFromFilter(); 836 837 } 838 839 844 protected void removeFilters(ISelection selection) { 845 if (selection instanceof IStructuredSelection) { 846 List toRemove = ((IStructuredSelection) selection).toList(); 847 MarkerFilter[] newFilters = new MarkerFilter[filters.length 848 - toRemove.size()]; 849 int index = 0; 850 for (int i = 0; i < filters.length; i++) { 851 if (toRemove.contains(filters[i])) { 852 continue; 853 } 854 newFilters[index] = filters[i]; 855 index++; 856 } 857 858 filters = newFilters; 859 filtersList.refresh(); 860 updateUIFromFilter(); 861 } 862 } 863 864 869 private void createNewFilter(String newName) { 870 MarkerFilter[] newFilters = new MarkerFilter[filters.length + 1]; 871 System.arraycopy(filters, 0, newFilters, 0, filters.length); 872 MarkerFilter filter = newFilter(newName); 873 newFilters[filters.length] = filter; 874 filters = newFilters; 875 filtersList.refresh(); 876 filtersList.setSelection(new StructuredSelection(filter), true); 877 filtersList.getControl().setFocus(); 878 } 879 880 886 protected abstract MarkerFilter newFilter(String newName); 887 888 893 Composite createSelectedFilterArea(Composite composite) { 894 895 Composite selectedComposite = new Composite(composite, SWT.NONE); 896 selectedComposite.setLayout(new GridLayout(2, false)); 897 898 Composite leftComposite = new Composite(selectedComposite, SWT.NONE); 899 leftComposite.setLayout(new GridLayout()); 900 leftComposite 901 .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 902 createResourceArea(leftComposite); 903 createAttributesArea(leftComposite); 904 905 Composite rightComposite = new Composite(selectedComposite, SWT.NONE); 906 createTypesArea(rightComposite); 907 rightComposite.setLayout(new GridLayout()); 908 rightComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, 909 true)); 910 911 return selectedComposite; 912 } 913 914 920 protected void createSeparatorLine(Composite parent) { 921 Label separator = new Label(parent, SWT.HORIZONTAL | SWT.SEPARATOR); 923 GridData gd = new GridData(GridData.FILL_HORIZONTAL); 924 gd.horizontalSpan = 2; 925 separator.setLayoutData(gd); 926 } 927 928 937 protected Button createRadioButton(Composite parent, String text) { 938 Button button = new Button(parent, SWT.RADIO); 939 button.setText(text); 940 button.setFont(parent.getFont()); 941 button.addSelectionListener(new SelectionAdapter() { 942 947 public void widgetSelected(SelectionEvent e) { 948 updateForSelection(); 949 } 950 }); 951 return button; 952 } 953 954 960 protected void createResourceArea(Composite parent) { 961 Composite group = new Composite(parent, SWT.NONE); 962 group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); 963 group.setLayout(new GridLayout()); 964 group.setFont(parent.getFont()); 965 anyResourceButton = createRadioButton(group, 966 MarkerMessages.filtersDialog_anyResource); 967 anyResourceInSameProjectButton = createRadioButton(group, 968 MarkerMessages.filtersDialog_anyResourceInSameProject); selectedResourceButton = createRadioButton(group, 972 MarkerMessages.filtersDialog_selectedResource); 973 selectedResourceAndChildrenButton = createRadioButton(group, 974 MarkerMessages.filtersDialog_selectedAndChildren); 975 workingSetGroup = new WorkingSetGroup(group); 976 } 977 978 984 protected void createTypesArea(Composite parent) { 985 986 Composite composite = new Composite(parent, SWT.NONE); 987 composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 988 GridLayout layout = new GridLayout(); 989 composite.setLayout(layout); 990 991 Label label = new Label(composite, SWT.NONE); 992 label.setText(MarkerMessages.filtersDialog_showItemsOfType); 993 994 Tree tree = new Tree(composite, SWT.CHECK | SWT.H_SCROLL | SWT.V_SCROLL 995 | SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER); 996 tree.setLinesVisible(true); 997 tree.setHeaderVisible(false); 998 TableLayout tableLayout = new TableLayout(); 999 tree.setLayout(tableLayout); 1000 tableLayout.addColumnData(new ColumnWeightData(100, true)); 1001 new TreeColumn(tree, SWT.NONE, 0); 1002 1003 typesViewer = new CheckboxTreeViewer(tree); 1004 GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true); 1005 gridData.widthHint = convertVerticalDLUsToPixels(100); 1006 gridData.heightHint = convertVerticalDLUsToPixels(125); 1007 1008 typesContentProvider = getTypesContentProvider(); 1009 typesViewer.getControl().setLayoutData(gridData); 1010 typesViewer.setContentProvider(typesContentProvider); 1011 typesViewer.setLabelProvider(getLabelProvider()); 1012 typesViewer.setComparator(getComparator()); 1013 typesViewer.addCheckStateListener(new ICheckStateListener() { 1014 public void checkStateChanged(CheckStateChangedEvent event) { 1015 markDirty(); 1016 Object element = event.getElement(); 1017 boolean checked = event.getChecked(); 1018 setChildrenChecked(element, checked); 1019 setParentCheckState(element, checked); 1020 } 1021 }); 1022 typesViewer.setInput(getSelectedFilter().getRootTypes().toArray()); 1023 1024 Composite buttonComposite = new Composite(composite, SWT.NONE); 1025 GridLayout buttonLayout = new GridLayout(); 1026 buttonLayout.marginWidth = 0; 1027 buttonComposite.setLayout(buttonLayout); 1028 selectAllButton = createButton(buttonComposite, SELECT_ALL_ID, 1029 MarkerMessages.filtersDialog_selectAllTypes, false); 1030 deselectAllButton = createButton(buttonComposite, DESELECT_ALL_ID, 1031 MarkerMessages.filtersDialog_deselectAllTypes, false); 1032 } 1033 1034 1039 protected MarkerFilter getSelectedFilter() { 1040 1041 if (selectedFilters.length == 1) { 1042 return selectedFilters[0]; 1043 } 1044 return null; 1045 } 1046 1047 1052 private ITreeContentProvider getTypesContentProvider() { 1053 return new ITreeContentProvider() { 1054 1059 public Object [] getElements(Object inputElement) { 1060 MarkerFilter selected = getSelectedFilter(); 1061 if (selected == null) { 1062 return new Object [0]; 1063 } 1064 1065 return getRootEntries(selected); 1066 } 1067 1068 1073 public void dispose() { 1074 } 1075 1076 1082 public void inputChanged(Viewer viewer, Object oldInput, 1083 Object newInput) { 1084 } 1085 1086 1091 public Object [] getChildren(Object parentElement) { 1092 return ((AbstractNode) parentElement).getChildren(); 1093 } 1094 1095 1100 public Object getParent(Object element) { 1101 return ((AbstractNode) element).getParent(); 1102 } 1103 1104 1109 public boolean hasChildren(Object element) { 1110 return ((AbstractNode) element).hasChildren(); 1111 } 1112 }; 1113 } 1114 1115 1123 abstract void createAttributesArea(Composite parent); 1124 1125 private ILabelProvider getLabelProvider() { 1126 return new TypesLabelProvider(); 1127 } 1128 1129 1134 protected List getSelectedTypes() { 1135 Object [] checkElements = typesViewer.getCheckedElements(); 1136 List selected = new ArrayList (); 1137 for (int i = 0; i < checkElements.length; i++) { 1138 AbstractNode node = (AbstractNode) checkElements[i]; 1139 if (!node.isCategory()) { 1140 selected.add(((MarkerTypeNode) node).getMarkerType()); 1141 } 1142 1143 } 1144 return selected; 1145 } 1146 1147 1152 protected ViewerComparator getComparator() { 1153 return new ViewerComparator() { 1154 1160 public int compare(Viewer viewer, Object e1, Object e2) { 1161 return getComparator().compare(((AbstractNode) e1).getName(), 1162 ((AbstractNode) e2).getName()); 1163 } 1164 }; 1165 } 1166 1167 1172 protected void okPressed() { 1173 1178 updateFilterFromUI(); 1179 1180 for (int i = 0; i < filters.length; i++) { 1181 filters[i].setEnabled(filtersList.getChecked(filters[i])); 1182 1183 } 1184 super.okPressed(); 1185 } 1186 1187 1191 protected void resetPressed() { 1192 typesViewer.setAllChecked(true); 1193 int onResource = MarkerFilter.DEFAULT_ON_RESOURCE; 1194 anyResourceButton.setSelection(onResource == MarkerFilter.ON_ANY); 1195 anyResourceInSameProjectButton 1196 .setSelection(onResource == MarkerFilter.ON_ANY_IN_SAME_CONTAINER); 1197 selectedResourceButton 1198 .setSelection(onResource == MarkerFilter.ON_SELECTED_ONLY); 1199 selectedResourceAndChildrenButton 1200 .setSelection(onResource == MarkerFilter.ON_SELECTED_AND_CHILDREN); 1201 workingSetGroup.setSelection(onResource == MarkerFilter.ON_WORKING_SET); 1202 updateEnabledState(true); 1203 } 1204 1205 1210 void setSelectedTypes(List markerTypes) { 1211 typesViewer.setCheckedElements(new Object [0]); 1212 for (int i = 0; i < markerTypes.size(); i++) { 1213 Object obj = markerTypes.get(i); 1214 if (obj instanceof MarkerType) { 1215 1216 Object mapping = nodeToTypeMapping.get(((MarkerType) obj) 1217 .getId()); 1218 if (mapping != null) { 1219 typesViewer.setChecked(mapping, true); 1220 setParentCheckState(mapping, true); 1221 } 1222 } 1223 } 1224 } 1225 1226 1230 protected void updateEnabledState(boolean enabled) { 1231 1232 typesViewer.getTree().setEnabled(enabled); 1233 selectAllButton.setEnabled(enabled 1234 && typesViewer.getTree().getItemCount() > 0); 1235 deselectAllButton.setEnabled(enabled 1236 && typesViewer.getTree().getItemCount() > 0); 1237 1238 anyResourceButton.setEnabled(enabled); 1239 anyResourceInSameProjectButton.setEnabled(enabled); 1240 selectedResourceButton.setEnabled(enabled); 1241 selectedResourceAndChildrenButton.setEnabled(enabled); 1242 workingSetGroup.setEnabled(enabled); 1243 } 1244 1245 1248 protected final void updateFilterFromUI() { 1249 1250 MarkerFilter filter = getSelectedFilter(); 1251 1252 if (filter == null) { 1253 updateEnabledState(false); 1254 return; 1255 } 1256 1257 updateFilterFromUI(filter); 1258 } 1259 1260 1265 protected void updateFilterFromUI(MarkerFilter filter) { 1266 1267 filter.setSelectedTypes(getSelectedTypes()); 1268 1269 if (selectedResourceButton.getSelection()) { 1270 filter.setOnResource(MarkerFilter.ON_SELECTED_ONLY); 1271 } else if (selectedResourceAndChildrenButton.getSelection()) { 1272 filter.setOnResource(MarkerFilter.ON_SELECTED_AND_CHILDREN); 1273 } else if (anyResourceInSameProjectButton.getSelection()) { 1274 filter.setOnResource(MarkerFilter.ON_ANY_IN_SAME_CONTAINER); 1275 } else if (workingSetGroup.getSelection()) { 1276 filter.setOnResource(MarkerFilter.ON_WORKING_SET); 1277 } else { 1278 filter.setOnResource(MarkerFilter.ON_ANY); 1279 } 1280 1281 filter.setWorkingSet(workingSetGroup.getWorkingSet()); 1282 } 1283 1284 1287 protected final void updateUIFromFilter() { 1288 1289 MarkerFilter filter = getSelectedFilter(); 1290 1291 if (filter == null) { 1292 updateEnabledState(false); 1293 return; 1294 } 1295 1296 updateUIWithFilter(filter); 1297 } 1298 1299 1304 protected void updateUIWithFilter(MarkerFilter filter) { 1305 setSelectedTypes(filter.getSelectedTypes()); 1306 1307 int on = filter.getOnResource(); 1308 anyResourceButton.setSelection(on == MarkerFilter.ON_ANY); 1309 anyResourceInSameProjectButton 1310 .setSelection(on == MarkerFilter.ON_ANY_IN_SAME_CONTAINER); 1311 selectedResourceButton 1312 .setSelection(on == MarkerFilter.ON_SELECTED_ONLY); 1313 selectedResourceAndChildrenButton 1314 .setSelection(on == MarkerFilter.ON_SELECTED_AND_CHILDREN); 1315 workingSetGroup.setSelection(on == MarkerFilter.ON_WORKING_SET); 1316 workingSetGroup.setWorkingSet(filter.getWorkingSet()); 1317 1318 updateEnabledState(true); 1319 } 1320 1321 1325 boolean isDirty() { 1326 return dirty; 1327 } 1328 1329 1332 void markDirty() { 1333 dirty = true; 1334 } 1335 1336 1341 public void setFilter(MarkerFilter newFilter) { 1342 setFilters(new MarkerFilter[] { newFilter }); 1343 updateUIFromFilter(); 1344 } 1345 1346 1349 public MarkerFilter[] getFilters() { 1350 return filters; 1351 } 1352 1353 1357 protected void updateForSelection() { 1358 updateEnabledState(true); 1359 markDirty(); 1360 } 1361 1362 1368 Object [] getRootEntries(MarkerFilter selected) { 1369 1370 List roots = selected.getRootTypes(); 1371 List markerNodes = new ArrayList (); 1372 HashMap categories = new HashMap (); 1373 for (int i = 0; i < roots.size(); i++) { 1374 Object obj = roots.get(i); 1375 buildTypeTree(markerNodes, obj, categories); 1376 } 1377 return markerNodes.toArray(); 1378 } 1379 1380 1387 private void buildTypeTree(List elements, Object obj, HashMap categories) { 1388 if (obj instanceof MarkerType) { 1389 1390 MarkerType markerType = (MarkerType) obj; 1391 1392 String categoryName = MarkerSupportRegistry.getInstance() 1393 .getCategory(markerType.getId()); 1394 1395 if (categoryName == null) { 1396 elements.add(new MarkerTypeNode(markerType)); 1397 } else { 1398 MarkerCategory category; 1399 if (categories.containsKey(categoryName)) { 1400 category = (MarkerCategory) categories.get(categoryName); 1401 } else { 1402 category = new MarkerCategory(categoryName); 1403 categories.put(categoryName, category); 1404 elements.add(category); 1405 } 1406 MarkerTypeNode node = new MarkerTypeNode(markerType); 1407 category.add(node); 1408 } 1409 1410 MarkerType[] subTypes = ((MarkerType) obj).getSubtypes(); 1411 for (int j = 0; j < subTypes.length; j++) { 1412 buildTypeTree(elements, subTypes[j], categories); 1413 } 1414 } 1415 } 1416 1417 1423 private void setParentCheckState(Object element, boolean checked) { 1424 Object parent = typesContentProvider.getParent(element); 1425 if (parent == null) { 1426 return; 1427 } 1428 Object [] children = typesContentProvider.getChildren(parent); 1429 if (children.length == 0) { 1430 return; 1431 } 1432 if (checked) { for (int i = 0; i < children.length; i++) { 1434 Object object = children[i]; 1435 if (!typesViewer.getChecked(object)) { 1436 typesViewer.setGrayChecked(parent, true); 1437 return; 1438 } 1439 } 1440 typesViewer.setChecked(parent, true); 1442 } else { 1443 for (int i = 0; i < children.length; i++) { 1444 Object object = children[i]; 1445 if (typesViewer.getChecked(object)) { 1446 typesViewer.setGrayChecked(parent, true); 1447 return; 1448 } 1449 } 1450 typesViewer.setChecked(parent, false); 1452 } 1453 1454 } 1455 1456 1462 private void setChildrenChecked(Object element, boolean checked) { 1463 Object [] children = typesContentProvider.getChildren(element); 1464 if (children.length > 0) { 1465 for (int i = 0; i < children.length; i++) { 1466 typesViewer.setChecked(children[i], checked); 1467 } 1468 } 1469 } 1470 1471 1476 protected void createFilterSelectButtons(Composite listArea) { 1477 Composite buttons = new Composite(listArea, SWT.NONE); 1478 GridLayout buttonLayout = new GridLayout(2, false); 1479 buttonLayout.marginWidth = 0; 1480 buttons.setLayout(buttonLayout); 1481 1482 createButton(buttons, SELECT_ALL_FILTERS_ID, 1483 MarkerMessages.filtersDialog_selectAll, false); 1484 createButton(buttons, DESELECT_ALL_FILTERS_ID, 1485 MarkerMessages.filtersDialog_deselectAll, false); 1486 } 1487 1488} 1489 | Popular Tags |