/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * 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 Common Public License v1.0
* which accompanies this distribution, and is available at
import net.sourceforge.phpdt.core.Flags;
import net.sourceforge.phpdt.core.IField;
import net.sourceforge.phpdt.core.IJavaElement;
+import net.sourceforge.phpdt.core.IMember;
import net.sourceforge.phpdt.core.IMethod;
import net.sourceforge.phpdt.core.IPackageFragment;
import net.sourceforge.phpdt.core.IPackageFragmentRoot;
+import net.sourceforge.phpdt.core.IType;
import net.sourceforge.phpdt.core.JavaModelException;
import net.sourceforge.phpdt.core.Signature;
+import net.sourceforge.phpdt.internal.corext.util.JavaModelUtil;
+import net.sourceforge.phpdt.internal.corext.util.JdtFlags;
import net.sourceforge.phpdt.internal.ui.preferences.MembersOrderPreferenceCache;
import net.sourceforge.phpeclipse.PHPeclipsePlugin;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.viewers.ContentViewer;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.ILabelProvider;
private static final int JAVAELEMENTS= 50;
private static final int OTHERS= 51;
- public JavaElementSorter() {
+ private MembersOrderPreferenceCache fMemberOrderCache;
+
+ /**
+ * Constructor.
+ */
+ public JavaElementSorter() {
super(null); // delay initialization of collator
+ fMemberOrderCache= PHPeclipsePlugin.getDefault().getMemberOrderPreferenceCache();
}
/**
}
} catch (JavaModelException e) {
- PHPeclipsePlugin.log(e);
+ if (!e.isDoesNotExist())
+ PHPeclipsePlugin.log(e);
}
return JAVAELEMENTS;
} else if (element instanceof IFile) {
return RESOURCEFOLDERS;
} else if (element instanceof IStorage) {
return STORAGE;
-// } else if (element instanceof ClassPathContainer) {
+ }
+// else if (element instanceof ClassPathContainer) {
// return PACKAGEFRAGMENTROOTS;
- }
+// }
return OTHERS;
}
private int getMemberCategory(int kind) {
- int offset= PHPeclipsePlugin.getDefault().getMemberOrderPreferenceCache().getIndex(kind);
+ int offset= fMemberOrderCache.getCategoryIndex(kind);
return offset + MEMBERSOFFSET;
- }
-
+ }
+
/*
* @see ViewerSorter#compare
*/
return getCollator().compare(a1.getLabel(e1), a2.getLabel(e2));
}
-// if (cat1 == PACKAGEFRAGMENTROOTS) {
-// IPackageFragmentRoot root1= getPackageFragmentRoot(e1);
-// IPackageFragmentRoot root2= getPackageFragmentRoot(e2);
-// if (!root1.getPath().equals(root2.getPath())) {
-// int p1= getClassPathIndex(root1);
-// int p2= getClassPathIndex(root2);
-// if (p1 != p2) {
-// return p1 - p2;
-// }
-// }
-// }
+ if (cat1 == PACKAGEFRAGMENTROOTS) {
+ IPackageFragmentRoot root1= getPackageFragmentRoot(e1);
+ IPackageFragmentRoot root2= getPackageFragmentRoot(e2);
+ if (root1 == null) {
+ if (root2 == null) {
+ return 0;
+ } else {
+ return 1;
+ }
+ } else if (root2 == null) {
+ return -1;
+ }
+ if (!root1.getPath().equals(root2.getPath())) {
+ int p1= getClassPathIndex(root1);
+ int p2= getClassPathIndex(root2);
+ if (p1 != p2) {
+ return p1 - p2;
+ }
+ }
+ e1= root1; // normalize classpath container to root
+ e2= root2;
+ }
// non - java resources are sorted using the label from the viewers label provider
if (cat1 == PROJECTS || cat1 == RESOURCES || cat1 == RESOURCEFOLDERS || cat1 == STORAGE || cat1 == OTHERS) {
return compareWithLabelProvider(viewer, e1, e2);
}
+ if (e1 instanceof IMember) {
+ if (fMemberOrderCache.isSortByVisibility()) {
+ try {
+ int flags1= JdtFlags.getVisibilityCode((IMember) e1);
+ int flags2= JdtFlags.getVisibilityCode((IMember) e2);
+ int vis= fMemberOrderCache.getVisibilityIndex(flags1) - fMemberOrderCache.getVisibilityIndex(flags2);
+ if (vis != 0) {
+ return vis;
+ }
+ } catch (JavaModelException ignore) {
+ }
+ }
+ }
+
String name1= ((IJavaElement) e1).getElementName();
String name2= ((IJavaElement) e2).getElementName();
- // java element are sorted by name
+ if (e1 instanceof IType) { // handle anonymous types
+ if (name1.length() == 0) {
+ if (name2.length() == 0) {
+ try {
+ return getCollator().compare(((IType) e1).getSuperclassName(), ((IType) e2).getSuperclassName());
+ } catch (JavaModelException e) {
+ return 0;
+ }
+ } else {
+ return 1;
+ }
+ } else if (name2.length() == 0) {
+ return -1;
+ }
+ }
+
int cmp= getCollator().compare(name1, name2);
if (cmp != 0) {
return cmp;
}
return 0;
}
+
-// private IPackageFragmentRoot getPackageFragmentRoot(Object element) {
+ private IPackageFragmentRoot getPackageFragmentRoot(Object element) {
// if (element instanceof ClassPathContainer) {
// // return first package fragment root from the container
// ClassPathContainer cp= (ClassPathContainer)element;
// Object[] roots= cp.getPackageFragmentRoots();
// if (roots.length > 0)
// return (IPackageFragmentRoot)roots[0];
-// // non resolvable - return a dummy package fragment root
-// return cp.getJavaProject().getPackageFragmentRoot("Non-Resolvable"); //$NON-NLS-1$
+// // non resolvable - return null
+// return null;
// }
-// return JavaModelUtil.getPackageFragmentRoot((IJavaElement)element);
-// }
+ return JavaModelUtil.getPackageFragmentRoot((IJavaElement)element);
+ }
private int compareWithLabelProvider(Viewer viewer, Object e1, Object e2) {
if (viewer == null || !(viewer instanceof ContentViewer)) {
return 0; // can't compare
}
-// private int getClassPathIndex(IPackageFragmentRoot root) {
-// try {
-// IPath rootPath= root.getPath();
-// IPackageFragmentRoot[] roots= root.getJavaProject().getPackageFragmentRoots();
-// for (int i= 0; i < roots.length; i++) {
-// if (roots[i].getPath().equals(rootPath)) {
-// return i;
-// }
-// }
-// } catch (JavaModelException e) {
-// }
-//
-// return Integer.MAX_VALUE;
-// }
+ private int getClassPathIndex(IPackageFragmentRoot root) {
+ try {
+ IPath rootPath= root.getPath();
+ IPackageFragmentRoot[] roots= root.getJavaProject().getPackageFragmentRoots();
+ for (int i= 0; i < roots.length; i++) {
+ if (roots[i].getPath().equals(rootPath)) {
+ return i;
+ }
+ }
+ } catch (JavaModelException e) {
+ }
+
+ return Integer.MAX_VALUE;
+ }
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ViewerSorter#getCollator()