1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package com.puppycrawl.tools.checkstyle.gui;
21
22 import javax.swing.JTree;
23 import javax.swing.SwingUtilities;
24 import javax.swing.event.TreeExpansionEvent;
25 import javax.swing.event.TreeExpansionListener;
26 import javax.swing.event.TreeModelEvent;
27 import javax.swing.event.TreeModelListener;
28 import javax.swing.table.AbstractTableModel;
29 import javax.swing.tree.TreePath;
30
31
32
33
34
35
36
37
38
39
40
41
42 public class TreeTableModelAdapter extends AbstractTableModel {
43
44 private static final long serialVersionUID = 8269213416115369275L;
45
46
47 private final JTree tree;
48
49 private final transient ParseTreeTableModel treeTableModel;
50
51
52
53
54
55
56 public TreeTableModelAdapter(ParseTreeTableModel treeTableModel, JTree tree) {
57 this.tree = tree;
58 this.treeTableModel = treeTableModel;
59
60 tree.addTreeExpansionListener(new UpdatingTreeExpansionListener());
61
62
63
64
65
66 treeTableModel.addTreeModelListener(new UpdatingTreeModelListener());
67 }
68
69
70
71 @Override
72 public int getColumnCount() {
73 return treeTableModel.getColumnCount();
74 }
75
76 @Override
77 public String getColumnName(int column) {
78 return treeTableModel.getColumnName(column);
79 }
80
81 @Override
82 public Class<?> getColumnClass(int column) {
83 return treeTableModel.getColumnClass(column);
84 }
85
86 @Override
87 public int getRowCount() {
88 return tree.getRowCount();
89 }
90
91 @Override
92 public Object getValueAt(int row, int column) {
93 return treeTableModel.getValueAt(nodeForRow(row), column);
94 }
95
96 @Override
97 public boolean isCellEditable(int row, int column) {
98 return treeTableModel.isCellEditable(column);
99 }
100
101
102
103
104
105
106 private Object nodeForRow(int row) {
107 final TreePath treePath = tree.getPathForRow(row);
108 return treePath.getLastPathComponent();
109 }
110
111
112
113
114 private class UpdatingTreeExpansionListener implements TreeExpansionListener {
115
116
117
118 @Override
119 public void treeExpanded(TreeExpansionEvent event) {
120 fireTableDataChanged();
121 }
122
123 @Override
124 public void treeCollapsed(TreeExpansionEvent event) {
125 fireTableDataChanged();
126 }
127
128 }
129
130
131
132
133 private class UpdatingTreeModelListener implements TreeModelListener {
134
135 @Override
136 public void treeNodesChanged(TreeModelEvent event) {
137 delayedFireTableDataChanged();
138 }
139
140 @Override
141 public void treeNodesInserted(TreeModelEvent event) {
142 delayedFireTableDataChanged();
143 }
144
145 @Override
146 public void treeNodesRemoved(TreeModelEvent event) {
147 delayedFireTableDataChanged();
148 }
149
150 @Override
151 public void treeStructureChanged(TreeModelEvent event) {
152 delayedFireTableDataChanged();
153 }
154
155
156
157
158
159 private void delayedFireTableDataChanged() {
160 SwingUtilities.invokeLater(TreeTableModelAdapter.this::fireTableDataChanged);
161 }
162
163 }
164
165 }