Statistics
| Revision:

root / trunk / libraries / libUIComponent / src / org / gvsig / gui / beans / swing / treeTable / TreeTable.java @ 13136

History | View | Annotate | Download (6.22 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 13136 2007-08-20 08:38:34Z evercher $
58
 * $Log$
59
 * Revision 1.1  2007-08-20 08:34:46  evercher
60
 * He fusionado LibUI con LibUIComponents
61
 *
62
 * Revision 1.4  2007/01/17 17:18:29  jorpiell
63
 * A?adido un m?todo para expandir todo el ?rbol
64
 *
65
 * Revision 1.3  2006/10/25 14:45:52  jorpiell
66
 * A?adidos los renderers al arbol
67
 *
68
 * Revision 1.2  2006/10/23 11:13:55  jorpiell
69
 * A?adida la posibilidad de recargar el ?rbol tantas veces como queramos
70
 *
71
 * Revision 1.1  2006/10/23 08:18:39  jorpiell
72
 * A?adida la clase treetable
73
 *
74
 *
75
 */
76
/**
77
 * To create a new tree table it is necessary to create a new
78
 * treetablemodel. See the ExampleModel.java.
79
 * @author Jorge Piera Llodr? (piera_jor@gva.es)
80
 */
81

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

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

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