1 package org.columba.mail.gui.table.model; 19 20 import java.text.Collator ; 21 import java.util.Collections ; 22 import java.util.Comparator ; 23 import java.util.Date ; 24 import java.util.List ; 25 import java.util.Vector ; 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 46 public class TableModelSorter implements ModelVisitor { 47 48 protected boolean ascending = true; 49 50 protected String sort = new String ("Date"); 51 52 protected Collator collator; 53 54 protected SortingStateObservable sortingStateObservable; 55 56 public TableModelSorter() { 57 58 setSortingColumn("Date"); 59 60 setSortingOrder(true); 61 62 sortingStateObservable = new SortingStateObservable(); 65 sortingStateObservable.setSortingState(getSortingColumn(), 66 getSortingOrder()); 67 68 collator = Collator.getInstance(); 69 } 70 71 74 public SortingStateObservable getSortingStateObservable() { 75 return sortingStateObservable; 76 } 77 78 85 public Object [] getColumns() { 86 XmlElement tableElement = FolderItem.getGlobalOptions(); 87 88 XmlElement columns = tableElement.getElement("columns"); 89 90 Vector v = new Vector (); 91 92 for (int i = 0; i < columns.count(); i++) { 93 XmlElement column = columns.getElement(i); 94 95 String name = column.getAttribute("name"); 96 v.add(name); 97 } 98 99 Object [] result = new String [v.size()]; 100 result = v.toArray(); 101 102 return result; 103 } 104 105 public void loadConfig(TableView view) { 106 107 } 108 109 113 114 public String getSortingColumn() { 115 return sort; 116 } 117 118 public boolean getSortingOrder() { 119 return ascending; 120 } 121 122 public void setSortingColumn(String str) { 123 sort = str; 124 } 125 126 public void setSortingOrder(boolean b) { 127 ascending = b; 128 } 129 130 137 public void sort(HeaderTableModel tableModel) { 138 142 MessageNode rootNode = tableModel.getRootNode(); 143 144 List v = rootNode.getVector(); 147 if (v == null) 148 return; 149 150 Collections.sort(v, new MessageHeaderComparator(getSortingColumn(), 152 tableModel.getColumnNumber(getSortingColumn()), 153 getSortingOrder())); 154 155 } 159 160 class MessageHeaderComparator implements Comparator { 161 protected int column; 162 163 protected boolean ascending; 164 165 protected String columnName; 166 167 public MessageHeaderComparator(String columnName, int sortCol, 168 boolean sortAsc) { 169 column = sortCol; 170 ascending = sortAsc; 171 this.columnName = columnName; 172 } 173 174 public int compare(Object o1, Object 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) { result = 1; 211 } else { 212 result = -1; 213 } 214 } else if (columnName.equals("Attachment")) { 215 boolean f1 = ((Boolean ) header1.get("columba.attachment")) 216 .booleanValue(); 217 boolean f2 = ((Boolean ) header2.get("columba.attachment")) 218 .booleanValue(); 219 220 if (f1 == f2) { 221 result = 0; 222 } else if (f1) { result = 1; 224 } else { 225 result = -1; 226 } 227 } else if ( (columnName.equals("Date")) || (columnName.equals("MultiLine")) ) { 228 Date d1 = (Date ) header1.get("columba.date"); 229 Date d2 = (Date ) 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 ) header1.get("columba.size")).intValue(); 238 int i2 = ((Integer ) 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 ) header1.get("columba.spam")) 249 .booleanValue(); 250 boolean f2 = ((Boolean ) header2.get("columba.spam")) 251 .booleanValue(); 252 253 if (f1 == f2) { 254 result = 0; 255 } else if (f1) { result = 1; 257 } else { 258 result = -1; 259 } 260 } else { 261 Object item1 = header1.get(columnName); 262 Object 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 ) { 271 result = collator.compare((String ) item1, (String ) item2); 272 } else if (item1 instanceof Boolean ) { 273 result = collator.compare((Boolean ) item1, (Boolean ) item2); 274 } 275 } 276 277 if (!ascending) { 278 result = -result; 279 } 280 281 return result; 282 } 283 284 public boolean equals(Object 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 299 public void visit(HeaderTableModel realModel) { 300 sort(realModel); 301 } 302 } | Popular Tags |