/*
* Copyright (c) 2012, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.tools.ui;
import com.google.dart.tools.ui.internal.preferences.MembersOrderPreferenceCache;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.viewers.ContentViewer;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.ui.model.IWorkbenchAdapter;
import java.io.File;
import java.util.Comparator;
/**
* Viewer comparator for Dart elements.
* <p>
* TODO Add functions, factories.
* <p>
* This class may be instantiated; it is not intended to be subclassed.
* </p>
* Provisional API: This class/interface is part of an interim API that is still under development
* and expected to change significantly before reaching stability. It is being made available at
* this early stage to solicit feedback from pioneering adopters on the understanding that any code
* that uses this API will almost certainly be broken (repeatedly) as the API evolves.
*/
public class DartElementComparator extends ViewerComparator {
private static final int DIRECTORY = 1;
private static final int FILE = 2;
private static final int PROJECTS = 3;
private static final int RESOURCEFOLDERS = 7;
private static final int DART_LIB = 9;
private static final int DART_FILE = 10;
private static final int HTML_FILE = 11;
private static final int RESOURCES = 12;
private static final int IMPORTED_LIBS_CONTAINER = 13;
private static final int IMPORTED_LIB_CONTAINER = 14;
private static final int IMPORT_CONTAINER = 15;
// Includes all categories ordered using the OutlineSortOrderPage:
// types, methods & fields
private static final int MEMBERSOFFSET = 15;
private static final int DARTELEMENTS = 50;
private static final int OTHERS = 51;
private static Comparator<String> DART_NAME_COMPARATOR = new Comparator<String>() {
@Override
public int compare(String arg0, String arg1) {
if (arg0.length() > 0 && arg1.length() > 0) {
boolean u0 = arg0.charAt(0) == '_';
boolean u1 = arg1.charAt(0) == '_';
if (u0 != u1) {
if (u1) {
return -1;
} else {
return 1;
}
}
}
return String.CASE_INSENSITIVE_ORDER.compare(arg0, arg1);
}
};
private MembersOrderPreferenceCache fMemberOrderCache;
/**
* Constructor.
*/
public DartElementComparator() {
super(DART_NAME_COMPARATOR); // Using String.CASE_INSENSITIVE_ORDER directly sorts _ to top
DartX.todo("functions, factories");
fMemberOrderCache = DartToolsPlugin.getDefault().getMemberOrderPreferenceCache();
}
@Override
public int category(Object objectElement) {
if (objectElement instanceof File) {
File file = (File) objectElement;
if (file.isDirectory()) {
return DIRECTORY;
} else {
return FILE;
}
} else if (objectElement instanceof IFile) {
return RESOURCES;
} else if (objectElement instanceof IProject) {
return PROJECTS;
} else if (objectElement instanceof IContainer) {
return RESOURCEFOLDERS;
}
DartX.todo();
// else if (element instanceof ProjectLibraryRoot) {
// return PROJECTS;
// }
return OTHERS;
}
@Override
@SuppressWarnings("unchecked")
public int compare(Viewer viewer, Object e1, Object e2) {
int cat1 = category(e1);
int cat2 = category(e2);
if (cat1 != cat2) {
return cat1 - cat2;
}
if (cat1 == PROJECTS || cat1 == DART_LIB || cat1 == RESOURCES || cat1 == RESOURCEFOLDERS
|| cat1 == OTHERS) {
String name1 = getNonJavaElementLabel(viewer, e1);
String name2 = getNonJavaElementLabel(viewer, e2);
if (name1 != null && name2 != null) {
return getComparator().compare(name1, name2);
}
return 0; // can't compare
}
// only Dart elements from this point
String name1 = getElementName(e1);
String name2 = getElementName(e2);
int cmp = getComparator().compare(name1, name2);
if (cmp != 0) {
return cmp;
}
return 0;
}
private String getElementName(Object element) {
return element.toString();
}
private int getMemberCategory(int kind) {
int offset = fMemberOrderCache.getCategoryIndex(kind);
return offset + MEMBERSOFFSET;
}
private String getNonJavaElementLabel(Viewer viewer, Object element) {
// try to use the workbench adapter for non - JavaScript resources or if not
// available, use the viewers label provider
if (element instanceof IResource) {
return ((IResource) element).getName();
}
if (element instanceof IStorage) {
return ((IStorage) element).getName();
}
if (element instanceof IAdaptable) {
IWorkbenchAdapter adapter = (IWorkbenchAdapter) ((IAdaptable) element).getAdapter(IWorkbenchAdapter.class);
if (adapter != null) {
return adapter.getLabel(element);
}
}
if (viewer instanceof ContentViewer) {
IBaseLabelProvider prov = ((ContentViewer) viewer).getLabelProvider();
if (prov instanceof ILabelProvider) {
return ((ILabelProvider) prov).getText(element);
}
}
return null;
}
}