TreeTableModelAdapter.java revision 9883:903a2e023ffb
1100280Sgordon/* 2100280Sgordon * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. 3118638Sfjoe * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 466830Sobrien * 566830Sobrien * This code is free software; you can redistribute it and/or modify it 666830Sobrien * under the terms of the GNU General Public License version 2 only, as 766830Sobrien * published by the Free Software Foundation. 866830Sobrien * 966830Sobrien * This code is distributed in the hope that it will be useful, but WITHOUT 1066830Sobrien * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1166830Sobrien * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1266830Sobrien * version 2 for more details (a copy is included in the LICENSE file that 1366830Sobrien * accompanied this code). 1466830Sobrien * 1566830Sobrien * You should have received a copy of the GNU General Public License version 1666830Sobrien * 2 along with this work; if not, write to the Free Software Foundation, 1766830Sobrien * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1866830Sobrien * 1966830Sobrien * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2066830Sobrien * or visit www.oracle.com if you need additional information or have any 2166830Sobrien * questions. 2266830Sobrien * 2366830Sobrien */ 2466830Sobrien 2566830Sobrienpackage sun.jvm.hotspot.ui.treetable; 2666830Sobrien 2751231Ssheldonhimport javax.swing.JTree; 28100280Sgordonimport javax.swing.SwingUtilities; 29108191Sdillonimport javax.swing.table.AbstractTableModel; 30127663Sluigiimport javax.swing.tree.TreePath; 31108191Sdillonimport javax.swing.event.TreeExpansionEvent; 32108191Sdillonimport javax.swing.event.TreeExpansionListener; 33127663Sluigiimport javax.swing.event.TreeModelEvent; 34127663Sluigiimport javax.swing.event.TreeModelListener; 35127663Sluigi 36127663Sluigi/** 37108191Sdillon * This is a wrapper class takes a TreeTableModel and implements 38127663Sluigi * the table model interface. The implementation is trivial, with 39127663Sluigi * all of the event dispatching support provided by the superclass: 40127663Sluigi * the AbstractTableModel. 41108191Sdillon * 42127663Sluigi * 43127663Sluigi * @author Philip Milne 44127663Sluigi * @author Scott Violet 45127663Sluigi */ 46149170Sbrookspublic class TreeTableModelAdapter extends AbstractTableModel 47127663Sluigi{ 48127663Sluigi JTree tree; 49127663Sluigi TreeTableModel treeTableModel; 50127663Sluigi 51127663Sluigi public TreeTableModelAdapter(TreeTableModel treeTableModel, JTree tree) { 52127663Sluigi this.tree = tree; 53149170Sbrooks this.treeTableModel = treeTableModel; 54130151Sschweikh 55127663Sluigi tree.addTreeExpansionListener(new TreeExpansionListener() { 56127663Sluigi // Don't use fireTableRowsInserted() here; the selection model 57149170Sbrooks // would get updated twice. 58149170Sbrooks public void treeExpanded(TreeExpansionEvent event) { 59108191Sdillon fireTableDataChanged(); 60127663Sluigi } 61127663Sluigi public void treeCollapsed(TreeExpansionEvent event) { 62126787Sphk fireTableDataChanged(); 63127663Sluigi } 64108191Sdillon }); 65127663Sluigi 66127663Sluigi // Install a TreeModelListener that can update the table when 67127663Sluigi // tree changes. We use delayedFireTableDataChanged as we can 68127663Sluigi // not be guaranteed the tree will have finished processing 69127663Sluigi // the event before us. 70127663Sluigi treeTableModel.addTreeModelListener(new TreeModelListener() { 71108191Sdillon public void treeNodesChanged(TreeModelEvent e) { 72179014Sbms delayedFireTableDataChanged(); 73179014Sbms } 74179014Sbms 75179014Sbms public void treeNodesInserted(TreeModelEvent e) { 76182895Sbms delayedFireTableDataChanged(); 77182895Sbms } 78182895Sbms 79182895Sbms public void treeNodesRemoved(TreeModelEvent e) { 80182895Sbms delayedFireTableDataChanged(); 81182895Sbms } 82182895Sbms 83182895Sbms public void treeStructureChanged(TreeModelEvent e) { 84182895Sbms delayedFireTableDataChanged(); 85182895Sbms } 86127663Sluigi }); 87164862Sluigi } 88164862Sluigi 89164862Sluigi // Wrappers, implementing TableModel interface. 90164862Sluigi 91164862Sluigi public int getColumnCount() { 92164862Sluigi return treeTableModel.getColumnCount(); 93164862Sluigi } 94161824Sbrooks 95161824Sbrooks public String getColumnName(int column) { 96161824Sbrooks return treeTableModel.getColumnName(column); 97108191Sdillon } 98127663Sluigi 99127663Sluigi public Class getColumnClass(int column) { 100127663Sluigi return treeTableModel.getColumnClass(column); 101127663Sluigi } 102127663Sluigi 103127663Sluigi public int getRowCount() { 104127663Sluigi return tree.getRowCount(); 105127663Sluigi } 106127663Sluigi 107127663Sluigi protected Object nodeForRow(int row) { 108108191Sdillon TreePath treePath = tree.getPathForRow(row); 109127663Sluigi return treePath.getLastPathComponent(); 110127663Sluigi } 111127663Sluigi 112127663Sluigi public Object getValueAt(int row, int column) { 113108191Sdillon return treeTableModel.getValueAt(nodeForRow(row), column); 114127663Sluigi } 115127663Sluigi 116127663Sluigi public boolean isCellEditable(int row, int column) { 117127663Sluigi return treeTableModel.isCellEditable(nodeForRow(row), column); 118161824Sbrooks } 119161824Sbrooks 120161824Sbrooks public void setValueAt(Object value, int row, int column) { 121161824Sbrooks treeTableModel.setValueAt(value, nodeForRow(row), column); 122161824Sbrooks } 123208060Sdougb 124127663Sluigi /** 125127663Sluigi * Invokes fireTableDataChanged after all the pending events have been 126161533Sru * processed. SwingUtilities.invokeLater is used to handle this. 127161533Sru */ 128161533Sru protected void delayedFireTableDataChanged() { 129161533Sru SwingUtilities.invokeLater(new Runnable() { 130161533Sru public void run() { 131161533Sru fireTableDataChanged(); 132127663Sluigi } 133161533Sru }); 134161533Sru } 135161533Sru} 136161533Sru