/******************************************************************************* * Copyright (c) 2000, 2008 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.internal; import com.ibm.icu.text.DateFormat; import java.util.Date; import java.util.Iterator; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages; import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin; import org.eclipse.ui.internal.ide.Policy; import org.eclipse.ui.views.markers.MarkerViewUtil; /** * The Util class is the class of general utilities used by the marker support. * */ public final class Util { static String EMPTY_STRING = "";//$NON-NLS-1$ static String TWO_LINE_FEED = "\n\n";//$NON-NLS-1$ static String LINE_FEED_AND_TAB = "\n\t";//$NON-NLS-1$ private static DateFormat format; static final MarkerNode[] EMPTY_MARKER_ARRAY = new MarkerNode[0]; static final String TYPE_MARKER_GROUPING_ID = "org.eclipse.ui.ide.type"; //$NON-NLS-1$ /** * Get the propery called property from the marker. If it is not found * return the empty string. * * @param property * @param marker * @return String */ public static String getProperty(String property, IMarker marker) { if (marker == null || !marker.exists()) { return EMPTY_STRING; } try { Object obj = marker.getAttribute(property); if (obj != null) { return obj.toString(); } return EMPTY_STRING; } catch (CoreException e) { Policy.handle(e); return EMPTY_STRING; } } /** * Get the human readable creation time from the timestamp * * @param timestamp * @return String */ public static String getCreationTime(long timestamp) { if (format == null) { format = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.MEDIUM); } return format.format(new Date(timestamp)); } /** * Get the human readable creation time from the marker. * * @param marker * @return String */ public static String getCreationTime(IMarker marker) { try { return getCreationTime(marker.getCreationTime()); } catch (CoreException e) { Policy.handle(e); return EMPTY_STRING; } } /** * Get the name of the container. If the marker has the * MarkerViewUtil#PATH_ATTRIBUTE set use that. Otherwise use the path of the * parent resource. * * @param marker * @return String */ public static String getContainerName(IMarker marker) { if (!marker.exists()) return Util.EMPTY_STRING; try { Object pathAttribute = marker .getAttribute(MarkerViewUtil.PATH_ATTRIBUTE); if (pathAttribute != null) { return pathAttribute.toString(); } } catch (CoreException exception) { // Log the exception and fall back. Policy.handle(exception); } IPath path = marker.getResource().getFullPath(); int n = path.segmentCount() - 1; // n is the number of segments in // container, not path if (n <= 0) { return Util.EMPTY_STRING; } 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(); } /** * Get the name of the element. If the marker has the * MarkerViewUtil#NAME_ATTRIBUTE set use that. Otherwise use the name of the * resource. * * @param marker * @return String */ public static String getResourceName(IMarker marker) { if (!marker.exists()) return Util.EMPTY_STRING; try { Object nameAttribute = marker .getAttribute(MarkerViewUtil.NAME_ATTRIBUTE); if (nameAttribute != null) { return nameAttribute.toString(); } } catch (CoreException exception) { Policy.handle(exception); } return marker.getResource().getName(); } /** * Return whether or not the marker is editable. * * @param marker * @return boolean <code>true</code> if it is editable */ public static boolean isEditable(IMarker marker) { if (marker == null) { return false; } try { return marker.isSubtypeOf(IMarker.BOOKMARK) || (marker.isSubtypeOf(IMarker.TASK) && marker .getAttribute(IMarker.USER_EDITABLE, true)); } catch (CoreException e) { return false; } } /** * Return an error status for the given exception. * * @param exception * @return IStatus */ public static IStatus errorStatus(Throwable exception) { String message = exception.getLocalizedMessage(); if (message == null) { message = EMPTY_STRING; } return new Status(IStatus.ERROR, IDEWorkbenchPlugin.IDE_WORKBENCH, IStatus.ERROR, message, exception); } static final int SHORT_DELAY = 100;// The 100 ms short delay for scheduling static final int LONG_DELAY = 30000;// The 30s long delay to run without a // builder update private Util() { super(); } /** * Get the image for the severity if it can be identified. * * @param severity * @return Image or <code>null</code> */ public static Image getImage(int severity) { if (severity == IMarker.SEVERITY_ERROR) { return getIDEImage(IDEInternalWorkbenchImages.IMG_OBJS_ERROR_PATH); } if (severity == IMarker.SEVERITY_WARNING) { return getIDEImage(IDEInternalWorkbenchImages.IMG_OBJS_WARNING_PATH); } if (severity == IMarker.SEVERITY_INFO) { return getIDEImage(IDEInternalWorkbenchImages.IMG_OBJS_INFO_PATH); } return null; } /** * Get the IDE image at path. * * @param path * @return Image */ private static Image getIDEImage(String constantName) { return JFaceResources.getResources().createImageWithDefault( IDEInternalWorkbenchImages.getImageDescriptor(constantName)); } /** * Get the short name for the container * * @param marker * @return String */ public static String getShortContainerName(IMarker marker) { if (!marker.exists()) return Util.EMPTY_STRING; try { Object pathAttribute = marker .getAttribute(MarkerViewUtil.PATH_ATTRIBUTE); if (pathAttribute != null) { return pathAttribute.toString(); } } catch (CoreException exception) { // Log the exception and fall back. Policy.handle(exception); } IResource resource = marker.getResource(); int type = resource.getType(); // Cannot be project relative if it is the root or a project if (type == IResource.PROJECT) { return resource.getName(); } if (type == IResource.ROOT) { return MarkerMessages.Util_WorkspaceRoot; } String result = marker.getResource().getProjectRelativePath() .removeLastSegments(1).toOSString(); if (result.trim().length() == 0) { return MarkerMessages.Util_ProjectRoot; } return result; } /** * Return whether or not the selection has one element that is concrete. * * @param selection * @return <true>code</true> if the selection has one element that is * concrete. */ static boolean isSingleConcreteSelection(IStructuredSelection selection) { if (selection != null && selection.size() == 1) { Object first = selection.getFirstElement(); if (first instanceof MarkerNode) { return ((MarkerNode) first).isConcrete(); } } return false; } /** * Return whether or not all of the elements in the selection are concrete. * * @param selection * @return <true>code</true> if all of the elements are concrete. */ public static boolean allConcreteSelection(IStructuredSelection selection) { if (selection != null && selection.size() > 0) { Iterator nodes = selection.iterator(); while (nodes.hasNext()) { if (((MarkerNode) nodes.next()).isConcrete()) { continue; } return false; } return true; } return false; } }