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 / PagedTableImpl.java @ 1556

History | View | Annotate | Download (10 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.PagedTable;
42
import org.gvsig.raster.swing.pagedtable.TableModel;
43

    
44

    
45
/**
46
 * Paged table
47
 * 
48
 * @author Nacho Brodin (nachobrodin@gmail.com)
49
 */
50
public class PagedTableImpl extends JPanel implements PagedTable, MouseListener, Observer {
51
        private static final long          serialVersionUID       = 1L;
52
        private PagedJTable                jTable                 = null;
53
        private ModelLoader                modelLoader            = null;
54
        private DefaultTableModel          model                  = null;
55
        private PaginationBarPanel         paginationBar          = null;
56
        private TableEntryControllerPanel  tableEntryController   = null;
57
        private TableControllerListener    tableListener          = null;
58
        private MoveRowsPanel              moveRowsPanel          = null;
59
        private Pager                      pager                  = null;
60
        private int                        heightLine             = 16;
61
        private int                        currentPage            = 0;
62
        
63
        public class PagedJTable extends JTable {
64
                private static final long serialVersionUID = 1L;
65

    
66
                public PagedJTable(DefaultTableModel model) {
67
                        super(model);
68
                }
69
                
70
                /**
71
                 * Reimplemented to calculate the number of pages when the component gets
72
                 * a resize event
73
                 */
74
                public void setBounds(int x, int y, int width, int height) {
75
                super.setBounds(x, y, width, height);
76
                int entriesPerPage = (int)(getHeight() / (double)heightLine);
77
                        getPager(entriesPerPage);
78
                        reloadPage();
79
            }
80
        }
81
        
82
        public PagedTableImpl(ModelLoader modelLoader) {
83
                this.modelLoader = modelLoader;
84
                this.model = (DefaultTableModel)modelLoader.getTableModel();
85
                tableListener = new TableControllerListener(this);
86
                init();
87
                getPager(0).addObserver(getTableEntryController());
88
                getPager(0).addObserver(this);
89
                getPager(0).addObserver(getPaginationBar());
90
        }
91
        
92
        private void init() {
93
                setLayout(new GridBagLayout());
94
                GridBagConstraints gbc = new GridBagConstraints();
95
                gbc.fill = GridBagConstraints.BOTH;
96
                gbc.weightx = 1;
97
                gbc.weighty = 1;
98
                gbc.gridx = 0;
99
                gbc.gridy = 0;
100
                
101
                add(getJTable(), gbc);
102
                
103
                gbc.fill = GridBagConstraints.VERTICAL;
104
                gbc.weightx = 0;
105
                gbc.weighty = 1;
106
                gbc.gridx = 1;
107
                gbc.gridy = 0;
108
                
109
                add(getPaginationBar(), gbc);
110
                
111
                gbc.fill = GridBagConstraints.HORIZONTAL;
112
                gbc.weightx = 1;
113
                gbc.weighty = 0;
114
                gbc.gridx = 0;
115
                gbc.gridy = 1;
116
                gbc.gridwidth = 2;
117
                
118
                JPanel panel = new JPanel();
119
                panel.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
120
                panel.add(getTableEntryController());
121
                panel.add(getMoveRowsPanel());
122
                add(panel, gbc);
123
        }
124
        
125
        public Pager getPager(int nEntriesPerPage) {
126
                if(pager == null) {
127
                        pager = new Pager(nEntriesPerPage);
128
                } else
129
                        pager.setEntriesPerPage(nEntriesPerPage);
130
                return pager;
131
        }
132
        
133
        public TableEntryControllerPanel getTableEntryController() {
134
                if(tableEntryController == null) {
135
                        tableEntryController = new TableEntryControllerPanel(tableListener);
136
                }
137
                return tableEntryController;
138
        }
139
        
140
        public PaginationBarPanel getPaginationBar() {
141
                if(paginationBar == null) {
142
                        paginationBar = new PaginationBarPanel(tableListener);
143
                }
144
                return paginationBar;
145
        }
146
        
147
        /**
148
         * This method initializes jPanel
149
         * @return javax.swing.JPanel
150
         */
151
        public MoveRowsPanel getMoveRowsPanel() {
152
                if (moveRowsPanel == null) {
153
                        moveRowsPanel = new MoveRowsPanel(tableListener);
154
                        moveRowsPanel.setVisible(false);
155
                }
156
                return moveRowsPanel;
157
        }
158
        
159
        /**
160
         * Obtiene la Tabla
161
         * @return Tabla de bandas de la imagen
162
         */
163
        public JTable getJTable() {
164
                if (jTable == null) {
165
                        jTable = new PagedJTable(model);
166
                        jTable.addMouseListener(this);
167

    
168
                        TableColumn column = null;
169

    
170
                        int widthPerColumn = (int) (this.getWidth() / modelLoader.getColumnNames().length);
171
                        for (int i = 0; i < modelLoader.getColumnNames().length; i++) {
172
                                column = jTable.getColumnModel().getColumn(i);
173
                                column.setResizable(true);
174
                                if (modelLoader.getColumnWidths() == null)
175
                                        column.setPreferredWidth(widthPerColumn);
176
                                else
177
                                        column.setPreferredWidth(modelLoader.getColumnWidths()[i]);
178
                        }
179
                }
180

    
181
                return jTable;
182
        } 
183
        
184
        public void setLineHeight(int height) {
185
                this.heightLine = height;
186
        }
187
        
188
        //************************************************
189
        //                    API
190
        //************************************************
191
        
192
        public void addRow(Object[] list) {
193
                pager.addEntry(list);
194
        }
195
        
196
        public void delRow(int i) {
197
                currentPage = pager.getSelectedPageNumber();
198
                pager.removeEntry(i);
199
        }
200
        
201
        public void removeAllRows() {
202
                pager.removeAllEntries();
203
        }
204
        
205
        public int[] getSelectedRows() {
206
                return pager.getSelectedRows();
207
        }
208
        
209
        public void swapRow(int i, int j) {
210
                if ((i < 0) || (j < 0))
211
                        return;
212
                if ((i >= model.getRowCount()) || (j >= model.getRowCount()))
213
                        return;
214
                model.moveRow(i, i, j);
215
                pager.swapRow(i, j);
216
        }
217
        
218
        public void setSelectedRows(int[] rows) {
219
                pager.setSelectedRows(rows);
220
        }
221
        
222
        public void setSelectedRow(int row) {
223
                if(row == -1) {
224
                        pager.setSelectedRows(new int[]{pager.getEntriesCount() - 1});
225
                } else {
226
                        pager.setSelectedRows(new int[]{row});
227
                }
228
        }
229
        
230
        public void addSelectedRow(int row) {
231
                pager.addSelectedRow(row);
232
        }
233
        
234
        public void increaseSelectedRows() {
235
                pager.increaseSelectedRows();
236
        }
237
        
238
        public void decreaseSelectedRows() {
239
                pager.decreaseSelectedRows();
240
        }
241
        
242
        public TableModel getTableModel() {
243
                return modelLoader.getTableModel();
244
        }
245
        
246
        //************************************************
247
        
248
        /**
249
         * Gets the number of rows in this table
250
         * @return N?mero de filas de la tabla
251
         */
252
        public int getRowTableCount() {
253
                return model.getRowCount();
254
        }
255
        
256
        /**
257
         * Gets the selected point
258
         * @return position of the selected point
259
         */
260
        public int getSelectedTableRow() {
261
                return getJTable().getSelectedRow();
262
        }
263
        
264
        /**
265
         * Reloads the selected page in the visual table
266
         */
267
        private int reloadPage() {
268
                model.setNumRows(0);
269
                List<Object> lines = pager.getSelectedPage();
270
                if(lines == null)
271
                        return pager.getSelectedPageNumber();
272
                for (int i = 0; i < lines.size(); i++) {
273
                        model.addRow((Object[])lines.get(i));
274
                }
275
                return pager.getSelectedPageNumber();
276
        }
277
        
278
        
279
        private void loadPageInTable(int page, int selection) {
280
                for (int i = model.getRowCount() - 1; i >= 0; i--) {
281
                        model.removeRow(i);
282
                }
283
                List<Object> pageElements = pager.getPage(page);
284
                for (int i = 0; i < pageElements.size(); i++) {
285
                        model.addRow((Object[])pageElements.get(i));
286
                }
287
                if(selection >= 0 && selection < model.getRowCount()) {
288
                        getJTable().setRowSelectionInterval(selection, selection);
289
                }
290
        }
291

    
292
        public void mouseClicked(MouseEvent e) {
293
                if(e.getSource() == jTable) {
294
                        //When the user clicks on table, it selects the entry in the table control
295
                        int selVisualRow = getSelectedTableRow();
296
                        if(selVisualRow >= 0) {
297
                                int selRow = pager.getSelectedPageNumber() * pager.getEntriesPerPage() + selVisualRow;
298
                                pager.setSelectedRows(new int[]{selRow});
299
                        }
300
                }
301
        }
302

    
303
        public void mouseEntered(MouseEvent e) {
304
                
305
        }
306

    
307
        public void mouseExited(MouseEvent e) {
308
                
309
        }
310

    
311
        public void mousePressed(MouseEvent e) {
312
                
313
        }
314

    
315
        public void mouseReleased(MouseEvent e) {
316
                
317
        }
318

    
319
        
320
        public void update(Observable o, Object arg) {
321
                if(o instanceof Pager && arg instanceof Integer) {
322
                        int option = ((Integer)arg).intValue();
323
                        if(option == Pager.CHANGE_SELECTED_ROWS ) {
324
                                Pager pager = (Pager)o;
325
                                int[] selectedRows = pager.getSelectedRows();
326
                                if(selectedRows != null && selectedRows.length > 0) {
327
                                        if(!pager.isInCurrentPage(selectedRows[0])) {
328
                                                pager.setSelectedPage(pager.getPageFromRow(selectedRows[0]));
329
                                                reloadPage();
330
                                        }
331
                                        int r = selectedRows[0] % pager.getEntriesPerPage();
332
                                        if(r >= 0 && r < model.getRowCount())
333
                                                getJTable().setRowSelectionInterval(r, r);
334
                                }
335
                        }
336
                        
337
                        if(option == Pager.CHANGE_ADD_ENTRY ) {
338
                                //Cambio de p?gina
339
                                if(model.getRowCount() >= pager.getEntriesPerPage()) {
340
                                        for (int i = model.getRowCount() - 1; i >= 0; i--) {
341
                                                model.removeRow(i);
342
                                        }
343
                                        pager.increaseSelectedPage();
344
                                        getPaginationBar().getSelectedPage().setText(pager.getSelectedPageNumber() + "");
345
                                }
346
                                model.addRow(pager.getLastEntry());
347
                                int lastTableRow = model.getRowCount() - 1;
348
                                getJTable().setRowSelectionInterval(lastTableRow, lastTableRow);
349
                        }
350
                        
351
                        if(option == Pager.CHANGE_REMOVE_ENTRY ) {
352
                                int[] selectedRows = pager.getSelectedRows();
353
                                int pageLoaded = reloadPage();
354
                                
355
                                //Se ha cargado una nueva p?gina
356
                                if(currentPage != pageLoaded) { 
357
                                        int r = model.getRowCount() - 1;
358
                                        getJTable().setRowSelectionInterval(r, r);
359
                                } else {
360
                                        int r = selectedRows[0] % pager.getEntriesPerPage();
361
                                        if(r >= 0 && r < model.getRowCount()) {
362
                                                getJTable().setRowSelectionInterval(r, r);
363
                                        }
364
                                }
365
                        }
366
                        
367
                        if(option == Pager.CHANGE_REMOVE_ALL ) {
368
                                model.setNumRows(0);
369
                        }
370
                        
371
                }
372
        }
373
}