/******************************************************************************* * Copyright © 2000, 2013 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.edt.ide.ui.internal.packageexplorer; import java.text.Collator; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IPath; import org.eclipse.edt.ide.core.internal.model.util.EGLModelUtil; import org.eclipse.edt.ide.core.model.EGLModelException; import org.eclipse.edt.ide.core.model.IEGLElement; import org.eclipse.edt.ide.core.model.IEGLPathContainer; import org.eclipse.edt.ide.core.model.IPackageFragment; import org.eclipse.edt.ide.core.model.IPackageFragmentRoot; import org.eclipse.edt.ide.ui.internal.EGLLogger; 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.ViewerSorter; import org.eclipse.ui.model.IWorkbenchAdapter; public class EGLElementSorter extends ViewerSorter{ private static final int PROJECTS= 1; private static final int PACKAGEFRAGMENTROOTS= 2; private static final int PACKAGEFRAGMENT= 3; private static final int EGLFILES= 4; private static final int CLASSFILES= 5; // private static final int RESOURCEFOLDERS= 7; // private static final int RESOURCES= 8; // private static final int STORAGE= 9; private static final int PACKAGE_DECL= 10; private static final int IMPORT_CONTAINER= 11; private static final int IMPORT_DECLARATION= 12; // Includes all categories ordered using the OutlineSortOrderPage: // types, initializers, methods & fields // private static final int MEMBERSOFFSET= 15; private static final int EGLELEMENTS= 50; private static final int OTHERS= 51; private Collator collator; /* * @see ViewerSorter#category */ public int category(Object element) { if (element instanceof IEGLElement) { IEGLElement je= (IEGLElement) element; switch (je.getElementType()) { case IEGLElement.INITIALIZER : { // int flags= ((IInitializer) je).getFlags(); // if (Flags.isStatic(flags)) // return getMemberCategory(MembersOrderPreferenceCache.STATIC_INIT_INDEX); // else // return getMemberCategory(MembersOrderPreferenceCache.INIT_INDEX); } // case IEGLElement.TYPE : // return getMemberCategory(MembersOrderPreferenceCache.TYPE_INDEX); case IEGLElement.PACKAGE_DECLARATION : return PACKAGE_DECL; case IEGLElement.IMPORT_CONTAINER : return IMPORT_CONTAINER; case IEGLElement.IMPORT_DECLARATION : return IMPORT_DECLARATION; case IEGLElement.PACKAGE_FRAGMENT : IPackageFragment pack= (IPackageFragment) je; if (pack.getParent().getResource() instanceof IProject) { return PACKAGEFRAGMENTROOTS; } return PACKAGEFRAGMENT; case IEGLElement.PACKAGE_FRAGMENT_ROOT : return PACKAGEFRAGMENTROOTS; case IEGLElement.EGL_PROJECT : return PROJECTS; case IEGLElement.CLASS_FILE : return CLASSFILES; case IEGLElement.EGL_FILE : return EGLFILES; } return EGLELEMENTS; } // else if (element instanceof IFile) { // return RESOURCES; // } else if (element instanceof IProject) { return PROJECTS; } // else if (element instanceof IContainer) { // return RESOURCEFOLDERS; // } else if (element instanceof IStorage) { // return STORAGE; // } else if (element instanceof IEGLPathContainer) { return PACKAGEFRAGMENTROOTS; } return OTHERS; } 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) { IWorkbenchAdapter a1= (IWorkbenchAdapter)((IAdaptable)e1).getAdapter(IWorkbenchAdapter.class); IWorkbenchAdapter a2= (IWorkbenchAdapter)((IAdaptable)e2).getAdapter(IWorkbenchAdapter.class); if(a1 != null && a2 != null) 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= getEGLPathIndex(root1); int p2= getEGLPathIndex(root2); if (p1 != p2) { return p1 - p2; } } } String name1 = null; String name2 = null; //Special case to handle build files created as Files instead of EGLFiles if(cat1 == OTHERS || cat2 == OTHERS){ if(( (cat1 == OTHERS)&&(e1 instanceof IResource) )){ name1=((IResource)e1).getName(); } if(( (cat2 == OTHERS)&&(e2 instanceof IResource) )){ name2=((IResource)e2).getName(); } } // non - egl resources are sorted using the label from the viewers label provider else if (cat1 == PROJECTS || /*cat1 == RESOURCES || cat1 == RESOURCEFOLDERS || cat1 == STORAGE ||*/ cat1 == OTHERS) { return compareWithLabelProvider(viewer, e1, e2); } if(name1==null){ name1= ((IEGLElement) e1).getElementName(); } if(name2==null){ name2= ((IEGLElement) e2).getElementName(); } // egl element are sorted by name if(name1!=null && name2!=null){ int cmp= getCollator().compare(name1, name2); if (cmp != 0) { return cmp; } } else{ EGLLogger.log(this, "An error occurred sorting navigator EGL elements."); //$NON-NLS-1$ } return 0; } public final Collator getCollator() { if (collator == null) { collator = Collator.getInstance(); } return collator; } private int compareWithLabelProvider(Viewer parent, Object e1, Object e2) { if (parent instanceof ContentViewer){ IBaseLabelProvider prov = ((ContentViewer) parent).getLabelProvider(); if (prov instanceof ILabelProvider) { ILabelProvider lprov= (ILabelProvider) prov; String name1 = lprov.getText(e1); String name2 = lprov.getText(e2); if (name1 != null && name2 != null) { return getCollator().compare(name1, name2); } } } return 0; // can't compare } public String getSortName(Object element) { //return ((EGLElementNode)element).getResource().getName(); return ((IEGLElement)element).getResource().getName(); } private IPackageFragmentRoot getPackageFragmentRoot(Object element) { // if (element instanceof EGLPathContainer) { // // 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$ // } return EGLModelUtil.getPackageFragmentRoot((IEGLElement)element); } private int getEGLPathIndex(IPackageFragmentRoot root) { try { IPath rootPath= root.getPath(); IPackageFragmentRoot[] roots= root.getEGLProject().getPackageFragmentRoots(); for (int i= 0; i < roots.length; i++) { if (roots[i].getPath().equals(rootPath)) { return i; } } } catch (EGLModelException e) { } return Integer.MAX_VALUE; } }