1 package org.columba.mail.gui.table; 19 20 import javax.swing.JOptionPane ; 21 import javax.swing.table.TableCellRenderer ; 22 import javax.swing.table.TableColumn ; 23 import javax.swing.tree.TreePath ; 24 25 import org.columba.api.plugin.IExtension; 26 import org.columba.api.plugin.IExtensionHandler; 27 import org.columba.api.plugin.PluginHandlerNotFoundException; 28 import org.columba.core.logging.Logging; 29 import org.columba.core.plugin.PluginManager; 30 import org.columba.mail.gui.table.model.HeaderTableModel; 31 import org.columba.mail.gui.table.model.MessageNode; 32 import org.columba.mail.gui.table.model.TableModelSorter; 33 import org.columba.mail.gui.table.plugins.BasicHeaderRenderer; 34 import org.columba.mail.gui.table.plugins.BasicRenderer; 35 import org.columba.mail.gui.table.plugins.BooleanHeaderRenderer; 36 import org.columba.mail.plugin.IExtensionHandlerKeys; 37 import org.columba.mail.resourceloader.MailImageLoader; 38 import org.frapuccino.treetable.CustomTreeTableCellRenderer; 39 import org.frapuccino.treetable.TreeTable; 40 41 48 public class TableView extends TreeTable { 49 50 private HeaderTableModel headerTableModel; 51 52 private IExtensionHandler handler; 53 54 private TableModelSorter sorter; 55 56 private int defaultRowHeight; 57 58 public TableView(HeaderTableModel headerTableModel, TableModelSorter sorter) { 59 super(); 60 61 this.sorter = sorter; 62 this.headerTableModel = headerTableModel; 63 64 defaultRowHeight = getRowHeight(); 65 66 setModel(headerTableModel); 67 68 try { 70 handler = PluginManager 71 .getInstance().getExtensionHandler( 72 IExtensionHandlerKeys.ORG_COLUMBA_MAIL_TABLERENDERER); 73 } catch (PluginHandlerNotFoundException ex) { 74 ex.printStackTrace(); 75 } 76 77 getTree().setCellRenderer(new SubjectTreeRenderer(this)); 78 79 getTree().setLargeModel(true); 80 } 81 82 public boolean getScrollableTracksViewportHeight() { 83 return getPreferredSize().height < getParent().getHeight(); 84 } 85 86 public void resetRowHeight() { 87 setRowHeight(defaultRowHeight); 88 } 89 90 107 public void enableThreadedView(boolean b) { 108 if (b) { 109 TableColumn tc = null; 110 tc = getColumn("Subject"); 111 112 tc.setCellRenderer(null); 114 115 } else { 117 TableColumn tc = null; 118 try { 119 tc = getColumn("Subject"); 120 tc.setCellRenderer(new BasicRenderer("columba.subject")); 122 } catch (IllegalArgumentException e) { 123 124 } 125 126 } 127 } 128 129 139 public TableColumn createTableColumn(String name, int size) { 140 TableColumn c = new TableColumn (); 141 142 c.setHeaderValue(name); 144 c.setIdentifier(name); 145 146 TableCellRenderer r = null; 147 148 if (handler.exists(name)) { 149 try { 151 IExtension extension = handler.getExtension(name); 152 r = (TableCellRenderer ) extension.instanciateExtension(null); 153 } catch (Exception e) { 154 if (Logging.DEBUG) { 155 e.printStackTrace(); 156 } 157 158 JOptionPane.showMessageDialog(this, 159 "Error while loading column: " + name + "\n" 160 + e.getMessage()); 161 } 162 } 163 164 if (r == null) { 165 r = new BasicRenderer(name); 168 169 registerRenderer(c, name, r, new BasicHeaderRenderer(name, sorter), 170 size, false); 171 } else { 172 IExtension extension = handler.getExtension(name); 173 174 String image = extension.getMetadata().getAttribute("icon"); 175 String fixed = extension.getMetadata().getAttribute( "size"); 176 boolean lockSize = false; 177 178 if (fixed != null) { 179 if (fixed.equals("fixed")) { 180 size = 23; 181 lockSize = true; 182 } 183 } 184 185 if (lockSize) { 186 registerRenderer(c, name, r, new BooleanHeaderRenderer( 187 MailImageLoader.getSmallIcon(image)), size, lockSize); 188 } else { 189 registerRenderer(c, name, r, new BasicHeaderRenderer(name, 190 sorter), size, lockSize); 191 } 192 } 193 194 return c; 195 } 196 197 213 protected void registerRenderer(TableColumn tc, String name, 214 TableCellRenderer cell, TableCellRenderer header, int size, 215 boolean lockSize) { 216 if (tc == null) { 217 return; 218 } 219 220 if ( name.equals("MultiLine")) { 222 setRowHeight(getRowHeight()*2); 223 } 224 225 if (cell != null) { 226 tc.setCellRenderer(cell); 227 } 228 229 if (header != null) { 230 tc.setHeaderRenderer(header); 231 } 232 233 if (lockSize) { 234 tc.setMaxWidth(size); 235 tc.setMinWidth(size); 236 } else { 237 tc.setPreferredWidth(size); 239 } 240 } 241 242 247 public MessageNode getSelectedNode() { 248 MessageNode node = (MessageNode) getTree() 249 .getLastSelectedPathComponent(); 250 251 return node; 252 } 253 254 259 public MessageNode[] getSelectedNodes() { 260 int[] rows = null; 261 MessageNode[] nodes = null; 262 263 rows = getSelectedRows(); 264 nodes = new MessageNode[rows.length]; 265 266 for (int i = 0; i < rows.length; i++) { 267 TreePath treePath = getTree().getPathForRow(rows[i]); 268 269 if (treePath == null) { 270 continue; 271 } 272 273 nodes[i] = (MessageNode) treePath.getLastPathComponent(); 274 } 275 276 return nodes; 277 } 278 279 287 public MessageNode getMessagNode(Object uid) { 288 return headerTableModel.getMessageNode(uid); 289 } 290 291 296 public Object selectFirstRow() { 297 298 Object uid = null; 299 300 if (getRowCount() > 0) { 302 changeSelection(0, 0, true, false); 304 305 MessageNode selectedNode = (MessageNode) getValueAt(0, 0); 307 308 uid = selectedNode.getUid(); 310 311 scrollRectToVisible(getCellRect(0, 0, false)); 313 316 return uid; 317 } 318 319 return null; 320 } 321 322 327 public Object selectLastRow() { 328 329 Object uid = null; 330 331 if (getRowCount() > 0) { 333 changeSelection(getRowCount() - 1, 0, true, false); 335 336 MessageNode selectedNode = (MessageNode) getValueAt( 338 getRowCount() - 1, 0); 339 340 uid = selectedNode.getUid(); 342 343 scrollRectToVisible(getCellRect(getRowCount() - 1, 0, false)); 345 346 349 return uid; 350 } 351 352 return null; 353 } 354 355 364 public void selectAll() { 365 for (int i = 0; i < getRowCount(); i++) { 367 TreePath path = getTree().getPathForRow(i); 368 getTree().expandPath(path); 369 } 370 super.selectAll(); 372 } 373 374 380 public void makeRowVisible(int row) { 381 scrollRectToVisible(getCellRect(row, 0, false)); 382 383 } 386 387 393 public void selectRow(int row) { 394 395 if (getRowCount() > 0) { 396 if (row < 0) { 397 row = 0; 398 } 399 400 if (row >= getRowCount()) { 401 row = getRowCount() - 1; 402 } 403 404 changeSelection(row, 0, false, false); 407 408 makeRowVisible(row); 409 413 } 414 } 415 416 423 public void clearSelection() { 424 } 426 } | Popular Tags |