diff options
Diffstat (limited to 'bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteContentProvider.java')
-rw-r--r-- | bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteContentProvider.java | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteContentProvider.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteContentProvider.java new file mode 100644 index 000000000..e5d3d74c6 --- /dev/null +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteContentProvider.java @@ -0,0 +1,158 @@ +/******************************************************************************* + * Copyright (c) 2000, 2008 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.team.internal.ccvs.ui.model; + +import java.util.HashMap; + +import org.eclipse.jface.viewers.AbstractTreeViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.team.internal.ccvs.core.*; +import org.eclipse.team.internal.ccvs.core.resources.RemoteFolderTree; +import org.eclipse.team.internal.ccvs.core.resources.RemoteResource; +import org.eclipse.team.internal.ccvs.ui.repo.RepositoryRoot; +import org.eclipse.ui.IWorkingSet; +import org.eclipse.ui.model.WorkbenchContentProvider; +import org.eclipse.ui.progress.DeferredTreeContentManager; + +/** + * Extension to the generic workbench content provider mechanism + * to lazily determine whether an element has children. That is, + * children for an element aren't fetched until the user clicks + * on the tree expansion box. + */ +public class RemoteContentProvider extends WorkbenchContentProvider { + + IWorkingSet workingSet; + DeferredTreeContentManager manager; + + HashMap cachedTrees; + + public RemoteContentProvider(){ + cachedTrees = new HashMap(); + } + + /* (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) { + if (viewer instanceof AbstractTreeViewer) { + manager = new DeferredTreeContentManager((AbstractTreeViewer) viewer); + } + super.inputChanged(viewer, oldInput, newInput); + } + + public boolean hasChildren(Object element) { + // the + box will always appear, but then disappear + // if not needed after you first click on it. + if (element instanceof ICVSRemoteResource) { + if (element instanceof ICVSRemoteFolder) { + return ((ICVSRemoteFolder) element).isExpandable(); + } + return ((ICVSRemoteResource) element).isContainer(); + } else if (element instanceof CVSResourceElement) { + ICVSResource r = ((CVSResourceElement) element).getCVSResource(); + if (r instanceof RemoteResource) { + return r.isFolder(); + } + } else if (element instanceof VersionCategory) { + return true; + } else if (element instanceof BranchCategory) { + return true; + } else if (element instanceof CVSTagElement) { + return true; + } else if (element instanceof RemoteModule) { + return true; + } + if (manager != null) { + if (manager.isDeferredAdapter(element)) + return manager.mayHaveChildren(element); + } + + return super.hasChildren(element); + } + + /** + * Sets the workingSet. + * @param workingSet The workingSet to set + */ + public void setWorkingSet(IWorkingSet workingSet) { + this.workingSet = workingSet; + } + + /** + * Returns the workingSet. + * @return IWorkingSet + */ + public IWorkingSet getWorkingSet() { + return workingSet; + } + + /* (non-Javadoc) + * @see org.eclipse.ui.model.WorkbenchContentProvider#getChildren(java.lang.Object) + */ + public Object[] getChildren(Object element) { + //check to see if we already have the children cached in the tree map + Object tree = cachedTrees.get(element); + if (tree != null) { + return ((RemoteFolderTree) tree).getChildren(); + } + + if (manager != null) { + Object[] children = manager.getChildren(element); + if (children != null) { + // This will be a placeholder to indicate + // that the real children are being fetched + return children; + } + } + Object[] children = super.getChildren(element); + for (int i = 0; i < children.length; i++) { + Object object = children[i]; + if (object instanceof CVSModelElement) + ((CVSModelElement)object).setWorkingSet(getWorkingSet()); + } + return children; + } + + public void cancelJobs(RepositoryRoot[] roots) { + if (manager != null) { + for (int i = 0; i < roots.length; i++) { + RepositoryRoot root = roots[i]; + cancelJobs(root.getRoot()); + } + } + } + + /** + * Cancel any jobs that are fetching content from the given location. + * @param location + */ + public void cancelJobs(ICVSRepositoryLocation location) { + if (manager != null) { + manager.cancel(location); + } + } + + /** + * Adds a remote folder tree to the cache + * @param project + * + */ + public void addCachedTree(ICVSRemoteFolder project, RemoteFolderTree tree){ + cachedTrees.put(project, tree); + } + + public void purgeCache(){ + cachedTrees.clear(); + } + + +} |