/** * <p>Copyright: Copyright (c) 2009</p> * <p>Company: �������ӹɷ����޹�˾</p> */ package com.hundsun.ares.studio.ui; import org.apache.log4j.Logger; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import com.hundsun.ares.studio.core.IARESElement; import com.hundsun.ares.studio.core.IARESModule; import com.hundsun.ares.studio.core.IARESModuleRoot; import com.hundsun.ares.studio.core.IARESResource; import com.hundsun.ares.studio.core.model.ResGroup; import com.hundsun.ares.studio.core.registry.IOrderable; /** * �Ƚ�(������) * @author sundl */ public class AresElementComparater extends ViewerComparator { private static Logger logger = Logger.getLogger(AresElementComparater.class); private static final int PROJECT = 0; private static final int MODULE_ROOT = 100; private static final int MODULE = 200; private static final int CATEGORY = 300; private static final int GROUP = 350; private static final int RESOURCE = 400; private static final int FOLDER = 500; private static final int FILE = 600; private static final int OTHER = Integer.MAX_VALUE; CommonElementContentProvider cep = new CommonElementContentProvider(false); CommonElementLabelProvider clp = new CommonElementLabelProvider(cep); @Override public int category(Object element) { if(element instanceof IARESElement) { IARESElement ae = (IARESElement)element; switch(ae.getElementType()) { case IARESElement.ARES_PROJECT: return PROJECT; case IARESElement.COMMON_MODULE_ROOT: return MODULE_ROOT; case IARESElement.COMMON_MODULE: return MODULE; case IARESElement.ARES_RESOURCE: return RESOURCE; default: return OTHER; } } else if (element instanceof ARESResourceCategory) { return CATEGORY; } else if (element instanceof ResGroup) { return GROUP; } else if (element instanceof IFolder) { return FOLDER; } else if (element instanceof IFile) { return FILE; } return OTHER - 1; } public int compare(Viewer viewer, Object e1, Object e2) { int cat1 = category(e1); int cat2 = category(e2); if (cat1 != cat2) { return cat1 - cat2; } if (e1 instanceof IARESModuleRoot || e1 instanceof IARESResource || e1 instanceof ARESResourceCategory) { IOrderable o1 = getOrderable(e1); IOrderable o2 = getOrderable(e2); // 2012-03-20 sundl Orderable��ͬ��ʱ�����getOrder�������� ��ͬ�Ļ���˵����ͬһ�����ͣ�Ӧ����������߼�����Label�������� if (o1 != null && o2 != null && o1.getOrder() != o2.getOrder()) { return o1.getOrder() - o2.getOrder(); } } // 2012-03-19 sundl ��Դ�仯�ᵼ����Դ�����ļ����Զ�collapse�����⣺������Sorter�йأ� // Ĭ�ϵ�ʵ��(super.compare())����labelprovider��get text�������򣬵����е�����£�������svn�����ʱ�� // Ĭ�ϵ�svn����������ڸı����ԴTextǰ�����һ�� '>' �����б仯�����û���޸Ĺ������ã�svn�ͻ�Ӱ���������� // ����һЩ��ֵ������ ������Դ�ļ��б��Զ�collapse; // ���Դ˴�����ʹ��Ĭ��ʵ�֣����������Լ��Ļ��ƽ���ʵ�� // // -- �����Ѿ�ȷ����ͬһ�������� if (e1 instanceof IARESModule || e1 instanceof IARESResource || e1 instanceof IARESModuleRoot) { ARESElementLabelProvider lbProvider = clp;//new ARESElementLabelProvider(); String str1 = lbProvider.getText(e1); String str2 = lbProvider.getText(e2); int result = str1.compareTo(str2); logger.debug(String.format("compare %s and %s, result is: %s", str1, str2, result)); return result; } int result = super.compare(viewer, e1, e2); logger.debug(String.format("%s and %s compare result: %s", String.valueOf(e1), String.valueOf(e2), result)); return result; } private IOrderable getOrderable(Object element) { if (element instanceof IOrderable) { return (IOrderable) element; } else if (element instanceof IAdaptable) { return (IOrderable) ((IAdaptable) element).getAdapter(IOrderable.class); } return null; } }