Statistics
| Revision:

root / trunk / libraries / libUI / src / org / gvsig / gui / beans / swing / treeTable / TreeTable.java @ 9797

History | View | Annotate | Download (6.13 KB)

1
package org.gvsig.gui.beans.swing.treeTable;
2

    
3
import java.awt.Component;
4
import java.awt.Dimension;
5

    
6
import javax.swing.Icon;
7
import javax.swing.JTable;
8
import javax.swing.table.TableCellEditor;
9
import javax.swing.tree.DefaultTreeCellRenderer;
10
import javax.swing.tree.DefaultTreeSelectionModel;
11
import javax.swing.tree.TreeCellEditor;
12
import javax.swing.tree.TreeCellRenderer;
13
import javax.swing.tree.TreeModel;
14

    
15
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
16
 *
17
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
18
 *
19
 * This program is free software; you can redistribute it and/or
20
 * modify it under the terms of the GNU General Public License
21
 * as published by the Free Software Foundation; either version 2
22
 * of the License, or (at your option) any later version.
23
 *
24
 * This program is distributed in the hope that it will be useful,
25
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
27
 * GNU General Public License for more details.
28
 *
29
 * You should have received a copy of the GNU General Public License
30
 * along with this program; if not, write to the Free Software
31
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
32
 *
33
 * For more information, contact:
34
 *
35
 *  Generalitat Valenciana
36
 *   Conselleria d'Infraestructures i Transport
37
 *   Av. Blasco Ib??ez, 50
38
 *   46010 VALENCIA
39
 *   SPAIN
40
 *
41
 *      +34 963862235
42
 *   gvsig@gva.es
43
 *      www.gvsig.gva.es
44
 *
45
 *    or
46
 *
47
 *   IVER T.I. S.A
48
 *   Salamanca 50
49
 *   46005 Valencia
50
 *   Spain
51
 *
52
 *   +34 963163400
53
 *   dac@iver.es
54
 */
55
/* CVS MESSAGES:
56
 *
57
 * $Id: TreeTable.java 9797 2007-01-17 17:18:29Z jorpiell $
58
 * $Log$
59
 * Revision 1.4  2007-01-17 17:18:29  jorpiell
60
 * A?adido un m?todo para expandir todo el ?rbol
61
 *
62
 * Revision 1.3  2006/10/25 14:45:52  jorpiell
63
 * A?adidos los renderers al arbol
64
 *
65
 * Revision 1.2  2006/10/23 11:13:55  jorpiell
66
 * A?adida la posibilidad de recargar el ?rbol tantas veces como queramos
67
 *
68
 * Revision 1.1  2006/10/23 08:18:39  jorpiell
69
 * A?adida la clase treetable
70
 *
71
 *
72
 */
73
/**
74
 * To create a new tree table it is necessary to create a new
75
 * treetablemodel. See the ExampleModel.java.
76
 * @author Jorge Piera Llodr? (piera_jor@gva.es)
77
 */
