com.bluexml.side.Requirements.modeler.views.internal.Util.java Source code

Java tutorial

Introduction

Here is the source code for com.bluexml.side.Requirements.modeler.views.internal.Util.java

Source

/*
Copyright (C) 2007-2011  BlueXML - www.bluexml.com
    
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
    
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
    
You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
*/

package com.bluexml.side.Requirements.modeler.views.internal;

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;
import org.eclipse.ui.views.markers.internal.MarkerMessages;
import org.eclipse.ui.views.markers.internal.MarkerNode;

import com.ibm.icu.text.DateFormat;

/**
 * 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;
    }
}