Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extGeoreferencing / src / org / gvsig / georeferencing / gui / pointsTable / TablePointsPanel.java @ 5563

History | View | Annotate | Download (15.8 KB)

1
package org.gvsig.georeferencing.gui.pointsTable;
2

    
3
import java.awt.BorderLayout;
4
import java.awt.Component;
5
import java.awt.Dimension;
6
import java.awt.FlowLayout;
7
import java.awt.GridBagConstraints;
8
import java.awt.GridBagLayout;
9
import java.awt.GridLayout;
10
import java.awt.event.ActionEvent;
11
import java.awt.event.ActionListener;
12
import java.awt.event.MouseAdapter;
13
import java.awt.event.MouseEvent;
14

    
15
import javax.swing.JOptionPane;
16
import javax.swing.JPanel;
17
import javax.swing.JScrollPane;
18
import javax.swing.JTable;
19
import javax.swing.table.DefaultTableModel;
20

    
21
import org.gvsig.georeferencing.gui.dialogs.GeoreferencingDialog;
22

    
23
import com.iver.andami.PluginServices;
24
import com.iver.cit.gvsig.fmap.layers.FLyrPoints;
25

    
26
/**
27
 * Panel que contiene la tabla de puntos con sus controles. 
28
 * @author Nacho Brodin (brodin_ign@gva.es)
29
 */
