1 package org.mc4j.console.swing.treetable; 2 3 16 17 import java.awt.Component ; 18 import java.awt.Dimension ; 19 import java.awt.Graphics ; 20 import java.awt.event.MouseEvent ; 21 import java.util.EventObject ; 22 23 import javax.swing.JTable ; 24 import javax.swing.JTree ; 25 import javax.swing.ListSelectionModel ; 26 import javax.swing.LookAndFeel ; 27 import javax.swing.UIManager ; 28 import javax.swing.event.ListSelectionEvent ; 29 import javax.swing.event.ListSelectionListener ; 30 import javax.swing.table.TableCellEditor ; 31 import javax.swing.table.TableCellRenderer ; 32 import javax.swing.tree.DefaultTreeCellRenderer ; 33 import javax.swing.tree.DefaultTreeSelectionModel ; 34 import javax.swing.tree.TreeCellRenderer ; 35 import javax.swing.tree.TreeModel ; 36 import javax.swing.tree.TreePath ; 37 38 47 public class JTreeTableOrig extends JTable { 48 51 protected TreeTableCellRenderer tree; 52 53 public JTreeTableOrig(TreeTableModel treeTableModel) { 54 super(); 55 56 tree = new TreeTableCellRenderer(this, treeTableModel); 58 59 super.setModel(new TreeTableModelAdapter(treeTableModel, tree)); 61 62 ListToTreeSelectionModelWrapper selectionWrapper = new 64 ListToTreeSelectionModelWrapper(); 65 tree.setSelectionModel(selectionWrapper); 66 setSelectionModel(selectionWrapper.getListSelectionModel()); 67 68 setDefaultRenderer(TreeTableModel.class, tree); 70 setDefaultEditor(TreeTableModel.class, new TreeTableCellEditor()); 71 72 setShowGrid(false); 74 75 setIntercellSpacing(new Dimension (0, 0)); 77 78 if (tree.getRowHeight() < 1) { 81 setRowHeight(18); 83 } 84 } 85 86 91 public void updateUI() { 92 super.updateUI(); 93 if (tree != null) { 94 tree.updateUI(); 95 } 96 LookAndFeel.installColorsAndFont(this, "Tree.background", 99 "Tree.foreground", "Tree.font"); 100 } 101 102 108 public int getEditingRow() { 109 return (getColumnClass(editingColumn) == TreeTableModel.class) ? -1 : 110 editingRow; 111 } 112 113 116 public void setRowHeight(int rowHeight) { 117 super.setRowHeight(rowHeight); 118 if (tree != null && tree.getRowHeight() != rowHeight) { 119 tree.setRowHeight(getRowHeight()); 120 } 121 } 122 123 126 public JTree getTree() { 127 return tree; 128 } 129 130 133 public static class TreeTableCellRenderer extends JTree implements TableCellRenderer { 134 135 138 protected int visibleRow; 139 140 protected JTreeTableOrig treeTable; 141 142 public TreeTableCellRenderer(JTreeTableOrig treeTable, TreeModel model) { 143 super(model); 144 this.treeTable = treeTable; 145 } 146 147 151 public void updateUI() { 152 super.updateUI(); 153 TreeCellRenderer tcr = getCellRenderer(); 156 if (tcr instanceof DefaultTreeCellRenderer ) { 157 DefaultTreeCellRenderer dtcr = ((DefaultTreeCellRenderer ) tcr); 158 dtcr.setTextSelectionColor(UIManager.getColor 163 ("Table.selectionForeground")); 164 dtcr.setBackgroundSelectionColor(UIManager.getColor 165 ("Table.selectionBackground")); 166 } 167 } 168 169 173 public void setRowHeight(int rowHeight) { 174 if (rowHeight > 0) { 175 super.setRowHeight(rowHeight); 176 if (this.treeTable != null && 177 treeTable.getRowHeight() != rowHeight) { 178 treeTable.setRowHeight(getRowHeight()); 179 } 180 } 181 } 182 183 186 public void setBounds(int x, int y, int w, int h) { 187 super.setBounds(x, 0, w, treeTable.getHeight()); 188 } 189 190 194 public void paint(Graphics g) { 195 g.translate(0, -visibleRow * getRowHeight()); 196 super.paint(g); 197 } 198 199 202 public Component getTableCellRendererComponent(JTable table, 203 Object value, 204 boolean isSelected, 205 boolean hasFocus, 206 int row, int column) { 207 if (isSelected) 208 setBackground(table.getSelectionBackground()); 209 else 210 setBackground(table.getBackground()); 211 212 visibleRow = row; 213 return this; 214 } 215 } 216 217 218 222 public class TreeTableCellEditor extends AbstractCellEditor implements 223 TableCellEditor { 224 public Component getTableCellEditorComponent(JTable table, 225 Object value, 226 boolean isSelected, 227 int r, int c) { 228 return tree; 229 } 230 231 249 public boolean isCellEditable(EventObject e) { 250 if (e instanceof MouseEvent ) { 251 for (int counter = getColumnCount() - 1; counter >= 0; 252 counter--) { 253 if (getColumnClass(counter) == TreeTableModel.class) { 254 MouseEvent me = (MouseEvent ) e; 255 MouseEvent newME = new MouseEvent (tree, me.getID(), 256 me.getWhen(), me.getModifiers(), 257 me.getX() - getCellRect(0, counter, true).x, 258 me.getY(), me.getClickCount(), 259 me.isPopupTrigger()); 260 tree.dispatchEvent(newME); 261 break; 262 } 263 } 264 } 265 return false; 266 } 267 } 268 269 270 276 class ListToTreeSelectionModelWrapper extends DefaultTreeSelectionModel { 277 280 protected boolean updatingListSelectionModel; 281 282 public ListToTreeSelectionModelWrapper() { 283 super(); 284 getListSelectionModel().addListSelectionListener 285 (createListSelectionListener()); 286 } 287 288 293 ListSelectionModel getListSelectionModel() { 294 return listSelectionModel; 295 } 296 297 302 public void resetRowSelection() { 303 if (!updatingListSelectionModel) { 304 updatingListSelectionModel = true; 305 try { 306 super.resetRowSelection(); 307 } finally { 308 updatingListSelectionModel = false; 309 } 310 } 311 } 317 318 321 protected ListSelectionListener createListSelectionListener() { 322 return new ListSelectionHandler(); 323 } 324 325 330 protected void updateSelectedPathsFromSelectedRows() { 331 if (!updatingListSelectionModel) { 332 updatingListSelectionModel = true; 333 try { 334 int min = listSelectionModel.getMinSelectionIndex(); 337 int max = listSelectionModel.getMaxSelectionIndex(); 338 339 clearSelection(); 340 if (min != -1 && max != -1) { 341 for (int counter = min; counter <= max; counter++) { 342 if (listSelectionModel.isSelectedIndex(counter)) { 343 TreePath selPath = tree.getPathForRow 344 (counter); 345 346 if (selPath != null) { 347 addSelectionPath(selPath); 348 } 349 } 350 } 351 } 352 } finally { 353 updatingListSelectionModel = false; 354 } 355 } 356 } 357 358 362 class ListSelectionHandler implements ListSelectionListener { 363 public void valueChanged(ListSelectionEvent e) { 364 updateSelectedPathsFromSelectedRows(); 365 } 366 } 367 } 368 } 369 | Popular Tags |