blob: 3270ac7d3c44dec5827e386d4c9fa7155214583d [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.history;
import com.ibm.icu.text.DateFormat;
import com.ibm.icu.text.SimpleDateFormat;
import java.text.Format;
import java.util.Date;
import java.util.Locale;
import org.eclipse.core.runtime.Assert;
import org.eclipse.ltk.core.refactoring.RefactoringDescriptorProxy;
import org.eclipse.ltk.core.refactoring.history.RefactoringHistory;
import org.eclipse.ltk.internal.ui.refactoring.Messages;
import org.eclipse.ltk.internal.ui.refactoring.RefactoringPluginImages;
import org.eclipse.ltk.internal.ui.refactoring.RefactoringUIMessages;
import org.eclipse.ltk.internal.ui.refactoring.history.RefactoringDescriptorImageDescriptor;
import org.eclipse.ltk.internal.ui.refactoring.history.RefactoringHistoryDate;
import org.eclipse.ltk.internal.ui.refactoring.history.RefactoringHistoryEntry;
import org.eclipse.ltk.internal.ui.refactoring.history.RefactoringHistoryNode;
import org.eclipse.ltk.internal.ui.refactoring.history.RefactoringImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.jface.viewers.LabelProvider;
/**
* Label provider to display a refactoring history. This label provider can be
* used in conjunction with {@link RefactoringHistoryContentProvider} or
* directly on {@link RefactoringDescriptorProxy} and {@link RefactoringHistory}
* elements.
* <p>
* Note: this class is not indented to be subclassed outside the refactoring
* framework.
* </p>
*
* @see IRefactoringHistoryControl
* @see RefactoringHistoryControlConfiguration
* @see RefactoringHistoryContentProvider
*
* @since 3.2
*/
public class RefactoringHistoryLabelProvider extends LabelProvider {
/** The collection image */
private final Image fCollectionImage;
/** The container image */
private final Image fContainerImage;
/** The control configuration to use */
private final RefactoringHistoryControlConfiguration fControlConfiguration;
/** The current locale to use */
private final Locale fCurrentLocale;
/** The cached date format, or <code>null</code> */
private DateFormat fDateFormat= null;
/** The decorated element image */
private Image fDecoratedElementImage= null;
/** The decorated item image */
private Image fDecoratedItemImage= null;
/** The element image */
private final Image fElementImage;
/** The item image */
private final Image fItemImage;
/**
* Creates a new refactoring history label provider.
*
* @param configuration
* the refactoring history control configuration to use
*/
public RefactoringHistoryLabelProvider(final RefactoringHistoryControlConfiguration configuration) {
Assert.isNotNull(configuration);
fControlConfiguration= configuration;
fItemImage= RefactoringPluginImages.DESC_OBJS_REFACTORING.createImage();
fContainerImage= RefactoringPluginImages.DESC_OBJS_REFACTORING_DATE.createImage();
fElementImage= RefactoringPluginImages.DESC_OBJS_REFACTORING_TIME.createImage();
fCollectionImage= RefactoringPluginImages.DESC_OBJS_REFACTORING_COLL.createImage();
fCurrentLocale= new Locale(RefactoringUIMessages.RefactoringHistoryLabelProvider_label_language, RefactoringUIMessages.RefactoringHistoryLabelProvider_label_country, RefactoringUIMessages.RefactoringHistoryLabelProvider_label_variant);
}
/**
* Decorates the image for the specified element.
*
* @param image
* the image to decorate
* @param element
* the associated element
* @return the decorated image
*/
private Image decorateImage(final Image image, final Object element) {
Image result= image;
RefactoringDescriptorProxy extended= null;
if (element instanceof RefactoringHistoryEntry)
extended= ((RefactoringHistoryEntry) element).getDescriptor();
else if (element instanceof RefactoringDescriptorProxy)
extended= (RefactoringDescriptorProxy) element;
if (extended != null) {
final String project= extended.getProject();
if (project == null || "".equals(project)) { //$NON-NLS-1$
if (image == fElementImage && fDecoratedElementImage != null)
result= fDecoratedElementImage;
else if (image == fItemImage && fDecoratedItemImage != null)
result= fDecoratedItemImage;
else {
final Rectangle bounds= image.getBounds();
result= new RefactoringDescriptorImageDescriptor(new RefactoringImageDescriptor(image), RefactoringDescriptorImageDescriptor.WORKSPACE, new Point(bounds.width, bounds.height)).createImage();
if (image == fElementImage)
fDecoratedElementImage= result;
else if (image == fItemImage)
fDecoratedItemImage= result;
}
}
}
return result;
}
/**
* {@inheritDoc}
*/
public void dispose() {
if (fContainerImage != null)
fContainerImage.dispose();
if (fCollectionImage != null)
fCollectionImage.dispose();
if (fElementImage != null)
fElementImage.dispose();
if (fItemImage != null)
fItemImage.dispose();
if (fDecoratedElementImage != null)
fDecoratedElementImage.dispose();
if (fDecoratedItemImage != null)
fDecoratedItemImage.dispose();
}
/**
* Returns a cached date format for the current locale.
*
* @return a cached date format for the current locale
*/
private DateFormat getDateFormat() {
if (fDateFormat == null)
fDateFormat= DateFormat.getTimeInstance(DateFormat.SHORT);
return fDateFormat;
}
/**
* Returns the label for the specified refactoring descriptor.
*
* @param descriptor
* the refactoring descriptor
* @return the label of the descriptor
*/
private String getDescriptorLabel(final RefactoringDescriptorProxy descriptor) {
if (fControlConfiguration.isTimeDisplayed()) {
final long stamp= descriptor.getTimeStamp();
if (stamp >= 0)
return Messages.format(fControlConfiguration.getRefactoringPattern(), new String[] { getDateFormat().format(new Date(stamp)), descriptor.getDescription()});
}
return descriptor.getDescription();
}
/**
* {@inheritDoc}
*/
public Image getImage(final Object element) {
Image image= null;
final boolean time= fControlConfiguration.isTimeDisplayed();
if (element instanceof RefactoringHistoryEntry || element instanceof RefactoringDescriptorProxy)
image= time ? fElementImage : fItemImage;
else
image= time ? fContainerImage : fCollectionImage;
return decorateImage(image, element);
}
/**
* {@inheritDoc}
*/
public String getText(Object element) {
if (element instanceof RefactoringHistoryEntry) {
final RefactoringHistoryEntry entry= (RefactoringHistoryEntry) element;
return getDescriptorLabel(entry.getDescriptor());
} else if (element instanceof RefactoringDescriptorProxy) {
return getDescriptorLabel((RefactoringDescriptorProxy) element);
} else if (element instanceof RefactoringHistory) {
return RefactoringUIMessages.RefactoringHistoryControlConfiguration_collection_label;
} else if (element instanceof RefactoringHistoryNode) {
final RefactoringHistoryNode node= (RefactoringHistoryNode) element;
final StringBuffer buffer= new StringBuffer(32);
final int kind= node.getKind();
switch (kind) {
case RefactoringHistoryNode.COLLECTION:
buffer.append(fControlConfiguration.getCollectionLabel());
break;
default: {
if (node instanceof RefactoringHistoryDate) {
final RefactoringHistoryDate date= (RefactoringHistoryDate) node;
final Date stamp= new Date(date.getTimeStamp());
Format format= null;
String pattern= ""; //$NON-NLS-1$
switch (kind) {
case RefactoringHistoryNode.THIS_WEEK:
pattern= fControlConfiguration.getThisWeekPattern();
format= new SimpleDateFormat(RefactoringUIMessages.RefactoringHistoryLabelProvider_this_week_format, fCurrentLocale);
break;
case RefactoringHistoryNode.LAST_WEEK:
pattern= fControlConfiguration.getLastWeekPattern();
format= new SimpleDateFormat(RefactoringUIMessages.RefactoringHistoryLabelProvider_last_week_format, fCurrentLocale);
break;
case RefactoringHistoryNode.WEEK:
pattern= fControlConfiguration.getWeekPattern();
format= new SimpleDateFormat(RefactoringUIMessages.RefactoringHistoryLabelProvider_week_format, fCurrentLocale);
break;
case RefactoringHistoryNode.YEAR:
pattern= fControlConfiguration.getYearPattern();
format= new SimpleDateFormat(RefactoringUIMessages.RefactoringHistoryLabelProvider_year_format, fCurrentLocale);
break;
case RefactoringHistoryNode.THIS_MONTH:
pattern= fControlConfiguration.getThisMonthPattern();
format= new java.text.SimpleDateFormat(RefactoringUIMessages.RefactoringHistoryLabelProvider_this_month_format, fCurrentLocale);
break;
case RefactoringHistoryNode.LAST_MONTH:
pattern= fControlConfiguration.getLastMonthPattern();
format= new java.text.SimpleDateFormat(RefactoringUIMessages.RefactoringHistoryLabelProvider_last_month_format, fCurrentLocale);
break;
case RefactoringHistoryNode.MONTH:
pattern= fControlConfiguration.getMonthPattern();
format= new java.text.SimpleDateFormat(RefactoringUIMessages.RefactoringHistoryLabelProvider_month_format, fCurrentLocale);
break;
case RefactoringHistoryNode.DAY:
pattern= fControlConfiguration.getDayPattern();
final int type= node.getParent().getKind();
if (type == RefactoringHistoryNode.THIS_WEEK || type == RefactoringHistoryNode.LAST_WEEK) {
final SimpleDateFormat simple= new SimpleDateFormat(RefactoringUIMessages.RefactoringHistoryLabelProvider_day_format, fCurrentLocale);
buffer.append(Messages.format(RefactoringUIMessages.RefactoringHistoryControlConfiguration_day_detailed_pattern, new String[] { simple.format(stamp), DateFormat.getDateInstance().format(stamp)}));
} else
format= DateFormat.getDateInstance();
break;
case RefactoringHistoryNode.YESTERDAY:
pattern= fControlConfiguration.getYesterdayPattern();
format= DateFormat.getDateInstance();
break;
case RefactoringHistoryNode.TODAY:
pattern= fControlConfiguration.getTodayPattern();
format= DateFormat.getDateInstance();
break;
}
if (format != null)
buffer.append(Messages.format(pattern,format.format(stamp)));
}
}
}
return buffer.toString();
}
return super.getText(element);
}
}