/****************************************************************************** * Copyright (c) 2010-2013, Linagora * * 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: * Linagora - initial API and implementation *******************************************************************************/ package com.ebmwebsourcing.petals.common.internal.provisional.projectscnf; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IStatus; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.ui.model.IWorkbenchAdapter; import com.ebmwebsourcing.petals.common.internal.PetalsCommonPlugin; /** * Sort elements in the Petals projects view. * @author Vincent Zurczak - EBM WebSourcing */ public class PetalsProjectsSorter extends ViewerSorter { /* (non-Javadoc) * @see org.eclipse.jface.viewers.ViewerComparator * #compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ @Override public int compare( Viewer viewer, Object e1, Object e2 ) { // The viewer can only contain IResources (projects, folders, files) // and categories (IWorkbenchAdapters) if( e1 instanceof IResource && e2 instanceof IResource ) { IResource r1 = (IResource) e1; IResource r2 = (IResource) e2; if( r1.getType() == r2.getType()) { if( r1.getType() == IResource.FILE ) { if( "jbi.xml".equals( r1.getName())) return -1; else if( "jbi.xml".equals( r2.getName())) return 1; String ext1 = r1.getFileExtension(); String ext2 = r2.getFileExtension(); if( ext1 == null ) return ext2 == null ? 0 : -1; if( ext2 == null ) return 1; if( ! ext1.equals( ext2 )) return ext1.compareTo( ext2 ); } return r1.getName().compareTo( r2.getName()); } if( r1.getType() == IResource.PROJECT ) return -2; if( r2.getType() == IResource.PROJECT ) return 2; if( r1.getType() == IResource.FOLDER ) return -1; if( r2.getType() == IResource.FOLDER ) return 1; return 0; } // Java resources are displayed first if( e1 instanceof IJavaElement && !( e2 instanceof IJavaElement )) return -1; if( e2 instanceof IJavaElement && !( e1 instanceof IJavaElement )) return 1; if( e2 instanceof IJavaElement && e1 instanceof IJavaElement ) return compareJavaElements((IJavaElement) e1, (IJavaElement) e2 ); // Comparison of categories are specific if( e1 instanceof PetalsProjectCategory && e2 instanceof PetalsProjectCategory ) { int n1 = ((PetalsProjectCategory) e1).getDisplayOrder(); int n2 = ((PetalsProjectCategory) e2).getDisplayOrder(); return n1 - n2; } // Otherwise, make the other comparisons if( e1 instanceof IWorkbenchAdapter && !( e1 instanceof IResource )) { if( e2 instanceof IWorkbenchAdapter && !( e2 instanceof IResource )) { String label1 = ((IWorkbenchAdapter) e1).getLabel( e1 ); String label2 = ((IWorkbenchAdapter) e2).getLabel( e2 ); return label1.compareTo( label2 ); } return -1; } if( e2 instanceof IWorkbenchAdapter && !( e2 instanceof IResource )) return 1; return super.compare( viewer, e1, e2 ); } /** * Compares Java elements. * @param j1 * @param j2 * @return an integer for sorting (0 if equivalent, <0 to display j1 first, >0 to display j2 first) */ private int compareJavaElements( IJavaElement j1, IJavaElement j2 ) { // Fragment roots have a special treatment if( j1 instanceof IPackageFragmentRoot && j2 instanceof IPackageFragmentRoot ) { IPackageFragmentRoot p1 = (IPackageFragmentRoot) j1; IPackageFragmentRoot p2 = (IPackageFragmentRoot) j2; try { if( p1.getKind() == p2.getKind()) return p1.getElementName().compareTo( p2.getElementName()); else if( p1.getKind() == IPackageFragmentRoot.K_SOURCE ) return -1; else return 1; } catch( JavaModelException e ) { PetalsCommonPlugin.log( e, IStatus.ERROR ); } return p1.getElementName().compareTo( p2.getElementName()); } // Otherwise, it depends on the element type if( j1.getElementType() == j2.getElementType()) return j1.getElementName().compareTo( j2.getElementName()); else return j1.getElementType() - j2.getElementType(); } }