30
public class TablePointsPanel extends JPanel implements ActionListener{
31
        
32
        //**********************Vars**********************************
33
        private GeoreferencingDialog                         parent = null;
34
        private JPanel                                                         pTable = null;
35
        private JPanel                                                         pPointSelection = null;
36
        private TableControlerPanel                         tableControlerPanel = null;
37
        private int                                                         widthGeneralPanel = 380, heightGeneralPanel = 160;
38
        private int                                                         widthSupPanel = 370, heightSupPanel = 125;
39
        private int                                                         widthInfPanel = 375, heightInfPanel = 27;
40
        private int                                                         widthTable = 375, heightTable = 110;
41
        private FLyrPoints                                                 lyrPoints = null;
42
        private int                                                         lastIndexSelection = -1;
43
        private boolean                                                 disableEvent = false;
44
        final static String[]                                         columnNames = {"N?", "X", "Y", 
45
                                                                                                                "X'", "Y'", "Error X",  
46
                                                                                                                "Error Y",  "RMS"};
47
        private PointTable                                                 table = null;
48
        private ButtonsExportImportPanel                 pButtonsExportImportPanel = null;
49
        /**
50
         * Estado de los botones cuando se ejecuta disableAllControls
51
         */
52
        private boolean[]                                         buttonsState = new boolean[3];
53
        /**
54
         * DisableAllControls ha sido ejecutada si est? a true esta variabled
55
         */
56
        private boolean                                         disableAllControls = false;
57
        //**********************End Vars******************************
58
        
59
        //**********************Classes*******************************
60
        /**
61
         * Clase que representa la tabla de puntos
62
         * @author Nacho Brodin (brodin_ign@gva.es)
63
         */
64
        public class PointTable extends JPanel {
65
           
66
                private JTable table = null;
67
                private JScrollPane scrollPane = null;
68
                
69
                private TableModelPoint tabModel = null;
70
                
71
                public TableModelPoint getTableModel(){
72
                        return tabModel;
73
                }
74
                
75
            public PointTable() {
76
                super(new GridLayout(1,0));
77
               
78
                tabModel = new TableModelPoint();
79
                table = new JTable(tabModel);
80
                table.setPreferredScrollableViewportSize(new Dimension(500, 70));
81

    
82
               
83
                table.addMouseListener(new MouseAdapter() {
84
                   public void mouseClicked(MouseEvent e) {
85
                           tableControlerPanel.setSelectedIndex(table.getSelectedRow());
86
                       parent.getPointManager().selectPoint(table.getSelectedRow(), parent);
87
                       tableControlerPanel.checkArrows();
88
                   }
89
                });
90

    
91
                scrollPane = new JScrollPane(table);
92
                add(scrollPane);
93
            }
94

    
95
            /**
96
             * TableModel del JTable que contiene los puntos con sus errores
97
             * @author Nacho Brodin (brodin_ign@gva.es)
98
             */
99
            public class TableModelPoint extends DefaultTableModel {
100
                     
101
                public TableModelPoint(){
102
                        super(new Object[0][8], columnNames);
103
                }
104
                
105
                public int getColumnCount() {
106
                    return columnNames.length;
107
                }
108

    
109
                public String getColumnName(int col) {
110
                    return columnNames[col];
111
                }
112

    
113
                public Class getColumnClass(int c) {
114
                   return String.class;
115
                }
116

    
117
                public void addNew() {
118
                    super.addRow(new Object[] {"", "", "", "", "", "", "", ""});
119
                }
120
                
121
                public void setValueAt(Object value, int row, int col) { 
122
                        super.setValueAt(value, row, col);
123
                }
124
                
125
                /**
126
                 * Devuelve true si la celda es editable. Solo son editables
127
                 * las celdas de los puntos.
128
                 */
129
                public boolean isCellEditable(int row, int col){
130
                        if(col >=1 && col <=4)
131
                                return true;
132
                        return false;
133
                }
134

    
135
         
136
            }
137
                /**
138
                 * @return Returns the table.
139
                 */
140
                public JTable getTable() {
141
                        return table;
142
                }
143
        }
144
        //**********************End Classes*****************************
145
        
146
        //**********************Methods*********************************
147
        /**
148
         * This is the default constructor
149
         */
150
        public TablePointsPanel(GeoreferencingDialog p) {
151
                super();
152
                this.parent = p;
153
                initialize();
154
        }
155

    
156
        /**
157
         * This method initializes this
158
         * 
159
         * @return void
160
         */
161
                private void initialize() {
162
        GridBagConstraints gridBagConstraints5 = new GridBagConstraints();
163
        GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
164
        GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
165
        this.setLayout(new GridBagLayout());
166
        this.setPreferredSize(new java.awt.Dimension(widthGeneralPanel, heightGeneralPanel));
167
        this.setSize(new java.awt.Dimension(widthGeneralPanel, heightGeneralPanel));
168
        this.setLocation(new java.awt.Point(0,0));
169
        gridBagConstraints1.gridx = 0;
170
        gridBagConstraints1.gridy = 0;
171
        gridBagConstraints1.insets = new java.awt.Insets(2,0,2,0);
172
        gridBagConstraints2.gridx = 0;
173
        gridBagConstraints2.gridy = 1;
174
        gridBagConstraints2.insets = new java.awt.Insets(5,0,5,0);
175
        gridBagConstraints2.anchor = java.awt.GridBagConstraints.NORTH;
176
        gridBagConstraints5.gridx = 0;
177
        gridBagConstraints5.gridy = 1;
178
        gridBagConstraints5.insets = new java.awt.Insets(1,0,1,0);
179
        this.add(getPTable(), gridBagConstraints1);
180
        this.add(getPPointSelection(), gridBagConstraints5);
181
        }
182

    
183
        /**
184
         * Actualiza el n?mero de puntos del combo a partir de los contenidos en
185
         * la capa de puntos. Esta funci?n es usada desde otros paneles que cambien
186
         * el punto seleccionado para comunicar a la tabla la nueva selecci?n.
187
         */
188
        public void updateComboPoint(int pointSelected){
189
                try{
190
                        loadLyrPoint();
191
                }catch(InstantiationException exc){
192
                    JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
193
                                        PluginServices.getText(this, "error_capa_puntos"));
194
                    return;
195
            }
196
                
197
                disableEvent = true;
198
                tableControlerPanel.setNItems(lyrPoints.getCountPoints());
199
                try{
200
                        tableControlerPanel.getCPoint().setSelectedIndex(pointSelected);
201
                }catch(IllegalArgumentException ex){
202
                        
203
                }
204
                getJTable().getTable().setRowSelectionInterval(pointSelected, pointSelected);
205
                tableControlerPanel.checkArrows();
206
                disableEvent = false;
207
        }
