1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.seasar.uruma.viewer;
17
18 import java.util.HashMap;
19 import java.util.Map;
20
21 import org.eclipse.jface.viewers.IBaseLabelProvider;
22 import org.eclipse.jface.viewers.ITableLabelProvider;
23 import org.eclipse.jface.viewers.TableViewer;
24 import org.eclipse.jface.viewers.Viewer;
25 import org.eclipse.jface.viewers.ViewerComparator;
26 import org.eclipse.swt.SWT;
27 import org.eclipse.swt.events.SelectionEvent;
28 import org.eclipse.swt.events.SelectionListener;
29 import org.eclipse.swt.widgets.Table;
30 import org.eclipse.swt.widgets.TableColumn;
31
32
33
34
35
36
37 public class GenericTableViewerComparator extends ViewerComparator {
38 private Table table;
39
40 private Map<TableColumn, Integer> columnMap = new HashMap<TableColumn, Integer>();
41
42 private TableColumn sortKey;
43
44 private SortingState sortingState = SortingState.NONE;
45
46
47
48
49 public GenericTableViewerComparator() {
50 super(new StringAndNumberComparator());
51 }
52
53 protected void setupColumnMap(final TableViewer viewer) {
54 this.table = viewer.getTable();
55 TableColumn[] columns = table.getColumns();
56 if (columns.length == 0) {
57 return;
58 }
59
60 for (int i = 0; i < columns.length; i++) {
61 columnMap.put(columns[i], i);
62
63 columns[i].addSelectionListener(new SelectionListener() {
64 public void widgetDefaultSelected(final SelectionEvent e) {
65 }
66
67 public void widgetSelected(final SelectionEvent e) {
68 setSortKey((TableColumn) e.widget);
69 viewer.setInput(viewer.getInput());
70 }
71 });
72 }
73
74 sortKey = columns[0];
75 }
76
77
78
79
80
81 @Override
82 public int compare(final Viewer viewer, final Object e1, final Object e2) {
83 TableViewer tableViewer = (TableViewer) viewer;
84
85 if (this.table == null) {
86 setupColumnMap(tableViewer);
87 }
88
89 int cat1 = category(e1);
90 int cat2 = category(e2);
91
92 if (cat1 != cat2) {
93 return cat1 - cat2;
94 }
95
96 Integer sortColumn = columnMap.get(sortKey);
97 if (sortColumn != null) {
98 int result = doCompare(tableViewer, e1, e2, sortColumn.intValue());
99
100 if (sortingState == SortingState.ASCENDING) {
101 return result;
102 } else if (sortingState == SortingState.DESCENDING) {
103 return result * (-1);
104 } else {
105 return 0;
106 }
107 } else {
108 return 0;
109 }
110 }
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126 protected int doCompare(final TableViewer viewer, final Object e1,
127 final Object e2, final int sortColumn) {
128 IBaseLabelProvider baseLabelProvider = viewer.getLabelProvider();
129
130 String value1 = "";
131 String value2 = "";
132 if (baseLabelProvider instanceof ITableLabelProvider) {
133 ITableLabelProvider prov = (ITableLabelProvider) baseLabelProvider;
134 value1 = prov.getColumnText(e1, sortColumn);
135 value2 = prov.getColumnText(e2, sortColumn);
136 } else {
137 value1 = e1.toString();
138 value2 = e2.toString();
139 }
140
141 if (value1 == null) {
142 value1 = "";
143 }
144 if (value2 == null) {
145 value2 = "";
146 }
147
148 return getComparator().compare(value1, value2);
149 }
150
151
152
153
154
155
156
157
158 public void setSortKey(final TableColumn tableColumn) {
159 if ((tableColumn != null) && !tableColumn.isDisposed()) {
160 sortKey = tableColumn;
161
162 if (sortingState == SortingState.DESCENDING) {
163 sortingState = SortingState.ASCENDING;
164 table.setSortColumn(sortKey);
165 table.setSortDirection(SWT.UP);
166 } else if (sortingState == SortingState.ASCENDING) {
167 sortingState = SortingState.NONE;
168 table.setSortColumn(null);
169 table.setSortDirection(SWT.NONE);
170 } else if (sortingState == SortingState.NONE) {
171 sortingState = SortingState.DESCENDING;
172 table.setSortColumn(sortKey);
173 table.setSortDirection(SWT.DOWN);
174 }
175 }
176 }
177 }