blob: c1c199139e38674851297699a517ab742d0d0505 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.views.bookmarkexplorer;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
class BookmarkSorter extends ViewerSorter {
private int[] directions;
private int[] priorities;
final static int ASCENDING = 1;
final static int DESCENDING = -1;
final static int DESCRIPTION = 0;
final static int RESOURCE = 1;
final static int FOLDER = 2;
final static int LOCATION = 3;
final static int CREATION_TIME = 4;
final static int[] DEFAULT_PRIORITIES = { FOLDER, RESOURCE, LOCATION,
DESCRIPTION, CREATION_TIME };
final static int[] DEFAULT_DIRECTIONS = { ASCENDING, //description
ASCENDING, //resource
ASCENDING, //folder
ASCENDING, //location
ASCENDING, }; //creation time
public BookmarkSorter() {
resetState();
}
public void reverseTopPriority() {
directions[priorities[0]] *= -1;
}
public void setTopPriority(int priority) {
if (priority < 0 || priority >= priorities.length)
return;
int index = -1;
for (int i = 0; i < priorities.length; i++) {
if (priorities[i] == priority)
index = i;
}
if (index == -1) {
resetState();
return;
}
//shift the array
for (int i = index; i > 0; i--) {
priorities[i] = priorities[i - 1];
}
priorities[0] = priority;
directions[priority] = DEFAULT_DIRECTIONS[priority];
}
public void setTopPriorityDirection(int direction) {
if (direction == ASCENDING || direction == DESCENDING)
directions[priorities[0]] = direction;
}
public int getTopPriorityDirection() {
return directions[priorities[0]];
}
public int getTopPriority() {
return priorities[0];
}
public int[] getPriorities() {
return priorities;
}
public void resetState() {
priorities = new int[DEFAULT_PRIORITIES.length];
System.arraycopy(DEFAULT_PRIORITIES, 0, priorities, 0,
priorities.length);
directions = new int[DEFAULT_DIRECTIONS.length];
System.arraycopy(DEFAULT_DIRECTIONS, 0, directions, 0,
directions.length);
}
private int compare(IMarker marker1, IMarker marker2, int depth) {
if (depth >= priorities.length)
return 0;
int column = priorities[depth];
switch (column) {
case DESCRIPTION: {
String desc1 = marker1.getAttribute(IMarker.MESSAGE, "");//$NON-NLS-1$
String desc2 = marker2.getAttribute(IMarker.MESSAGE, "");//$NON-NLS-1$
int result = collator.compare(desc1, desc2);
if (result == 0)
return compare(marker1, marker2, depth + 1);
return result * directions[column];
}
case RESOURCE: {
String res1 = marker1.getResource().getName();
String res2 = marker2.getResource().getName();
int result = collator.compare(res1, res2);
if (result == 0)
return compare(marker1, marker2, depth + 1);
return result * directions[column];
}
case FOLDER: {
String folder1 = BookmarkLabelProvider.getContainerName(marker1);
String folder2 = BookmarkLabelProvider.getContainerName(marker2);
int result = collator.compare(folder1, folder2);
if (result == 0)
return compare(marker1, marker2, depth + 1);
return result * directions[column];
}
case LOCATION: {
int line1 = marker1.getAttribute(IMarker.LINE_NUMBER, -1);
int line2 = marker2.getAttribute(IMarker.LINE_NUMBER, -1);
int result = line1 - line2;
if (result == 0)
return compare(marker1, marker2, depth + 1);
return result * directions[column];
}
case CREATION_TIME: {
long result;
try {
result = marker1.getCreationTime() - marker2.getCreationTime();
} catch (CoreException e) {
result = 0;
}
if (result == 0)
return compare(marker1, marker2, depth + 1);
return ((int) result) * directions[column];
}
}
return 0;
}
public int compare(Viewer viewer, Object e1, Object e2) {
IMarker marker1 = (IMarker) e1;
IMarker marker2 = (IMarker) e2;
return compare(marker1, marker2, 0);
}
public void saveState(IDialogSettings settings) {
if (settings == null)
return;
for (int i = 0; i < priorities.length; i++) {
settings.put("priority" + i, priorities[i]);//$NON-NLS-1$
settings.put("direction" + i, directions[i]);//$NON-NLS-1$
}
}
public void restoreState(IDialogSettings settings) {
if (settings == null)
return;
try {
for (int i = 0; i < priorities.length; i++) {
priorities[i] = settings.getInt("priority" + i);//$NON-NLS-1$
directions[i] = settings.getInt("direction" + i);//$NON-NLS-1$
}
} catch (NumberFormatException e) {
resetState();
}
}
}