diff options
Diffstat (limited to 'bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSParticipantLabelDecorator.java')
-rw-r--r-- | bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSParticipantLabelDecorator.java | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSParticipantLabelDecorator.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSParticipantLabelDecorator.java new file mode 100644 index 000000000..0a769cb20 --- /dev/null +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSParticipantLabelDecorator.java @@ -0,0 +1,230 @@ +/******************************************************************************* + * Copyright (c) 2000, 2006 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.subscriber; + +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.jface.viewers.*; +import org.eclipse.swt.graphics.Image; +import org.eclipse.team.core.TeamException; +import org.eclipse.team.core.diff.IDiff; +import org.eclipse.team.core.history.IFileRevision; +import org.eclipse.team.core.mapping.ISynchronizationContext; +import org.eclipse.team.core.subscribers.Subscriber; +import org.eclipse.team.core.subscribers.SubscriberMergeContext; +import org.eclipse.team.core.synchronize.SyncInfo; +import org.eclipse.team.core.variants.IResourceVariant; +import org.eclipse.team.internal.ccvs.core.CVSException; +import org.eclipse.team.internal.ccvs.core.mapping.ChangeSetModelProvider; +import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; +import org.eclipse.team.internal.ccvs.core.resources.RemoteFile; +import org.eclipse.team.internal.ccvs.ui.*; +import org.eclipse.team.internal.ccvs.ui.mappings.ModelCompareParticipant; +import org.eclipse.team.internal.core.mapping.SyncInfoToDiffConverter; +import org.eclipse.team.internal.core.subscribers.DiffChangeSet; +import org.eclipse.team.internal.ui.Utils; +import org.eclipse.team.internal.ui.synchronize.SyncInfoModelElement; +import org.eclipse.team.ui.TeamUI; +import org.eclipse.team.ui.mapping.SynchronizationStateTester; +import org.eclipse.team.ui.synchronize.*; + + +public class CVSParticipantLabelDecorator extends LabelProvider implements IPropertyChangeListener, ILabelDecorator { + private ISynchronizePageConfiguration configuration; + private SynchronizationStateTester tester = new SynchronizationStateTester() { + public int getState(Object element, int stateMask, IProgressMonitor monitor) throws CoreException { + // Disable state decoration + return IDiff.NO_CHANGE; + } + }; + + public CVSParticipantLabelDecorator(ISynchronizePageConfiguration configuration) { + this.configuration = configuration; + // Listen for decorator changed to refresh the viewer's labels. + CVSUIPlugin.addPropertyChangeListener(this); + TeamUI.addPropertyChangeListener(this); + } + + public String decorateText(String input, Object elementOrPath) { + if (!isEnabledFor(elementOrPath)) + return input; + try { + String text = input; + IResource resource = getResource(elementOrPath); + if (resource != null && resource.getType() != IResource.ROOT) { + // Prepare the decoration but substitute revision and hide dirty indicator + CVSDecoration decoration = getDecoration(resource); + decoration.setRevision(getRevisionNumber(elementOrPath)); + decoration.compute(); + // Update label + StringBuffer output = new StringBuffer(25); + if (decoration.getPrefix() != null) { + output.append(decoration.getPrefix()); + } + output.append(text); + if (decoration.getSuffix() != null) { + output.append(decoration.getSuffix()); + } + return output.toString(); + } + return text; + } catch (CoreException e) { + return input; + } + } + + protected IResource getResource(Object element) { + if (element instanceof ISynchronizeModelElement) + return ((ISynchronizeModelElement) element).getResource(); + return Utils.getResource(internalGetElement(element)); + } + + protected CVSDecoration getDecoration(IResource resource) throws CoreException { + return CVSLightweightDecorator.decorate(resource, tester); + } + + public Image decorateImage(Image base, Object element) { + return base; + } + public void propertyChange(PropertyChangeEvent event) { + if (needsRefresh(event)) { + Viewer viewer = configuration.getPage().getViewer(); + if(viewer instanceof StructuredViewer && !viewer.getControl().isDisposed()) { + ((StructuredViewer)viewer).refresh(true); + } + } + } + + protected boolean needsRefresh(PropertyChangeEvent event) { + final String property= event.getProperty(); + return property.equals(CVSUIPlugin.P_DECORATORS_CHANGED) || property.equals(TeamUI.GLOBAL_FILE_TYPES_CHANGED); + } + public void dispose() { + CVSUIPlugin.removePropertyChangeListener(this); + TeamUI.removePropertyChangeListener(this); + } + + protected String getRevisionNumber(Object elementOrPath) { + IResource resource = getResource(elementOrPath); + if (resource != null && resource.getType() == IResource.FILE) { + IResourceVariant local; + try { + local = (IResourceVariant) CVSWorkspaceRoot.getRemoteResourceFor(resource); + } catch (CVSException e) { + local = null; + } + if(local == null) { + local = getBase(elementOrPath); + } + String localRevision = getRevisionString(local); + StringBuffer revisionString = new StringBuffer(); + IResourceVariant remote = getRemote(elementOrPath); + String remoteRevision = getRevisionString(remote); + if(localRevision != null) { + revisionString.append(localRevision); + } + if(remoteRevision != null) { + revisionString.append( (localRevision != null ? " - " : "") + remoteRevision); //$NON-NLS-1$ //$NON-NLS-2$ + } + return revisionString.toString(); + } + return null; + } + + private boolean isEnabledFor(Object elementOrPath) { + return !isCompareWithChangeSets() || elementOrPath instanceof TreePath; + } + + private boolean isCompareWithChangeSets() { + String id = (String)configuration.getProperty(ModelSynchronizeParticipant.P_VISIBLE_MODEL_PROVIDER); + return configuration.getParticipant() instanceof ModelCompareParticipant && id.equals(ChangeSetModelProvider.ID); + } + + private SyncInfo getSyncInfo(Object element) { + if (element instanceof SyncInfoModelElement) { + SyncInfoModelElement sime = (SyncInfoModelElement) element; + return sime.getSyncInfo(); + } + IResource resource = getResource(element); + if (resource != null) { + ISynchronizeParticipant participant = configuration.getParticipant(); + if (participant instanceof ModelSynchronizeParticipant) { + ModelSynchronizeParticipant msp = (ModelSynchronizeParticipant) participant; + ISynchronizationContext context = msp.getContext(); + if (context instanceof SubscriberMergeContext) { + SubscriberMergeContext smc = (SubscriberMergeContext) context; + Subscriber subscriber = smc.getSubscriber(); + try { + return subscriber.getSyncInfo(resource); + } catch (TeamException e) { + CVSUIPlugin.log(e); + } + } + } + } + return null; + } + + private IResourceVariant getBase(Object element) { + if (element instanceof TreePath) { + TreePath tp = (TreePath) element; + IDiff diff = getDiff(tp); + IFileRevision revision = Utils.getBase(diff); + return SyncInfoToDiffConverter.asResourceVariant(revision); + } + SyncInfo info = getSyncInfo(element); + if (info != null) + return info.getBase(); + return null; + } + + private IResourceVariant getRemote(Object element) { + if (element instanceof TreePath) { + TreePath tp = (TreePath) element; + IDiff diff = getDiff(tp); + IFileRevision revision = Utils.getRemote(diff); + return SyncInfoToDiffConverter.asResourceVariant(revision); + } + SyncInfo info = getSyncInfo(element); + if (info != null) + return info.getRemote(); + return null; + } + + private IDiff getDiff(TreePath tp) { + Object first = tp.getFirstSegment(); + Object last = tp.getLastSegment(); + IResource resource = Utils.getResource(last); + if (first instanceof DiffChangeSet && resource != null) { + DiffChangeSet dcs = (DiffChangeSet) first; + return dcs.getDiffTree().getDiff(resource); + } + return null; + } + + private String getRevisionString(IResourceVariant remoteFile) { + if(remoteFile instanceof RemoteFile) { + return ((RemoteFile)remoteFile).getRevision(); + } + return null; + } + + private Object internalGetElement(Object elementOrPath) { + if (elementOrPath instanceof TreePath) { + TreePath tp = (TreePath) elementOrPath; + return tp.getLastSegment(); + } + return elementOrPath; + } +} |