//----------------------------------------------------------------------------// // // // T r e e T a b l e M o d e l A d a p t e r // // // //----------------------------------------------------------------------------// package omr.ui.treetable; /* * @(#)TreeTableModelAdapter.java 1.2 98/10/27 * * Copyright 1997, 1998 by Sun Microsystems, Inc., * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A. * All rights reserved. * * This software is the confidential and proprietary information * of Sun Microsystems, Inc. ("Confidential Information"). You * shall not disclose such Confidential Information and shall use * it only in accordance with the terms of the license agreement * you entered into with Sun. */ import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeExpansionListener; import javax.swing.event.TreeModelEvent; import javax.swing.event.TreeModelListener; import javax.swing.table.AbstractTableModel; import javax.swing.tree.TreePath; /** * This is a wrapper class takes a TreeTableModel and implements the table * model interface. The implementation is trivial, with all of the event * dispatching support provided by the superclass: the AbstractTableModel. * * @author Philip Milne * @author Scott Violet * @version 1.2 10/27/98 */ public class TreeTableModelAdapter extends AbstractTableModel { //~ Instance fields -------------------------------------------------------- JTree tree; TreeTableModel treeTableModel; //~ Constructors ----------------------------------------------------------- //-----------------------// // TreeTableModelAdapter // //-----------------------// /** * Creates a new TreeTableModelAdapter object. * * @param treeTableModel DOCUMENT ME! * @param tree DOCUMENT ME! */ public TreeTableModelAdapter (TreeTableModel treeTableModel, JTree tree) { this.tree = tree; this.treeTableModel = treeTableModel; tree.addTreeExpansionListener( new TreeExpansionListener() { // Don't use fireTableRowsInserted() here; the selection model // would get updated twice. @Override public void treeExpanded (TreeExpansionEvent event) { fireTableDataChanged(); } @Override public void treeCollapsed (TreeExpansionEvent event) { fireTableDataChanged(); } }); // Install a TreeModelListener that can update the table when // tree changes. We use delayedFireTableDataChanged as we can // not be guaranteed the tree will have finished processing // the event before us. treeTableModel.addTreeModelListener( new TreeModelListener() { @Override public void treeNodesChanged (TreeModelEvent e) { delayedFireTableDataChanged(); } @Override public void treeNodesInserted (TreeModelEvent e) { delayedFireTableDataChanged(); } @Override public void treeNodesRemoved (TreeModelEvent e) { delayedFireTableDataChanged(); } @Override public void treeStructureChanged (TreeModelEvent e) { delayedFireTableDataChanged(); } }); } //~ Methods ---------------------------------------------------------------- //----------------// // getColumnClass // //----------------// /** * DOCUMENT ME! * * @param column DOCUMENT ME! * * @return DOCUMENT ME! */ @Override public Class<?> getColumnClass (int column) { return treeTableModel.getColumnClass(column); } //----------------// // getColumnCount // //----------------// // Wrappers, implementing TableModel interface. /** * DOCUMENT ME! * * @return DOCUMENT ME! */ @Override public int getColumnCount () { return treeTableModel.getColumnCount(); } //---------------// // getColumnName // //---------------// /** * DOCUMENT ME! * * @param column DOCUMENT ME! * * @return DOCUMENT ME! */ @Override public String getColumnName (int column) { return treeTableModel.getColumnName(column); } //-------------// // getRowCount // //-------------// /** * DOCUMENT ME! * * @return DOCUMENT ME! */ @Override public int getRowCount () { return tree.getRowCount(); } //------------// // getValueAt // //------------// /** * DOCUMENT ME! * * @param row DOCUMENT ME! * @param column DOCUMENT ME! * * @return DOCUMENT ME! */ @Override public Object getValueAt (int row, int column) { return treeTableModel.getValueAt(nodeForRow(row), column); } //----------------// // isCellEditable // //----------------// /** * DOCUMENT ME! * * @param row DOCUMENT ME! * @param column DOCUMENT ME! * * @return DOCUMENT ME! */ @Override public boolean isCellEditable (int row, int column) { return treeTableModel.isCellEditable(nodeForRow(row), column); } //------------// // nodeForRow // //------------// /** * DOCUMENT ME! * * @param row DOCUMENT ME! * * @return DOCUMENT ME! */ public Object nodeForRow (int row) { TreePath treePath = tree.getPathForRow(row); return treePath.getLastPathComponent(); } //------------// // setValueAt // //------------// /** * DOCUMENT ME! * * @param value DOCUMENT ME! * @param row DOCUMENT ME! * @param column DOCUMENT ME! */ @Override public void setValueAt (Object value, int row, int column) { treeTableModel.setValueAt(value, nodeForRow(row), column); } //-----------------------------// // delayedFireTableDataChanged // //-----------------------------// /** * Invokes fireTableDataChanged after all the pending events have been * processed. SwingUtilities.invokeLater is used to handle this. */ protected void delayedFireTableDataChanged () { SwingUtilities.invokeLater( new Runnable() { @Override public void run () { fireTableDataChanged(); } }); } }