KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > mail > gui > table > model > TableModelSorter


1 // The contents of this file are subject to the Mozilla Public License Version
2
// 1.1
3
//(the "License"); you may not use this file except in compliance with the
4
//License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
5
//
6
//Software distributed under the License is distributed on an "AS IS" basis,
7
//WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
8
//for the specific language governing rights and
9
//limitations under the License.
10
//
11
//The Original Code is "The Columba Project"
12
//
13
//The Initial Developers of the Original Code are Frederik Dietz and Timo
14
// Stich.
15
//Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
16
//
17
//All Rights Reserved.
18
package org.columba.mail.gui.table.model;
19
20 import java.text.Collator JavaDoc;
21 import java.util.Collections JavaDoc;
22 import java.util.Comparator JavaDoc;
23 import java.util.Date JavaDoc;
24 import java.util.List JavaDoc;
25 import java.util.Vector JavaDoc;
26
27 import org.columba.core.xml.XmlElement;
28 import org.columba.mail.config.FolderItem;
29 import org.columba.mail.gui.table.SortingStateObservable;
30 import org.columba.mail.gui.table.TableView;
31 import org.columba.mail.message.ColumbaHeader;
32 import org.columba.ristretto.message.Flags;
33
34 /**
35  *
36  *
37  * Extends <class>BasicTableModelSorter </class> with Columba specific stuff.
38  * <p>
39  * Sorting order and column are initially loaded/saved from an xml configuration
40  * file.
41  * <p>
42  * It especially implements <interface>TableModelModifier </interface>.
43  *
44  * @author fdietz
45  */

