X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/JavaElementSorter.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/JavaElementSorter.java index 95bcc5e..ce6061d 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/JavaElementSorter.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/JavaElementSorter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * 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 @@ -15,11 +15,15 @@ import java.text.Collator; 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; @@ -28,6 +32,7 @@ import org.eclipse.core.resources.IFile; 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; @@ -70,8 +75,14 @@ public class JavaElementSorter extends ViewerSorter { 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(); } /** @@ -144,7 +155,8 @@ public class JavaElementSorter extends ViewerSorter { } } catch (JavaModelException e) { - PHPeclipsePlugin.log(e); + if (!e.isDoesNotExist()) + PHPeclipsePlugin.log(e); } return JAVAELEMENTS; } else if (element instanceof IFile) { @@ -155,17 +167,18 @@ public class JavaElementSorter extends ViewerSorter { 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 */ @@ -182,26 +195,66 @@ public class JavaElementSorter extends ViewerSorter { 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; @@ -221,19 +274,20 @@ public class JavaElementSorter extends ViewerSorter { } 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)) { @@ -250,20 +304,20 @@ public class JavaElementSorter extends ViewerSorter { 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()