fixed outline refresh bug
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / ui / JavaElementSorter.java
index 95bcc5e..ce6061d 100644 (file)
@@ -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()