org.eclipse.eclemma.internal.ui.dialogs.CoveragePropertyPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.eclemma.internal.ui.dialogs.CoveragePropertyPage.java

Source

/*******************************************************************************
 * Copyright (c) 2006, 2016 Mountainminds GmbH & Co. KG and Contributors
 * 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:
 *    Marc R. Hoffmann - initial API and implementation
 *
 ******************************************************************************/
package org.eclipse.eclemma.internal.ui.dialogs;

import java.text.DecimalFormat;
import java.text.NumberFormat;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.OwnerDrawLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.PropertyPage;
import org.jacoco.core.analysis.ICounter;
import org.jacoco.core.analysis.ICoverageNode;

import org.eclipse.eclemma.core.CoverageTools;
import org.eclipse.eclemma.core.ICoverageSession;
import org.eclipse.eclemma.internal.ui.ContextHelp;
import org.eclipse.eclemma.internal.ui.RedGreenBar;
import org.eclipse.eclemma.internal.ui.UIMessages;

/**
 * Property page for coverage details of a Java element.
 */
public class CoveragePropertyPage extends PropertyPage {

    private static final NumberFormat COVERAGE_VALUE = new DecimalFormat(
            UIMessages.CoveragePropertyPageColumnCoverage_value);

    private static final NumberFormat COUNTER_VALUE = DecimalFormat.getIntegerInstance();

    @Override
    protected Control createContents(Composite parent) {
        ContextHelp.setHelp(parent, ContextHelp.COVERAGE_PROPERTIES);
        noDefaultAndApplyButton();
        parent = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        parent.setLayout(layout);

        Label l1 = new Label(parent, SWT.NONE);
        l1.setText(UIMessages.CoveragePropertyPageSession_label);
        l1.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));

        Text t1 = new Text(parent, SWT.READ_ONLY | SWT.WRAP);
        t1.setText(getSessionDescription());
        t1.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false));
        t1.setBackground(t1.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));

        Control table = createTable(parent);
        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        gd.horizontalSpan = 2;
        table.setLayoutData(gd);

        return parent;
    }

    private String getSessionDescription() {
        ICoverageSession session = CoverageTools.getSessionManager().getActiveSession();
        return session == null ? UIMessages.CoveragePropertyPageNoSession_value : session.getDescription();
    }

    private Control createTable(Composite parent) {
        final Table table = new Table(parent, SWT.BORDER);
        initializeDialogUnits(table);
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        TableViewer viewer = new TableViewer(table);
        createColumn(viewer, SWT.LEFT, 20, UIMessages.CoveragePropertyPageColumnCounter_label,
                new CellLabelProvider() {
                    @Override
                    public void update(ViewerCell cell) {
                        final Line line = (Line) cell.getElement();
                        cell.setText(line.label);
                    }
                });
        createColumn(viewer, SWT.RIGHT, 20, UIMessages.CoveragePropertyPageColumnCoverage_label,
                new OwnerDrawLabelProvider() {
                    @Override
                    public void update(ViewerCell cell) {
                        final Line line = (Line) cell.getElement();
                        cell.setText(COVERAGE_VALUE.format(line.counter.getCoveredRatio()));
                    }

                    @Override
                    protected void paint(Event event, Object element) {
                        final Line line = (Line) element;
                        RedGreenBar.draw(event, table.getColumn(1).getWidth(), line.counter);
                    }

                    @Override
                    protected void erase(Event event, Object element) {
                    }

                    @Override
                    protected void measure(Event event, Object element) {
                    }
                });
        createColumn(viewer, SWT.RIGHT, 16, UIMessages.CoveragePropertyPageColumnCovered_label,
                new CellLabelProvider() {
                    @Override
                    public void update(ViewerCell cell) {
                        final Line line = (Line) cell.getElement();
                        cell.setText(COUNTER_VALUE.format(line.counter.getCoveredCount()));
                    }
                });
        createColumn(viewer, SWT.RIGHT, 16, UIMessages.CoveragePropertyPageColumnMissed_label,
                new CellLabelProvider() {
                    @Override
                    public void update(ViewerCell cell) {
                        final Line line = (Line) cell.getElement();
                        cell.setText(COUNTER_VALUE.format(line.counter.getMissedCount()));
                    }
                });
        createColumn(viewer, SWT.RIGHT, 16, UIMessages.CoveragePropertyPageColumnTotal_label,
                new CellLabelProvider() {
                    @Override
                    public void update(ViewerCell cell) {
                        final Line line = (Line) cell.getElement();
                        cell.setText(COUNTER_VALUE.format(line.counter.getTotalCount()));
                    }
                });
        viewer.setContentProvider(new ArrayContentProvider());
        viewer.addFilter(new ViewerFilter() {
            @Override
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                return ((Line) element).counter.getTotalCount() != 0;
            }
        });
        viewer.setInput(getLines());
        return table;
    }

    private void createColumn(TableViewer viewer, int align, int width, String caption,
            CellLabelProvider labelProvider) {
        TableViewerColumn column = new TableViewerColumn(viewer, align);
        column.getColumn().setText(caption);
        column.getColumn().setWidth(convertWidthInCharsToPixels(width));
        column.setLabelProvider(labelProvider);
    }

    private Line[] getLines() {
        ICoverageNode c = CoverageTools.getCoverageInfo(getElement());
        if (c == null) {
            return new Line[0];
        } else {
            return new Line[] {
                    new Line(UIMessages.CoveragePropertyPageInstructions_label, c.getInstructionCounter()),
                    new Line(UIMessages.CoveragePropertyPageBranches_label, c.getBranchCounter()),
                    new Line(UIMessages.CoveragePropertyPageLines_label, c.getLineCounter()),
                    new Line(UIMessages.CoveragePropertyPageMethods_label, c.getMethodCounter()),
                    new Line(UIMessages.CoveragePropertyPageTypes_label, c.getClassCounter()),
                    new Line(UIMessages.CoveragePropertyPageComplexity_label, c.getComplexityCounter()) };
        }
    }

    private static class Line {
        public final String label;
        public final ICounter counter;

        public Line(String label, ICounter counter) {
            this.label = label;
            this.counter = counter;
        }
    }

}