com.archimatetool.hammer.view.ValidatorViewer.java Source code

Java tutorial

Introduction

Here is the source code for com.archimatetool.hammer.view.ValidatorViewer.java

Source

/**
 * This program and the accompanying materials
 * are made available under the terms of the License
 * which accompanies this distribution in the file LICENSE.txt
 */
package com.archimatetool.hammer.view;

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

import org.eclipse.jface.layout.TreeColumnLayout;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.TreeColumn;

import com.archimatetool.editor.ui.ArchiLabelProvider;
import com.archimatetool.hammer.validation.issues.IIssue;
import com.archimatetool.hammer.validation.issues.IIssueCategory;

/**
 * Tree Viewer for Valaditor View
 * 
 * @author Phillip Beauvoir
 */
public class ValidatorViewer extends TreeViewer {

    public static int ASCENDING = 1;
    public static int DESCENDING = -1;

    private String[] columnNames = { Messages.ValidatorViewer_0, Messages.ValidatorViewer_1,
            Messages.ValidatorViewer_2 };

    private int[] columnWeights = { 20, 60, 20 };

    private int[] columnSort = { DESCENDING, // Set to opposite of what user will initially press
            DESCENDING, DESCENDING };

    public ValidatorViewer(Composite parent, int style) {
        super(parent, style | SWT.MULTI | SWT.FULL_SELECTION);

        setContentProvider(new ValidatorViewerContentProvider());
        setLabelProvider(new ValidatorViewerLabelProvider());

        getTree().setHeaderVisible(true);
        getTree().setLinesVisible(true);

        // Use layout from parent container
        TreeColumnLayout layout = (TreeColumnLayout) getControl().getParent().getLayout();

        for (int i = 0; i < columnNames.length; i++) {
            final TreeColumn column = new TreeColumn(getTree(), SWT.NONE);
            column.setText(columnNames[i]);
            column.setData(i);
            layout.setColumnData(column, new ColumnWeightData(columnWeights[i], true));

            column.addListener(SWT.Selection, new Listener() {
                @Override
                public void handleEvent(Event event) {
                    int index = (int) column.getData();
                    columnSort[index] *= -1;
                    setColumnSorting(column, columnSort[index]);
                    sort(index);
                }
            });
        }
    }

    private void setColumnSorting(TreeColumn column, int order) {
        getTree().setSortColumn(column);
        getTree().setSortDirection(order == ASCENDING ? SWT.UP : SWT.DOWN);
    }

    private void sort(final int columnIndex) {
        setComparator(new ViewerComparator(Collator.getInstance()) {
            @Override
            public int compare(Viewer viewer, Object e1, Object e2) {
                if (e1 instanceof IIssueCategory && e2 instanceof IIssueCategory) {
                    return 0;
                }

                ITableLabelProvider provider = (ITableLabelProvider) getLabelProvider();
                String s1 = provider.getColumnText(e1, columnIndex);
                String s2 = provider.getColumnText(e2, columnIndex);

                if (s1 == null) {
                    s1 = ""; //$NON-NLS-1$
                }
                if (s2 == null) {
                    s2 = ""; //$NON-NLS-1$
                }

                return columnSort[columnIndex] == ASCENDING ? getComparator().compare(s1, s2)
                        : getComparator().compare(s2, s1);
            }
        });
    }

    // ========================= Model Provoders =====================================

    /**
     *  Content Provider
     */
    class ValidatorViewerContentProvider implements ITreeContentProvider {

        public void inputChanged(Viewer v, Object oldInput, Object newInput) {
        }

        public void dispose() {
        }

        public Object[] getElements(Object parent) {
            return getChildren(parent);
        }

        public Object[] getChildren(Object parentElement) {
            if (parentElement instanceof IIssueCategory) {
                return ((IIssueCategory) parentElement).getIssues().toArray();
            }

            if (parentElement instanceof List<?>) {
                return ((List<?>) parentElement).toArray();
            }

            return new Object[0];
        }

        public Object getParent(Object element) {
            return null;
        }

        public boolean hasChildren(Object element) {
            return getChildren(element).length > 0;
        }
    }

    /**
     * Label Provider
     */
    class ValidatorViewerLabelProvider extends LabelProvider implements ITableLabelProvider {

        @Override
        public String getColumnText(Object element, int columnIndex) {
            if (element instanceof IIssueCategory) {
                if (columnIndex == 0) {
                    IIssueCategory category = (IIssueCategory) element;
                    int size = category.getIssues().size();
                    String text = (size == 1) ? Messages.ValidatorViewer_3 : Messages.ValidatorViewer_4;
                    return category.getName() + " (" + size + " " + text + ")"; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
                }
                return ""; //$NON-NLS-1$
            }

            if (element instanceof IIssue) {
                IIssue issue = (IIssue) element;

                switch (columnIndex) {
                case 0:
                    return issue.getName();

                case 1:
                    return issue.getDescription();

                case 2:
                    return ArchiLabelProvider.INSTANCE.getLabel(issue.getObject());

                default:
                    break;
                }
            }

            return ""; //$NON-NLS-1$
        }

        @Override
        public Image getColumnImage(Object element, int columnIndex) {
            if (columnIndex == 0) {
                if (element instanceof IIssue) {
                    return ((IIssue) element).getImage();
                }
                if (element instanceof IIssueCategory) {
                    return ((IIssueCategory) element).getImage();
                }
            }

            return null;
        }
    }
}