001: ////////////////////////////////////////////////////////////////////////////////
002: // checkstyle: Checks Java source code for adherence to a set of rules.
003: // Copyright (C) 2001-2002 Oliver Burn
004: //
005: // This library is free software; you can redistribute it and/or
006: // modify it under the terms of the GNU Lesser General Public
007: // License as published by the Free Software Foundation; either
008: // version 2.1 of the License, or (at your option) any later version.
009: //
010: // This library is distributed in the hope that it will be useful,
011: // but WITHOUT ANY WARRANTY; without even the implied warranty of
012: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: // Lesser General Public License for more details.
014: //
015: // You should have received a copy of the GNU Lesser General Public
016: // License along with this library; if not, write to the Free Software
017: // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
018: ////////////////////////////////////////////////////////////////////////////////
019:
020: /*
021: * @(#)TreeTableModelAdapter.java 1.2 98/10/27
022: *
023: * Copyright 1997, 1998 by Sun Microsystems, Inc.,
024: * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
025: * All rights reserved.
026: *
027: * This software is the confidential and proprietary information
028: * of Sun Microsystems, Inc. ("Confidential Information"). You
029: * shall not disclose such Confidential Information and shall use
030: * it only in accordance with the terms of the license agreement
031: * you entered into with Sun.
032: */
033:
034: package com.puppycrawl.tools.checkstyle.gui;
035:
036: import javax.swing.JTree;
037: import javax.swing.SwingUtilities;
038: import javax.swing.table.AbstractTableModel;
039: import javax.swing.tree.TreePath;
040: import javax.swing.event.TreeExpansionEvent;
041: import javax.swing.event.TreeExpansionListener;
042: import javax.swing.event.TreeModelEvent;
043: import javax.swing.event.TreeModelListener;
044:
045: /**
046: * This is a wrapper class takes a TreeTableModel and implements
047: * the table model interface. The implementation is trivial, with
048: * all of the event dispatching support provided by the superclass:
049: * the AbstractTableModel.
050: *
051: * @version 1.2 10/27/98
052: *
053: * @author Philip Milne
054: * @author Scott Violet
055: */
056: public class TreeTableModelAdapter extends AbstractTableModel {
057: private JTree mTree;
058: private TreeTableModel mTreeTableModel;
059:
060: public TreeTableModelAdapter(TreeTableModel aTreeTableModel,
061: JTree aTree) {
062: this .mTree = aTree;
063: this .mTreeTableModel = aTreeTableModel;
064:
065: aTree.addTreeExpansionListener(new TreeExpansionListener() {
066: // Don't use fireTableRowsInserted() here; the selection model
067: // would get updated twice.
068: public void treeExpanded(TreeExpansionEvent event) {
069: fireTableDataChanged();
070: }
071:
072: public void treeCollapsed(TreeExpansionEvent event) {
073: fireTableDataChanged();
074: }
075: });
076:
077: // Install a TreeModelListener that can update the table when
078: // mTree changes. We use delayedFireTableDataChanged as we can
079: // not be guaranteed the mTree will have finished processing
080: // the event before us.
081: aTreeTableModel.addTreeModelListener(new TreeModelListener() {
082: public void treeNodesChanged(TreeModelEvent e) {
083: delayedFireTableDataChanged();
084: }
085:
086: public void treeNodesInserted(TreeModelEvent e) {
087: delayedFireTableDataChanged();
088: }
089:
090: public void treeNodesRemoved(TreeModelEvent e) {
091: delayedFireTableDataChanged();
092: }
093:
094: public void treeStructureChanged(TreeModelEvent e) {
095: delayedFireTableDataChanged();
096: }
097: });
098: }
099:
100: // Wrappers, implementing TableModel interface.
101:
102: public int getColumnCount() {
103: return mTreeTableModel.getColumnCount();
104: }
105:
106: public String getColumnName(int column) {
107: return mTreeTableModel.getColumnName(column);
108: }
109:
110: public Class getColumnClass(int column) {
111: return mTreeTableModel.getColumnClass(column);
112: }
113:
114: public int getRowCount() {
115: return mTree.getRowCount();
116: }
117:
118: protected Object nodeForRow(int row) {
119: final TreePath treePath = mTree.getPathForRow(row);
120: return treePath.getLastPathComponent();
121: }
122:
123: public Object getValueAt(int row, int column) {
124: return mTreeTableModel.getValueAt(nodeForRow(row), column);
125: }
126:
127: public boolean isCellEditable(int row, int column) {
128: return mTreeTableModel.isCellEditable(nodeForRow(row), column);
129: }
130:
131: public void setValueAt(Object value, int row, int column) {
132: mTreeTableModel.setValueAt(value, nodeForRow(row), column);
133: }
134:
135: /**
136: * Invokes fireTableDataChanged after all the pending events have been
137: * processed. SwingUtilities.invokeLater is used to handle this.
138: */
139: protected void delayedFireTableDataChanged() {
140: SwingUtilities.invokeLater(new Runnable() {
141: public void run() {
142: fireTableDataChanged();
143: }
144: });
145: }
146: }
|