Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extGeoreferencing / src / com / iver / cit / gvsig / gui / Panels / TablePointsPanel.java @ 3102

History | View | Annotate | Download (13.4 KB)

1
package com.iver.cit.gvsig.gui.Panels;
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.JLabel;
16
import javax.swing.JOptionPane;
17
import javax.swing.JPanel;
18
import javax.swing.JScrollPane;
19
import javax.swing.JTable;
20
import javax.swing.table.DefaultTableModel;
21

    
22
import com.iver.andami.PluginServices;
23
import com.iver.cit.gvsig.fmap.layers.FLayer;
24
import com.iver.cit.gvsig.fmap.layers.FLyrGeoRaster;
25
import com.iver.cit.gvsig.fmap.layers.FLyrPoints;
26
import com.iver.cit.gvsig.gui.View;
27
import com.iver.cit.gvsig.gui.Dialogs.GeoreferencingDialog;
28
public class TablePointsPanel extends JPanel implements ActionListener{
29

    
30
        private GeoreferencingDialog parent = null;
31
        
32
        private JPanel pTable = null;
33
        private JPanel pPointSelection = null;
34
        private TableControlerPanel tableControlerPanel = null;
35
        
36
        private int widthGeneralPanel = 380, heightGeneralPanel = 160;
37
        private int widthSupPanel = 370, heightSupPanel = 125;
38
        private int widthInfPanel = 375, heightInfPanel = 27;
39
        private int widthTable = 375, heightTable = 110;
40
        
41
        private FLyrPoints lyrPoints = null;
42
        private int lastIndexSelection = -1;
43
        private boolean disableEvent = false;
44
        
45
        final static String[] columnNames = {"N?",
46
                "X",
47
                "Y",
48
                "X'",
49
                "Y'",
50
                "Error X", 
51
                "Error Y", 
52
                "RMS"};
53
        
54
        private PointTable table = null;
55
        
56
        
57
        
58
        /**
59
         * This is the default constructor
60
         */
61
        public TablePointsPanel(GeoreferencingDialog p) {
62
                super();
63
                this.parent = p;
64
                initialize();
65
        }
66

    
67
        /**
68
         * This method initializes this
69
         * 
70
         * @return void
71
         */
72
        private void initialize() {
73
        GridBagConstraints gridBagConstraints5 = new GridBagConstraints();
74
        GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
75
        GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
76
        this.setLayout(new GridBagLayout());
77
        this.setPreferredSize(new java.awt.Dimension(widthGeneralPanel, heightGeneralPanel));
78
        this.setSize(new java.awt.Dimension(widthGeneralPanel, heightGeneralPanel));
79
        this.setLocation(new java.awt.Point(0,0));
80
        gridBagConstraints1.gridx = 0;
81
        gridBagConstraints1.gridy = 0;
82
        gridBagConstraints1.insets = new java.awt.Insets(2,0,2,0);
83
        gridBagConstraints2.gridx = 0;
84
        gridBagConstraints2.gridy = 1;
85
        gridBagConstraints2.insets = new java.awt.Insets(5,0,5,0);
86
        gridBagConstraints2.anchor = java.awt.GridBagConstraints.NORTH;
87
        gridBagConstraints5.gridx = 0;
88
        gridBagConstraints5.gridy = 1;
89
        gridBagConstraints5.insets = new java.awt.Insets(1,0,1,0);
90
        this.add(getPTable(), gridBagConstraints1);
91
        this.add(getPPointSelection(), gridBagConstraints5);
92
        }
93

    
94
        /**
95
         * This method initializes jPanel        
96
         *         
97
         * @return javax.swing.JPanel        
98
         */    
99
        private JPanel getPTable() {
100
                if (pTable == null) {
101
                        BorderLayout borderLayout4 = new BorderLayout();
102
                        pTable = new JPanel();
103
                        pTable.setLayout(borderLayout4);
104
                        pTable.setSize(new java.awt.Dimension(widthSupPanel,heightSupPanel));
105
                        pTable.setPreferredSize(new java.awt.Dimension(widthSupPanel,heightSupPanel));
106
                        pTable.add(getJTable(), BorderLayout.CENTER);
107
                }
108
                return pTable;
109
        }
110
        
111
        /**
112
         * This method initializes jPanel1        
113
         *         
114
         * @return javax.swing.JPanel        
115
         */    
116
        private JPanel getPPointSelection() {
117
                if (pPointSelection == null) {
118
                        pPointSelection = new JPanel();
119
                        pPointSelection.setPreferredSize(new java.awt.Dimension(widthInfPanel, heightInfPanel));
120
                        if(this.tableControlerPanel == null){
121
                                FlowLayout flowLayout1 = new FlowLayout();
122
                                FlowLayout flowLayout = new FlowLayout();
123
                                FlowLayout flowLayout6 = new FlowLayout();
124
                                pPointSelection.setLayout(flowLayout6);
125
                                tableControlerPanel = new TableControlerPanel();
126
                                tableControlerPanel.setLayout(flowLayout1);
127
                                flowLayout1.setVgap(1);
128
                                flowLayout1.setHgap(0);
129
                                flowLayout6.setAlignment(java.awt.FlowLayout.LEFT);
130
                                flowLayout6.setHgap(3);
131
                                flowLayout6.setVgap(1);
132
                                pPointSelection.add(tableControlerPanel, null);
133
                                pPointSelection.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.gray,1));
134
                                tableControlerPanel.getBFirst().addActionListener(this);
135
                                tableControlerPanel.getBLast().addActionListener(this);
136
                                tableControlerPanel.getBNext().addActionListener(this);
137
                                tableControlerPanel.getBPrev().addActionListener(this);
138
                                tableControlerPanel.getBNew().setVisible(false);
139
                                tableControlerPanel.getCPoint().addActionListener(this);
140
                        }
141
                }
