# HG changeset patch # User Frank Benoit # Date 1211198185 -7200 # Node ID 604fa1feb76a966cfa82e166c1e695f0cc3c6e0d # Parent 4095b64d16f5d7a8e05e55167d435e8e4b0d8680 Added jface snippet040, thanks to yidabu. It still has compile problems, that need further examination. diff -r 4095b64d16f5 -r 604fa1feb76a jface/snippets/Snippet040TableViewerSorting.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jface/snippets/Snippet040TableViewerSorting.d Mon May 19 13:56:25 2008 +0200 @@ -0,0 +1,307 @@ +/******************************************************************************* + * 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 jface.snippets.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; +/** + * Example usage of ViewerComparator in tables to allow sorting + * + * @author Tom Schindl + * + */ + +void main(String[] args) { + Snippet040TableViewerSorting.main(args); +} + +public class Snippet040TableViewerSorting { + + private class MyContentProvider : IStructuredContentProvider { + + public Object[] getElements(Object inputElement) { + return cast (Person[]) inputElement; + } + + 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); + } + + 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 (cast(Person) element).givenname; + } + protected void doSetValue(Object element, Object value) { + (cast(Person) element).givenname = value.toString(); + } + }); + + 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 (cast(Person) element).surname; + } + protected void doSetValue(Object element, Object value) { + (cast(Person) element).surname = value.toString(); + } + }); + + 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 (cast(Person) element).email; + } + protected void doSetValue(Object element, Object value) { + (cast(Person) element).email = value.toString(); + } + }); + 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(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; + } + + private static 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) { + if( this.viewer.getComparator() !is null ) { + if( this.viewer.getComparator() == this ) { + int tdirection = this.direction; + + if( tdirection == ASC ) { + setSorter(this, DESC); + } else if( tdirection == DESC ) { + setSorter(this, NONE); + } + } else { + setSorter(this, ASC); + } + } else { + setSorter(this, ASC); + } + } + }); + } + + public void setSorter(ColumnViewerSorter sorter, int direction) { + if( direction == 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 == ASC ) { + column.getColumn().getParent().setSortDirection(DWT.DOWN); + } else { + column.getColumn().getParent().setSortDirection(DWT.UP); + } + + if( viewer.getComparator() == 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); + } + + /** + * @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(); + } + +}