package org.eclipse.team.internal.ui.target;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.core.target.Site;
import org.eclipse.team.internal.ui.TeamUIPlugin;
import org.eclipse.team.ui.ISharedImages;
import org.eclipse.team.ui.TeamImages;
import org.eclipse.ui.model.IWorkbenchAdapter;

public class SiteElement implements IWorkbenchAdapter, IAdaptable {
	Site site;
	
	public SiteElement(Site site) {
		this.site = site;
	}

	public Site getSite() {
		return site;
	}
	
	public Object getAdapter(Class adapter) {
		if (adapter == IWorkbenchAdapter.class) return this;
		return null;
	}

	public int hashCode() {
		return site.hashCode();
	}

	public Object[] getChildren(Object o) {
		try {
			return new RemoteResourceElement(site.getRemoteResource()).getChildren(this);
		} catch (TeamException e) {
			TeamUIPlugin.handle(e);
			return new Object[0];
		}
	}
	
	public ImageDescriptor getImageDescriptor(Object object) {
		return TeamImages.getImageDescriptor(ISharedImages.IMG_SITE_ELEMENT);
	}
	
	public String getLabel(Object o) {
		return getSite().getDisplayName();
	}
	
	public Object getParent(Object o) {
		return null;
	}
	
	public boolean equals(Object obj) {
		if(obj == null) return false;
		if(!(obj instanceof SiteElement)) return false;
		Site otherSite = ((SiteElement)obj).getSite();
		return getSite().equals(otherSite);
	}
}