/**
* <p>Copyright: Copyright (c) 2009</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.ui;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import com.hundsun.ares.studio.core.ARESModelException;
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.IARESModuleRoot;
import com.hundsun.ares.studio.core.IARESProject;
import com.hundsun.ares.studio.core.IParent;
/**
* ������CP.
* @author sundl
*/
public abstract class ARESElementContentProvider implements ITreeContentProvider{
protected static final Object[] NO_CHILDREN = new Object[0];
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
*/
public Object[] getChildren(Object parentElement) {
if (!exists(parentElement)) {
return NO_CHILDREN;
}
try {
if (parentElement instanceof IARESModel) {
return ((IARESModel)parentElement).getARESProjects();
} else if (parentElement instanceof IARESProject) {
IARESProject project = (IARESProject)parentElement;
if (!project.getProject().isOpen()) {
return NO_CHILDREN;
}
return getProjectChildren(project);
} else if (parentElement instanceof IARESModuleRoot) {
return getModuleRootChildren((IARESModuleRoot)parentElement);
} else if (parentElement instanceof IARESModule) {
return getModuleChildren((IARESModule)parentElement);
} else if (parentElement instanceof IParent) {
return ((IParent)parentElement).getChildren();
}
} catch (Exception e) {
e.printStackTrace();
}
return NO_CHILDREN;
}
protected Object[] getModuleChildren(IARESModule module) throws ARESModelException{
return module.getARESResources();
}
protected Object[] getModuleRootChildren(IARESModuleRoot root) throws ARESModelException {
return root.getModules();
}
/**
* Note: This method is for internal use only. Clients should not call this method.
*
* @param element the element to test
* @return returns <code>true</code> if the element exists
*
* @noreference This method is not intended to be referenced by clients.
*/
protected boolean exists(Object element) {
if (element == null) {
return false;
}
if (element instanceof IResource) {
return ((IResource)element).exists();
}
if (element instanceof IARESElement) {
return ((IARESElement)element).exists();
}
return true;
}
protected abstract Object[] getProjectChildren(IARESProject project);
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
*/
public Object getParent(Object element) {
if (!exists(element))
return null;
return internalGetParent(element);
}
protected Object internalGetParent(Object child) {
if (child instanceof IARESElement) {
return ((IARESElement)child).getParent();
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
*/
public boolean hasChildren(Object element) {
if(element instanceof IARESProject) {
IARESProject project = (IARESProject)element;
if(!project.getProject().isOpen()) {
return false;
}
}
if(element instanceof IParent) {
try {
IARESElement aresElement = (IARESElement)element;
if (aresElement.isStructureKnown()) {
return ((IParent)element).hasChildren();
} else {
return true;
}
} catch (ARESModelException e) {
e.printStackTrace();
return true;
}
}
Object[] children= getChildren(element);
return (children != null) && children.length > 0;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}