org.sonar.ide.eclipse.ui.internal.views.issues.IssueDescriptionField.java Source code

Java tutorial

Introduction

Here is the source code for org.sonar.ide.eclipse.ui.internal.views.issues.IssueDescriptionField.java

Source

/*
 * SonarQube Eclipse
 * Copyright (C) 2010-2014 SonarSource
 * dev@sonar.codehaus.org
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
 */
package org.sonar.ide.eclipse.ui.internal.views.issues;

import org.eclipse.core.resources.IMarker;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.views.markers.MarkerField;
import org.eclipse.ui.views.markers.MarkerItem;
import org.sonar.ide.eclipse.core.internal.markers.MarkerUtils;
import org.sonar.ide.eclipse.ui.internal.SonarImages;

/**
 * Each rule in Sonar has severity, so it seems logical to combine rule name and severity in one field.
 */
public class IssueDescriptionField extends MarkerField {

    /**
     * Create a new instance of the receiver.
     */
    public IssueDescriptionField() {
        super();
    }

    @Override
    public int getDefaultColumnWidth(Control control) {
        return 50 * getFontWidth(control);
    }

    public static final int getFontWidth(Control control) {
        GC gc = new GC(control.getDisplay());
        int width = gc.getFontMetrics().getAverageCharWidth();
        gc.dispose();
        return width;
    }

    @Override
    public String getValue(MarkerItem item) {
        return item.getAttributeValue(IMarker.MESSAGE, "Unknow");
    }

    @Override
    public int compare(MarkerItem item1, MarkerItem item2) {
        int severity1 = getSeverity(item1);
        int severity2 = getSeverity(item2);
        if (severity1 == severity2) {
            return super.compare(item1, item2);
        }
        return severity2 - severity1;
    }

    private int getSeverity(MarkerItem item) {
        return convertSeverity(item.getAttributeValue(MarkerUtils.SONAR_MARKER_ISSUE_SEVERITY_ATTR, ""));
    }

    public static int convertSeverity(String severity) {
        String severityLower = severity != null ? severity.toLowerCase() : "";
        final int result;
        if (severityLower.startsWith("blocker")) {
            result = 0;
        } else if (severityLower.startsWith("critical")) {
            result = 1;
        } else if (severityLower.startsWith("major")) {
            result = 2;
        } else if (severityLower.startsWith("minor")) {
            result = 3;
        } else if (severityLower.startsWith("info")) {
            result = 4;
        } else {
            result = -1;
        }
        return result;
    }

    private Image getImage(MarkerItem item) {
        if (item.getMarker() != null) {
            return getSeverityImage(getSeverity(item));
        } else {
            // If there is no marker maybe we have a groupBy item
            // First try with groupBy is new issue
            String msg = item.getAttributeValue(IMarker.MESSAGE, "");
            if (msg.startsWith("New issues")) {
                return SonarImages.IMG_NEW_ISSUE;
            } else if (msg.startsWith("Other issues")) {
                return SonarImages.IMG_ISSUE;
            }
            // GroupBy severity
            return getSeverityImage(convertSeverity(item.getAttributeValue(IMarker.MESSAGE, "")));
        }
    }

    private Image getSeverityImage(int severity) {
        final Image result;
        switch (severity) {
        case -1:
            result = null;
            break;
        case 0:
            result = SonarImages.IMG_SEVERITY_BLOCKER;
            break;
        case 1:
            result = SonarImages.IMG_SEVERITY_CRITICAL;
            break;
        case 2:
            result = SonarImages.IMG_SEVERITY_MAJOR;
            break;
        case 3:
            result = SonarImages.IMG_SEVERITY_MINOR;
            break;
        case 4:
            result = SonarImages.IMG_SEVERITY_INFO;
            break;
        default:
            throw new IllegalArgumentException();
        }
        return result;
    }

    @Override
    public void update(ViewerCell cell) {
        super.update(cell);

        MarkerItem item = (MarkerItem) cell.getElement();
        if (item != null) {
            cell.setImage(getImage(item));
        }
    }

}