/** * <p>Copyright: Copyright (c) 2009</p> * <p>Company: �������ӹɷ����޹�˾</p> */ package com.hundsun.ares.studio.ui.refactoring; import java.io.File; import java.util.Arrays; import java.util.HashSet; import java.util.Set; 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.IProjectProperty; import com.hundsun.ares.studio.core.IReferencedLibrary; import com.hundsun.ares.studio.core.registry.ARESResRegistry; import com.hundsun.ares.studio.core.registry.IModuleRootDescriptor; import com.hundsun.ares.studio.core.registry.IResDescriptor; import com.hundsun.ares.studio.core.registry.ModuleRootType2ResTypeMap; import com.hundsun.ares.studio.core.registry.ModulesRootTypeRegistry; import com.hundsun.ares.studio.core.util.ARESElementUtil; /** * �����ࡣ * @author sundl */ public class RefactoringUtil { /** * �ж��Ƿ����ɾ�� * @param element * @return */ public static boolean canDelete(IARESElement element) { if (element instanceof IARESModuleRoot) { IARESModuleRoot root = (IARESModuleRoot) element; if (root.isArchive()) return false; ModulesRootTypeRegistry reg = ModulesRootTypeRegistry.getInstance(); IModuleRootDescriptor desc = (IModuleRootDescriptor) reg.getModuleRootDescriptor(root.getType()); if (desc != null) return desc.isDeletable(); return false; } else if (element instanceof IARESModule) { IARESModule module = (IARESModule)element; return !module.isDefaultModule(); } else if (element instanceof IARESResource) { ARESResRegistry reg = ARESResRegistry.getInstance(); IResDescriptor desc = reg.getResDescriptor((IARESResource) element); if (desc != null) { boolean deleteable = desc.isDeleteable(); return deleteable && !element.isReadOnly(); } } else if (element instanceof IProjectProperty) { return false; } else if (element instanceof IReferencedLibrary) { return false; } return !element.isReadOnly(); } /** * ����Ԫ���Ƿ���Ը��ơ�<br> * <li>��Դ������Դ����ע���ʱ������þ����Ƿ���Ը��ƣ�<br> * <li>��ͨģ����Ը��ƣ�Ĭ��ģ�鲻���Ը��ơ� * <li>ģ��������Ը��� * @param element * @return */ public static boolean canCopy(IARESElement element) { switch (element.getElementType()) { case IARESElement.ARES_RESOURCE: IARESResource aresRes = (IARESResource)element; String type = aresRes.getType(); ARESResRegistry reg = ARESResRegistry.getInstance(); IResDescriptor desc = reg.getResDescriptor(type); return desc == null ? false : desc.isCopyable(); case IARESElement.COMMON_MODULE: IARESModule module = (IARESModule)element; return !module.isDefaultModule(); case IARESElement.COMMON_MODULE_ROOT: return false; default: return false; } } public static boolean canPaste(IARESElement[] elements, IARESElement destination) { for (IARESElement element : elements) { if (!canPaste(element, destination)) return false; } return true; } public static boolean canPaste(String[] files, IARESElement destination) { for (String file : files) { if (!canPaste(file, destination)) return false; } return true; } /** * �Ƿ����ճ����ָ����λ�� * @param element * @param destination * @return */ public static boolean canPaste(IARESElement element, IARESElement destination) { switch (element.getElementType()) { // ��Դ -- ֻ��ճ���������Ŵ�����Դ���� case IARESElement.ARES_RESOURCE: IARESResource aresResource = (IARESResource) element; if (destination instanceof IARESModule) { IARESModule module = (IARESModule) destination; IARESModuleRoot root = module.getRoot(); return ModuleRootType2ResTypeMap.getInstance().isAllowed(root.getType(), aresResource.getType()); } else { return false; } // ģ�� -- ֻ����ͬ�����͵�ģ����¸���ճ�������Ҹ�ģ�鲻��ճ�����¼�(��)ģ�� case IARESElement.COMMON_MODULE: IARESModule module = (IARESModule)element; if (destination instanceof IARESModule) { IARESModule destModule = (IARESModule) destination; boolean isParent = destination.getElementName().startsWith(module.getElementName() + "."); boolean isRootSameType = module.getRoot().getType().equals(destModule.getRoot().getType()); IModuleRootDescriptor desc = getRootDescriptor(destModule.getRoot().getType()); // ���ճ�����Ƿ�ᳬ�����㼶���ơ� int maxLevel = desc.getMaxModuleLevel(); int moduleLevel = module.getElementName().split("\\.").length; int targetModuleLevel = destModule.getElementName().split("\\.").length; boolean moduleLevelOverflow = maxLevel == -1 ? false : targetModuleLevel + moduleLevel > maxLevel; return !isParent && isRootSameType && !destination.equals(module) && !moduleLevelOverflow; } else if (destination instanceof IARESModuleRoot) { IARESModuleRoot destRoot = (IARESModuleRoot) destination; return module.getRoot().getType().equals(destRoot.getType()); } // ģ��� -- ��ʱ��֧�� case IARESElement.COMMON_MODULE_ROOT: return false; default: return false; } } /** * �жϲ���ϵͳ�е��ļ�(·��)�Ƿ����ճ����ָ����λ�� * @param file * @param destination * @return */ public static boolean canPaste(String filePath, IARESElement destination) { File file = new File(filePath); // ������ļ�����ֻ������һ����Դ if (file.isFile()) { if (destination instanceof IARESModule) { return true; } else return false; } else { // ������ļ��У�����Ϊ��һ��ģ�� if (destination instanceof IARESModule) { return false; } else { return true; } } } /** * ���Ԫ���Ƿ����ͬʱ���ơ�<br> * ���ȣ�ÿ��������Ԫ�ض�������Ը��� * ��Σ�����Ԫ�ص����ͱ�����ͬ * @param element * @return */ public static boolean canCopy(IARESElement[] elements) { for (IARESElement element : elements) { if (!canCopy(element)) return false; } if (ARESElementUtil.elementsIsOfType(elements, IARESElement.COMMON_MODULE)) { return true; } if (ARESElementUtil.elementsIsOfType(elements, IARESElement.ARES_RESOURCE)) { IARESResource[] resources = ARESElementUtil.toARESResource(elements); boolean isResSameType = !ARESElementUtil.getResourcesType(resources).equals(ARESElementUtil.UNKNOWN); boolean isSameParent = ARESElementUtil.getParent(resources) != null; return isResSameType && isSameParent; } return false; } /** * ���Ԫ���Ƿ����ͬʱ�ƶ���<br> * ���ȣ�ÿ��������Ԫ�ض���������ƶ� * ��Σ�����Ԫ�ص����ͱ�����ͬ�����ұ�����ͬһ�������¡� * @param element * @return */ public static boolean canMove(IARESElement[] elements) { if (!ARESElementUtil.hasSameParent(elements)) { return false; } for (IARESElement element : elements) { if (!canMove(element)) return false; } if (ARESElementUtil.elementsIsOfType(elements, IARESElement.COMMON_MODULE) || ARESElementUtil.elementsIsOfType(elements, IARESElement.ARES_RESOURCE)) { return true; } return false; } public static boolean canMoveTo(IARESElement element, IARESElement destination) { if (!canMove(element)) return false; if (element.equals(destination)) { return false; } IARESModuleRoot sourceRoot = null; IARESModuleRoot destRoot = null; boolean elementIsResource = false; boolean elementIsModule = false; if (element instanceof IARESResource) { IARESResource aresRes = (IARESResource) element; sourceRoot = aresRes.getRoot(); elementIsResource = true; } else if (element instanceof IARESModule) { IARESModule module = (IARESModule) element; sourceRoot = module.getRoot(); elementIsModule = true; } boolean targetIsRoot = false; boolean targetIsModule = false; if (destination instanceof IARESModule) { IARESModule module = (IARESModule) destination; destRoot = module.getRoot(); targetIsModule = true; } else if (destination instanceof IARESModuleRoot) { destRoot = (IARESModuleRoot) destination; targetIsRoot = true; } if (sourceRoot == null || destRoot == null) { return false; } // ֻ����ͬ���͵�ģ���֮���ƶ� if (!sourceRoot.getType().equals(destRoot.getType())) return false; if (elementIsModule && targetIsModule) { IARESModule module = (IARESModule) element; IARESModule targetModule = (IARESModule) destination; // Ĭ��ģ�鲻���ƶ��������ƶ���Ĭ��ģ�� if (module.isDefaultModule() || targetModule.isDefaultModule()) return false; IARESModule sourceParentModule = module.getParentModule(); // �����ƶ����Լ��ĸ�ģ�� if (sourceParentModule != null) { return !sourceParentModule.equals(targetModule); } /*else { return targetModule.getParentModule() != null; }*/ ModulesRootTypeRegistry reg = ModulesRootTypeRegistry.getInstance(); IModuleRootDescriptor desc = reg.getModuleRootDescriptor(targetModule.getRoot().getType()); int max = desc.getMaxModuleLevel(); if (max != -1) { String[] segments = targetModule.getElementName().split("\\."); if (segments.length >= max - 1) { return false; } } } else if (elementIsModule && targetIsRoot) { IARESModule module = (IARESModule) element; IARESModule sourceParentModule = module.getParentModule(); if (sourceParentModule == null) { return !destination.equals(module.getRoot()); } else { return false; } } else if (elementIsResource && targetIsModule) { IARESModule sourceModule = (IARESModule) element.getParent(); boolean targetIsParent = sourceModule.equals(destination); if (targetIsParent) return false; } else if (elementIsResource && targetIsRoot) { return false; } return true; } public static boolean canMoveTo(IARESElement[] elements, IARESElement destination) { for (IARESElement element : elements) { if (!canMoveTo(element, destination)) return false; } return true; } /** * �Ƿ�����ƶ� * @param element * @return */ public static boolean canMove(IARESElement element) { switch (element.getElementType()) { case IARESElement.ARES_RESOURCE: // ���ð���IJ����ƶ�... IARESResource res = (IARESResource) element; if (res.getRoot().isArchive()) return false; IResDescriptor desc = getARESResourceDescriptor(res); if (desc != null) return desc.isMoveable(); break; case IARESElement.COMMON_MODULE: IARESModule module = (IARESModule)element; if (module.getRoot().isArchive()) return false; return !module.isDefaultModule(); default: return false; } return false; } /** * ȫ��������ɾ���Ļ����ſ���ɾ���� * @param elements * @return */ public static boolean canDelete(IARESElement[] elements) { for (IARESElement element : elements) { if (!canDelete(element)) { return false; } } return true; } public static IARESElement[] setMinus(IARESElement[] setToRemoveFrom, IARESElement[] elementsToRemove) { Set<IARESElement> setMinus= new HashSet<IARESElement>(setToRemoveFrom.length - setToRemoveFrom.length); setMinus.addAll(Arrays.asList(setToRemoveFrom)); setMinus.removeAll(Arrays.asList(elementsToRemove)); return (IARESElement[]) setMinus.toArray(new IARESElement[setMinus.size()]); } private static IResDescriptor getARESResourceDescriptor(IARESResource aresRes) { String type = aresRes.getType(); ARESResRegistry reg = ARESResRegistry.getInstance(); IResDescriptor desc = reg.getResDescriptor(type); return desc; } private static IModuleRootDescriptor getRootDescriptor(String type) { ModulesRootTypeRegistry reg = ModulesRootTypeRegistry.getInstance(); return reg.getModuleRootDescriptor(type); } }