1 package org.columba.mail.gui.table.model; 19 20 import java.util.Enumeration ; 21 import java.util.HashMap ; 22 import java.util.List ; 23 import java.util.Map ; 24 import java.util.Vector ; 25 26 import javax.swing.event.ChangeEvent ; 27 import javax.swing.event.ListSelectionEvent ; 28 import javax.swing.event.TableColumnModelEvent ; 29 import javax.swing.tree.DefaultTreeModel ; 30 import javax.swing.tree.TreePath ; 31 32 import org.columba.mail.gui.table.IHeaderTableModel; 33 import org.columba.mail.message.ColumbaHeader; 34 import org.columba.mail.message.ICloseableIterator; 35 import org.columba.mail.message.IColumbaHeader; 36 import org.columba.mail.message.IHeaderList; 37 import org.frapuccino.treetable.AbstractTreeTableModel; 38 import org.frapuccino.treetable.CustomTreeTableCellRenderer; 39 40 public class HeaderTableModel extends AbstractTreeTableModel implements IHeaderTableModel { 41 42 45 private List columns = new Vector (); 46 47 protected IHeaderList headerList; 48 49 57 protected Map map = new HashMap (); 58 59 protected MessageNode root; 60 61 private boolean enableThreadedView; 62 63 private Vector visitors = new Vector (); 64 65 public HeaderTableModel() { 66 } 67 68 public HeaderTableModel(String [] c) { 69 for (int i = 0; i < c.length; i++) { 71 columns.add(c[i]); 72 } 73 } 74 75 public void registerVisitor(ModelVisitor visitor) { 76 visitors.add(visitor); 77 } 78 79 83 84 89 public void modify(Object [] uids) { 90 for (int i = 0; i < uids.length; i++) { 91 MessageNode node = (MessageNode) map.get(uids[i]); 92 93 IColumbaHeader header = getHeaderList().get(uids[i]); 94 if( header == null) continue; 95 96 node.setUserObject(header); 97 98 if (node != null) { 99 getTreeModel().nodeChanged(node); 101 } 102 } 103 104 } 105 106 111 public void remove(Object [] uids) { 112 if (uids != null) { 113 for (int i = 0; i < uids.length; i++) { 114 MessageNode node = (MessageNode) map.get(uids[i]); 115 116 if (node != null) { 117 map.remove(node); 118 119 if (node.getParent() != null) { 120 getTreeModel().removeNodeFromParent(node); 121 } 122 } 123 } 124 125 } 126 } 127 128 public void reset() { 129 if (root == null) { 130 root = new MessageNode(new ColumbaHeader(), "0"); 131 132 tree.setRootNode(root); 133 } 134 135 root.removeAllChildren(); 137 138 map.clear(); 140 141 if ((headerList == null) || (headerList.count() == 0)) { 142 145 getTreeModel().nodeStructureChanged(getRootNode()); 146 147 fireTableDataChanged(); 148 149 return; 150 } 151 152 153 } 154 155 public void update() { 156 if ((headerList == null) || (headerList.count() == 0)) { 157 root.removeAllChildren(); 160 161 getTreeModel().nodeStructureChanged(getRootNode()); 162 163 fireTableDataChanged(); 164 165 return; 166 } 167 168 ICloseableIterator it; 170 for (it = headerList.keyIterator(); it.hasNext();) { 171 Object uid = it.next(); 173 174 if( !map.containsKey(uid)) { 175 IColumbaHeader header = headerList.get(uid); 177 178 MessageNode child = new MessageNode(header, uid); 180 181 map.put(uid, child); 183 184 root.add(child); 186 } 187 } 188 it.close(); 189 190 191 Enumeration e = visitors.elements(); 192 while (e.hasMoreElements()) { 193 ModelVisitor v = (ModelVisitor) e.nextElement(); 194 v.visit(this); 195 } 196 197 getTreeModel().nodeStructureChanged(getRootNode()); 198 199 fireTableDataChanged(); 200 } 201 202 public void clear() { 203 root = new MessageNode(new ColumbaHeader(), "0"); 204 tree.setRootNode(root); 205 206 } 207 208 213 public void set(IHeaderList headerList) { 214 this.headerList = headerList; 215 216 reset(); 217 update(); 218 } 219 220 221 public void enableThreadedView(boolean b) { 222 enableThreadedView = b; 223 } 224 225 public MessageNode getRootNode() { 226 return root; 227 } 228 229 public IHeaderList getHeaderList() { 230 return headerList; 231 } 232 233 public MessageNode getMessageNode(Object uid) { 234 return (MessageNode) map.get(uid); 235 } 236 237 public DefaultTreeModel getTreeModel() { 238 return (DefaultTreeModel ) getTree().getModel(); 239 } 240 241 242 public int getColumnCount() { 243 return columns.size(); 244 } 245 246 public int getRowCount() { 247 if (getTree() != null) { 248 return getTree().getRowCount(); 249 } else { 250 return 0; 251 } 252 } 253 254 public Object getValueAt(int row, int col) { 255 TreePath treePath = getTree().getPathForRow(row); 257 if( treePath == null) return null; 258 259 return (MessageNode) treePath.getLastPathComponent(); 260 } 261 262 269 public int getRow(MessageNode node) { 270 271 for (int i = 0; i < getTree().getRowCount(); i++) { 272 MessageNode n = (MessageNode) getValueAt(i, 0); 273 if (n.getUid().equals(node.getUid())) 274 return i; 275 } 276 277 return -1; 278 } 279 280 public String getColumnName(int column) { 281 return (String ) columns.get(column); 282 } 283 284 public int getColumnNumber(String name) { 285 for (int i = 0; i < getColumnCount(); i++) { 286 if (name.equals(getColumnName(i))) { 287 return i; 288 } 289 } 290 291 return -1; 292 } 293 294 302 public Class getColumnClass(int column) { 303 if (enableThreadedView) { 304 if (getColumnName(column).equals("Subject")) { 305 return CustomTreeTableCellRenderer.class; 306 } 307 } 308 309 return getValueAt(0, column).getClass(); 310 } 311 312 public boolean isCellEditable(int row, int col) { 313 String name = getColumnName(col); 314 315 if (name.equalsIgnoreCase("Subject")) { 316 return true; 317 } 318 319 return false; 320 } 321 322 328 public void setColumns(String [] c) { 329 columns = new Vector (); 330 331 for (int i = 0; i < c.length; i++) { 333 columns.add(c[i]); 334 } 335 } 336 337 343 public void addColumn(String c) { 344 columns.add(c); 345 } 346 347 351 public void clearColumns() { 352 columns.clear(); 353 } 354 355 358 public MessageNode getMessageNodeAtRow(int index) { 359 return (MessageNode) getValueAt(index,0); 360 } 361 362 public void columnMarginChanged(ChangeEvent e) { 363 } 364 365 public void columnSelectionChanged(ListSelectionEvent e) { 366 } 367 368 public void columnAdded(TableColumnModelEvent e) { 369 } 370 371 public void columnMoved(TableColumnModelEvent e) { 372 if( e.getFromIndex() != e.getToIndex()) { 373 columns.add(e.getToIndex(),columns.remove(e.getFromIndex())); 374 } 375 } 376 377 public void columnRemoved(TableColumnModelEvent e) { 378 } 379 380 } | Popular Tags |