view jface/snippets/viewers/Snippet040TableViewerSorting.d @ 146:7c4b76583cb8

Added new JFace snippets
author Frank Benoit <benoit@tionex.de>
date Mon, 11 Aug 2008 11:17:37 +0200
parents 161f7698cfb8
children
line wrap: on
line source

/*******************************************************************************
 * Copyright (c) 2006 Tom Schindl and others.
 * 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:
 *     Tom Schindl - initial API and implementation
 * Port to the D programming language:
 *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
 *******************************************************************************/
module snippets.viewers.Snippet040TableViewerSorting;

// http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet040TableViewerSorting.java?view=markup

import dwtx.jface.viewers.CellEditor;
import dwtx.jface.viewers.ColumnLabelProvider;
import dwtx.jface.viewers.ColumnViewer;
import dwtx.jface.viewers.EditingSupport;
import dwtx.jface.viewers.IStructuredContentProvider;
import dwtx.jface.viewers.TableViewer;
import dwtx.jface.viewers.TableViewerColumn;
import dwtx.jface.viewers.TextCellEditor;
import dwtx.jface.viewers.Viewer;
import dwtx.jface.viewers.ViewerComparator;
import dwt.DWT;
import dwt.events.SelectionAdapter;
import dwt.events.SelectionEvent;
import dwt.layout.FillLayout;
import dwt.widgets.Display;
import dwt.widgets.Shell;
import dwt.dwthelper.utils;

version(JIVE) import jive.stacktrace;

/**
 * Example usage of ViewerComparator in tables to allow sorting
 *
 * @author Tom Schindl <tom.schindl@bestsolution.at>
 *
 */