78

    
79
public class TreeTable extends JTable {
80
        protected TreeTableCellRenderer tree;
81
                
82
        public TreeTable(TreeTableModel treeTableModel) {
83
                super();
84
            setModel(treeTableModel);  
85
        }
86
        
87
        public TreeTable(TreeTableModel treeTableModel,TreeCellRenderer cellRenderer,TreeCellEditor cellEditor) {
88
                super();
89
            setModel(treeTableModel,cellRenderer,cellEditor);  
90
        }
91
        
92
        public void setModel(TreeTableModel treeTableModel,TreeCellRenderer cellRenderer,TreeCellEditor cellEditor){
93
                tree = new TreeTableCellRenderer(treeTableModel,this,cellRenderer,cellEditor);
94
                super.setModel(new TreeTableModelAdapter(treeTableModel, tree));
95
                setModel();
96
        }
97
        
98
        public void setModel(TreeTableModel treeTableModel){
99
                tree = new TreeTableCellRenderer(treeTableModel,this); 
100
                super.setModel(new TreeTableModelAdapter(treeTableModel, tree));
101
                setModel();
102
        }
103
        
104
        private void setModel(){
105
                // Force the JTable and JTree to share their row selection models. 
106
                tree.setSelectionModel(new DefaultTreeSelectionModel() { 
107
                        // Extend the implementation of the constructor, as if: 
108
                        /* public this() */ {
109
                                setSelectionModel(listSelectionModel); 
110
                        } 
111
                }); 
112
                // Make the tree and table row heights the same. 
113
                tree.setRowHeight(getRowHeight());
114
                
115
                // Install the tree editor renderer and editor. 
116
                setDefaultRenderer(TreeTableModel.class, tree); 
117
                setDefaultEditor(TreeTableModel.class, new TreeTableCellEditor());  
118
                
119
                setShowGrid(false);
120
                setIntercellSpacing(new Dimension(0, 0)); 
121
        }
122
        
123
        /* Workaround for BasicTableUI anomaly. Make sure the UI never tries to 
124
         * paint the editor. The UI currently uses different techniques to 
125
         * paint the renderers and editors and overriding setBounds() below 
126
         * is not the right thing to do for an editor. Returning -1 for the 
127
         * editing row in this case, ensures the editor is never painted. 
128
         */
129
        public int getEditingRow() {
130
                return (getColumnClass(editingColumn) == TreeTableModel.class) ? -1 : editingRow;  
131
        }
132

    
133
        
134
        public class TreeTableCellEditor extends AbstractCellEditor implements TableCellEditor {
135
                public Component getTableCellEditorComponent(JTable table, Object value,
136
                                boolean isSelected, int r, int c) {
137
                        return tree;
138
                }
139
        }
140
        
141
        /**
142
         * Deletes all the tree icons
143
         *
144
         */
145
        public void deleteIcons(){
146
                setLeafIcon(null);
147
            setClosedIcon(null);
148
            setOpenIcon(null);
149
        }
150
        
151
        /**
152
         * Sets the root visible
153
         */
154
        public void setRootVisible(boolean rootVisible){
155
                tree.setRootVisible(rootVisible);
156
        }
157
        
158
        /**
159
         * Sets the leaftIcon
160
         * @param newIcon
161
         */
162
        public void setLeafIcon(Icon newIcon){
163
                TreeTableCellRenderer renderer = (TreeTableCellRenderer)getTree();
164
                DefaultTreeCellRenderer treeRenderer = (DefaultTreeCellRenderer)renderer.getCellRenderer();
165
                treeRenderer.setLeafIcon(newIcon);
166
        }
167
        
168
        /**
169
         * Sets the open icon
170
         * @param newIcon
171
         */
172
        public void setOpenIcon(Icon newIcon){
173
                TreeTableCellRenderer renderer = (TreeTableCellRenderer)getTree();
174
                DefaultTreeCellRenderer treeRenderer = (DefaultTreeCellRenderer)renderer.getCellRenderer();
175
                treeRenderer.setOpenIcon(newIcon);
176
        }
177
        
178
        /**
179
         * Sets the close icon
180
         * @param newIcon
181
         */
182
        public void setClosedIcon(Icon newIcon){
183
                TreeTableCellRenderer renderer = (TreeTableCellRenderer)getTree();
184
                DefaultTreeCellRenderer treeRenderer = (DefaultTreeCellRenderer)renderer.getCellRenderer();
185
                treeRenderer.setClosedIcon(newIcon);
186
        }
187

    
188
        public Component getTree() {
189
                return tree;
190
        }
191
        
192
        public int expandJTreeNode (Object node, int row){
193
                TreeModel model = tree.getModel();
194
                if (node != null  &&  !model.isLeaf(node)){
195
                        tree.expandRow(row);
196
                        for (int index = 0;        row + 1 < tree.getRowCount()  &&  index < model.getChildCount(node); index++){
197
                                row++;
198
                                Object child = model.getChild(node, index);
199
                                if (child == null)
200
                                        break;
201
                                javax.swing.tree.TreePath path;
202
                                while ((path = tree.getPathForRow(row)) != null  &&        path.getLastPathComponent() != child){
203
                                        tree.expandRow(row);
204
                                        row++;                                        
205
                                }
206
                                if (path == null)
207
                                        break;
208
                                row = expandJTreeNode(child, row);                                
209
                        }
210
                }
211
                return row;
212
        }
213
        
214
}
215