fr.labsticc.framework.ide.viewpart.TreeColumnSorter.java Source code

Java tutorial

Introduction

Here is the source code for fr.labsticc.framework.ide.viewpart.TreeColumnSorter.java

Source

/*******************************************************************************
 * Copyright (c) 2011 Lab-STICC Universite de Bretagne Sud, Lorient.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the CeCILL-B license available
 * at :
 * en : http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
 * fr : http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
 * 
 * Contributors:
 * Dominique BLOUIN (Lab-STICC UBS), dominique.blouin@univ-ubs.fr
 ******************************************************************************/
package fr.labsticc.framework.ide.viewpart;

import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;

import fr.labsticc.framework.core.util.DefaultComparator;

/**
 * @author <a href="mailto:dominique.blouin@univ-ubs.fr">Dominique Blouin</a>
 */
public class TreeColumnSorter extends ViewerSorter {
    private static final DefaultComparator comparator = DefaultComparator.getInstance();

    private boolean ascend;

    private TreeColumn column;

    public TreeColumnSorter() {
        column = null;
        ascend = true;
    }

    public void columnClicked(final TreeColumn p_column) {
        final Tree tree = p_column.getParent();

        if (column == p_column) {
            ascend = !ascend;
        } else {
            column = p_column;
            tree.setSortColumn(column);
            ascend = true;
        }

        tree.setSortDirection(ascend ? SWT.UP : SWT.DOWN);
    }

    private boolean ascend() {
        return ascend;
    }

    @Override
    public int compare(final Viewer p_viewer, final Object p_obj1, final Object p_obj2) {
        Object prop1;
        Object prop2;

        if (column == null) {
            prop1 = p_obj1;
            prop2 = p_obj2;
        } else {
            final TreeViewer treeViewer = (TreeViewer) p_viewer;
            final int colIndex = indexOf(treeViewer.getTree(), column);
            //         
            //         final IBaseLabelProvider lblProvider = treeViewer.getLabelProvider();
            //         
            //         if ( lblProvider instnaceof TreeCellLabelProvider ) {
            //            final TreeCellLabelProvider lblProvider = (TreeCellLabelProvider) treeViewer.getLabelProvider();
            prop1 = getColumnText(treeViewer, p_obj1, colIndex);

            if (prop1 == null) {
                Image image = getColumnImage(treeViewer, p_obj1, colIndex);
                prop1 = image == null ? null : image.toString();

                image = getColumnImage(treeViewer, p_obj2, colIndex);
                prop2 = image == null ? null : image.toString();
            } else {
                prop2 = getColumnText(treeViewer, p_obj2, colIndex);
            }
        }

        if (ascend()) {
            return comparator.compare(prop1, prop2);
        }

        return comparator.compare(prop2, prop1);
    }

    private String getColumnText(final TreeViewer p_treeViewer, final Object p_element, final int pi_colIndex) {
        final CellLabelProvider cellLabelProvider = p_treeViewer.getLabelProvider(pi_colIndex);

        if (cellLabelProvider instanceof ColumnLabelProvider) {
            return ((ColumnLabelProvider) cellLabelProvider).getText(p_element);
        }

        final IBaseLabelProvider lblProvider = p_treeViewer.getLabelProvider();

        if (lblProvider instanceof TreeCellLabelProvider) {
            return ((TreeCellLabelProvider) lblProvider).getColumnText(p_element, pi_colIndex);
        }

        return null;
    }

    private Image getColumnImage(final TreeViewer p_treeViewer, final Object p_element, final int pi_colIndex) {
        final CellLabelProvider cellLabelProvider = p_treeViewer.getLabelProvider(pi_colIndex);

        if (cellLabelProvider instanceof ColumnLabelProvider) {
            return ((ColumnLabelProvider) cellLabelProvider).getImage(p_element);
        }

        final IBaseLabelProvider lblProvider = p_treeViewer.getLabelProvider();

        if (lblProvider instanceof TreeCellLabelProvider) {
            return ((TreeCellLabelProvider) lblProvider).getColumnImage(p_element, pi_colIndex);
        }

        return null;
    }

    private static int indexOf(final Tree p_tree, final TreeColumn p_column) {
        int index = 0;

        for (final TreeColumn column : p_tree.getColumns()) {
            if (p_column == column) {
                return index;
            }

            index++;
        }

        return -1;
    }
}