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

History | View | Annotate | Download (8.15 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.table.DefaultTableModel;
39
import javax.swing.table.JTableHeader;
40
import javax.swing.table.TableColumn;
41

    
42
import org.gvsig.raster.swing.pagedtable.ModelLoader;
43

    
44

    
45
/**
46
 * Paged table
47
 * 
48
 * @author Nacho Brodin (nachobrodin@gmail.com)
49
 */
50
public class PagedTablePanel extends JPanel implements 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 Pager                      pager                  = null;
56
        private int                        heightLine             = 16;
57
        
58
        public class PagedJTable extends JTable {
59
                private static final long serialVersionUID = 1L;
60

    
61
                public PagedJTable(DefaultTableModel model, String[] columnNames) {
62
                        super(null, columnNames);
63
                        this.setModel(model);
64
                }
65
                
66
                /**
67
                 * Reimplemented to calculate the number of pages when the component gets
68
                 * a resize event
69
                 */
70
                public void setBounds(int x, int y, int width, int height) {
71
                super.setBounds(x, y, width, height);
72
                int entriesPerPage = (int)(getHeight() / (double)heightLine);
73
                        getPager(entriesPerPage);
74
            }
75
        }
76
        
77
        public PagedTablePanel(ModelLoader modelLoader,
78
                        Pager pager, 
79
                        PaginationBarPanel paginationBar,
80
                        MoveRowsPanel moveRowsPanel, 
81
                        TableEntryControllerPanel tableEntryControllerPanel) {
82
                this.modelLoader = modelLoader;
83
                this.pager = pager;
84
                this.model = (DefaultTableModel)modelLoader.getTableModel();
85
                initGUI(paginationBar, moveRowsPanel, tableEntryControllerPanel);
86
                
87
        }
88
        
89
        private void initGUI(
90
                        PaginationBarPanel paginationBar, 
91
                        MoveRowsPanel moveRowsPanel, 
92
                        TableEntryControllerPanel tableEntryControllerPanel) {
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(getJTableWithHeader(), 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(paginationBar, 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(tableEntryControllerPanel);
121
                panel.add(moveRowsPanel);
122
                add(panel, gbc);
123
        }
124
        
125
        public Pager getPager(int nEntriesPerPage) {
126
                pager.setEntriesPerPage(nEntriesPerPage);
127
                return pager;
128
        }
129
        
130
        /**
131
         * Gets a panel with the JTable and its header
132
         * @return
133
         */
134
        public JPanel getJTableWithHeader() {
135
                JPanel p = new JPanel(new BorderLayout());
136
                JTableHeader header = getJTable().getTableHeader();
137
                p.add(header, BorderLayout.NORTH);
138
                p.add(getJTable(), BorderLayout.CENTER);
139
                return p;
140
        }
141
        
142
        /**
143
         * Gets the JTable
144
         * @return Tabla de bandas de la imagen
145
         */
146
        public JTable getJTable() {
147
                if (jTable == null) {
148
                        jTable = new PagedJTable(model, modelLoader.getColumnNames());
149
                        jTable.addMouseListener(this);
150
                        jTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
151
                        
152
                        TableColumn column = null;
153

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

    
175
                return jTable;
176
        } 
177
        
178
        public void setLineHeight(int height) {
179
                this.heightLine = height;
180
        }
181
        
182
        /**
183
         * Gets the number of rows in this table
184
         * @return N?mero de filas de la tabla
185
         */
186
        public int getRowTableCount() {
187
                return model.getRowCount();
188
        }
189
        
190
        /**
191
         * Gets the selected point
192
         * @return position of the selected point
193
         */
194
        public int getSelectedTableRow() {
195
                return getJTable().getSelectedRow();
196
        }
197
        
198
        /**
199
         * Reloads the selected page in the visual table
200
         */
201
        private int reloadPage() {
202
                model.setNumRows(0);
203
                List<Object> lines = pager.getSelectedPage();
204
                if(lines == null)
205
                        return pager.getSelectedPageNumber();
206
                for (int i = 0; i < lines.size(); i++) {
207
                        model.addRow((Object[])lines.get(i));
208
                }
209
                return pager.getSelectedPageNumber();
210
        }
211

    
212
        public void mouseClicked(MouseEvent e) {
213
                if(e.getSource() == jTable) {
214
                        //When the user clicks on table, it selects the entry in the table control
215
                        int selVisualRow = getSelectedTableRow();
216
                        if(selVisualRow >= 0) {
217
                                int selRow = pager.getSelectedPageNumber() * pager.getEntriesPerPage() + selVisualRow;
218
                                pager.setSelectedRows(new int[]{selRow});
219
                        }
220
                }
221
        }
222

    
223
        public void mouseEntered(MouseEvent e) {
224
                
225
        }
226

    
227
        public void mouseExited(MouseEvent e) {
228
                
229
        }
230

    
231
        public void mousePressed(MouseEvent e) {
232
                
233
        }
234

    
235
        public void mouseReleased(MouseEvent e) {
236
                
237
        }
238

    
239
        
240
        public void update(Observable o, Object arg) {
241
                if(o instanceof Pager && arg instanceof Integer) {
242
                        int option = ((Integer)arg).intValue();
243
                        if(option == Pager.EVENT_SELECTED_ROWS ) {
244
                                Pager pager = (Pager)o;
245
                                int[] selectedRows = pager.getSelectedRows();
246
                                if(selectedRows != null && selectedRows.length > 0) {
247
                                        if(!pager.isInCurrentPage(selectedRows[0])) {
248
                                                pager.setSelectedPage(pager.getPageFromRow(selectedRows[0]));
249
                                                reloadPage();
250
                                        }
251
                                        int r = selectedRows[0] % pager.getEntriesPerPage();
252
                                        if(r >= 0 && r < model.getRowCount())
253
                                                getJTable().setRowSelectionInterval(r, r);
254
                                }
255
                        }
256
                        
257
                        if(option == Pager.EVENT_ADD_ENTRY ) {
258
                                model.addRow(pager.getLastEntry());
259
                                int lastTableRow = model.getRowCount() - 1;
260
                                getJTable().setRowSelectionInterval(lastTableRow, lastTableRow);
261
                        }
262
                        
263
                        if(option == Pager.EVENT_REMOVE_ENTRY ) {
264
                                int[] selectedRows = pager.getSelectedRows();
265
                                reloadPage();
266
                                if(selectedRows != null) {
267
                                        int r = selectedRows[0] % pager.getEntriesPerPage();
268
                                        if(r >= 0 && r < model.getRowCount()) {
269
                                                getJTable().setRowSelectionInterval(r, r);
270
                                        }
271
                                }
272
                        }
273
                        
274
                        if(option == Pager.EVENT_REMOVE_ALL ) {
275
                                model.setNumRows(0);
276
                        }
277
                        
278
                        if(option == Pager.EVENT_SELECTED_PAGE ) {
279
                                reloadPage();
280
                                int[] selectedRows = pager.getSelectedRows();
281
                                if(selectedRows != null) {
282
                                        int r = selectedRows[0] % pager.getEntriesPerPage();
283
                                        if(r >= 0 && r < model.getRowCount()) {
284
                                                getJTable().setRowSelectionInterval(r, r);
285
                                        }
286
                                }
287
                        }
288
                        
289
                }
290
        }
291
}