/** * (c) 2011, Alejandro Serrano * Released under the terms of the EPL. */ package net.sf.eclipsefp.haskell.browser.views.declarations; import net.sf.eclipsefp.haskell.browser.items.Constructor; import net.sf.eclipsefp.haskell.browser.items.DeclarationType; import net.sf.eclipsefp.haskell.browser.items.Instance; import net.sf.eclipsefp.haskell.browser.items.QueryItem; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; /** * Sort declarations, usually in a case-insensitive way, * but sending all instance declarations to the bottom. * @author Alejandro Serrano * */ public class DeclarationsSorter extends ViewerSorter { @Override public int compare( final Viewer viewer, final Object e1, final Object e2 ) { // Put constructors first if( e1 instanceof Constructor && e2 instanceof QueryItem ) { return -1; } else if( e1 instanceof QueryItem && e2 instanceof Constructor ) { return 1; } else if( e1 instanceof QueryItem && e2 instanceof QueryItem ) { QueryItem q1 = ( QueryItem )e1; QueryItem q2 = ( QueryItem )e2; // Put instances at the end if( q1.getType() != DeclarationType.INSTANCE && q2.getType() == DeclarationType.INSTANCE ) { return -1; } else if( q1.getType() == DeclarationType.INSTANCE && q2.getType() != DeclarationType.INSTANCE ) { return 1; } else if( q1.getType() == DeclarationType.INSTANCE && q2.getType() == DeclarationType.INSTANCE ) { Instance i1 = (Instance)q1.getDeclaration(); Instance i2 = (Instance)q2.getDeclaration(); return i1.getCompleteDefinition().compareToIgnoreCase( i2.getCompleteDefinition() ); } else { return q1.getName().compareToIgnoreCase( q2.getName() ); } } else if( e1 instanceof Constructor && e2 instanceof Constructor ) { Constructor d1 = ( Constructor )e1; Constructor d2 = ( Constructor )e2; return d1.getName().compareToIgnoreCase( d2.getName() ); } else { return 0; } } }