blob: a989ed50c71f45d2cf3d84b8af1452bae27f158c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 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.mappings;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.resources.*;
import org.eclipse.core.resources.mapping.ResourceTraversal;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.team.core.diff.IDiffTree;
import org.eclipse.team.internal.ccvs.core.mapping.ChangeSetModelProvider;
import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
import org.eclipse.team.internal.ccvs.ui.ICVSUIConstants;
import org.eclipse.team.internal.ccvs.ui.subscriber.CVSParticipantLabelDecorator;
import org.eclipse.team.internal.core.subscribers.*;
import org.eclipse.team.internal.ui.mapping.ResourceModelLabelProvider;
import org.eclipse.team.internal.ui.synchronize.ChangeSetCapability;
import org.eclipse.team.ui.mapping.ITeamContentProviderManager;
import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration;
import org.eclipse.team.ui.synchronize.ModelSynchronizeParticipant;
import org.eclipse.ui.navigator.ICommonContentExtensionSite;
public class ChangeSetLabelProvider extends ResourceModelLabelProvider {
private CVSParticipantLabelDecorator decorator;
public void init(ICommonContentExtensionSite site) {
super.init(site);
ISynchronizePageConfiguration configuration = getConfiguration();
if (isCompare(configuration)) {
decorator = new CVSParticipantLabelDecorator(configuration);
}
}
private ISynchronizePageConfiguration getConfiguration() {
return (ISynchronizePageConfiguration)getExtensionSite().getExtensionStateModel().getProperty(ITeamContentProviderManager.P_SYNCHRONIZATION_PAGE_CONFIGURATION);
}
private boolean isCompare(ISynchronizePageConfiguration configuration) {
return configuration.getParticipant() instanceof ModelCompareParticipant;
}
public String getText(Object element) {
String text = super.getText(element);
if (decorator != null && isChangeSetsEnabled())
text = decorator.decorateText(text, element);
return text;
}
private boolean isChangeSetsEnabled() {
String id = (String)getConfiguration().getProperty(ModelSynchronizeParticipant.P_VISIBLE_MODEL_PROVIDER);
return id.equals(ChangeSetModelProvider.ID);
}
protected String getDelegateText(Object elementOrPath) {
Object element = internalGetElement(elementOrPath);
if (element instanceof DiffChangeSet) {
DiffChangeSet set = (DiffChangeSet) element;
return set.getName();
}
return super.getDelegateText(elementOrPath);
}
protected Image getDelegateImage(Object elementOrPath) {
Object element = internalGetElement(elementOrPath);
if (element instanceof DiffChangeSet) {
return getChangeSetImage();
}
return super.getDelegateImage(elementOrPath);
}
private Image getChangeSetImage() {
return getImageManager().getImage(CVSUIPlugin.getPlugin().getImageDescriptor(ICVSUIConstants.IMG_CHANGELOG));
}
public void dispose() {
if (decorator != null)
decorator.dispose();
super.dispose();
}
protected boolean isBusy(Object elementOrPath) {
Object element = internalGetElement(elementOrPath);
if (element instanceof DiffChangeSet) {
DiffChangeSet dcs = (DiffChangeSet) element;
IResource[] resources = dcs.getResources();
for (int i = 0; i < resources.length; i++) {
IResource resource = resources[i];
if (getContext().getDiffTree().getProperty(resource.getFullPath(), IDiffTree.P_BUSY_HINT))
return true;
}
return false;
}
return super.isBusy(elementOrPath);
}
protected boolean hasDecendantConflicts(Object elementOrPath) {
Object element = internalGetElement(elementOrPath);
if (element instanceof DiffChangeSet) {
DiffChangeSet dcs = (DiffChangeSet) element;
IResource[] resources = dcs.getResources();
for (int i = 0; i < resources.length; i++) {
IResource resource = resources[i];
if (getContext().getDiffTree().getProperty(resource.getFullPath(), IDiffTree.P_HAS_DESCENDANT_CONFLICTS))
return true;
}
return false;
}
if (elementOrPath instanceof TreePath && element instanceof IResource) {
DiffChangeSet set = internalGetChangeSet(elementOrPath);
if (set != null) {
ResourceTraversal[] traversals = getTraversalCalculator().getTraversals(set, (TreePath)elementOrPath);
return (getContext().getDiffTree().hasMatchingDiffs(traversals, CONFLICT_FILTER));
}
}
return super.hasDecendantConflicts(elementOrPath);
}
private DiffChangeSet internalGetChangeSet(Object elementOrPath) {
if (elementOrPath instanceof TreePath) {
TreePath tp = (TreePath) elementOrPath;
Object o = tp.getFirstSegment();
if (o instanceof DiffChangeSet) {
return (DiffChangeSet) o;
}
}
return null;
}
protected int getMarkerSeverity(Object elementOrPath) {
Object element = internalGetElement(elementOrPath);
if (element instanceof DiffChangeSet) {
DiffChangeSet dcs = (DiffChangeSet) element;
Set projects = new HashSet();
IResource[] resources = dcs.getResources();
int severity = -1;
for (int i = 0; i < resources.length; i++) {
IResource resource = resources[i];
IProject project = resource.getProject();
if (!projects.contains(project)) {
projects.add(project);
int next = super.getMarkerSeverity(project);
if (next == IMarker.SEVERITY_ERROR)
return IMarker.SEVERITY_ERROR;
if (next == IMarker.SEVERITY_WARNING)
severity = next;
}
}
return severity;
}
return super.getMarkerSeverity(elementOrPath);
}
protected void updateLabels(Object[] elements) {
super.updateLabels(addSetsContainingElements(elements));
}
private Object[] addSetsContainingElements(Object[] elements) {
Set result = new HashSet();
for (int i = 0; i < elements.length; i++) {
Object object = elements[i];
result.add(object);
if (object instanceof IProject) {
IProject project = (IProject) object;
ChangeSet[] sets = getSetsContaing(project);
for (int j = 0; j < sets.length; j++) {
ChangeSet set = sets[j];
result.add(set);
}
}
}
return result.toArray();
}
private ChangeSet[] getSetsContaing(IProject project) {
return getContentProvider().getSetsShowingPropogatedStateFrom(project.getFullPath());
}
private ChangeSetContentProvider getContentProvider() {
return (ChangeSetContentProvider)getExtensionSite().getExtension().getContentProvider();
}
private Object internalGetElement(Object elementOrPath) {
if (elementOrPath instanceof TreePath) {
TreePath tp = (TreePath) elementOrPath;
return tp.getLastSegment();
}
return elementOrPath;
}
public Font getFont(Object element) {
element = internalGetElement(element);
if (element instanceof ActiveChangeSet && isDefaultActiveSet((ActiveChangeSet)element)) {
return JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT);
}
return super.getFont(element);
}
private boolean isDefaultActiveSet(ActiveChangeSet set) {
ChangeSetCapability changeSetCapability = getContentProvider().getChangeSetCapability();
if (changeSetCapability != null) {
ActiveChangeSetManager activeChangeSetManager = changeSetCapability.getActiveChangeSetManager();
if (activeChangeSetManager != null)
return activeChangeSetManager.isDefault(set);
}
return false;
}
}