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