142
                return pPointSelection;
143
        }
144
        
145
        /**
146
         * Actualiza el n?mero de puntos del combo a partir de los contenidos en
147
         * la capa de puntos. Esta funci?n es usada desde otros paneles que cambien
148
         * el punto seleccionado para comunicar a la tabla la nueva selecci?n.
149
         */
150
        public void updateComboPoint(int pointSelected){
151
                try{
152
                        loadLyrPoint();
153
                }catch(InstantiationException exc){
154
                    JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
155
                                        PluginServices.getText(this, "error_capa_puntos"));
156
                    return;
157
            }
158
                
159
                disableEvent = true;
160
                tableControlerPanel.setNItems(lyrPoints.getCountPoints());
161
                tableControlerPanel.getCPoint().setSelectedIndex(pointSelected);
162
                getJTable().getTable().setRowSelectionInterval(pointSelected, pointSelected);
163
                tableControlerPanel.checkArrows();
164
                disableEvent = false;
165
        }
166
        
167
        /**
168
         * Obtiene una capa de puntos. Si no existe crea una.
169
         * @return
170
         */
171
        private void loadLyrPoint() throws InstantiationException{
172
                //Buscamos una capa FlyrPoint en la vista y si no la hay la creamos
173
                        
174
                if(lyrPoints == null){
175
                        View  theView = null;
176
                        try{
177
                                theView = (View)PluginServices.getMDIManager().getActiveView();
178
                        }catch(ClassCastException exc){
179
                                return;
180
                        }
181
                        for(int i=0;i<theView.getMapControl().getMapContext().getLayers().getLayersCount();i++){
182
                                FLayer lyr = theView.getMapControl().getMapContext().getLayers().getLayer(i);
183
                                if(        lyr instanceof FLyrGeoRaster &&
184
                                        lyr.getName().startsWith("*") &&
185
                                        lyr.isActive())
186
                                        try{
187
                                                lyrPoints = ((FLyrGeoRaster)lyr).getFLyrPoints();
188
                                        }catch(ClassCastException exc){
189
                                                throw new InstantiationException("No se ha podido obtener una capa de puntos");                                
190
                                        }
191
                        }
192
                }
193

    
194
        }
195
        
196
        /**
197
         * Comprueba si los valores de un punto en los campos de la tabla est?n
198
         * vacios y lanza una excepci?n si hay alguno sin informaci?n.
199
         * @throws NoSuchFieldException
200
         */
