com.vectrace.MercurialEclipse.TableColumnSorter.java Source code

Java tutorial

Introduction

Here is the source code for com.vectrace.MercurialEclipse.TableColumnSorter.java

Source

/*******************************************************************************
 * Copyright (c) See next comment
 * 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:
 *     Stefan C - Copy code
 *******************************************************************************/
/*******************************************************************************
 * TableViewerSorting Example
 *
 * Adam Cabler
 *
 * revised example by Tom Schindl
 * http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet040TableViewerSorting.java?view=markup
 *
 * removed ColumnViewer references
 * added ITableLabelProvider
 * used label provider for text compare
 *
 * minor change by Stefan Chysser
 *   - only cycle between ASC and DESC, the go-back to None is confusing
 *
 * 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
 *
 *
 *******************************************************************************/

package com.vectrace.MercurialEclipse;

import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.TableColumn;

public abstract class TableColumnSorter extends ViewerComparator {
    public static final int ASC = 1;

    public static final int NONE = 0;

    public static final int DESC = -1;

    private int direction;

    private final TableColumn column;

    private final TableViewer viewer;

    public TableColumnSorter(TableViewer viewer, TableColumn column) {
        this.column = column;
        this.viewer = viewer;
        this.column.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                if (TableColumnSorter.this.viewer.getComparator() != null) {
                    if (TableColumnSorter.this.viewer.getComparator() == TableColumnSorter.this) {
                        int tdirection = TableColumnSorter.this.direction;

                        if (tdirection == ASC) {
                            setSorter(TableColumnSorter.this, DESC);
                        } else if (tdirection == DESC) {
                            setSorter(TableColumnSorter.this, ASC);
                        }
                    } else {
                        setSorter(TableColumnSorter.this, ASC);
                    }
                } else {
                    setSorter(TableColumnSorter.this, ASC);
                }
            }
        });
    }

    public void setSorter(TableColumnSorter sorter, int direction) {
        if (direction == NONE) {
            column.getParent().setSortColumn(null);
            column.getParent().setSortDirection(SWT.NONE);
            viewer.setComparator(null);
        } else {
            column.getParent().setSortColumn(column);
            sorter.direction = direction;

            if (direction == ASC) {
                column.getParent().setSortDirection(SWT.DOWN);
            } else {
                column.getParent().setSortDirection(SWT.UP);
            }

            if (viewer.getComparator() == sorter) {
                viewer.refresh();
            } else {
                viewer.setComparator(sorter);
            }

        }
    }

    @Override
    public int compare(Viewer cViewer, Object e1, Object e2) {
        return direction * doCompare(cViewer, e1, e2);
    }

    protected abstract int doCompare(Viewer tableViewer, Object e1, Object e2);
}