| package org.eclipse.ui.views.markers.internal; |
| |
| import java.util.Comparator; |
| |
| import org.eclipse.jface.dialogs.IDialogSettings; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.jface.viewers.ViewerSorter; |
| |
| /** |
| * CategorySorter is the sorter that takes categories and the viewer into |
| * account. |
| * |
| */ |
| public class CategorySorter extends ViewerSorter implements Comparator { |
| TableSorter innerSorter; |
| |
| IField categoryField; |
| |
| boolean reverseSort = false; |
| |
| private final String TAG_FIELD = "categoryField"; //$NON-NLS-1$ |
| |
| /** |
| * Create a new instance of the receiver wrapping a sorter. |
| * |
| * @param sorter |
| */ |
| CategorySorter(TableSorter sorter) { |
| innerSorter = sorter; |
| } |
| |
| /** |
| * Compare obj1 and obj starting with field depth. |
| * |
| * @param obj1 |
| * @param obj2 |
| * @param depth |
| * @param continueSearching |
| * @return int |
| * @see ViewerSorter#compare(Viewer, Object, Object) |
| */ |
| int compare(Object obj1, Object obj2, int depth, boolean continueSearching) { |
| |
| if (obj1 == null || obj2 == null || !(obj1 instanceof MarkerNode) |
| || !(obj2 instanceof MarkerNode)) { |
| return 0; |
| } |
| |
| MarkerNode marker1; |
| MarkerNode marker2; |
| if (reverseSort) { |
| marker1 = (MarkerNode) obj2; |
| marker2 = (MarkerNode) obj1; |
| } else { |
| marker1 = (MarkerNode) obj1; |
| marker2 = (MarkerNode) obj2; |
| } |
| |
| if (!marker1.isConcrete() || !marker2.isConcrete()) |
| return marker1.getDescription().compareTo(marker2.getDescription()); |
| |
| if (categoryField == null) |
| return innerSorter.compare(marker1, marker2, depth, |
| continueSearching); |
| |
| if (depth == 0) { // Is this the hierachy check |
| int result = categoryField.compare(marker1, marker2); |
| if (continueSearching && result == 0) |
| return innerSorter.compare(marker1, marker2, 0, |
| continueSearching); |
| return result; |
| } |
| |
| // Now head for the table sorter |
| return innerSorter.compare(marker1, marker2, depth - 1, |
| continueSearching); |
| |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, |
| * java.lang.Object, java.lang.Object) |
| */ |
| public int compare(Viewer viewer, Object e1, Object e2) { |
| return compare(e1, e2, 0, true); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) |
| */ |
| public int compare(Object arg0, Object arg1) { |
| return compare(arg0, arg1, 0, true); |
| } |
| |
| /** |
| * Get the category field. |
| * |
| * @return IField |
| */ |
| public IField getCategoryField() { |
| return categoryField; |
| } |
| |
| /** |
| * Set the field that we are categorizing by. |
| * |
| * @param field |
| */ |
| public void setCategoryField(IField field) { |
| this.categoryField = field; |
| reverseSort = false; |
| } |
| |
| /** |
| * Reverse the direction we are sorting in |
| */ |
| public void reverseSortDirection() { |
| reverseSort = !reverseSort; |
| |
| } |
| |
| /** |
| * Set the inner sorter to the new sorter. |
| * @param sorter2 |
| */ |
| public void setTableSorter(TableSorter sorter2) { |
| innerSorter = sorter2; |
| |
| } |
| |
| /** |
| * Save the state of the receiver. |
| * @param dialogSettings |
| */ |
| public void saveState(IDialogSettings dialogSettings) { |
| if (dialogSettings == null) { |
| return; |
| } |
| |
| IDialogSettings settings = dialogSettings |
| .getSection(TableSorter.TAG_DIALOG_SECTION); |
| if (settings == null) { |
| settings = dialogSettings.addNewSection(TableSorter.TAG_DIALOG_SECTION); |
| } |
| |
| String description = Util.EMPTY_STRING; |
| if(categoryField != null) |
| description = categoryField.getDescription(); |
| |
| settings.put(TAG_FIELD, description); |
| |
| } |
| |
| /** |
| * Restore the state of the receiver from the dialog settings. |
| * @param dialogSettings |
| * @param view |
| */ |
| public void restoreState(IDialogSettings dialogSettings, ProblemView view) { |
| if (dialogSettings == null) { |
| return; |
| } |
| |
| IDialogSettings settings = dialogSettings |
| .getSection(TableSorter.TAG_DIALOG_SECTION); |
| if (settings == null) |
| return; |
| |
| String description = settings.get(TAG_FIELD); |
| |
| if(description == null || description.length() == 0){ |
| categoryField = null; |
| return; |
| } |
| |
| categoryField = view.findField(description); |
| } |
| } |