201
        private void checkInfoPointText(int nPunto)throws NoSuchFieldException{
202
                if(        getJTable().getTable().getValueAt(nPunto, 0).toString().equals("") ||
203
                        getJTable().getTable().getValueAt(nPunto, 1).toString().equals("") ||
204
                        getJTable().getTable().getValueAt(nPunto, 2).toString().equals("") ||
205
                        getJTable().getTable().getValueAt(nPunto, 3).toString().equals("") ||
206
                        getJTable().getTable().getValueAt(nPunto, 4).toString().equals("") ){
207
                                disableEvent = true;
208
                                tableControlerPanel.setSelectedIndex(lastIndexSelection);
209
                                disableEvent = false;
210
                                throw new NoSuchFieldException();
211
                }
212
        }
213
        /**
214
         * Cuando pasamos de un punto a otro
215
         * <UL>
216
         * <LI>Cargamos la capa de puntos si no est? cargada todavia</LI>
217
         * <LI>Comprobamos que el punto desde el que partimos no tenga campos inicio o fin vacios</LI>
218
         * <LI>Seleccionamos en el combo en nuevo punto</LI>
219
         * <LI>Cargamos la informaci?n del nuevo punto en los JTextField, mini imagen y seleccionamos la fila de la tabla</LI>
220
         * <LI>Chequeamos la flechas para activar o desactivar las que toquen.</LI>
221
         * </UL>
222
         * @param changeSelection        Cambia la posici?n seleccionada del combo si es true
223
         * @param pos        Posici?n a la que cambia el combo si el parametro chageSelection es true
224
         */
225
        private void changePoint(boolean changeSelection, int pos){
226
                disableEvent = true;
227
            try{
228
                    loadLyrPoint();
229
                    checkInfoPointText(pos);                        
230
                if(changeSelection){
231
                        lastIndexSelection = pos;
232
                        tableControlerPanel.setSelectedIndex(pos);
233
                }
234
                lyrPoints.loadVisualPoint(tableControlerPanel.getSelectedIndex(), parent);
235
                tableControlerPanel.checkArrows();
236
            }catch(NoSuchFieldException exc){
237
                    JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
238
                                        PluginServices.getText(this, "coordenadas_vacias"));
239
            }catch(InstantiationException exc){
240
                    JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
241
                                        PluginServices.getText(this, "error_capa_puntos"));
242
            }
243
            disableEvent = false;
244
        }
245
        
246
        /* (non-Javadoc)
247
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
248
         */
249
        public void actionPerformed(ActionEvent e) {
250
                //Bot?n de ir al punto inicial
251
                if(e.getSource() == tableControlerPanel.getBFirst()){
252
                        if(tableControlerPanel.getItemCount() >= 1)
253
                                changePoint(true, 0);
254
                }
255
                
256
                //Bot?n de ir al punto anterior
257
                if(e.getSource() == tableControlerPanel.getBPrev()){
258
                        if(tableControlerPanel.getSelectedIndex() != 0)                                 
259
                               changePoint(true, tableControlerPanel.getSelectedIndex() - 1);
260
                }
261
                
262
                //Bot?n de ir al punto siguiente
263
                if(e.getSource() == tableControlerPanel.getBNext()){
264
                        if(tableControlerPanel.getSelectedIndex() != (tableControlerPanel.getItemCount() - 1))
265
                        changePoint(true, tableControlerPanel.getSelectedIndex() + 1);
266
                
267
                }
268
                
269
                //Bot?n de ir al punto final
270
                if(e.getSource() == tableControlerPanel.getBLast()){
271
                        if(tableControlerPanel.getItemCount() >= 1)
272
                                changePoint(true, tableControlerPanel.getItemCount() - 1);
273
                }
274
                
275
                //Combo de selecci?n de punto
276
                if(e.getSource() == tableControlerPanel.getCPoint()){
277
                        if(tableControlerPanel.getSelectedIndex() != -1){
278
                                if(!disableEvent){
279
                                        changePoint(true,tableControlerPanel.getSelectedIndex());        
280
                                }
281
                        }
282
                }
283
        
284
        }
285
        /**
286
         * This method initializes jTable        
287
         *         
288
         * @return javax.swing.JTable        
289
         */    
290
        public PointTable getJTable() {
291
                if (table == null) {
292
                        table = new PointTable();
293
                        table.setSize(new java.awt.Dimension(widthTable, heightTable));
294
                        table.setPreferredSize(new java.awt.Dimension(widthTable, heightTable));
295
                }
296
                return table;
297
        }
