/**
* <p>Copyright: Copyright (c) 2009</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.ui;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.model.IWorkbenchAdapter;
import com.hundsun.ares.studio.core.ARESCore;
import com.hundsun.ares.studio.core.ARESModelException;
import com.hundsun.ares.studio.core.IARESProject;
import com.hundsun.ares.studio.core.IReferencedLibrary;
import com.hundsun.ares.studio.core.IResPathEntry;
import com.hundsun.ares.studio.core.IResPathEntryElement;
import com.hundsun.ares.studio.core.util.Util;
/**
* �����á� �ڵ㡣
* @author sundl
*/
public class RefLibContainer implements IAdaptable{
private static final String REF_LIB_CONTAINER = "referenced_library";
private IARESProject project;
public RefLibContainer(IARESProject project) {
this.project = project;
}
public IReferencedLibrary[] getReferencedLibs() throws ARESModelException {
return project.getReferencedLibs();
}
public IARESProject getProject() {
return project;
}
public void setProject(IARESProject project) {
this.project = project;
}
public IAdaptable[] getChildren() {
List<IAdaptable> children = new ArrayList<IAdaptable>();
for (IResPathEntry entry : project.getRawResPath()) {
switch (entry.getEntryKind()) {
case IResPathEntry.RPE_LIBRAY:
IReferencedLibrary lib = project.getReferencedLibrary(entry);
if (lib != null && lib.exists())
children.add(lib);
break;
case IResPathEntry.RPE_PROJECT:
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject project = (IProject) root.findMember(entry.getPath());
IARESProject aresProject = ARESCore.create(project);
if (aresProject != null && aresProject.exists()) {
children.add(new RequiredProject(this, aresProject, entry));
}
break;
}
}
return children.toArray(new IAdaptable[0]);
}
@Override
public int hashCode() {
return Util.combineHashCodes(REF_LIB_CONTAINER.hashCode(), project.hashCode());
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof RefLibContainer))
return false;
RefLibContainer other = (RefLibContainer) obj;
return this.project.equals(other.project);
}
public static class RequiredProject extends PlatformObject implements IAdaptable, IWorkbenchAdapter, IResPathEntryElement {
private RefLibContainer container;
// �����������ù��̴����aresProject
private IARESProject aresProject;
// 2012-2-20 sundl ��¼���ͣ����ڴ���respathentry������ɾ����ʱ�������equals�������Զ�����ɾ����
// ���ù��̵�����
private IResPathEntry entry;
public RequiredProject(RefLibContainer container, IARESProject aresProject, IResPathEntry entry) {
this.container = container;
this.aresProject = aresProject;
this.entry = entry;
}
/* (non-Javadoc)
* @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(java.lang.Object)
*/
@Override
public Object[] getChildren(Object o) {
return new Object[0];
}
/* (non-Javadoc)
* @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.lang.Object)
*/
@Override
public ImageDescriptor getImageDescriptor(Object object) {
return PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(IDE.SharedImages.IMG_OBJ_PROJECT);
}
/* (non-Javadoc)
* @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
*/
@Override
public String getLabel(Object o) {
return aresProject.getElementName();
}
/* (non-Javadoc)
* @see org.eclipse.ui.model.IWorkbenchAdapter#getParent(java.lang.Object)
*/
@Override
public Object getParent(Object o) {
return container;
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
@Override
public Object getAdapter(Class adapter) {
if (adapter == IWorkbenchAdapter.class)
return this;
return super.getAdapter(adapter);
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.core.IResPathEntryElement#getResPathEntry()
*/
@Override
public IResPathEntry getResPathEntry() {
return entry;
}
public IARESProject getHostAresProject() {
return container.getProject();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((aresProject == null) ? 0 : aresProject.hashCode());
result = prime * result + ((entry == null) ? 0 : entry.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
RequiredProject other = (RequiredProject) obj;
if (aresProject == null) {
if (other.aresProject != null)
return false;
} else if (!aresProject.equals(other.aresProject))
return false;
if (entry == null) {
if (other.entry != null)
return false;
} else if (!entry.equals(other.entry))
return false;
return true;
}
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
@Override
public Object getAdapter(Class adapter) {
if (adapter == IARESProject.class) {
return getProject();
} else if (adapter == IProject.class) {
return getProject().getProject();
}
return null;
}
}