void main(String[] args) {
    Snippet040TableViewerSorting.main(args);
}

    private class MyContentProvider : IStructuredContentProvider {

        public Object[] getElements(Object inputElement) {
            return (cast(ArrayWrapperT!(Person)) inputElement).array;
        }

        public void dispose() {
        }

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

    }

    public class Person {
        public String givenname;
        public String surname;
        public String email;

        public this(String givenname, String surname, String email) {
            this.givenname = givenname;
            this.surname = surname;
            this.email = email;
        }

    }

    protected abstract class AbstractEditingSupport : EditingSupport {
        private TextCellEditor editor;

        public this(TableViewer viewer) {
            super(viewer);
            this.editor = new TextCellEditor(viewer.getTable());
        }

        protected bool canEdit(Object element) {
            return true;
        }

        protected CellEditor getCellEditor(Object element) {
            return editor;
        }

        protected void setValue(Object element, Object value) {
            doSetValue(element, value);
            getViewer().update(element, null);
        }

        protected abstract void doSetValue(Object element, Object value);
    }

    private abstract class ColumnViewerSorter : ViewerComparator {
        public static final int ASC = 1;

        public static final int NONE = 0;

        public static final int DESC = -1;

        private int direction = 0;

        private TableViewerColumn column;

        private ColumnViewer viewer;

        public this(ColumnViewer viewer_, TableViewerColumn column_) {
            this.column = column_;
            this.viewer = viewer_;
            this.column.getColumn().addSelectionListener(new class() SelectionAdapter {
                public void widgetSelected(SelectionEvent e) {
                    this.outer.widgetSelected(e);
                }
            });
        }

        private void widgetSelected(SelectionEvent e){
            if( viewer.getComparator() !is null ) {
                if( viewer.getComparator() is this ) {
                    int tdirection = direction;

                    if( tdirection is ASC ) {
                        setSorter(this, DESC);
                    } else if( tdirection is DESC ) {
                        setSorter(this, NONE);
                    }
                } else {
                    setSorter(this, ASC);
                }
            } else {
                setSorter(this, ASC);
            }
        }
        public void setSorter(ColumnViewerSorter sorter, int direction) {
            if( direction is NONE ) {
                column.getColumn().getParent().setSortColumn(null);
                column.getColumn().getParent().setSortDirection(DWT.NONE);
                viewer.setComparator(null);
            } else {
                column.getColumn().getParent().setSortColumn(column.getColumn());
                sorter.direction = direction;

                if( direction is ASC ) {
                    column.getColumn().getParent().setSortDirection(DWT.DOWN);
                } else {
                    column.getColumn().getParent().setSortDirection(DWT.UP);
                }

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

            }
        }

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

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

public class Snippet040TableViewerSorting {


    public this(Shell shell) {
        TableViewer v = new TableViewer(shell, DWT.BORDER | DWT.FULL_SELECTION);
        v.setContentProvider(new MyContentProvider());

        TableViewerColumn column = new TableViewerColumn(v, DWT.NONE);
        column.getColumn().setWidth(200);
        column.getColumn().setText("Givenname");
        column.getColumn().setMoveable(true);
        column.setLabelProvider(new class() ColumnLabelProvider {
            public String getText(Object element) {
                return (cast(Person) element).givenname;
            }
        });

        column.setEditingSupport(new class(v) AbstractEditingSupport {
            public this(TableViewer t ){
                super(t);
            }
            protected Object getValue(Object element) {
                return new ArrayWrapperString((cast(Person) element).givenname);
            }
            protected void doSetValue(Object element, Object value) {
                (cast(Person) element).givenname = stringcast(value);
            }
        });

        ColumnViewerSorter cSorter = new class(v,column) ColumnViewerSorter {
            this(TableViewer t, TableViewerColumn c ){
                super(t,c);
            }
            protected int doCompare(Viewer viewer, Object e1, Object e2) {
                Person p1 = cast(Person) e1;
                Person p2 = cast(Person) e2;
                return p1.givenname.compareToIgnoreCase(p2.givenname);
            }
        };

        column = new TableViewerColumn(v, DWT.NONE);
        column.getColumn().setWidth(200);
        column.getColumn().setText("Surname");
        column.getColumn().setMoveable(true);
        column.setLabelProvider(new class() ColumnLabelProvider {
            public String getText(Object element) {
                return (cast(Person) element).surname;
            }
        });

        column.setEditingSupport(new class(v) AbstractEditingSupport {
            this(TableViewer t ){
                super(t);
            }
            protected Object getValue(Object element) {
                return stringcast((cast(Person) element).surname);
            }
            protected void doSetValue(Object element, Object value) {
                (cast(Person) element).surname = stringcast(value);
            }
        });

        new class(v,column) ColumnViewerSorter {
            this(TableViewer t, TableViewerColumn c ){
                super(t,c);
            }
            protected int doCompare(Viewer viewer, Object e1, Object e2) {
                Person p1 = cast(Person) e1;
                Person p2 = cast(Person) e2;
                return p1.surname.compareToIgnoreCase(p2.surname);
            }
        };

        column = new TableViewerColumn(v, DWT.NONE);
        column.getColumn().setWidth(200);
        column.getColumn().setText("E-Mail");
        column.getColumn().setMoveable(true);
        column.setLabelProvider(new class() ColumnLabelProvider {
            public String getText(Object element) {
                return (cast(Person) element).email;
            }
        });

        column.setEditingSupport(new class(v) AbstractEditingSupport {
            this(TableViewer t ){
                super(t);
            }
            protected Object getValue(Object element) {
                return stringcast((cast(Person) element).email);
            }
            protected void doSetValue(Object element, Object value) {
                (cast(Person) element).email = stringcast(value);
            }
        });
        new class(v,column) ColumnViewerSorter {
            this(TableViewer t, TableViewerColumn c ){
                super(t,c);
            }
            protected int doCompare(Viewer viewer, Object e1, Object e2) {
                Person p1 = cast(Person) e1;
                Person p2 = cast(Person) e2;
                return p1.email.compareToIgnoreCase(p2.email);
            }
        };

        Person[] model = createModel();
        v.setInput( new ArrayWrapperT!(Person)(model));
        v.getTable().setLinesVisible(true);
        v.getTable().setHeaderVisible(true);
        cSorter.setSorter(cSorter, ColumnViewerSorter.ASC);
    }

    private Person[] createModel() {
        Person[] elements = new Person[4];
        elements[0] = new Person("Tom", "Schindl",
                "tom.schindl@bestsolution.at");
        elements[1] = new Person("Boris", "Bokowski",
                "Boris_Bokowski@ca.ibm.com");
        elements[2] = new Person("Tod", "Creasey", "Tod_Creasey@ca.ibm.com");
        elements[3] = new Person("Wayne", "Beaton", "wayne@eclipse.org");

        return elements;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        Display display = new Display();

        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
        new Snippet040TableViewerSorting(shell);
        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }

}