/** * <p>Copyright: Copyright (c) 2009</p> * <p>Company: �������ӹɷ����޹�˾</p> */ package com.hundsun.ares.studio.ui; import java.util.Arrays; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.apache.log4j.Logger; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.ui.IMemento; import org.eclipse.ui.navigator.ICommonContentExtensionSite; import org.eclipse.ui.navigator.IPipelinedTreeContentProvider; import org.eclipse.ui.navigator.PipelinedShapeModification; import org.eclipse.ui.navigator.PipelinedViewerUpdate; import com.hundsun.ares.studio.core.ARESCore; import com.hundsun.ares.studio.core.IARESElement; import com.hundsun.ares.studio.core.IARESModel; import com.hundsun.ares.studio.core.IARESModule; import com.hundsun.ares.studio.core.IARESProject; import com.hundsun.ares.studio.core.IARESResource; import com.hundsun.ares.studio.core.IReferencedLibrary; import com.hundsun.ares.studio.internal.core.ARESProject; /** * CommonNavigatorҪ���ʵ����IPipelinedTreeContentProvider��CP�� * ����Java�޷���̳У����԰�getChildren֮�������ί�ɸ���������ɡ� * @author sundl */ public abstract class ARESNavigatorContentProvider implements IPipelinedTreeContentProvider { private static Logger logger = Logger.getLogger(ARESNavigatorContentProvider.class); // ���� ������ת��===== BEGIN ======== /** * ����ʹ�õĴ���contentProvider * @return */ protected abstract ITreeContentProvider getDelegateContentProvider(); public Object[] getChildren(Object parentElement) { return getDelegateContentProvider().getChildren(parentElement); } public Object getParent(Object element) { return getDelegateContentProvider().getParent(element); } public boolean hasChildren(Object element) { return getDelegateContentProvider().hasChildren(element); } public Object[] getElements(Object inputElement) { return getDelegateContentProvider().getElements(inputElement); } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { getDelegateContentProvider().inputChanged(viewer, oldInput, newInput); } // ���� ������ת��===== END ======== /* (non-Javadoc) * �����Լ������Ƿ�dispose����CP * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ public void dispose() { } /* (non-Javadoc) * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#getPipelinedChildren(java.lang.Object, java.util.Set) */ public void getPipelinedChildren(Object aParent, Set theCurrentChildren) { customize(getChildren(aParent), theCurrentChildren); IARESProject aresProj = null; if (aParent instanceof IProject) { aresProj = ARESCore.create((IProject) aParent); } else if (aParent instanceof IARESProject) { aresProj = (IARESProject) aresProj; } if (aresProj != null) { customizeReflibNodes(aresProj, theCurrentChildren); } logger.debug("Parent: " + aParent + "\nChildren: " + theCurrentChildren); } private void customize(Object[] aresElements, Set proposedChildren) { List elementList= Arrays.asList(aresElements); for (Iterator iter= proposedChildren.iterator(); iter.hasNext();) { Object element= iter.next(); IResource resource= null; if (element instanceof IResource) { resource= (IResource)element; } else if (element instanceof IAdaptable) { resource= (IResource)((IAdaptable)element).getAdapter(IResource.class); } if (resource != null) { int i= elementList.indexOf(resource); if (i >= 0) { aresElements[i]= null; } } } for (int i= 0; i < aresElements.length; i++) { Object element= aresElements[i]; if (element instanceof IARESElement) { IARESElement cElement= (IARESElement)element; IResource resource= cElement.getResource(); if (resource != null) { proposedChildren.remove(resource); } proposedChildren.add(element); } else if (element != null) { proposedChildren.add(element); } } } private void customizeReflibNodes(IARESProject project, Set proposedChildren) { for (Iterator iter= proposedChildren.iterator(); iter.hasNext();) { Object element= iter.next(); IResource resource= null; if (element instanceof IResource) { resource= (IResource)element; } else if (element instanceof IAdaptable) { resource= (IResource)((IAdaptable)element).getAdapter(IResource.class); } if (resource != null && resource.getType() == IResource.FILE) { IPath path = resource.getFullPath(); IReferencedLibrary lib = ((ARESProject) project).getReferencedLibrary(path); if (lib != null && lib.exists()) { iter.remove(); } } } } /* (non-Javadoc) * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#getPipelinedElements(java.lang.Object, java.util.Set) */ public void getPipelinedElements(Object anInput, Set theCurrentElements) { logger.debug("getPipelinedElements, input is: " + anInput + "\n, Children is: " + theCurrentElements); } /* (non-Javadoc) * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#getPipelinedParent(java.lang.Object, java.lang.Object) */ public Object getPipelinedParent(Object anObject, Object aSuggestedParent) { logger.debug("Object: " + anObject + "\n suggestedParent: " + aSuggestedParent); Object parent= getDelegateContentProvider().getParent(anObject); if (parent instanceof IARESModel) { return ((IARESModel)parent).getWorkspace().getRoot(); } if (parent instanceof IARESProject) { return ((IARESProject)parent).getProject(); } logger.debug("resultParent: " + parent); return parent; } /* (non-Javadoc) * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#interceptAdd(org.eclipse.ui.navigator.PipelinedShapeModification) */ public PipelinedShapeModification interceptAdd(PipelinedShapeModification addModification) { Object parent= addModification.getParent(); if (parent instanceof IARESProject) { addModification.setParent(((IARESProject)parent).getProject()); } if (parent instanceof IWorkspaceRoot) { deconvertAresProjects(addModification); } convertToAresElements(addModification); // �½���Դ��ʱ��,JDT���������������½����ļ��ڵ�Add��ģ������,����������Ҫ���⴦��һ�� CommonElementContentProvider cp = (CommonElementContentProvider) getDelegateContentProvider(); parent = addModification.getParent(); if (parent instanceof IARESElement) { for (Iterator childrenItr = addModification.getChildren().iterator(); childrenItr.hasNext();) { Object child = childrenItr.next(); if (child instanceof IARESElement) childrenItr.remove(); } } if (parent instanceof IARESModule && cp.showCategory) { // ��ʾ���������� for (Iterator childrenItr = addModification.getChildren().iterator(); childrenItr.hasNext();) { Object child = childrenItr.next(); // only convert IFolders and IFiles if (child instanceof IARESResource) { IARESResource aresRes = (IARESResource) child; ARESResourceCategory[] cates = cp.getCategories((IARESModule) parent); for (ARESResourceCategory cate : cates) { if (cate.isResTypeAllowed(aresRes.getType())) { childrenItr.remove(); break; } } } } } return addModification; } @SuppressWarnings("unchecked") private void deconvertAresProjects(PipelinedShapeModification modification) { Set convertedChildren = new LinkedHashSet(); for (Iterator iterator = modification.getChildren().iterator(); iterator.hasNext();) { Object added = iterator.next(); if(added instanceof IARESProject) { iterator.remove(); convertedChildren.add(((IARESProject)added).getProject()); } } modification.getChildren().addAll(convertedChildren); } private boolean convertToAresElements(PipelinedShapeModification modification) { Object parent = modification.getParent(); // As of 3.3, we no longer re-parent additions to IProject. if (parent instanceof IContainer) { IARESElement element = ARESCore.create((IContainer) parent); if (element != null && element.exists()) { // we don't convert the root if( !(element instanceof IARESModel) && !(element instanceof IARESProject)) modification.setParent(element); return convertToAresElements(modification.getChildren()); } } return false; } @SuppressWarnings("unchecked") private boolean convertToAresElements(Set currentChildren) { LinkedHashSet convertedChildren = new LinkedHashSet(); IARESElement newChild; for (Iterator childrenItr = currentChildren.iterator(); childrenItr.hasNext();) { Object child = childrenItr.next(); // only convert IFolders and IFiles if (child instanceof IFolder || child instanceof IFile) { if ((newChild = ARESCore.create((IResource) child)) != null && newChild.exists()) { childrenItr.remove(); convertedChildren.add(newChild); } } else if (child instanceof IARESProject) { childrenItr.remove(); convertedChildren.add( ((IARESProject)child).getProject()); } } if (!convertedChildren.isEmpty()) { currentChildren.addAll(convertedChildren); return true; } return false; } /* (non-Javadoc) * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#interceptRefresh(org.eclipse.ui.navigator.PipelinedViewerUpdate) */ public boolean interceptRefresh(PipelinedViewerUpdate aRefreshSynchronization) { logger.debug(aRefreshSynchronization.getRefreshTargets()); return convertToAresElements(aRefreshSynchronization.getRefreshTargets()); } /* (non-Javadoc) * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#interceptRemove(org.eclipse.ui.navigator.PipelinedShapeModification) */ public PipelinedShapeModification interceptRemove(PipelinedShapeModification removeModification) { logger.debug(removeModification.getChildren()); deconvertAresProjects(removeModification); convertToAresElements(removeModification.getChildren()); return removeModification; } /* (non-Javadoc) * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#interceptUpdate(org.eclipse.ui.navigator.PipelinedViewerUpdate) */ public boolean interceptUpdate(PipelinedViewerUpdate anUpdateSynchronization) { logger.debug(anUpdateSynchronization.getRefreshTargets()); return convertToAresElements(anUpdateSynchronization.getRefreshTargets()); } /* (non-Javadoc) * @see org.eclipse.ui.navigator.ICommonContentProvider#init(org.eclipse.ui.navigator.ICommonContentExtensionSite) */ public void init(ICommonContentExtensionSite aConfig) { // System.out.println("init"); } /* (non-Javadoc) * @see org.eclipse.ui.navigator.IMementoAware#restoreState(org.eclipse.ui.IMemento) */ public void restoreState(IMemento aMemento) { } /* (non-Javadoc) * @see org.eclipse.ui.navigator.IMementoAware#saveState(org.eclipse.ui.IMemento) */ public void saveState(IMemento aMemento) { } }