Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java158
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();
+ }
+
+
+}

Back to the top