comparison org.eclipse.jface.snippets/EclipseJfaceSnippets/org/eclipse/jface/snippets/viewers/Snippet040TableViewerSorting.d @ 31:5d87d4191adf

Added JFace Snippets sources
author Frank Benoit <benoit@tionex.de>
date Mon, 23 Mar 2009 11:16:06 +0100
parents
children c4b36186a9bc
comparison
equal deleted inserted replaced
30:93b0e7382fd5 31:5d87d4191adf
1 /*******************************************************************************
2 * Copyright (c) 2006 Tom Schindl and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * Tom Schindl - initial API and implementation
10 * Port to the D programming language:
11 * yidabu at gmail dot com ( D China http://www.d-programming-language-china.org/ )
12 *******************************************************************************/
13 module snippets.viewers.Snippet040TableViewerSorting;
14
15 // http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet040TableViewerSorting.java?view=markup
16
17 import dwtx.jface.viewers.CellEditor;
18 import dwtx.jface.viewers.ColumnLabelProvider;
19 import dwtx.jface.viewers.ColumnViewer;
20 import dwtx.jface.viewers.EditingSupport;
21 import dwtx.jface.viewers.IStructuredContentProvider;
22 import dwtx.jface.viewers.TableViewer;
23 import dwtx.jface.viewers.TableViewerColumn;
24 import dwtx.jface.viewers.TextCellEditor;
25 import dwtx.jface.viewers.Viewer;
26 import dwtx.jface.viewers.ViewerComparator;
27 import dwt.DWT;
28 import dwt.events.SelectionAdapter;
29 import dwt.events.SelectionEvent;
30 import dwt.layout.FillLayout;
31 import dwt.widgets.Display;
32 import dwt.widgets.Shell;
33 import dwt.dwthelper.utils;
34
35 version(JIVE) import jive.stacktrace;
36
37 /**
38 * Example usage of ViewerComparator in tables to allow sorting
39 *
40 * @author Tom Schindl <tom.schindl@bestsolution.at>
41 *
42 */
43
44 void main(String[] args) {
45 Snippet040TableViewerSorting.main(args);
46 }
47
48 private class MyContentProvider : IStructuredContentProvider {
49
50 public Object[] getElements(Object inputElement) {
51 return (cast(ArrayWrapperT!(Person)) inputElement).array;
52 }
53
54 public void dispose() {
55 }
56
57 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
58 }
59
60 }
61
62 public class Person {
63 public String givenname;
64 public String surname;
65 public String email;
66
67 public this(String givenname, String surname, String email) {
68 this.givenname = givenname;
69 this.surname = surname;
70 this.email = email;
71 }
72
73 }
74
75 protected abstract class AbstractEditingSupport : EditingSupport {
76 private TextCellEditor editor;
77
78 public this(TableViewer viewer) {
79 super(viewer);
80 this.editor = new TextCellEditor(viewer.getTable());
81 }
82
83 protected bool canEdit(Object element) {
84 return true;
85 }
86
87 protected CellEditor getCellEditor(Object element) {
88 return editor;
89 }
90
91 protected void setValue(Object element, Object value) {
92 doSetValue(element, value);
93 getViewer().update(element, null);
94 }
95
96 protected abstract void doSetValue(Object element, Object value);
97 }
98
99 private abstract class ColumnViewerSorter : ViewerComparator {
100 public static final int ASC = 1;
101
102 public static final int NONE = 0;
103
104 public static final int DESC = -1;
105
106 private int direction = 0;
107
108 private TableViewerColumn column;
109
110 private ColumnViewer viewer;
111
112 public this(ColumnViewer viewer_, TableViewerColumn column_) {
113 this.column = column_;
114 this.viewer = viewer_;
115 this.column.getColumn().addSelectionListener(new class() SelectionAdapter {
116 public void widgetSelected(SelectionEvent e) {
117 this.outer.widgetSelected(e);
118 }
119 });
120 }
121
122 private void widgetSelected(SelectionEvent e){
123 if( viewer.getComparator() !is null ) {
124 if( viewer.getComparator() is this ) {
125 int tdirection = direction;
126
127 if( tdirection is ASC ) {
128 setSorter(this, DESC);
129 } else if( tdirection is DESC ) {
130 setSorter(this, NONE);
131 }
132 } else {
133 setSorter(this, ASC);
134 }
135 } else {
136 setSorter(this, ASC);
137 }
138 }
139 public void setSorter(ColumnViewerSorter sorter, int direction) {
140 if( direction is NONE ) {
141 column.getColumn().getParent().setSortColumn(null);
142 column.getColumn().getParent().setSortDirection(DWT.NONE);
143 viewer.setComparator(null);
144 } else {
145 column.getColumn().getParent().setSortColumn(column.getColumn());
146 sorter.direction = direction;
147
148 if( direction is ASC ) {
149 column.getColumn().getParent().setSortDirection(DWT.DOWN);
150 } else {
151 column.getColumn().getParent().setSortDirection(DWT.UP);
152 }
153
154 if( viewer.getComparator() is sorter ) {
155 viewer.refresh();
156 } else {
157 viewer.setComparator(sorter);
158 }
159
160 }
161 }
162
163 public int compare(Viewer viewer, Object e1, Object e2) {
164 return direction * doCompare(viewer, e1, e2);
165 }
166
167 protected abstract int doCompare(Viewer viewer, Object e1, Object e2);
168 }
169
170 public class Snippet040TableViewerSorting {
171
172
173 public this(Shell shell) {
174 TableViewer v = new TableViewer(shell, DWT.BORDER | DWT.FULL_SELECTION);
175 v.setContentProvider(new MyContentProvider());
176
177 TableViewerColumn column = new TableViewerColumn(v, DWT.NONE);
178 column.getColumn().setWidth(200);
179 column.getColumn().setText("Givenname");
180 column.getColumn().setMoveable(true);
181 column.setLabelProvider(new class() ColumnLabelProvider {
182 public String getText(Object element) {
183 return (cast(Person) element).givenname;
184 }
185 });
186
187 column.setEditingSupport(new class(v) AbstractEditingSupport {
188 public this(TableViewer t ){
189 super(t);
190 }
191 protected Object getValue(Object element) {
192 return new ArrayWrapperString((cast(Person) element).givenname);
193 }
194 protected void doSetValue(Object element, Object value) {
195 (cast(Person) element).givenname = stringcast(value);
196 }
197 });
198
199 ColumnViewerSorter cSorter = new class(v,column) ColumnViewerSorter {
200 this(TableViewer t, TableViewerColumn c ){
201 super(t,c);
202 }
203 protected int doCompare(Viewer viewer, Object e1, Object e2) {
204 Person p1 = cast(Person) e1;
205 Person p2 = cast(Person) e2;
206 return p1.givenname.compareToIgnoreCase(p2.givenname);
207 }
208 };
209
210 column = new TableViewerColumn(v, DWT.NONE);
211 column.getColumn().setWidth(200);
212 column.getColumn().setText("Surname");
213 column.getColumn().setMoveable(true);
214 column.setLabelProvider(new class() ColumnLabelProvider {
215 public String getText(Object element) {
216 return (cast(Person) element).surname;
217 }
218 });
219
220 column.setEditingSupport(new class(v) AbstractEditingSupport {
221 this(TableViewer t ){
222 super(t);
223 }
224 protected Object getValue(Object element) {
225 return stringcast((cast(Person) element).surname);
226 }
227 protected void doSetValue(Object element, Object value) {
228 (cast(Person) element).surname = stringcast(value);
229 }
230 });
231
232 new class(v,column) ColumnViewerSorter {
233 this(TableViewer t, TableViewerColumn c ){
234 super(t,c);
235 }
236 protected int doCompare(Viewer viewer, Object e1, Object e2) {
237 Person p1 = cast(Person) e1;
238 Person p2 = cast(Person) e2;
239 return p1.surname.compareToIgnoreCase(p2.surname);
240 }
241 };
242
243 column = new TableViewerColumn(v, DWT.NONE);
244 column.getColumn().setWidth(200);
245 column.getColumn().setText("E-Mail");
246 column.getColumn().setMoveable(true);
247 column.setLabelProvider(new class() ColumnLabelProvider {
248 public String getText(Object element) {
249 return (cast(Person) element).email;
250 }
251 });
252
253 column.setEditingSupport(new class(v) AbstractEditingSupport {
254 this(TableViewer t ){
255 super(t);
256 }
257 protected Object getValue(Object element) {
258 return stringcast((cast(Person) element).email);
259 }
260 protected void doSetValue(Object element, Object value) {
261 (cast(Person) element).email = stringcast(value);
262 }
263 });
264 new class(v,column) ColumnViewerSorter {
265 this(TableViewer t, TableViewerColumn c ){
266 super(t,c);
267 }
268 protected int doCompare(Viewer viewer, Object e1, Object e2) {
269 Person p1 = cast(Person) e1;
270 Person p2 = cast(Person) e2;
271 return p1.email.compareToIgnoreCase(p2.email);
272 }
273 };
274
275 Person[] model = createModel();
276 v.setInput( new ArrayWrapperT!(Person)(model));
277 v.getTable().setLinesVisible(true);
278 v.getTable().setHeaderVisible(true);
279 cSorter.setSorter(cSorter, ColumnViewerSorter.ASC);
280 }
281
282 private Person[] createModel() {
283 Person[] elements = new Person[4];
284 elements[0] = new Person("Tom", "Schindl",
285 "tom.schindl@bestsolution.at");
286 elements[1] = new Person("Boris", "Bokowski",
287 "Boris_Bokowski@ca.ibm.com");
288 elements[2] = new Person("Tod", "Creasey", "Tod_Creasey@ca.ibm.com");
289 elements[3] = new Person("Wayne", "Beaton", "wayne@eclipse.org");
290
291 return elements;
292 }
293
294 /**
295 * @param args
296 */
297 public static void main(String[] args) {
298 Display display = new Display();
299
300 Shell shell = new Shell(display);
301 shell.setLayout(new FillLayout());
302 new Snippet040TableViewerSorting(shell);
303 shell.open();
304
305 while (!shell.isDisposed()) {
306 if (!display.readAndDispatch())
307 display.sleep();
308 }
309 display.dispose();
310 }
311
312 }