298
        
299
        /**
300
         * Elimina todas las filas de la tabla.
301
         */
302
        public void clearTable(){
303
                int l = table.getTable().getRowCount();
304
                for(int i=0;i<l;i++)
305
                        ((DefaultTableModel)table.getTable().getModel()).removeRow(0);
306
        }
307

    
308
        /**
309
         * @return Returns the tableControlerPanel.
310
         */
311
        public TableControlerPanel getTableControlerPanel() {
312
                return tableControlerPanel;
313
        }
314
        
315
        /**
316
         * Asigna una tabla
317
         * @param table
318
         */
319
        public void setTable(PointTable table){
320
                this.table = table;
321
                table.setSize(new java.awt.Dimension(widthTable, heightTable));
322
                table.setPreferredSize(new java.awt.Dimension(widthTable, heightTable));
323
        }
324
        
325
        /**
326
         * Calculo del nuevo tama?o a partir de un frame redimensionado
327
         * @param w Ancho del frame
328
         * @param h Alto del frame
329
         */
330
        public void newFrameSize(int w, int h){
331
                int initWFrame = 385, initHFrame = 185;
332
                int initWGen = 380, initWSup = 370, initWInf = 375 , initWTable = 375;
333
                
334
                widthGeneralPanel = (int)((initWGen * w)/initWFrame);
335
                widthSupPanel = (int)((initWSup * w)/initWFrame);
336
                widthInfPanel = (int)((initWInf * w)/initWFrame);
337
                widthTable = (int)((initWTable * w)/initWFrame);
338
                
339
        this.resize(new java.awt.Dimension(widthGeneralPanel, heightGeneralPanel));
340
        getPTable().resize(new java.awt.Dimension(widthSupPanel,heightSupPanel));
341
                getPPointSelection().resize(new java.awt.Dimension(widthInfPanel, heightInfPanel));
342
                getJTable().resize(new java.awt.Dimension(widthTable, heightTable));
343
                
344
        }
345
        
346
        public class PointTable extends JPanel {
347
           
348
                private JTable table = null;
349
                private JScrollPane scrollPane = null;
350
                
351
                private TableModelPoint tabModel = null;
352
                
353
                public TableModelPoint getTableModel(){
354
                        return tabModel;
355
                }
356
                
357
            public PointTable() {
358
                super(new GridLayout(1,0));
359
               
360
                tabModel = new TableModelPoint();
361
                table = new JTable(tabModel);
362
                table.setPreferredScrollableViewportSize(new Dimension(500, 70));
363

    
364
               
365
                table.addMouseListener(new MouseAdapter() {
366
                   public void mouseClicked(MouseEvent e) {
367
                           
368
                   }
369
                });
370

    
371
                scrollPane = new JScrollPane(table);
372
                add(scrollPane);
373
            }
374

    
375
            /**
376
             * TableModel del JTable que contiene los puntos con sus errores
377
             * @author Nacho Brodin (brodin_ign@gva.es)
378
             *
379
             */
380
            public class TableModelPoint extends DefaultTableModel {
381
                     
382
                public TableModelPoint(){
383
                        super(new Object[0][8], columnNames);
384
                }
385
                
386
                public int getColumnCount() {
387
                    return columnNames.length;
388
                }
389

    
390
                public String getColumnName(int col) {
391
                    return columnNames[col];
392
                }
393

    
394
                public Class getColumnClass(int c) {
395
                   return String.class;
396
                }
397

    
398
                public void addNew() {
399
                    super.addRow(new Object[] {"", "", "", "", "", "", "", ""});
400
                }
401
                
402
                public void setValueAt(Object value, int row, int col) { 
403
                        super.setValueAt(value, row, col);
404
                }
405
                
406
                /**
407
                 * Devuelve true si la celda es editable. Solo son editables
408
                 * las celdas de los puntos.
409
                 */
410
                public boolean isCellEditable(int row, int col){
411
                        if(col >=1 && col <=4)
412
                                return true;
413
                        return false;
414
                }
415

    
416
         
417
            }
418
                /**
419
                 * @return Returns the table.
420
                 */
421
                public JTable getTable() {
422
                        return table;
423
                }
424
        }
425

    
426
}