Statistics
| Revision:

gvsig-raster / org.gvsig.raster / trunk / org.gvsig.raster / org.gvsig.raster.swing / org.gvsig.raster.swing.impl / src / main / java / org / gvsig / raster / swing / impl / pagedtable / PagedTablePanel.java @ 1722

History | View | Annotate | Download (9.01 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2012 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.raster.swing.impl.pagedtable;
25

    
26
import java.awt.BorderLayout;
27
import java.awt.FlowLayout;
28
import java.awt.GridBagConstraints;
29
import java.awt.GridBagLayout;
30
import java.awt.event.MouseEvent;
31
import java.awt.event.MouseListener;
32
import java.util.List;
33
import java.util.Observable;
34
import java.util.Observer;
35

    
36
import javax.swing.JPanel;
37
import javax.swing.JTable;
38
import javax.swing.event.TableModelEvent;
39
import javax.swing.event.TableModelListener;
40
import javax.swing.table.DefaultTableModel;
41
import javax.swing.table.JTableHeader;
42
import javax.swing.table.TableColumn;
43

    
44
import org.gvsig.raster.swing.pagedtable.ModelLoader;
45
import org.gvsig.raster.swing.pagedtable.PagedTableEvent;
46

    
47

    
48
/**
49
 * Paged table
50
 * 
51
 * @author Nacho Brodin (nachobrodin@gmail.com)
52
 */
53
public class PagedTablePanel extends JPanel implements MouseListener, Observer, TableModelListener {
54
        private static final long          serialVersionUID       = 1L;
55
        private PagedJTable                jTable                 = null;
56
        private ModelLoader                modelLoader            = null;
57
        private DefaultTableModel          model                  = null;
58
        private Pager                      pager                  = null;
59
        private int                        heightLine             = 16;
60
        
61
        public class PagedJTable extends JTable {
62
                private static final long serialVersionUID = 1L;
63

    
64
                public PagedJTable(DefaultTableModel model, String[] columnNames) {
65
                        super(null, columnNames);
66
                        this.setModel(model);
67
                }
68
                
69
                /**
70
                 * Reimplemented to calculate the number of pages when the component gets
71
                 * a resize event
72
                 */
73
                public void setBounds(int x, int y, int width, int height) {
74
                super.setBounds(x, y, width, height);
75
                int entriesPerPage = (int)(getHeight() / (double)heightLine);
76
                        getPager(entriesPerPage);
77
            }
78
        }
79
        
80
        public PagedTablePanel(ModelLoader modelLoader,
81
                        Pager pager, 
82
                        PaginationBarPanel paginationBar,
83
                        MoveRowsPanel moveRowsPanel, 
84
                        TableEntryControllerPanel tableEntryControllerPanel) {
85
                this.modelLoader = modelLoader;
86
                this.pager = pager;
87
                this.model = (DefaultTableModel)modelLoader.getTableModel();
88
                initGUI(paginationBar, moveRowsPanel, tableEntryControllerPanel);
89
                
90
        }
91
        
92
        private void initGUI(
93
                        PaginationBarPanel paginationBar, 
94
                        MoveRowsPanel moveRowsPanel, 
95
                        TableEntryControllerPanel tableEntryControllerPanel) {
96
                setLayout(new GridBagLayout());
97
                GridBagConstraints gbc = new GridBagConstraints();
98
                gbc.fill = GridBagConstraints.BOTH;
99
                gbc.weightx = 1;
100
                gbc.weighty = 1;
101
                gbc.gridx = 0;
102
                gbc.gridy = 0;
103
                
104
                add(getJTableWithHeader(), gbc);
105
                
106
                gbc.fill = GridBagConstraints.VERTICAL;
107
                gbc.weightx = 0;
108
                gbc.weighty = 1;
109
                gbc.gridx = 1;
110
                gbc.gridy = 0;
111
                
112
                add(paginationBar, gbc);
113
                
114
                gbc.fill = GridBagConstraints.HORIZONTAL;
115
                gbc.weightx = 1;
116
                gbc.weighty = 0;
117
                gbc.gridx = 0;
118
                gbc.gridy = 1;
119
                gbc.gridwidth = 2;
120
                
121
                JPanel panel = new JPanel();
122
                panel.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
123
                panel.add(tableEntryControllerPanel);
124
                panel.add(moveRowsPanel);
125
                add(panel, gbc);
126
        }
127
        
128
        public Pager getPager(int nEntriesPerPage) {
129
                pager.setEntriesPerPage(nEntriesPerPage);
130
                return pager;
131
        }
132
        
133
        /**
134
         * Gets a panel with the JTable and its header
135
         * @return
136
         */
137
        public JPanel getJTableWithHeader() {
138
                JPanel p = new JPanel(new BorderLayout());
139
                JTableHeader header = getJTable().getTableHeader();
140
                p.add(header, BorderLayout.NORTH);
141
                p.add(getJTable(), BorderLayout.CENTER);
142
                return p;
143
        }
144
        
145
        /**
146
         * Gets the JTable
147
         * @return Tabla de bandas de la imagen
148
         */
149
        public JTable getJTable() {
150
                if (jTable == null) {
151
                        jTable = new PagedJTable(model, modelLoader.getColumnNames());
152
                        jTable.addMouseListener(this);
153
                        jTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
154
                        model.addTableModelListener(this);
155
                        
156
                        TableColumn column = null;
157

    
158
                        int widthPerColumn = (int) (this.getWidth() / modelLoader.getColumnNames().length);
159
                        for (int i = 0; i < modelLoader.getColumnNames().length; i++) {
160
                                column = jTable.getColumnModel().getColumn(i);
161
                                column.setResizable(true);
162
                                if (modelLoader.getColumnWidths() == null)
163
                                        column.setPreferredWidth(widthPerColumn);
164
                                else {
165
                                        if(i < modelLoader.getColumnWidths().length && 
166
                                           modelLoader.getColumnWidths()[i] > 0) {
167
                                                column.setMaxWidth(modelLoader.getColumnWidths()[i]);
168
                                        } else {
169
                                                if(modelLoader.getColumnWidths()[i] == 0) {
170
                                                        column.setMinWidth(0);
171
                                                        column.setMaxWidth(0);
172
                                                } else
173
                                                        column.setPreferredWidth(widthPerColumn);
174
                                        }
175
                                }
176
                                if(modelLoader.getCellEditorForColumn(i) != null)
177
                                        column.setCellEditor(modelLoader.getCellEditorForColumn(i));
178
                                if(modelLoader.getRenderForColumn(i) != null)
179
                                        column.setCellRenderer(modelLoader.getRenderForColumn(i));
180
                        }
181
                }
182

    
183
                return jTable;
184
        } 
185
        
186

    
187
        public void tableChanged(TableModelEvent e) {
188
                if(e.getType() == TableModelEvent.UPDATE) {
189
                        int column = e.getColumn();
190
                        if(column != TableModelEvent.ALL_COLUMNS) {
191
                                Object[] entry = pager.getEntry(e.getFirstRow());
192
                                if(entry != null && column >= 0 && column < entry.length)
193
                                        entry[column] = model.getValueAt(e.getFirstRow(), column);
194
                                pager.throwEvent(PagedTableEvent.EVENT_MODIFY_ENTRY, new int[]{e.getFirstRow()});
195
                        }
196
                }
197
        }
198
        
199
        public void setLineHeight(int height) {
200
                this.heightLine = height;
201
        }
202
        
203
        /**
204
         * Gets the number of rows in this table
205
         * @return N?mero de filas de la tabla
206
         */
207
        public int getRowTableCount() {
208
                return model.getRowCount();
209
        }
210
        
211
        /**
212
         * Gets the selected point
213
         * @return position of the selected point
214
         */
215
        public int getSelectedTableRow() {
216
                return getJTable().getSelectedRow();
217
        }
218
        
219
        /**
220
         * Reloads the selected page in the visual table
221
         */
222
        private int reloadPage() {
223
                model.setNumRows(0);
224
                List<Object> lines = pager.getSelectedPage();
225
                if(lines == null)
226
                        return pager.getSelectedPageNumber();
227
                for (int i = 0; i < lines.size(); i++) {
228
                        model.addRow((Object[])lines.get(i));
229
                }
230
                return pager.getSelectedPageNumber();
231
        }
232

    
233
        public void mouseClicked(MouseEvent e) {
234
                if(e.getSource() == jTable) {
235
                        //When the user clicks on table, it selects the entry in the table control
236
                        int selVisualRow = getSelectedTableRow();
237
                        if(selVisualRow >= 0) {
238
                                int selRow = pager.getSelectedPageNumber() * pager.getEntriesPerPage() + selVisualRow;
239
                                pager.setSelectedRows(new int[]{selRow});
240
                        }
241
                }
242
        }
243

    
244
        public void mouseEntered(MouseEvent e) {
245
                
246
        }
247

    
248
        public void mouseExited(MouseEvent e) {
249
                
250
        }
251

    
252
        public void mousePressed(MouseEvent e) {
253
                
254
        }
255

    
256
        public void mouseReleased(MouseEvent e) {
257
                
258
        }
259

    
260
        
261
        public void update(Observable o, Object arg) {
262
                if(o instanceof Pager && arg instanceof Integer) {
263
                        int option = ((Integer)arg).intValue();
264
                        if(option == PagedTableEvent.EVENT_SELECTED_ROWS ) {
265
                                Pager pager = (Pager)o;
266
                                int[] selectedRows = pager.getSelectedRows();
267
                                if(selectedRows != null && selectedRows.length > 0) {
268
                                        if(!pager.isInCurrentPage(selectedRows[0])) {
269
                                                pager.setSelectedPage(pager.getPageFromRow(selectedRows[0]));
270
                                                reloadPage();
271
                                        }
272
                                        int r = selectedRows[0] % pager.getEntriesPerPage();
273
                                        if(r >= 0 && r < model.getRowCount())
274
                                                getJTable().setRowSelectionInterval(r, r);
275
                                }
276
                        }
277
                        
278
                        if(option == PagedTableEvent.EVENT_ADD_ENTRY ) {
279
                                model.addRow(pager.getLastEntry());
280
                                int lastTableRow = model.getRowCount() - 1;
281
                                getJTable().setRowSelectionInterval(lastTableRow, lastTableRow);
282
                        }
283
                        
284
                        if(option == PagedTableEvent.EVENT_REMOVE_ENTRY ) {
285
                                int[] selectedRows = pager.getSelectedRows();
286
                                reloadPage();
287
                                if(selectedRows != null) {
288
                                        int r = selectedRows[0] % pager.getEntriesPerPage();
289
                                        if(r >= 0 && r < model.getRowCount()) {
290
                                                getJTable().setRowSelectionInterval(r, r);
291
                                        }
292
                                }
293
                        }
294
                        
295
                        if(option == PagedTableEvent.EVENT_REMOVE_ALL ) {
296
                                model.setNumRows(0);
297
                        }
298
                        
299
                        if(option == PagedTableEvent.EVENT_SELECTED_PAGE || option == PagedTableEvent.EVENT_MODIFY_ENTRY) {
300
                                reloadPage();
301
                                int[] selectedRows = pager.getSelectedRows();
302
                                if(selectedRows != null) {
303
                                        int r = selectedRows[0] % pager.getEntriesPerPage();
304
                                        if(r >= 0 && r < model.getRowCount()) {
305
                                                getJTable().setRowSelectionInterval(r, r);
306
                                        }
307
                                }
308
                        }
309
                        
310
                }
311
        }
312

    
313
}