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 @ 1672

History | View | Annotate | Download (9.12 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.FlowLayout;
27
import java.awt.GridBagConstraints;
28
import java.awt.GridBagLayout;
29
import java.awt.event.MouseEvent;
30
import java.awt.event.MouseListener;
31
import java.util.List;
32
import java.util.Observable;
33
import java.util.Observer;
34

    
35
import javax.swing.JPanel;
36
import javax.swing.JTable;
37
import javax.swing.table.DefaultTableModel;
38
import javax.swing.table.TableColumn;
39

    
40
import org.gvsig.raster.swing.pagedtable.ModelLoader;
41
import org.gvsig.raster.swing.pagedtable.TableModel;
42

    
43

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

    
60
                public PagedJTable(DefaultTableModel model) {
61
                        super(model);
62
                }
63
                
64
                /**
65
                 * Reimplemented to calculate the number of pages when the component gets
66
                 * a resize event
67
                 */
68
                public void setBounds(int x, int y, int width, int height) {
69
                super.setBounds(x, y, width, height);
70
                int entriesPerPage = (int)(getHeight() / (double)heightLine);
71
                        getPager(entriesPerPage);
72
            }
73
        }
74
        
75
        public PagedTablePanel(ModelLoader modelLoader,
76
                        Pager pager, 
77
                        PaginationBarPanel paginationBar,
78
                        MoveRowsPanel moveRowsPanel, 
79
                        TableEntryControllerPanel tableEntryControllerPanel) {
80
                this.modelLoader = modelLoader;
81
                this.pager = pager;
82
                this.model = (DefaultTableModel)modelLoader.getTableModel();
83
                initGUI(paginationBar, moveRowsPanel, tableEntryControllerPanel);
84
                
85
        }
86
        
87
        private void initGUI(
88
                        PaginationBarPanel paginationBar, 
89
                        MoveRowsPanel moveRowsPanel, 
90
                        TableEntryControllerPanel tableEntryControllerPanel) {
91
                setLayout(new GridBagLayout());
92
                GridBagConstraints gbc = new GridBagConstraints();
93
                gbc.fill = GridBagConstraints.BOTH;
94
                gbc.weightx = 1;
95
                gbc.weighty = 1;
96
                gbc.gridx = 0;
97
                gbc.gridy = 0;
98
                
99
                add(getJTable(), gbc);
100
                
101
                gbc.fill = GridBagConstraints.VERTICAL;
102
                gbc.weightx = 0;
103
                gbc.weighty = 1;
104
                gbc.gridx = 1;
105
                gbc.gridy = 0;
106
                
107
                add(paginationBar, gbc);
108
                
109
                gbc.fill = GridBagConstraints.HORIZONTAL;
110
                gbc.weightx = 1;
111
                gbc.weighty = 0;
112
                gbc.gridx = 0;
113
                gbc.gridy = 1;
114
                gbc.gridwidth = 2;
115
                
116
                JPanel panel = new JPanel();
117
                panel.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
118
                panel.add(tableEntryControllerPanel);
119
                panel.add(moveRowsPanel);
120
                add(panel, gbc);
121
        }
122
        
123
        public Pager getPager(int nEntriesPerPage) {
124
                pager.setEntriesPerPage(nEntriesPerPage);
125
                return pager;
126
        }
127
        
128
        /**
129
         * Obtiene la Tabla
130
         * @return Tabla de bandas de la imagen
131
         */
132
        public JTable getJTable() {
133
                if (jTable == null) {
134
                        jTable = new PagedJTable(model);
135
                        jTable.addMouseListener(this);
136

    
137
                        TableColumn column = null;
138

    
139
                        int widthPerColumn = (int) (this.getWidth() / modelLoader.getColumnNames().length);
140
                        for (int i = 0; i < modelLoader.getColumnNames().length; i++) {
141
                                column = jTable.getColumnModel().getColumn(i);
142
                                column.setResizable(true);
143
                                if (modelLoader.getColumnWidths() == null)
144
                                        column.setPreferredWidth(widthPerColumn);
145
                                else
146
                                        column.setPreferredWidth(modelLoader.getColumnWidths()[i]);
147
                        }
148
                }
149

    
150
                return jTable;
151
        } 
152
        
153
        public void setLineHeight(int height) {
154
                this.heightLine = height;
155
        }
156
        
157
        //************************************************
158
        //                    API
159
        //************************************************
160
        
161
        public void addRow(Object[] list) {
162
                pager.addEntry(list);
163
        }
164
        
165
        public void delRow(int i) {
166
                pager.removeEntry(i);
167
        }
168
        
169
        public void removeAllRows() {
170
                pager.removeAllEntries();
171
        }
172
        
173
        public int[] getSelectedRows() {
174
                return pager.getSelectedRows();
175
        }
176
        
177
        public void swapRow(int i, int j) {
178
                if ((i < 0) || (j < 0))
179
                        return;
180
                if ((i >= model.getRowCount()) || (j >= model.getRowCount()))
181
                        return;
182
                model.moveRow(i, i, j);
183
                pager.swapRow(i, j);
184
        }
185
        
186
        public void setSelectedRows(int[] rows) {
187
                pager.setSelectedRows(rows);
188
        }
189
        
190
        public void setSelectedRow(int row) {
191
                if(row == -1) {
192
                        pager.setSelectedRows(new int[]{pager.getEntriesCount() - 1});
193
                } else {
194
                        pager.setSelectedRows(new int[]{row});
195
                }
196
        }