208
        
209
        /**
210
         * Obtiene una capa de puntos. Si no existe crea una.
211
         * @return
212
         */
213
        private void loadLyrPoint() throws InstantiationException{
214
                        
215
                if(lyrPoints == null){
216
                        if(lyrPoints == null){
217
                                lyrPoints = this.parent.getLyrPoints();
218
                                if(lyrPoints == null)
219
                                        throw new InstantiationException();
220
                        }
221
                }
222

    
223
        }
224
        
225
        /**
226
         * Comprueba si los valores de un punto en los campos de la tabla est?n
227
         * vacios y lanza una excepci?n si hay alguno sin informaci?n.
228
         * @throws NoSuchFieldException
229
         */
230
        private void checkInfoPointText(int nPunto)throws NoSuchFieldException{
231
                if(        getJTable().getTable().getValueAt(nPunto, 0).toString().equals("") ||
232
                        getJTable().getTable().getValueAt(nPunto, 1).toString().equals("") ||
233
                        getJTable().getTable().getValueAt(nPunto, 2).toString().equals("") ||
234
                        getJTable().getTable().getValueAt(nPunto, 3).toString().equals("") ||
235
                        getJTable().getTable().getValueAt(nPunto, 4).toString().equals("") ){
236
                                disableEvent = true;
237
                                tableControlerPanel.setSelectedIndex(lastIndexSelection);
238
                                disableEvent = false;
239
                                throw new NoSuchFieldException();
240
                }
241
        }
242
        /**
243
         * Cuando pasamos de un punto a otro
244
         * <UL>
245
         * <LI>Cargamos la capa de puntos si no est? cargada todavia</LI>
246
         * <LI>Comprobamos que el punto desde el que partimos no tenga campos inicio o fin vacios</LI>
247
         * <LI>Seleccionamos en el combo en nuevo punto</LI>
248
         * <LI>Cargamos la informaci?n del nuevo punto en los JTextField, mini imagen y seleccionamos la fila de la tabla</LI>
249
         * <LI>Chequeamos la flechas para activar o desactivar las que toquen.</LI>
250
         * </UL>
251
         * @param changeSelection        Cambia la posici?n seleccionada del combo si es true
252
         * @param pos        Posici?n a la que cambia el combo si el parametro chageSelection es true
253
         */
254
        private void changePoint(boolean changeSelection, int pos){
255
                disableEvent = true;
256
            try{
257
                    loadLyrPoint();
258
                    checkInfoPointText(pos);                        
259
                if(changeSelection){
260
                        lastIndexSelection = pos;
261
                        tableControlerPanel.setSelectedIndex(pos);
262
                }
263
                lyrPoints.getPointManager().selectPoint(tableControlerPanel.getSelectedIndex(), parent);
264
                tableControlerPanel.checkArrows();
265
            }catch(NoSuchFieldException exc){
266
                    JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
267
                                        PluginServices.getText(this, "coordenadas_vacias"));
268
            }catch(InstantiationException exc){
269
                    JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
270
                                        PluginServices.getText(this, "error_capa_puntos"));
271
            }
272
            disableEvent = false;
273
        }
274
        
275
        /* (non-Javadoc)
276
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
277
         */
