/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.team.internal.ccvs.ui.model;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.jface.progress.IElementCollector;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.internal.ccvs.core.*;
import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
import org.eclipse.team.internal.ccvs.ui.ICVSUIConstants;
import org.eclipse.team.internal.ccvs.ui.repo.RepositoryManager;
import org.eclipse.ui.model.IWorkbenchAdapter;
import org.eclipse.ui.progress.IDeferredWorkbenchAdapter;

/**
 * This class represents an IProject resource in a repository.  The
 * children of a RemoteModule are its versions. A RemoteModule is
 * a child of the VersionsCategory.
 */
public class RemoteModule
 extends CVSModelElement
 implements IAdaptable, IDeferredWorkbenchAdapter {
 ICVSRemoteFolder folder;
 VersionCategory parent;

 /**
  * RemoteProject constructor.
  */
 public RemoteModule(ICVSRemoteFolder folder, VersionCategory parent) {
  this.folder = folder;
  this.parent = parent;
 }

 /**
  * Returns an object which is an instance of the given class
  * associated with this object. Returns <code>null</code> if
  * no such object can be found.
  */
 public Object getAdapter(Class adapter) {
  if (adapter == IWorkbenchAdapter.class)
   return this;
  if (adapter == IDeferredWorkbenchAdapter.class)
   return this;
  return null;
 }

 /**
  * Returns an image to be used for displaying an object in the desktop.
  * @param object The object to get an image for.
  * @param owner The viewer that the image will be used in.  The image will
  * be disposed when this viewer is closed.  If the owner is null, a new 
  * image is returned, and the caller is responsible for disposing it.
  */
 public ImageDescriptor getImageDescriptor(Object object) {
  return CVSUIPlugin.getPlugin().getImageDescriptor(
   ICVSUIConstants.IMG_PROJECT_VERSION);
 }

 /**
  * Returns the name of this element.  This will typically
  * be used to assign a label to this object when displayed
  * in the UI.
  */
 public String getLabel(Object o) {
  return folder.getName();
 }

 /**
  * Returns the logical parent of the given object in its tree.
  */
 public Object getParent(Object o) {
  return parent;
 }

 /**
  * Return the repository the given element belongs to.
  */
 public ICVSRepositoryLocation getRepository(Object o) {
  return folder.getRepository();
 }

 /** (Non-javadoc)
  * For debugging purposes only.
  */
 public String toString() {
  return "RemoteModule(" + folder.getName() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
 }

 public ICVSRemoteResource getCVSResource() {
  return folder;
 }

 /**
  * Returns the children of this object.  When this object
  * is displayed in a tree, the returned objects will be this
  * element's children.  Returns an empty enumeration if this
  * object has no children. The children of the RemoteModule
  * are the versions for that module.
  *
  * @see org.eclipse.team.internal.ccvs.ui.model.CVSModelElement#internalGetChildren(java.lang.Object, org.eclipse.core.runtime.IProgressMonitor)
  */
 public Object[] fetchChildren(Object o, IProgressMonitor monitor)
  throws TeamException {
  RepositoryManager manager =
   CVSUIPlugin.getPlugin().getRepositoryManager();
  try {
   manager.refreshDefinedTags(folder, false /* replace */
   , false, monitor);
  } catch (TeamException e) {
   // continue
  }
  CVSTag[] tags =
   CVSUIPlugin.getPlugin().getRepositoryManager().getKnownTags(
    folder,
    CVSTag.VERSION);
  Object[] versions = new Object[tags.length];
  for (int i = 0; i < versions.length; i++) {
   versions[i] = folder.forTag(tags[i]);
  }
  return versions;
 }

 public void fetchDeferredChildren(
  Object o,
  IElementCollector collector,
  IProgressMonitor monitor) {
		try {
			collector.add(fetchChildren(o, monitor), monitor);
		} catch (TeamException e) {
			CVSUIPlugin.log(e);
  }
 }

 public boolean isContainer() {
  return true;
 }

 public ISchedulingRule getRule(Object element) {
  return new RepositoryLocationSchedulingRule(folder.getRepository()); //$NON-NLS-1$
 }
}
