blob: e5ad04ab4f460d68d75ea195d87bf335c71f609f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.views.tasklist;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.DateFormat;
import java.text.MessageFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.swt.graphics.Image;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.util.Assert;
import org.eclipse.jface.viewers.IBasicPropertyConstants;
/**
* Utility class for accessing marker attributes.
*/
class MarkerUtil implements IMarkerConstants {
private static Map imageDescriptors;
private static ImageRegistry imageRegistry = new ImageRegistry();
private static MessageFormat line =
new MessageFormat(TaskListMessages.getString("TaskList.line")); //$NON-NLS-1$;
private static MessageFormat lineAndLocation =
new MessageFormat(TaskListMessages.getString("TaskList.lineAndLocation")); //$NON-NLS-1$
static {
createImageDescriptors();
}
/**
* Don't allow instantiation.
*/
private MarkerUtil() {
}
/**
* Creates an image descriptor for the image file referred to by the
* given relative path (relative to the icons directory for the plug-in).
*/
static ImageDescriptor createImageDescriptor(String relativePath) {
String iconPath = "icons/full/";//$NON-NLS-1$
try {
URL URL_BASIC = TaskList.getPlugin().getDescriptor().getInstallURL();
URL url = new URL(URL_BASIC, iconPath + relativePath);
return ImageDescriptor.createFromURL(url);
} catch (MalformedURLException e) {
Assert.isTrue(false);
return null;
}
}
/**
* Creates the map of image descriptors.
*/
static void createImageDescriptors() {
String LOCAL = "clcl16/";//$NON-NLS-1$
String LOCAL_GREY = "elcl16/";//$NON-NLS-1$
String LOCAL_DISABLED = "dlcl16/";//$NON-NLS-1$
String OBJ = "obj16/";//$NON-NLS-1$
imageDescriptors = new HashMap(51);
imageDescriptors.put("header_complete", createImageDescriptor("obj16/header_complete.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("header_priority", createImageDescriptor("obj16/header_priority.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("task", createImageDescriptor(OBJ + "taskmrk_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("error", createImageDescriptor(OBJ + "error_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("warn", createImageDescriptor(OBJ + "warn_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("info", createImageDescriptor(OBJ + "info_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("hprio", createImageDescriptor(OBJ + "hprio_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("lprio", createImageDescriptor(OBJ + "lprio_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("complete_tsk", createImageDescriptor(OBJ + "complete_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("incomplete_tsk", createImageDescriptor(OBJ + "incomplete_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("gotoobj", createImageDescriptor(LOCAL + "gotoobj_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("gotoobj_grey", createImageDescriptor(LOCAL_GREY + "gotoobj_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("addtsk", createImageDescriptor(LOCAL + "addtsk_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("addtsk_grey", createImageDescriptor(LOCAL_GREY + "addtsk_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("addtsk_disabled", createImageDescriptor(LOCAL_DISABLED + "addtsk_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("showcomplete", createImageDescriptor(LOCAL + "showcomplete_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("selected_mode", createImageDescriptor(LOCAL + "selected_mode.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("selected_mode_grey", createImageDescriptor(LOCAL_GREY + "selected_mode.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("selected_mode_disabled", createImageDescriptor(LOCAL_DISABLED + "selected_mode.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("showchild_mode", createImageDescriptor(LOCAL + "showchild_mode.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("showchild_mode_grey", createImageDescriptor(LOCAL_GREY + "showchild_mode.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("showchild_mode_disabled", createImageDescriptor(LOCAL_DISABLED + "showchild_mode.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("showerr_grey", createImageDescriptor(LOCAL_GREY + "showerr_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("showerr_disabled", createImageDescriptor(LOCAL_DISABLED + "showerr_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("showwarn_grey", createImageDescriptor(LOCAL_GREY + "showwarn_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("showwarn_disabled", createImageDescriptor(LOCAL_DISABLED + "showwarn_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("showtsk_grey", createImageDescriptor(LOCAL_GREY + "showtsk_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("showtsk_disabled", createImageDescriptor(LOCAL_DISABLED + "showtsk_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
imageDescriptors.put("filter", createImageDescriptor(LOCAL + "filter_ps.gif"));//$NON-NLS-2$//$NON-NLS-1$
}
/**
* Returns the ending character offset of the given marker.
*/
public static int getCharEnd(IMarker marker) {
return marker.getAttribute(IMarker.CHAR_END, -1);
}
/**
* Returns the starting character offset of the given marker.
*/
public static int getCharStart(IMarker marker) {
return marker.getAttribute(IMarker.CHAR_START, -1);
}
/**
* Returns the icon to be used in the tasklist
* for the complete state of a task. Returns null
* for markers that are not tasks.
*/
public static Image getCompleteImage(IMarker marker) {
if (isMarkerType(marker, IMarker.TASK)) {
if (isComplete(marker))
return getImage("complete_tsk");//$NON-NLS-1$
else if (!isReadOnly(marker)) // don't show a check box for read-only tasks
return getImage("incomplete_tsk");//$NON-NLS-1$
}
return null;
}
/**
* Returns the text to be used for the complete state of a task.
* Returns the empty string for markers that are not tasks.
*/
public static String getCompleteText(IMarker marker) {
if (isMarkerType(marker, IMarker.TASK)) {
if (isComplete(marker))
return TaskListMessages.getString("TaskList.completed"); //$NON-NLS-1$
else
return TaskListMessages.getString("TaskList.notCompleted"); //$NON-NLS-1$
}
return ""; //$NON-NLS-1$
}
/**
* Returns the text to be used for the kind of marker.
*/
public static String getKindText(IMarker marker) {
if (isMarkerType(marker, IMarker.TASK)) {
return TaskListMessages.getString("TaskList.task"); //$NON-NLS-1$
}
switch (getSeverity(marker)) {
case IMarker.SEVERITY_ERROR:
return TaskListMessages.getString("TaskList.error"); //$NON-NLS-1$
case IMarker.SEVERITY_WARNING:
return TaskListMessages.getString("TaskList.warning"); //$NON-NLS-1$
case IMarker.SEVERITY_INFO:
return TaskListMessages.getString("TaskList.info"); //$NON-NLS-1$
}
return ""; //$NON-NLS-1$
}
/**
* Returns the container name if it is defined, or empty string if not.
*/
public static String getContainerName(IMarker marker) {
IPath path = marker.getResource().getFullPath();
int n = path.segmentCount() - 1; // n is the number of segments in container, not path
if (n <= 0)
return ""; //$NON-NLS-1$
int len = 0;
for (int i = 0; i < n; ++i)
len += path.segment(i).length();
// account for /'s
if (n > 1)
len += n-1;
StringBuffer sb = new StringBuffer(len);
for (int i = 0; i < n; ++i) {
if (i != 0)
sb.append('/');
sb.append(path.segment(i));
}
return sb.toString();
}
/**
* Returns the image with the given key, or <code>null</code> if not found.
*/
static Image getImage(String key) {
Image image = (Image) imageRegistry.get(key);
if (image == null) {
ImageDescriptor desc = getImageDescriptor(key);
if (desc != null) {
image = desc.createImage(false);
if (image == null) {
System.err.println("TaskList: Error creating image for " + key);//$NON-NLS-1$
}
imageRegistry.put(key, image);
}
}
return image;
}
/**
* Returns the image that should be used to visually represent
* the marker, based on its type and priority.
*/
static public Image getImage(IMarker marker) {
if (isMarkerType(marker, IMarker.PROBLEM)) {
switch (getSeverity(marker)) {
case IMarker.SEVERITY_ERROR:
return getImage("error");//$NON-NLS-1$
case IMarker.SEVERITY_WARNING:
return getImage("warn");//$NON-NLS-1$
case IMarker.SEVERITY_INFO:
return getImage("info");//$NON-NLS-1$
}
}
else if (isMarkerType(marker, IMarker.TASK)) {
return getImage("task");//$NON-NLS-1$
}
return null;
}
/**
* Returns the image descriptor with the given key, or <code>null</code> if not found.
*/
static ImageDescriptor getImageDescriptor(String key) {
ImageDescriptor desc = (ImageDescriptor) imageDescriptors.get(key);
if (desc == null) {
System.err.println("TaskList: No image descriptor for " + key); //$NON-NLS-1$
}
return desc;
}
/**
* Returns the text for the line and location column given the marker.
*/
public static String getLineAndLocation(IMarker marker) {
int lineNumber = getLineNumber(marker);
String location = getLocation(marker);
return getLineAndLocation(lineNumber, location);
}
/**
* Returns the text for the line and location column given the line number and location text.
*/
public static String getLineAndLocation(int lineNumber, String location) {
if (lineNumber == -1) {
if (location.equals("")) {//$NON-NLS-1$
return "";//$NON-NLS-1$
}
else {
return location;
}
}
else {
if (location.equals("")) {//$NON-NLS-1$
return line.format(new Object[] { Integer.toString(lineNumber) });
}
else {
return lineAndLocation.format(new Object[] { Integer.toString(lineNumber), location });
}
}
}
/**
* Returns the line number of the given marker.
*/
public static int getLineNumber(IMarker marker) {
return marker.getAttribute(IMarker.LINE_NUMBER, -1);
}
/**
* Returns the text for the location field.
*/
public static String getLocation(IMarker marker) {
return marker.getAttribute(IMarker.LOCATION, "");//$NON-NLS-1$
}
/**
* Returns the message attribute of the given marker,
* or the empty string if the message attribute is not defined.
*/
public static String getMessage(IMarker marker) {
return marker.getAttribute(IMarker.MESSAGE, "");//$NON-NLS-1$
}
/**
* Returns the numeric value of the given string, which is assumed to represent a numeric value.
*
* @return <code>true</code> if numeric, <code>false</code> if not
*/
static public int getNumericValue(String value) {
boolean negative = false;
int i = 0;
int len = value.length();
// skip any leading '#'
// workaround for 1GCE69U: ITPJCORE:ALL - Java problems should not have '#' in location.
if (i < len && value.charAt(i) == '#')
++i;
if (i < len && value.charAt(i) == '-') {
negative = true;
++i;
}
int result = 0;
while (i < len) {
int digit = Character.digit(value.charAt(i++), 10);
if (digit < 0) {
return result;
}
result = result * 10 + digit;
}
if (negative) {
result = -result;
}
return result;
}
/**
* Returns the priority of the given marker. Default is PRIORITY_NORMAL.
*/
public static int getPriority(IMarker marker) {
return marker.getAttribute(IMarker.PRIORITY, IMarker.PRIORITY_NORMAL);
}
/**
* Returns an image that should visually represent marker's priority
* in the tasklist.
*/
public static Image getPriorityImage(IMarker marker) {
switch (getPriority(marker)) {
case IMarker.PRIORITY_HIGH:
return getImage("hprio");//$NON-NLS-1$
case IMarker.PRIORITY_NORMAL:
return null; // no image for normal priority
case IMarker.PRIORITY_LOW:
return getImage("lprio");//$NON-NLS-1$
}
return null;
}
/**
* Returns the text for the given marker's priority.
*/
public static String getPriorityText(IMarker marker) {
if (!isMarkerType(marker, IMarker.TASK))
return ""; //$NON-NLS-1$
switch (getPriority(marker)) {
case IMarker.PRIORITY_HIGH:
return TaskListMessages.getString("TaskList.high"); //$NON-NLS-1$
case IMarker.PRIORITY_NORMAL:
return TaskListMessages.getString("TaskList.normal"); //$NON-NLS-1$
case IMarker.PRIORITY_LOW:
return TaskListMessages.getString("TaskList.low"); //$NON-NLS-1$
}
return ""; //$NON-NLS-1$
}
/**
* Implements IProvider interface by supporting a number of
* properties required for visual representation of markers
* in the tasklist.
*/
static public Object getProperty(Object object, String key) {
IMarker marker = (IMarker) object;
// optimizations:
// - check properties needed for TaskListLabelProvider first,
// then those needed for cell modifiers
// - use == instead of equals for efficiency
if (IBasicPropertyConstants.P_IMAGE == key) {
return getImage(marker);
}
if (IMarkerConstants.P_COMPLETE_IMAGE == key) {
return getCompleteImage(marker);
}
if (IMarkerConstants.P_PRIORITY_IMAGE == key) {
return getPriorityImage(marker);
}
if (IMarker.MESSAGE == key) {
return getMessage(marker);
}
if (IMarkerConstants.P_RESOURCE_NAME == key) {
return getResourceName(marker);
}
if (IMarkerConstants.P_CONTAINER_NAME == key) {
return getContainerName(marker);
}
if (IMarkerConstants.P_LINE_AND_LOCATION == key) {
return getLineAndLocation(marker);
}
if (IMarker.PRIORITY == key) {
// this property is used only by cell editor, where order is High, Normal, Low
return new Integer(IMarker.PRIORITY_HIGH-getPriority(marker));
}
if (IMarker.DONE == key) {
return isComplete(marker) ? Boolean.TRUE : Boolean.FALSE;
}
if (IBasicPropertyConstants.P_TEXT == key) {
return getMessage(marker);
}
return null;
}
/**
* Returns name if it is defined, or
* blank string if not.
*/
public static String getResourceName(IMarker marker) {
return marker.getResource().getName();
}
/**
* Returns the severity of the given marker. Default is SEVERITY_WARNING.
*/
public static int getSeverity(IMarker marker) {
return marker.getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING);
}
/**
* A helper method that returns true if the given
* marker is marked as complete in the tasklist.
* Only tasks can be complete.
*/
public static boolean isComplete(IMarker marker) {
return marker.getAttribute(IMarker.DONE, false);
}
/**
* Returns whether the given marker is editable.
* Only tasks which have not been marked as read-only are editable.
*/
public static boolean isEditable(IMarker marker) {
return isMarkerType(marker, IMarker.TASK) && !isReadOnly(marker);
}
/**
* Returns whether the given marker is of the given type (either directly or indirectly).
*/
public static boolean isMarkerType(IMarker marker, String type) {
try {
return marker.isSubtypeOf(type);
}
catch (CoreException e) {
return false;
}
}
/**
* Returns whether the given marker is read-only.
*/
public static boolean isReadOnly(IMarker marker) {
return !marker.getAttribute(IMarker.USER_EDITABLE, true);
}
/**
* Returns the creation time of the marker as a string.
*/
public static String getCreationTime(IMarker marker) {
try {
return DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.MEDIUM).format(new Date(marker.getCreationTime()));
} catch (CoreException e) {
return null;
}
}
}