278
        public void actionPerformed(ActionEvent e) {
279
                //Bot?n de ir al punto inicial
280
                if(e.getSource() == tableControlerPanel.getBFirst()){
281
                        if(tableControlerPanel.getItemCount() >= 1)
282
                                changePoint(true, 0);
283
                }
284
                
285
                //Bot?n de ir al punto anterior
286
                if(e.getSource() == tableControlerPanel.getBPrev()){
287
                        if(tableControlerPanel.getSelectedIndex() != 0)                                 
288
                               changePoint(true, tableControlerPanel.getSelectedIndex() - 1);
289
                }
290
                
291
                //Bot?n de ir al punto siguiente
292
                if(e.getSource() == tableControlerPanel.getBNext()){
293
                        if(tableControlerPanel.getSelectedIndex() != (tableControlerPanel.getItemCount() - 1))
294
                        changePoint(true, tableControlerPanel.getSelectedIndex() + 1);
295
                
296
                }
297
                
298
                //Bot?n de ir al punto final
299
                if(e.getSource() == tableControlerPanel.getBLast()){
300
                        if(tableControlerPanel.getItemCount() >= 1)
301
                                changePoint(true, tableControlerPanel.getItemCount() - 1);
302
                }
303
                
304
                //Combo de selecci?n de punto
305
                if(e.getSource() == tableControlerPanel.getCPoint()){
306
                        if(tableControlerPanel.getSelectedIndex() != -1){
307
                                if(!disableEvent){
308
                                        changePoint(true,tableControlerPanel.getSelectedIndex());        
309
                                }
310
                        }
311
                }
312
        
313
        }
314
        
315
        /**
316
         * Esta funci?n deshabilita todos los controles y guarda sus valores
317
         * de habilitado o deshabilitado para que cuando se ejecute restoreControlsValue
318
         * se vuelvan a quedar como estaba
319
         */
320
        public void disableAllControls(){
321
                if(!disableAllControls){
322
                        disableAllControls = true;
323
                        
324
                        //Salvamos los estados
325
                        buttonsState[0] = getPButtonsExportImportPanel().getBSave().isEnabled();
326
                        buttonsState[1] = getPButtonsExportImportPanel().getBLoad().isEnabled();
327
                        buttonsState[2] = getPButtonsExportImportPanel().getBExportToAscii().isEnabled();
328
                        
329
                        //Desactivamos controles
330
                        getPButtonsExportImportPanel().getBSave().setEnabled(false);
331
                        getPButtonsExportImportPanel().getBLoad().setEnabled(false);
332
                        getPButtonsExportImportPanel().getBExportToAscii().setEnabled(false);
333
                }
334
        }
335
        
336
        /**
337
         * Esta funci?n deja los controles como estaban al ejecutar la funci?n 
338
         * disableAllControls
339
         */
340
        public void restoreControlsValue(){
341
                if(disableAllControls){
342
                        disableAllControls = false;
343
                        getPButtonsExportImportPanel().getBSave().setEnabled(buttonsState[0]);
344
                        getPButtonsExportImportPanel().getBLoad().setEnabled(buttonsState[1]);
345
                        getPButtonsExportImportPanel().getBExportToAscii().setEnabled(buttonsState[2]);
346
                }
347
        }
348
        //**********************End Methods*****************************
349
        
350
        //**********************Setters & Getters***********************
351
        /**
352
         * This method initializes jPanel        
353
         *         
354
         * @return javax.swing.JPanel        
355
         */    
356
        public JPanel getPTable() {
357
                if (pTable == null) {
358
                        BorderLayout borderLayout4 = new BorderLayout();
359
                        pTable = new JPanel();
360
                        pTable.setLayout(borderLayout4);
361
                        pTable.setSize(new java.awt.Dimension(widthSupPanel,heightSupPanel));
362
                        pTable.setPreferredSize(new java.awt.Dimension(widthSupPanel,heightSupPanel));
363
                        pTable.add(getJTable(), BorderLayout.CENTER);
364
                }
365
                return pTable;
366
        }
367
        
368
        /**
369
         * This method initializes jPanel1        
370
         *         
371
         * @return javax.swing.JPanel        
372
         */    
