blob: 00fc1678e33a734895bcab7e11ed127f2401869f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 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.ltk.ui.refactoring.model;
import org.eclipse.team.core.diff.IDiff;
import org.eclipse.team.core.diff.IThreeWayDiff;
import org.eclipse.team.ui.mapping.SynchronizationLabelProvider;
import org.eclipse.ltk.core.refactoring.RefactoringDescriptorProxy;
import org.eclipse.ltk.core.refactoring.history.RefactoringHistory;
import org.eclipse.ltk.internal.ui.refactoring.model.RefactoringDescriptorDiff;
import org.eclipse.ltk.internal.ui.refactoring.model.RefactoringDescriptorSynchronizationProxy;
import org.eclipse.ltk.internal.ui.refactoring.model.RefactoringHistoryDiff;
/**
* Partial implementation of a refactoring-aware synchronization label provider.
* <p>
* This class overrides several methods from
* {@link SynchronizationLabelProvider} to customize the rendering of
* refactoring history objects in team synchronization views.
* </p>
* <p>
* Note: this class is designed to be extended by clients. Programming language
* implementers who need refactoring support in a synchronization label provider
* used in team synchronization views may use this class as a basis for
* refactoring-aware synchronization label providers.
* </p>
*
* @see org.eclipse.team.ui.mapping.SynchronizationLabelProvider
*
* @since 3.2
*/
public abstract class AbstractSynchronizationLabelProvider extends SynchronizationLabelProvider {
/**
* {@inheritDoc}
*/
protected String decorateText(final String base, final Object element) {
if (element instanceof RefactoringDescriptorProxy)
return base;
return super.decorateText(base, element);
}
/**
* {@inheritDoc}
*/
protected IDiff getDiff(final Object element) {
if (element instanceof RefactoringDescriptorProxy)
return new RefactoringDescriptorDiff((RefactoringDescriptorProxy) element, getKind(element), getDirection(element));
else if (element instanceof RefactoringHistory)
return new RefactoringHistoryDiff((RefactoringHistory) element, getKind(element), getDirection(element));
return super.getDiff(element);
}
/**
* Returns the direction of the difference of the specified refactoring
* history object.
* <p>
* The result of this method is used to compose an icon which reflects the
* direction of the difference between the two or three versions of the
* refactoring history object.
* </p>
*
* @param element
* the refactoring history object
* @return the direction of the difference
*
* @see IThreeWayDiff#getDirection()
*/
protected int getDirection(Object element) {
if (element instanceof RefactoringHistory) {
final RefactoringHistory history= (RefactoringHistory) element;
final RefactoringDescriptorProxy[] descriptors= history.getDescriptors();
int direction= 0;
if (descriptors.length > 0) {
if (descriptors[0] instanceof RefactoringDescriptorSynchronizationProxy) {
final RefactoringDescriptorSynchronizationProxy proxy= (RefactoringDescriptorSynchronizationProxy) descriptors[0];
direction= proxy.getDirection();
}
}
for (int index= 1; index < descriptors.length; index++) {
if (descriptors[index] instanceof RefactoringDescriptorSynchronizationProxy) {
final RefactoringDescriptorSynchronizationProxy proxy= (RefactoringDescriptorSynchronizationProxy) descriptors[index];
if (proxy.getDirection() != direction)
return IThreeWayDiff.CONFLICTING;
}
}
return IDiff.NO_CHANGE;
} else if (element instanceof RefactoringDescriptorSynchronizationProxy) {
final RefactoringDescriptorSynchronizationProxy proxy= (RefactoringDescriptorSynchronizationProxy) element;
return proxy.getDirection();
}
return IThreeWayDiff.CONFLICTING;
}
/**
* Returns the kind of difference between the three sides ancestor, left and
* right of the specified refactoring history object.
* <p>
* The result of this method is used to compose an icon which reflects the
* kind of difference between the two or three versions of the refactoring
* history object.
* </p>
*
* @param element
* the refactoring history object
* @return the kind of difference
*
* @see IDiff#getKind()
*/
protected int getKind(Object element) {
if (element instanceof RefactoringHistory)
return IDiff.CHANGE;
return IDiff.ADD;
}
}