org.eclipse.jubula.client.analyze.ui.renderer.TableRenderer.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jubula.client.analyze.ui.renderer.TableRenderer.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2012 BREDEX GmbH.
 * 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:
 *     BREDEX GmbH - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.eclipse.jubula.client.analyze.ui.renderer;

import java.text.Collator;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jubula.client.analyze.internal.AnalyzeResult;
import org.eclipse.jubula.client.analyze.ui.definition.IResultRendererUI;
import org.eclipse.jubula.client.analyze.ui.i18n.Messages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

/**
 * @author volker
 */
public class TableRenderer implements IResultRendererUI {
    /**
     * 
     */
    private AnalyzeResult m_analyzeResult;

    /** The TopLevelControl of this Renderer */
    private Control m_topControl;

    /**
     * The TableRenderer is able to display the AnalyzeResult as a Table
     */
    public TableRenderer() {
    }

    /** @return The TopControl of this Renderer */
    public Control getTopControl() {
        return m_topControl;
    }

    /**
     * @param control
     *            The Control that is to be set as TopControl of this Renderer
     */
    public void setTopControl(Control control) {
        this.m_topControl = control;
    }

    /**
     * @param res
     *            The given AnalyzeResult
     * @param composite
     *            The given Composite
     */
    public void renderResult(AnalyzeResult res, Composite composite) {
        m_analyzeResult = res;

        if (m_analyzeResult.getResult() instanceof Map) {
            Map<String, String> resultMap = (Map<String, String>) m_analyzeResult.getResult();
            ArrayList<TableResult> resultList = new ArrayList<TableResult>();

            for (Map.Entry<String, String> e : resultMap.entrySet()) {

                TableResult tr = new TableResult();

                if (String.valueOf(e.getKey()).equals("class org.eclipse.jubula.client.core.model.TestSuitePO")) { //$NON-NLS-1$
                    tr.setCol1(Messages.Testsuite);
                } else if (String.valueOf(e.getKey())
                        .equals("class org.eclipse.jubula.client.core.model.CategoryPO")) { //$NON-NLS-1$
                    tr.setCol1(Messages.Category);
                } else if (String.valueOf(e.getKey()).equals("class org.eclipse.jubula.client.core.model.CapPO")) { //$NON-NLS-1$
                    tr.setCol1(Messages.TestStep);
                } else if (String.valueOf(e.getKey())
                        .equals("class org.eclipse.jubula.client.core.model.ExecTestCasePO")) { //$NON-NLS-1$
                    tr.setCol1(Messages.ReferencedTestCase);
                } else if (String.valueOf(e.getKey())
                        .equals("class org.eclipse.jubula.client.core.model.ProjectPO")) { //$NON-NLS-1$
                    tr.setCol1(Messages.Project);
                } else if (String.valueOf(e.getKey())
                        .equals("class org.eclipse.jubula.client.core.model.SpecTestCasePO")) { //$NON-NLS-1$
                    tr.setCol1(Messages.Testcase);
                } else if (String.valueOf(e.getKey())
                        .equals("class org.eclipse.jubula.client.core.model.TestJobPO")) { //$NON-NLS-1$
                    tr.setCol1(Messages.TestJob);
                } else if (String.valueOf(e.getKey())
                        .equals("class org.eclipse.jubula.client.core.model.RefTestSuitePO")) { //$NON-NLS-1$
                    tr.setCol1(Messages.ReferencedTestSuite);
                } else if (String.valueOf(e.getKey())
                        .equals("class org.eclipse.jubula.client.core.model.ComponentNamePO")) { //$NON-NLS-1$
                    tr.setCol1(Messages.ComponentName);
                } else if (String.valueOf(e.getKey())
                        .equals("class org.eclipse.jubula.client.core.model.EventExecTestCasePO")) { //$NON-NLS-1$
                    tr.setCol1(Messages.EventHandler);
                }
                tr.setCol2(String.valueOf(e.getValue()));
                resultList.add(tr);
            }
            createViewer(composite, resultList);
        }
    }

    /**
     * creates the TableViewer
     * 
     * @param parent
     *            The parent Composite
     * @param resultList
     *            The Given resultList
     */
    private void createViewer(Composite parent, List<TableResult> resultList) {
        TableViewer tv = new TableViewer(parent);
        createColumns(parent, tv);

        Table table = tv.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        tv.setContentProvider(new ArrayContentProvider());
        // set the Sorter

        tv.setSorter(new TableResultSorter());

        tv.setInput(resultList);
        // set the crontrol of the TreeViewer as the TopControl of this Renderer
        setTopControl(tv.getControl());
    }