373
        public JPanel getPPointSelection() {
374
                if (pPointSelection == null) {
375
                        pPointSelection = new JPanel();
376
                        pPointSelection.setPreferredSize(new java.awt.Dimension(widthInfPanel, heightInfPanel));
377
                        if(this.tableControlerPanel == null){
378
                                FlowLayout flowLayout6 = new FlowLayout();
379
                                pPointSelection.setLayout(flowLayout6);
380
                                tableControlerPanel = new TableControlerPanel();
381
                                flowLayout6.setAlignment(java.awt.FlowLayout.LEFT);
382
                                flowLayout6.setHgap(0);
383
                                flowLayout6.setVgap(2);
384
                                pPointSelection.add(tableControlerPanel, null);
385
                                pPointSelection.add(getPButtonsExportImportPanel(), null);
386
                                pPointSelection.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.gray,1));
387
                                tableControlerPanel.getBFirst().addActionListener(this);
388
                                tableControlerPanel.getBLast().addActionListener(this);
389
                                tableControlerPanel.getBNext().addActionListener(this);
390
                                tableControlerPanel.getBPrev().addActionListener(this);
391
                                tableControlerPanel.getBNew().setVisible(false);
392
                                tableControlerPanel.getCPoint().addActionListener(this);
393
                        }
394
                }
395
                return pPointSelection;
396
        }
397
        
398
        /**
399
         * This method initializes jTable        
400
         *         
401
         * @return javax.swing.JTable        
402
         */    
403
        public PointTable getJTable() {
404
                if (table == null) {
405
                        table = new PointTable();
406
                        table.setSize(new java.awt.Dimension(widthTable, heightTable));
407
                        table.setPreferredSize(new java.awt.Dimension(widthTable, heightTable));
408
                }
409
                return table;
410
        }
411
        
412
        /**
413
         * Elimina todas las filas de la tabla.
414
         */
415
        public void clearTable(){
416
                int l = table.getTable().getRowCount();
417
                this.setSaveToDisk(false);
418
                for(int i=0;i<l;i++)
419
                        ((DefaultTableModel)table.getTable().getModel()).removeRow(0);
420
        }
421

    
422
        /**
423
         * @return Returns the tableControlerPanel.
424
         */
425
        public TableControlerPanel getTableControlerPanel() {
426
                return tableControlerPanel;
427
        }
428
        
429
        /**
430
         * Asigna una tabla
431
         * @param table
432
         */
433
        public void setTable(PointTable table){
434
                this.table = table;
435
                table.setSize(new java.awt.Dimension(widthTable, heightTable));
436
                table.setPreferredSize(new java.awt.Dimension(widthTable, heightTable));
437
        }
438
        
439
        /**
440
         * Calculo del nuevo tama?o a partir de un frame redimensionado
441
         * @param w Ancho del frame
442
         * @param h Alto del frame
443
         */
444
        public void newFrameSize(int w, int h){
445
                int newWidth = w;
446
                
447
        this.setSize(new java.awt.Dimension(newWidth, heightGeneralPanel));
448
        this.setPreferredSize(new java.awt.Dimension(newWidth, heightGeneralPanel));
449
        
450
        getPTable().setSize(new java.awt.Dimension((int)(0.98*newWidth),heightSupPanel));
451
        getPTable().setPreferredSize(new java.awt.Dimension((int)(0.98*newWidth),heightSupPanel));
452
                
453
        getJTable().setSize(new java.awt.Dimension((int)(0.98*newWidth), heightTable));
454
                getJTable().setPreferredSize(new java.awt.Dimension((int)(0.98*newWidth), heightTable));
455
                
456
                getPPointSelection().setSize(new java.awt.Dimension((int)(0.98*newWidth), heightInfPanel));
457
        }
458

    
459
        /**
460
         * This method initializes jPanel        
461
         *         
462
         * @return javax.swing.JPanel        
463
         */
464
        public ButtonsExportImportPanel getPButtonsExportImportPanel() {
465
                if (pButtonsExportImportPanel == null) {
466
                        pButtonsExportImportPanel = new ButtonsExportImportPanel();
467
                }
468
                return pButtonsExportImportPanel;
469
        }
470
        
471
        /**
472
         * Activa o desactiva los botones de exportar capa de puntos y salvar
473
         * la tabla a Ascii.
474
         *@param isPossible Si vale true activa los controles de salvar y exportaci?n
475
         *y si vale false los desactiva
476
         */
477
        public void setSaveToDisk(boolean isPossible){
478
                this.getPButtonsExportImportPanel().setSaveToDisk(isPossible);
479
        }
480
        //**********************End Setters & Getters*******************
481
}