197
        
198
        public void addSelectedRow(int row) {
199
                pager.addSelectedRow(row);
200
        }
201
        
202
        public void increaseSelectedRows() {
203
                pager.increaseSelectedRows();
204
        }
205
        
206
        public void decreaseSelectedRows() {
207
                pager.decreaseSelectedRows();
208
        }
209
        
210
        public void nextPage() {
211
                pager.increaseSelectedPage();
212
        }
213
        
214
        public void prevPage() {
215
                pager.decreaseSelectedPage();
216
        }
217
        
218
        public void setSelectedPage(int pageNumber) {
219
                pager.setSelectedPage(pageNumber);
220
        }
221
        
222
        public TableModel getTableModel() {
223
                return modelLoader.getTableModel();
224
        }
225
        
226
        //************************************************
227
        
228
        /**
229
         * Gets the number of rows in this table
230
         * @return N?mero de filas de la tabla
231
         */
232
        public int getRowTableCount() {
233
                return model.getRowCount();
234
        }
235
        
236
        /**
237
         * Gets the selected point
238
         * @return position of the selected point
239
         */
240
        public int getSelectedTableRow() {
241
                return getJTable().getSelectedRow();
242
        }
243
        
244
        /**
245
         * Reloads the selected page in the visual table
246
         */
247
        private int reloadPage() {
248
                model.setNumRows(0);
249
                List<Object> lines = pager.getSelectedPage();
250
                if(lines == null)
251
                        return pager.getSelectedPageNumber();
252
                for (int i = 0; i < lines.size(); i++) {
253
                        model.addRow((Object[])lines.get(i));
254
                }
255
                return pager.getSelectedPageNumber();
256
        }
257
        
258
        
259
//        private void loadPageInTable(int page, int selection) {
260
//                for (int i = model.getRowCount() - 1; i >= 0; i--) {
261
//                        model.removeRow(i);
262
//                }
263
//                List<Object> pageElements = pager.getPage(page);
264
//                for (int i = 0; i < pageElements.size(); i++) {
265
//                        model.addRow((Object[])pageElements.get(i));
266
//                }
267
//                if(selection >= 0 && selection < model.getRowCount()) {
268
//                        getJTable().setRowSelectionInterval(selection, selection);
269
//                }
270
//        }
271

    
272
        public void mouseClicked(MouseEvent e) {
273
                if(e.getSource() == jTable) {
274
                        //When the user clicks on table, it selects the entry in the table control
275
                        int selVisualRow = getSelectedTableRow();
276
                        if(selVisualRow >= 0) {
277
                                int selRow = pager.getSelectedPageNumber() * pager.getEntriesPerPage() + selVisualRow;
278
                                pager.setSelectedRows(new int[]{selRow});
279
                        }
280
                }
281
        }
282

    
283
        public void mouseEntered(MouseEvent e) {
284
                
285
        }
286

    
287
        public void mouseExited(MouseEvent e) {
288
                
289
        }
290

    
291
        public void mousePressed(MouseEvent e) {
292
                
293
        }
294

    
295
        public void mouseReleased(MouseEvent e) {
296
                
297
        }
298

    
299
        
300
        public void update(Observable o, Object arg) {
301
                if(o instanceof Pager && arg instanceof Integer) {
302
                        int option = ((Integer)arg).intValue();
303
                        if(option == Pager.EVENT_SELECTED_ROWS ) {
304
                                Pager pager = (Pager)o;
305
                                int[] selectedRows = pager.getSelectedRows();
306
                                if(selectedRows != null && selectedRows.length > 0) {
307
                                        if(!pager.isInCurrentPage(selectedRows[0])) {
308
                                                pager.setSelectedPage(pager.getPageFromRow(selectedRows[0]));
309
                                                reloadPage();
310
                                        }
311
                                        int r = selectedRows[0] % pager.getEntriesPerPage();
312
                                        if(r >= 0 && r < model.getRowCount())
313
                                                getJTable().setRowSelectionInterval(r, r);
314
                                }
315
                        }
316
                        
317
                        if(option == Pager.EVENT_ADD_ENTRY ) {
318
                                model.addRow(pager.getLastEntry());
319
                                int lastTableRow = model.getRowCount() - 1;
320
                                getJTable().setRowSelectionInterval(lastTableRow, lastTableRow);
321
                        }
322
                        
323
                        if(option == Pager.EVENT_REMOVE_ENTRY ) {
324
                                int[] selectedRows = pager.getSelectedRows();
325
                                reloadPage();
326
                                if(selectedRows != null) {
327
                                        int r = selectedRows[0] % pager.getEntriesPerPage();
328
                                        if(r >= 0 && r < model.getRowCount()) {
329
                                                getJTable().setRowSelectionInterval(r, r);
330
                                        }
331
                                }
332
                        }
333
                        
334
                        if(option == Pager.EVENT_REMOVE_ALL ) {
335
                                model.setNumRows(0);
336
                        }
337
                        
338
                        if(option == Pager.EVENT_SELECTED_PAGE ) {
339
                                reloadPage();
340
                                int[] selectedRows = pager.getSelectedRows();
341
                                if(selectedRows != null) {
342
                                        int r = selectedRows[0] % pager.getEntriesPerPage();
343
                                        if(r >= 0 && r < model.getRowCount()) {
344
                                                getJTable().setRowSelectionInterval(r, r);
345
                                        }
346
                                }
347
                        }
348
                        
349
                }
350
        }
351
}