blob: b504ebfa8d6bec3afe50e320b989fcd731955b63 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2009 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.ui.views.markers;
import java.net.URL;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.ResourceManager;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.DecorationOverlayIcon;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.eclipse.ui.internal.util.BundleUtility;
import org.eclipse.ui.internal.views.markers.MarkerSupportInternalUtilities;
/**
* MarkerField is the abstract superclass of the definition of the content
* providers for columns in a Markers View.
*
* @since 3.4
*
*/
public abstract class MarkerField {
private IConfigurationElement configurationElement;
private ResourceManager imageManager;
private ImageRegistry imageRegistry;
/**
* Annotate the image with indicators for whether or not help or quick fix
* are available.
*
* @param item
* the item being decorated
* @param image
* the image being overlaid
* @return Image
*/
public Image annotateImage(MarkerItem item, Image image) {
ImageDescriptor[] descriptors = new ImageDescriptor[5];
if (item.getMarker() != null) {
IMarker marker = item.getMarker();
// If there is no image get the full image rather than the decorated
// one
if (marker != null) {
String contextId = IDE.getMarkerHelpRegistry().getHelp(marker);
if (contextId != null) {
if (image == null)
image = JFaceResources.getImage(Dialog.DLG_IMG_HELP);
else{
descriptors[IDecoration.TOP_RIGHT] =
getIDEImageDescriptor(MarkerSupportInternalUtilities.IMG_MARKERS_HELP_DECORATION_PATH);
}
}
if (IDE.getMarkerHelpRegistry().hasResolutions(marker)) {
if (image == null){
image = getImageManager()
.createImage(
IDEInternalWorkbenchImages
.getImageDescriptor(IDEInternalWorkbenchImages.IMG_ELCL_QUICK_FIX_ENABLED));
}else{
descriptors[IDecoration.BOTTOM_RIGHT] =
getIDEImageDescriptor(MarkerSupportInternalUtilities.IMG_MARKERS_QUICK_FIX_DECORATION_PATH);
}
}
if (descriptors[IDecoration.TOP_RIGHT] != null
|| descriptors[IDecoration.BOTTOM_RIGHT] != null)
image = getImageManager().createImage(
new DecorationOverlayIcon(image, descriptors));
}
}
return image;
}
/**
* Get the workbench image with the given path relative to
* ICON_PATH from the plugins image registry .
* @param relativePath
* @return ImageDescriptor
*/
ImageDescriptor getIDEImageDescriptor(String relativePath){
if(imageRegistry==null){
imageRegistry=IDEWorkbenchPlugin.getDefault().getImageRegistry();
}
ImageDescriptor descriptor=imageRegistry.getDescriptor(relativePath);
if(descriptor==null){
descriptor=IDEWorkbenchPlugin.getIDEImageDescriptor(relativePath);
imageRegistry.put(relativePath, descriptor);
}
return descriptor;
}
/**
* Compare item1 and item2 for sorting purposes.
*
* @param item1
* @param item2
* @return Either:
* <li>a negative number if the value of item1 is less than the
* value of item2 for this field.
* <li><code>0</code> if the value of item1 and the value of
* item2 are equal for this field.
* <li>a positive number if the value of item1 is greater than the
* value of item2 for this field.
*/
public int compare(MarkerItem item1, MarkerItem item2) {
return getValue(item1).compareTo(getValue(item2));
}
/**
* @return The image to be displayed in the column header for this field or
* <code>null<code>.
*/
public Image getColumnHeaderImage() {
String path = configurationElement
.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_ICON);
if (path == null)
return null;
URL url = BundleUtility.find(configurationElement.getContributor()
.getName(), path);
if (url == null)
return null;
return getImageManager().createImageWithDefault(
ImageDescriptor.createFromURL(url));
}
/**
* Return the text to be displayed in the column header for this field.
*
* @return String
* @see #getColumnTooltipText() this is the default column tooltip text
*/
public String getColumnHeaderText() {
return getName();
}
/**
* Return the name of this field.
*
* @return String
* @since 3.6
*/
public String getName() {
return configurationElement
.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_NAME);
}
/**
* Return the text for the column tooltip.
*
* @return String
* @see #getColumnHeaderText()
*/
public String getColumnTooltipText() {
return getColumnHeaderText();
}
/**
* Get the configuration element for the receiver. This is used by the
* markerSupport internals to retreive the values defined in the extenstion.
*
* @return IConfigurationElement
*/
public final IConfigurationElement getConfigurationElement() {
return configurationElement;
}
/**
* Get the number of characters that should be reserved for the receiver.
*
* @param control
* the control to scale from
* @return int
*/
public int getDefaultColumnWidth(Control control) {
return 15 * MarkerSupportInternalUtilities.getFontWidth(control);
}
/**
* Return the editing support for entries for this field. Return null if it
* cannot be in-line edited.
*
* @param viewer
* the viewer this will be applied to
* @return {@link EditingSupport} or <code>null</code>.
*/
public EditingSupport getEditingSupport(ColumnViewer viewer) {
return null;
}
/**
* Return the image manager used by the receiver.
*
* @return ResourceManager
*/
protected ResourceManager getImageManager() {
if (imageManager == null)
return IDEWorkbenchPlugin.getDefault().getResourceManager();
return imageManager;
}
/**
* @param item
* @return The String value of the object for this particular field to be
* displayed to the user.
*/
public abstract String getValue(MarkerItem item);
/**
* Set the configuration element used by the receiver.
*
* @param element
*/
public final void setConfigurationElement(IConfigurationElement element) {
configurationElement = element;
}
/**
* Set the imageManager. This is not normally required to be send if using a
* {@link MarkerSupportView} as this is done for you.
*
* @param manager
*/
public final void setImageManager(ResourceManager manager) {
this.imageManager = manager;
}
/**
* Update the contents of the cell.
*
* @param cell
*/
public void update(ViewerCell cell) {
cell.setText(getValue((MarkerItem) cell.getElement()));
}
}