46 public class TableModelSorter implements ModelVisitor {
47
48     protected boolean ascending = true;
49
50     protected String JavaDoc sort = new String JavaDoc("Date");
51
52     protected Collator JavaDoc collator;
53     
54     protected SortingStateObservable sortingStateObservable;
55
56     public TableModelSorter() {
57
58         setSortingColumn("Date");
59
60         setSortingOrder(true);
61
62         // observable connects the sorting table with the sort menu (View->Sort
63
// Messages)
64
sortingStateObservable = new SortingStateObservable();
65         sortingStateObservable.setSortingState(getSortingColumn(),
66                 getSortingOrder());
67
68         collator = Collator.getInstance();
69     }
70
71     /**
72      * @return
73      */

74     public SortingStateObservable getSortingStateObservable() {
75         return sortingStateObservable;
76     }
77
78     /**
79      *
80      * This method is used by <class>SortMessagesMenu </class> to generate the
81      * available menuitem entries
82      *
83      * @return array of visible columns
84      */

85     public Object JavaDoc[] getColumns() {
86         XmlElement tableElement = FolderItem.getGlobalOptions();
87
88         XmlElement columns = tableElement.getElement("columns");
89
90         Vector JavaDoc v = new Vector JavaDoc();
91
92         for (int i = 0; i < columns.count(); i++) {
93             XmlElement column = columns.getElement(i);
94
95             String JavaDoc name = column.getAttribute("name");
96             v.add(name);
97         }
98
99         Object JavaDoc[] result = new String JavaDoc[v.size()];
100         result = v.toArray();
101
102         return result;
103     }
104
105     public void loadConfig(TableView view) {
106
107     }
108
109     /**
110      * ***************************** implements TableModelModifier
111      * ******************
112      */

113
114     public String JavaDoc getSortingColumn() {
115         return sort;
116     }
117
118     public boolean getSortingOrder() {
119         return ascending;
120     }
121
122     public void setSortingColumn(String JavaDoc str) {
123         sort = str;
124     }
125
126     public void setSortingOrder(boolean b) {
127         ascending = b;
128     }
129
130     /**
131      *
132      * sort the table
133      *
134      * use selected column and sorting order
135      *
136      */

137     public void sort(HeaderTableModel tableModel) {
138         /*
139          * if (str.equals("In Order Received")) { // do not sort the table, just
140          * use MessageNode rootNode = getRootNode(); } else {
141          */

142         MessageNode rootNode = tableModel.getRootNode();
143
144         // get a list of MessageNode objects of the first
145
// hierachy level
146
List JavaDoc v = rootNode.getVector();
147         if (v == null)
148             return;
149
150         // do the sorting
151
Collections.sort(v, new MessageHeaderComparator(getSortingColumn(),
152                 tableModel.getColumnNumber(getSortingColumn()),
153                 getSortingOrder()));
154
155         // notify tree
156
//getRealModel().getTreeModel().nodeStructureChanged(getRootNode());
157
//}
158
}
159
160     class MessageHeaderComparator implements Comparator JavaDoc {
161         protected int column;
162
163         protected boolean ascending;
164
165         protected String JavaDoc columnName;
166
167         public MessageHeaderComparator(String JavaDoc columnName, int sortCol,
168                 boolean sortAsc) {
169             column = sortCol;
170             ascending = sortAsc;
171             this.columnName = columnName;
172         }
173
174         public int compare(Object JavaDoc o1, Object JavaDoc o2) {
175             MessageNode node1 = (MessageNode) o1;
176             MessageNode node2 = (MessageNode) o2;
177
178             ColumbaHeader header1 = (ColumbaHeader) node1.getUserObject();
179             ColumbaHeader header2 = (ColumbaHeader) node2.getUserObject();
180
181             if ((header1 == null) || (header2 == null)) {
182                 return 0;
183             }
184
185             int result = 0;
186
187             if (columnName.equals("Status")) {
188                 Flags flags1 = header1.getFlags();
189                 Flags flags2 = header2.getFlags();
190
191                 if ((flags1 == null) || (flags2 == null)) {
192                     result = 0;
193                 } else if ((flags1.getSeen()) && (!flags2.getSeen())) {
194                     result = -1;
195                 } else if ((!flags1.getSeen()) && (flags2.getSeen())) {
196                     result = 1;
197                 } else {
198                     result = 0;
199                 }
200             } else if (columnName.equals("Flagged")) {
201                 Flags flags1 = header1.getFlags();
202                 Flags flags2 = header2.getFlags();
203
204                 boolean f1 = flags1.getFlagged();
205                 boolean f2 = flags2.getFlagged();
206
207                 if (f1 == f2) {
208                     result = 0;
209                 } else if (f1) { // define false < true
210
result = 1;
211                 } else {
212                     result = -1;
213                 }
214             } else if (columnName.equals("Attachment")) {
215                 boolean f1 = ((Boolean JavaDoc) header1.get("columba.attachment"))
216                         .booleanValue();
217                 boolean f2 = ((Boolean JavaDoc) header2.get("columba.attachment"))
218                         .booleanValue();
219
220                 if (f1 == f2) {
221                     result = 0;
222                 } else if (f1) { // define false < true
223
result = 1;
224                 } else {
225                     result = -1;
226                 }
227             } else if ( (columnName.equals("Date")) || (columnName.equals("MultiLine")) ) {
228                 Date JavaDoc d1 = (Date JavaDoc) header1.get("columba.date");
229                 Date JavaDoc d2 = (Date JavaDoc) header2.get("columba.date");
230
231                 if ((d1 == null) || (d2 == null)) {
232                     result = 0;
233                 } else {
234                     result = d1.compareTo(d2);
235                 }
236             } else if (columnName.equals("Size")) {
237                 int i1 = ((Integer JavaDoc) header1.get("columba.size")).intValue();
238                 int i2 = ((Integer JavaDoc) header2.get("columba.size")).intValue();
239
240                 if (i1 == i2) {
241                     result = 0;
242                 } else if (i1 > i2) {
243                     result = 1;
244                 } else {
245                     result = -1;
246                 }
247             } else if (columnName.equals("Spam")) {
248                 boolean f1 = ((Boolean JavaDoc) header1.get("columba.spam"))
249                         .booleanValue();
250                 boolean f2 = ((Boolean JavaDoc) header2.get("columba.spam"))
251                         .booleanValue();
252
253                 if (f1 == f2) {
254                     result = 0;
255                 } else if (f1) { // define false < true
256
result = 1;
257                 } else {
258                     result = -1;
259                 }
260             } else {
261                 Object JavaDoc item1 = header1.get(columnName);
262                 Object JavaDoc item2 = header2.get(columnName);
263
264                 if ((item1 != null) && (item2 == null)) {
265                     result = 1;
266                 } else if ((item1 == null) && (item2 != null)) {
267                     result = -1;
268                 } else if ((item1 == null) && (item2 == null)) {
269                     result = 0;
270                 } else if (item1 instanceof String JavaDoc) {
271                     result = collator.compare((String JavaDoc) item1, (String JavaDoc) item2);
272                 } else if (item1 instanceof Boolean JavaDoc) {
273                     result = collator.compare((Boolean JavaDoc) item1, (Boolean JavaDoc) item2);
274                 }
275             }
276
277             if (!ascending) {
278                 result = -result;
279             }
280
281             return result;
282         }
283
284         public boolean equals(Object JavaDoc obj) {
285             if (obj instanceof MessageHeaderComparator) {
286                 MessageHeaderComparator compObj = (MessageHeaderComparator) obj;
287
288                 return (compObj.column == column)
289                         && (compObj.ascending == ascending);
290             }
291
292             return false;
293         }
294     }
295
296     /**
297      * @see org.columba.mail.gui.table.model.ModelVisitor#visit(org.columba.mail.gui.table.model.TreeTableModelInterface)
298      */

299     public void visit(HeaderTableModel realModel) {
300         sort(realModel);
301     }
302 }
Popular Tags