blob: 1447e6ef7bd9740e79f3206c55e24bae1a663498 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* 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;
}
}