    /**
     * 
     * @param cmp
     *            the parent composite
     * @param viewer
     *            The TableViewer
     */
    private void createColumns(Composite cmp, TableViewer viewer) {
        String[] titles = { Messages.NodeType, Messages.Amount };
        int[] colType = { 0, 1 };

        // set the bounds of the table to the aspect ratio 1/3 and 2/3
        int c1 = (((cmp.getBounds().width) / 3) * 2);
        int c2 = ((cmp.getBounds().width) / 3);
        int[] bounds = { c1, c2 };
        // First column
        TableViewerColumn col = createTabelViewerColumn(titles[0], bounds[0], viewer, colType[0]);
        col.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                TableResult tr = (TableResult) element;
                return tr.getCol1();
            }
        });
        // Second column
        col = createTabelViewerColumn(titles[1], bounds[1], viewer, colType[1]);
        col.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {

                TableResult tr = (TableResult) element;
                return tr.getCol2();
            }
        });
    }

    /**
     * @param title
     *            The columnTitle
     * @param bounds
     *            The bounds of the Column
     * @param viewer
     *            The parent Viewer
     * @param colType
     *            The columnType
     * @return The TableViewerColumn
     */
    private TableViewerColumn createTabelViewerColumn(String title, int bounds, TableViewer viewer, int colType) {

        final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE);

        final int c = colType;

        final TableColumn column = viewerColumn.getColumn();
        final TableViewer tv = viewer;

        column.setText(title);
        column.setWidth(bounds);
        column.setResizable(true);
        column.setMoveable(true);
        column.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent event) {
                ((TableResultSorter) tv.getSorter()).doSort(c);
                tv.refresh();
            }
        });
        return viewerColumn;
    }

    /**
     * This class is used to sort the TableResults
     * 
     * @author volker
     */
    class TableResultSorter extends ViewerSorter {
        /** */
        private static final int ASCENDING = 0;
        /** */
        private static final int DESCENDING = 1;
        /** */
        private int m_column;
        /** */
        private int m_direction;

        /**
         * checks if the direction ascending/descending
         * 
         * @param column
         *            the column that has to be sorted
         */
        public void doSort(int column) {
            if (column == this.m_column) {
                m_direction = 1 - m_direction;
            } else {
                this.m_column = column;
                m_direction = ASCENDING;
            }
        }

        /** {@inheritDoc} */
        public int compare(Viewer viewer, Object e1, Object e2) {
            int rc = 0;
            TableResult tr1 = (TableResult) e1;
            TableResult tr2 = (TableResult) e2;

            // create a new Collator for the comparison
            Collator col = Collator.getInstance();
            switch (m_column) {
            case 0:
                rc = col.compare(tr1.getCol1(), tr2.getCol1());
                break;
            case 1:
                if (new Integer(tr1.getCol2()) < (new Integer(tr2.getCol2()))) {
                    rc = -1;
                } else if (new Integer(tr1.getCol2()) == (new Integer(tr2.getCol2()))) {
                    rc = 0;
                } else if (new Integer(tr1.getCol2()) > (new Integer(tr2.getCol2()))) {
                    rc = 1;
                }
                break;
            default:
                break;
            }
            if (m_direction == DESCENDING) {
                rc = -rc;
            }
            return rc;
        }
    }

    /**
     * This class is used to provide a Result, that could be used from
     * TableRenderer with two columns
     * 
     * @author volker
     * 
     */
    public class TableResult {
        /**
         * the value which will be shown in the first column
         */
        private String m_col1;
        /**
         * the value which will be shown in the second column
         */
        private String m_col2;

        /**
         * the value which will be shown in the first column
         * 
         * @return the value which will be shown in the first column
         */
        public String getCol1() {
            return m_col1;
        }

        /**
         * the value which will be shown in the first column
         * 
         * @param col1
         *            the value which will be shown in the first column
         */
        public void setCol1(String col1) {
            this.m_col1 = col1;
        }

        /**
         * @return the value which will be shown in the second column
         */
        public String getCol2() {
            return m_col2;
        }

        /**
         * @param col2
         *            the value which will be shown in the second column
         */
        public void setCol2(String col2) {
            this.m_col2 = col2;
        }
    }
}