Update of /cvsroot/eclipse-ccase/net.sourceforge.eclipseccase.ui/src/net/sourceforge/eclipseccase/views In directory sfp-cvsdas-4.v30.ch3.sourceforge.com:/tmp/cvs-serv31721/src/net/sourceforge/eclipseccase/views Modified Files: CheckoutsViewActionGroup.java CheckoutsView.java messages.properties Added Files: CheckoutsViewContentProvider.java CheckoutsViewRoot.java CheckoutsViewLabelProvider.java Removed Files: ClearCaseContentProvider.java ClearCaseViewLabelProvider.java ClearCaseViewActionGroup.java ClearCaseViewPart.java ClearCaseViewRoot.java Log Message: major restructure of view-private view code. Should fix/improve: 3035853 ViewPrivate view unusably slow with large projects 3013400 Constant refreshing of removed files 2983666 ViewPrivate view does not show CO files from outside Eclipse --- NEW FILE: CheckoutsViewRoot.java --- /******************************************************************************* * Copyright (c) 2002, 2004 eclipse-ccase.sourceforge.net. * 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: * Matthew Conway - initial API and implementation * IBM Corporation - concepts and ideas from Eclipse * Gunnar Wagenknecht - new features, enhancements and bug fixes *******************************************************************************/ package net.sourceforge.eclipseccase.views; import net.sourceforge.eclipseccase.StateCacheFactory; import net.sourceforge.eclipseccase.ui.ClearCaseUI; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.IWorkingSet; import org.eclipse.ui.model.IWorkbenchAdapter; import org.eclipse.ui.progress.IDeferredWorkbenchAdapter; import org.eclipse.ui.progress.IElementCollector; /** * A generic root element for the <code>ClearCaseViewPart</code>. * * @author Gunnar Wagenknecht (g.w...@in...) */ public class CheckoutsViewRoot implements IDeferredWorkbenchAdapter, IAdaptable { CheckoutsView checkoutsView; public CheckoutsViewRoot(CheckoutsView checkoutsView) { this.checkoutsView = checkoutsView; } /* * (non-Javadoc) * * @see * org.eclipse.ui.progress.IDeferredWorkbenchAdapter#fetchDeferredChildren * (java.lang.Object, org.eclipse.jface.progress.IElementCollector, * org.eclipse.core.runtime.IProgressMonitor) */ public void fetchDeferredChildren(Object object, IElementCollector collector, IProgressMonitor monitor) { if (!StateCacheFactory.getInstance().isInitialized()) { // during startup, don't update from uninitialized cache // TODO: schedule an automatic refresh after 2 seconds collector.done(); return; } if (ClearCaseUI.DEBUG_VIEWPRIV) { ClearCaseUI.trace(ClearCaseUI.VIEWPRIV, "fetchDeferredChildren: starting"); //$NON-NLS-1$ } Iterable<IResource> resources = StateCacheFactory.getInstance().getContainedResources(); for (IResource resource : resources) { // determine state if (checkoutsView.shouldAdd(resource)) { if (ClearCaseUI.DEBUG_VIEWPRIV) { ClearCaseUI.trace(ClearCaseUI.VIEWPRIV, "adding to collector: " + resource.getFullPath()); //$NON-NLS-1$ } collector.add(resource, new SubProgressMonitor(monitor, 1000, SubProgressMonitor.SUPPRESS_SUBTASK_LABEL)); } } if (ClearCaseUI.DEBUG_VIEWPRIV) { ClearCaseUI.trace(ClearCaseUI.VIEWPRIV, "fetchDeferredChildren: done"); //$NON-NLS-1$ } collector.done(); } /* * (non-Javadoc) * * @see org.eclipse.ui.progress.IDeferredWorkbenchAdapter#isContainer() */ public boolean isContainer() { return true; } /* * (non-Javadoc) * * @see * org.eclipse.ui.progress.IDeferredWorkbenchAdapter#getRule(java.lang.Object * ) */ public ISchedulingRule getRule(Object object) { return ResourcesPlugin.getWorkspace().getRoot(); } /* * (non-Javadoc) * * @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(java.lang.Object) */ public Object[] getChildren(Object o) { return new Object[0]; } /* * (non-Javadoc) * * @see * org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.lang.Object * ) */ public ImageDescriptor getImageDescriptor(Object object) { return getWorkspaceWorkbenchAdapter().getImageDescriptor(object); } /** * @return */ private IWorkbenchAdapter getWorkspaceWorkbenchAdapter() { return ((IWorkbenchAdapter) ResourcesPlugin.getWorkspace().getRoot().getAdapter(IWorkbenchAdapter.class)); } /* * (non-Javadoc) * * @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object) */ public String getLabel(Object o) { return getWorkspaceWorkbenchAdapter().getLabel(o); } /* * (non-Javadoc) * * @see org.eclipse.ui.model.IWorkbenchAdapter#getParent(java.lang.Object) */ public Object getParent(Object o) { return null; } private IWorkingSet workingSet; /** * Returns the workingSet. * * @return IWorkingSet */ public IWorkingSet getWorkingSet() { return workingSet; } /** * Sets the workingSet. * * @param workingSet * The workingSet to set */ public void setWorkingSet(IWorkingSet workingSet) { this.workingSet = workingSet; } /* * (non-Javadoc) * * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) */ @SuppressWarnings("unchecked") public Object getAdapter(Class adapter) { return ResourcesPlugin.getWorkspace().getRoot().getAdapter(adapter); } } Index: messages.properties =================================================================== RCS file: /cvsroot/eclipse-ccase/net.sourceforge.eclipseccase.ui/src/net/sourceforge/eclipseccase/views/messages.properties,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** messages.properties 24 Feb 2010 13:31:58 -0000 1.2 --- messages.properties 28 Jul 2010 12:03:39 -0000 1.3 *************** *** 1,2 **** ! ClearCaseViewActionGroup.refresh.name=&Refresh View ! ClearCaseViewActionGroup.refresh.description=Refreshes the view --- 1,2 ---- ! ClearCaseViewActionGroup.refresh.name=&Refresh List ! ClearCaseViewActionGroup.refresh.description=Refreshes the view by asking ClearCase for a file listing, long running operation in huge ClearCase views Index: CheckoutsViewActionGroup.java =================================================================== RCS file: /cvsroot/eclipse-ccase/net.sourceforge.eclipseccase.ui/src/net/sourceforge/eclipseccase/views/CheckoutsViewActionGroup.java,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** CheckoutsViewActionGroup.java 18 Mar 2010 09:04:11 -0000 1.7 --- CheckoutsViewActionGroup.java 28 Jul 2010 12:03:39 -0000 1.8 *************** *** 5,12 **** --- 5,19 ---- package net.sourceforge.eclipseccase.views; + import org.eclipse.jface.action.*; + import org.eclipse.jface.viewers.IStructuredSelection; + import org.eclipse.ui.actions.ActionFactory; + import org.eclipse.ui.actions.OpenFileAction; + import org.eclipse.ui.views.navigator.ShowInNavigatorAction; + import net.sourceforge.eclipseccase.ui.ClearCaseImages; import org.eclipse.jface.action.*; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IWorkbenchActionConstants; + import org.eclipse.ui.views.navigator.MainActionGroup; /** *************** *** 15,19 **** * @author Gunnar Wagenknecht (g.w...@in...) */ ! public class CheckoutsViewActionGroup extends ClearCaseViewActionGroup { /** --- 22,26 ---- * @author Gunnar Wagenknecht (g.w...@in...) */ ! public class CheckoutsViewActionGroup extends MainActionGroup { /** *************** *** 32,35 **** --- 39,89 ---- private Action hideHijackedElements; + private Action refreshAction; + + private ShowInNavigatorAction showInNavigatorAction; + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.views.navigator.MainActionGroup#fillContextMenu(org.eclipse + * .jface.action.IMenuManager) + */ + @Override + public void fillContextMenu(IMenuManager menu) { + // menu.add(showInNavigatorAction); + // menu.add(new Separator()); + + super.fillContextMenu(menu); + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.views.navigator.MainActionGroup#runDefaultAction(org.eclipse + * .jface.viewers.IStructuredSelection) + */ + @Override + public void runDefaultAction(IStructuredSelection selection) { + // double click should open file in editor, not in navigator + // see bug 2964016: Not possible to open file from 'view private files' + + // showInNavigatorAction.selectionChanged(selection); + // showInNavigatorAction.run(); + OpenFileAction ofa = new OpenFileAction(getCheckoutsView().getSite().getPage()); + ofa.selectionChanged(selection); + if (ofa.isEnabled()) { + ofa.run(); + } + } + + /** + * @return + */ + protected CheckoutsView getCheckoutsView() { + return ((CheckoutsView) getNavigator()); + } + /* * (non-Javadoc) *************** *** 41,46 **** --- 95,107 ---- @Override public void fillActionBars(IActionBars actionBars) { + workingSetGroup.fillActionBars(actionBars); + sortAndFilterGroup.fillActionBars(actionBars); + + actionBars.setGlobalActionHandler(ActionFactory.REFRESH.getId(), refreshAction); + + IToolBarManager toolBar = actionBars.getToolBarManager(); IMenuManager menu = actionBars.getMenuManager(); IMenuManager submenu = new MenuManager("Show..."); + menu.add(submenu); submenu.add(hideCheckouts); *************** *** 49,60 **** menu.add(new Separator()); - IToolBarManager toolBar = actionBars.getToolBarManager(); toolBar.add(new Separator()); toolBar.add(hideCheckouts); toolBar.add(hideHijackedElements); toolBar.add(hideNewElements); toolBar.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); - super.fillActionBars(actionBars); } --- 110,121 ---- menu.add(new Separator()); toolBar.add(new Separator()); toolBar.add(hideCheckouts); toolBar.add(hideHijackedElements); toolBar.add(hideNewElements); + toolBar.add(new Separator()); + toolBar.add(refreshAction); toolBar.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } *************** *** 69,72 **** --- 130,150 ---- super.makeActions(); + refreshAction = new Action(Messages.getString("ClearCaseViewActionGroup.refresh.name"), ClearCaseImages //$NON-NLS-1$ + .getImageDescriptor(ClearCaseImages.IMG_REFRESH)) { + + @Override + public void run() { + getCheckoutsView().refresh(); + getCheckoutsView().refreshFromClearCase(); + } + }; + refreshAction.setToolTipText(Messages.getString("ClearCaseViewActionGroup.refresh.description")); //$NON-NLS-1$ + refreshAction.setDisabledImageDescriptor(ClearCaseImages.getImageDescriptor(ClearCaseImages.IMG_REFRESH_DISABLED)); + refreshAction.setHoverImageDescriptor(ClearCaseImages.getImageDescriptor(ClearCaseImages.IMG_REFRESH)); + + // showInNavigatorAction = new + // ShowInNavigatorAction(getClearCaseView().getSite().getPage(), + // getClearCaseView().getViewer()); + hideCheckouts = new Action("Checked-Out Elements") { @Override *************** *** 99,109 **** } - /** - * @return - */ - protected CheckoutsView getCheckoutsView() { - return (CheckoutsView) getClearCaseView(); - } - /* * (non-Javadoc) --- 177,180 ---- --- ClearCaseViewLabelProvider.java DELETED --- --- ClearCaseContentProvider.java DELETED --- --- ClearCaseViewActionGroup.java DELETED --- --- NEW FILE: CheckoutsViewContentProvider.java --- /******************************************************************************* * Copyright (c) 2002, 2004 eclipse-ccase.sourceforge.net. * 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: * Matthew Conway - initial API and implementation * IBM Corporation - concepts and ideas from Eclipse * Gunnar Wagenknecht - new features, enhancements and bug fixes *******************************************************************************/ package net.sourceforge.eclipseccase.views; import org.eclipse.ui.progress.IDeferredWorkbenchAdapter; import org.eclipse.jface.viewers.*; import org.eclipse.ui.IWorkingSet; import org.eclipse.ui.progress.DeferredTreeContentManager; /** * A content provider for the ClearCaseViewPart. * * @author Gunnar Wagenknecht (gu...@wa...) */ public class CheckoutsViewContentProvider implements ITreeContentProvider { DeferredTreeContentManager manager; /* * (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(this, (AbstractTreeViewer) viewer){ /* (non-Javadoc) * @see org.eclipse.ui.progress.DeferredTreeContentManager#getFetchJobName(java.lang.Object, org.eclipse.ui.progress.IDeferredWorkbenchAdapter) */ @Override protected String getFetchJobName(Object parent, IDeferredWorkbenchAdapter adapter) { return "Updating view-private file list"; } }; } } 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 CheckoutsViewRoot) return true; return false; } /* * (non-Javadoc) * * @see * org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang. * Object) */ public Object[] getChildren(Object element) { if (element instanceof CheckoutsViewRoot) { ((CheckoutsViewRoot) element).setWorkingSet(getWorkingSet()); 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; } } return new Object[0]; } /** * Cancels all pending jobs for the specified root. * * @param root */ public void cancelJobs(CheckoutsViewRoot root) { if (manager != null) { manager.cancel(root); } } /* * (non-Javadoc) * * @see * org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object * ) */ public Object getParent(Object element) { return null; } /* * (non-Javadoc) * * @see * org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java * .lang.Object) */ public Object[] getElements(Object inputElement) { return getChildren(inputElement); } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ public void dispose() { // nothing to dispose } private IWorkingSet workingSet; /** * Returns the workingSet. * * @return IWorkingSet */ public IWorkingSet getWorkingSet() { return workingSet; } /** * Sets the workingSet. * * @param workingSet * The workingSet to set */ public void setWorkingSet(IWorkingSet workingSet) { this.workingSet = workingSet; } } --- ClearCaseViewRoot.java DELETED --- --- ClearCaseViewPart.java DELETED --- Index: CheckoutsView.java =================================================================== RCS file: /cvsroot/eclipse-ccase/net.sourceforge.eclipseccase.ui/src/net/sourceforge/eclipseccase/views/CheckoutsView.java,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** CheckoutsView.java 21 Apr 2010 18:01:08 -0000 1.16 --- CheckoutsView.java 28 Jul 2010 12:03:39 -0000 1.17 *************** *** 1,19 **** package net.sourceforge.eclipseccase.views; ! import java.util.ArrayList; ! import java.util.List; import net.sourceforge.eclipseccase.*; import net.sourceforge.eclipseccase.ui.ClearCaseUI; ! import org.eclipse.core.resources.IContainer; ! import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.*; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.team.core.Team; /** * The Checkouts view */ ! public class CheckoutsView extends ClearCaseViewPart { private static final String SETTING_HIDE_CHECKOUTS = "hideCheckouts"; --- 1,25 ---- package net.sourceforge.eclipseccase.views; ! import java.util.*; import net.sourceforge.eclipseccase.*; import net.sourceforge.eclipseccase.ui.ClearCaseUI; ! import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.IDialogSettings; + import org.eclipse.jface.viewers.*; import org.eclipse.team.core.Team; + import org.eclipse.ui.*; + import org.eclipse.ui.progress.IWorkbenchSiteProgressService; + import org.eclipse.ui.views.navigator.ResourceComparator; + import org.eclipse.ui.views.navigator.ResourceNavigator; /** * The Checkouts view */ ! @SuppressWarnings("deprecation") ! public class CheckoutsView extends ResourceNavigator implements IResourceStateListener, IResourceChangeListener { ! protected static final CoreException IS_AFFECTED_EX = new CoreException(Status.CANCEL_STATUS); ! private static final String SETTING_HIDE_CHECKOUTS = "hideCheckouts"; *************** *** 29,32 **** --- 35,44 ---- private Boolean inClearCaseRefresh = false; + private CheckoutsViewContentProvider contentProvider; + + protected boolean initialized = false; + + private CheckoutsViewRoot myRoot; + /* * (non-Javadoc) *************** *** 36,41 **** * .core.resources.IResource) */ ! @Override ! protected boolean shouldAdd(IResource resource) { ClearCaseProvider provider = ClearCaseProvider.getClearCaseProvider(resource); --- 48,52 ---- * .core.resources.IResource) */ ! boolean shouldAdd(IResource resource) { ClearCaseProvider provider = ClearCaseProvider.getClearCaseProvider(resource); *************** *** 43,53 **** return false; // don't show ignored resources ! if (Team.isIgnoredHint(resource)) return false; // don't show resources with unknown state ! if (provider.isUnknownState(resource)) return false; // optimize: query the cache only once: --- 54,75 ---- return false; + if (ClearCaseUI.DEBUG_VIEWPRIV) { + ClearCaseUI.trace(ClearCaseUI.VIEWPRIV, "shouldAdd? " + resource.getFullPath()); //$NON-NLS-1$ + } // don't show ignored resources ! if (Team.isIgnoredHint(resource)) { ! if (ClearCaseUI.DEBUG_VIEWPRIV) { ! ClearCaseUI.trace(ClearCaseUI.VIEWPRIV, " no, ignored"); //$NON-NLS-1$ ! } return false; + } // don't show resources with unknown state ! if (provider.isUnknownState(resource)) { ! if (ClearCaseUI.DEBUG_VIEWPRIV) { ! ClearCaseUI.trace(ClearCaseUI.VIEWPRIV, " no, unknown state"); //$NON-NLS-1$ ! } return false; + } // optimize: query the cache only once: *************** *** 55,70 **** // show checkouts if enabled ! if (!hideCheckouts() && state.isCheckedOut()) return true; ! // show Hijacked files if enabled ! if (!hideHijackedElements() && state.isHijacked()) return true; ! // show new elements if enabled ! if (!hideNewElements() && !state.isClearCaseElement()) return true; // hide all other return false; } --- 77,107 ---- // show checkouts if enabled ! if (!hideCheckouts() && state.isCheckedOut()) { ! if (ClearCaseUI.DEBUG_VIEWPRIV) { ! ClearCaseUI.trace(ClearCaseUI.VIEWPRIV, " yes, checked out"); //$NON-NLS-1$ ! } return true; + } ! // show new elements if enabled ! if (!hideNewElements() && !state.isClearCaseElement()) { ! if (ClearCaseUI.DEBUG_VIEWPRIV) { ! ClearCaseUI.trace(ClearCaseUI.VIEWPRIV, " yes, viewpriv"); //$NON-NLS-1$ ! } return true; + } ! // show Hijacked files if enabled ! if (!hideHijackedElements() && state.isHijacked()) { ! if (ClearCaseUI.DEBUG_VIEWPRIV) { ! ClearCaseUI.trace(ClearCaseUI.VIEWPRIV, " yes, hijacked"); //$NON-NLS-1$ ! } return true; + } // hide all other + if (ClearCaseUI.DEBUG_VIEWPRIV) { + ClearCaseUI.trace(ClearCaseUI.VIEWPRIV, " no"); //$NON-NLS-1$ + } return false; } *************** *** 140,153 **** } ! /* ! * (non-Javadoc) * - * @see net.sourceforge.eclipseccase.views.ClearCaseViewPart#makeActions() */ - @Override - protected void makeActions() { - setActionGroup(new CheckoutsViewActionGroup(this)); - } - public void refreshFromClearCase() { synchronized (inClearCaseRefresh) { --- 177,191 ---- } ! /** ! * Collects checked out, hijacked, view private files by calling a cleartool ! * subprocess to get the actual listing. Each found element is checked for a ! * corresponding IResource in the workspace. If found, that resource is ! * updated in the StateCache, which in turn triggers a StateChanged event ! * which updates the actual view. ! * ! * All this may be very long operation, several minutes in huge CC views. It ! * is done in a newly created job. * */ public void refreshFromClearCase() { synchronized (inClearCaseRefresh) { *************** *** 167,171 **** } if (dirlist.size() > 0) { ! final IResource[] array = (IResource[]) dirlist.toArray(new IResource[dirlist.size()]); final ViewPrivCollector collector = new ViewPrivCollector(array); collector.setFindCheckedouts(!hideCheckouts()); --- 205,209 ---- } if (dirlist.size() > 0) { ! final IResource[] array = dirlist.toArray(new IResource[dirlist.size()]); final ViewPrivCollector collector = new ViewPrivCollector(array); collector.setFindCheckedouts(!hideCheckouts()); *************** *** 194,196 **** --- 232,515 ---- } } + + /** + * @see org.eclipse.team.internal.ccvs.ui.repo.RemoteViewPart#getContentProvider() + */ + protected CheckoutsViewContentProvider getContentProvider() { + if (contentProvider == null) { + contentProvider = new CheckoutsViewContentProvider(); + } + return contentProvider; + } + + @Override + protected void initContentProvider(TreeViewer viewer) { + viewer.setContentProvider(getContentProvider()); + StateCacheFactory.getInstance().addStateChangeListerer(this); + ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE); + } + + @Override + protected void initLabelProvider(TreeViewer viewer) { + viewer.setLabelProvider(new DecoratingLabelProvider(new CheckoutsViewLabelProvider(), getPlugin().getWorkbench().getDecoratorManager().getLabelDecorator())); + } + + @Override + public void setComparator(ResourceComparator comparator) { + super.setComparator(new ResourceComparator(comparator.getCriteria()) { + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.views.navigator.ResourceSorter#compare(org.eclipse + * .jface.viewers.Viewer, java.lang.Object, java.lang.Object) + */ + @Override + public int compare(Viewer viewer, Object o1, Object o2) { + // have to deal with non-resources in navigator + // if one or both objects are not resources, returned a + // comparison + // based on class. + if (!(o1 instanceof IResource && o2 instanceof IResource)) + return compareClass(o1, o2); + IResource r1 = (IResource) o1; + IResource r2 = (IResource) o2; + + int typeres = compareClearCaseTypes(r1, r2); + if (typeres != 0) { + return typeres; + } + if (getCriteria() == NAME) + return compareNames(r1, r2); + else if (getCriteria() == TYPE) + return compareTypes(r1, r2); + else + return 0; + } + + @SuppressWarnings("unchecked") + @Override + protected int compareNames(IResource resource1, IResource resource2) { + return getComparator().compare(resource1.getFullPath().toString(), resource2.getFullPath().toString()); + } + + protected int compareClearCaseTypes(IResource resource1, IResource resource2) { + // TODO: optimize this, how can the repeated lookups be + // eliminated? + StateCache c1 = StateCacheFactory.getInstance().get(resource1); + StateCache c2 = StateCacheFactory.getInstance().get(resource2); + // sort checkedout files first + if (c1.isCheckedOut()) { + if (c2.isCheckedOut()) { + return 0; + } else { + return -1; + } + } else if (c2.isCheckedOut()) { + return 1; + } else { + // no CO + // sort hijacked files second + if (c1.isHijacked()) { + if (c2.isHijacked()) { + return 0; + } else { + return -1; + } + } else if (c2.isHijacked()) { + return 1; + } else { + // both files are neither CO nor hijacked + return 0; + } + } + } + }); + } + + @Override + protected IAdaptable getInitialInput() { + return getRoot(); + } + + protected CheckoutsViewRoot getRoot() { + if (null == myRoot) { + myRoot = new CheckoutsViewRoot(this); + } + + return myRoot; + } + + @Override + public void setWorkingSet(IWorkingSet workingSet) { + getContentProvider().setWorkingSet(workingSet); + super.setWorkingSet(workingSet); + } + + @Override + public void updateTitle() { + // do nothing + } + + @Override + protected void makeActions() { + setActionGroup(new CheckoutsViewActionGroup(this)); + } + + /** + * Refreshes the viewer. + */ + public void refresh() { + if (getViewer() == null) + return; + getContentProvider().cancelJobs(getRoot()); + getViewer().refresh(); + initialized = true; + } + + public void refreshInGuiThread() { + getViewer().getControl().getDisplay().asyncExec(new Runnable() { + public void run() { + refresh(); + } + }); + } + + @Override + public void dispose() { + StateCacheFactory.getInstance().removeStateChangeListerer(this); + ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); + super.dispose(); + } + + public void resourceStateChanged(final IResource[] resources) { + if (!initialized) { + refreshInGuiThread(); + return; + } + + for (int i = 0; i < resources.length; i++) { + final IResource resource = resources[i]; + + // filter out ignored resources + ClearCaseProvider provider = ClearCaseProvider.getClearCaseProvider(resource); + if (null == provider || provider.isIgnored(resource)) + return; + + // do not add non existent resources + final boolean shouldAdd = resource.exists() && shouldAdd(resource); + + if (null != getViewer() && null != getViewer().getControl() && !getViewer().getControl().isDisposed()) { + getViewer().getControl().getDisplay().syncExec(new Runnable() { + + public void run() { + if (null != getViewer() && null != getViewer().getControl() && !getViewer().getControl().isDisposed()) { + // we remove in every case + getViewer().remove(resource); + + // only add if desired + if (shouldAdd) { + getViewer().add(getRoot(), resource); + } + } + } + }); + } + } + } + + public void resourceChanged(IResourceChangeEvent event) { + if (!initialized) { + refreshInGuiThread(); + return; + } + IResourceDelta rootDelta = event.getDelta(); + if (null != rootDelta) { + + final Set<IResource> toRemove = new HashSet<IResource>(); + + try { + rootDelta.accept(new IResourceDeltaVisitor() { + + public boolean visit(IResourceDelta delta) throws CoreException { + + switch (delta.getKind()) { + + case IResourceDelta.ADDED: + // do nothing + return false; + + case IResourceDelta.REMOVED: + toRemove.add(delta.getResource()); + return true; + + default: + IResource resource = delta.getResource(); + if (null != resource) { + // filter out non clear case projects + if (resource.getType() == IResource.PROJECT) + return null != ClearCaseProvider.getClearCaseProvider(delta.getResource()); + return true; + } + return false; + } + } + }); + } catch (CoreException ex) { + // refresh on exception + if (IS_AFFECTED_EX == ex) { + refresh(); + } + } + + if (null != getViewer() && null != getViewer().getControl() && !getViewer().getControl().isDisposed()) { + getViewer().getControl().getDisplay().syncExec(new Runnable() { + + public void run() { + if (null != getViewer() && null != getViewer().getControl() && !getViewer().getControl().isDisposed()) { + // remove resources + getViewer().remove(toRemove.toArray()); + } + } + }); + } + } + } + + @Override + public void init(IViewSite site, IMemento memento) throws PartInitException { + super.init(site, memento); + IWorkbenchSiteProgressService progressService = getProgressService(); + if (null != progressService) { + progressService.showBusyForFamily(ClearCasePlugin.FAMILY_CLEARCASE_OPERATION); + } + } + + /** + * Returns the IWorkbenchSiteProgressService for the receiver. + * + * @return IWorkbenchSiteProgressService (maybe <code>null</code>) + */ + protected IWorkbenchSiteProgressService getProgressService() { + return (IWorkbenchSiteProgressService) getSite().getAdapter(IWorkbenchSiteProgressService.class); + } + + protected void handleDoubleClick(DoubleClickEvent event) { + IStructuredSelection selection = (IStructuredSelection) event.getSelection(); + Object element = selection.getFirstElement(); + + TreeViewer viewer = getTreeViewer(); + if (viewer.isExpandable(element)) { + viewer.setExpandedState(element, !viewer.getExpandedState(element)); + } else if (selection.size() == 1 && (element instanceof IResource)) { + // OpenFileAction ofa = new OpenFileAction(getSite().getPage()); + // ofa.selectionChanged((IStructuredSelection) + // viewer.getSelection()); + // if (ofa.isEnabled()) { + // ofa.run(); + // } + } + + } } \ No newline at end of file --- NEW FILE: CheckoutsViewLabelProvider.java --- /* * Copyright (c) 2004 Intershop (www.intershop.de) * Created on Apr 13, 2004 */ package net.sourceforge.eclipseccase.views; import net.sourceforge.eclipseccase.StateCacheFactory; import net.sourceforge.eclipseccase.StateCache; import org.eclipse.core.resources.IResource; import org.eclipse.ui.model.WorkbenchLabelProvider; /** * TODO Provide description for ClearCaseViewLabelProvider. * * @author Gunnar Wagenknecht (g.w...@in...) */ public class CheckoutsViewLabelProvider extends WorkbenchLabelProvider { /* * (non-Javadoc) * * @see * org.eclipse.ui.model.WorkbenchLabelProvider#decorateText(java.lang.String * , java.lang.Object) */ @Override protected String decorateText(String input, Object element) { if (element instanceof IResource) { IResource resource = (IResource) element; StateCache cache = StateCacheFactory.getInstance().get(resource); if (cache.isCheckedOut()) { return resource.getFullPath().toString() + " CHECKEDOUT"; } else if (cache.isHijacked()) { return resource.getFullPath().toString() + " HIJACKED"; } else { return resource.getFullPath().toString() + " (no CC element)"; } } return super.decorateText(input, element); } } |