Statistics
| Revision:

root / branches / v2_0_0_prep / extensions / extGeocoding / src / org / gvsig / geocoding / gui / address / AddressComposedPanel.java @ 27464

History | View | Annotate | Download (16.5 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
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
 */
22

    
23
/*
24
 * AUTHORS (In addition to CIT):
25
 * 2008 Prodevelop S.L. main developer
26
 */
27

    
28
package org.gvsig.geocoding.gui.address;
29

    
30

    
31

    
32
import java.awt.Color;
33
import java.io.File;
34
import java.util.ArrayList;
35
import java.util.Iterator;
36
import java.util.List;
37
import java.util.Vector;
38

    
39
import javax.swing.ImageIcon;
40
import javax.swing.JLabel;
41
import javax.swing.JPanel;
42
import javax.swing.JScrollPane;
43
import javax.swing.JTabbedPane;
44
import javax.swing.JTable;
45
import javax.swing.table.DefaultTableCellRenderer;
46
import javax.swing.table.DefaultTableModel;
47
import javax.swing.table.TableColumn;
48

    
49
import org.gvsig.fmap.dal.exception.DataException;
50
import org.gvsig.fmap.dal.feature.Feature;
51
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
52
import org.gvsig.fmap.dal.feature.FeatureSet;
53
import org.gvsig.fmap.dal.feature.FeatureStore;
54
import org.gvsig.geocoding.Address;
55
import org.gvsig.geocoding.AddressComponent;
56
import org.gvsig.geocoding.ComposeAddress;
57
import org.gvsig.geocoding.Literal;
58
import org.gvsig.geocoding.NumberAddress;
59
import org.gvsig.geocoding.RelationsComponent;
60
import org.gvsig.geocoding.extension.GeocoController;
61
import org.gvsig.geocoding.gui.newpattern.ComboDesc;
62
import org.gvsig.geocoding.utils.GeocoUtils;
63
import org.slf4j.Logger;
64
import org.slf4j.LoggerFactory;
65

    
66
import com.iver.andami.PluginServices;
67

    
68
/**
69
 * Address composed panel
70
 * 
71
 * @author <a href="mailto:jsanz@prodevelop.es"> Jorge Gaspar Sanz Salinas</a>
72
 * @author <a href="mailto:vsanjaime@prodevelop.es"> Vicente Sanjaime Calvet</a>
73
 */
74
public class AddressComposedPanel extends AbstractAddressPanel {
75

    
76
        private static final long serialVersionUID = 1L;
77
        private Logger log = LoggerFactory.getLogger(AddressComposedPanel.class);
78
        
79
        private GeocoController control = null;
80

    
81
        private JLabel jLabTypeBetween;
82
        private JLabel jLabTypeCross;
83
        private JPanel jPanAddressBetween;
84
        private JPanel jPanAddressCross;
85
        private JPanel jPanBetween;
86
        private JPanel jPanCross;
87
        private JScrollPane jScrollAddressBetween;
88
        private JScrollPane jScrollAddressCross;
89
        private JTabbedPane jTabbedComposed;
90
        private JTable jTableAddressBetween;
91
        private JTable jTableAddressCross;
92

    
93
        private boolean iscross = true;
94

    
95
        /**
96
         * Constructor
97
         */
98
        public AddressComposedPanel(GeocoController control, Literal literal) {
99
                initComponents();
100
                this.control = control;
101

    
102
                setImages();
103
                setMesages();
104

    
105
                // create table model
106

    
107
                if (control.getGmodel().isSimple()) {
108
                        createSimpleTablesModels(literal);
109
                } else {
110
                        List<FeatureAttributeDescriptor> descs = control.getGmodel()
111
                                        .getListDescriptorSelectedTable();
112
                        createTableTablesModels(literal, descs);
113
                }
114
        }
115

    
116
        /**
117
         * Set images in the panel
118
         */
119
        private void setImages() {
120
                String baseDir = PluginServices.getPluginServices(this)
121
                                .getClassLoader().getBaseDir();
122

    
123
                jLabTypeCross
124
                                .setIcon(new ImageIcon(baseDir + File.separator + "images"
125
                                                + File.separator + "new" + File.separator
126
                                                + "composedcross.png"));
127
                jLabTypeBetween.setIcon(new ImageIcon(baseDir + File.separator
128
                                + "images" + File.separator + "new" + File.separator
129
                                + "composedbetween.png"));
130
        }
131

    
132
        /**
133
         * Set strings in the panel
134
         */
135
        private void setMesages() {
136
                PluginServices ps = PluginServices.getPluginServices(this);
137

    
138
                String element = ps.getText("xelement");
139

    
140
                DefaultTableModel cmodel = (DefaultTableModel) jTableAddressCross
141
                                .getModel();
142
                String value1 = ps.getText("xvalue1");
143
                String value2 = ps.getText("xvalue2");
144
                Object[] headers = { element, value1, value2 };
145
                cmodel.setColumnIdentifiers(headers);
146
                jTableAddressCross.setModel(cmodel);
147

    
148
                DefaultTableModel bmodel = (DefaultTableModel) jTableAddressBetween
149
                                .getModel();
150
                String value11 = ps.getText("xmainvalue");
151
                String value22 = ps.getText("xvalue2");
152
                String value33 = ps.getText("xvalue3");
153
                Object[] bheaders = { element, value11, value22, value33 };
154
                bmodel.setColumnIdentifiers(bheaders);
155
                jTableAddressBetween.setModel(bmodel);
156

    
157
                // tabs
158
                String titleCross = ps.getText("xcross");
159
                jTabbedComposed.setTitleAt(0, titleCross);
160
                String titleBetween = ps.getText("xbetween");
161
                jTabbedComposed.setTitleAt(1, titleBetween);
162
        }
163

    
164
        /**
165
         * Initialize components
166
         */
167
        private void initComponents() {
168
                java.awt.GridBagConstraints gridBagConstraints;
169

    
170
                jTabbedComposed = new javax.swing.JTabbedPane();
171
                jPanCross = new javax.swing.JPanel();
172
                jLabTypeCross = new javax.swing.JLabel();
173
                jPanAddressCross = new javax.swing.JPanel();
174
                jScrollAddressCross = new javax.swing.JScrollPane();
175
                jTableAddressCross = new javax.swing.JTable();
176
                jPanBetween = new javax.swing.JPanel();
177
                jLabTypeBetween = new javax.swing.JLabel();
178
                jPanAddressBetween = new javax.swing.JPanel();
179
                jScrollAddressBetween = new javax.swing.JScrollPane();
180
                jTableAddressBetween = new javax.swing.JTable();
181

    
182
                setLayout(new java.awt.GridBagLayout());
183

    
184
                jPanCross.setLayout(new java.awt.GridBagLayout());
185

    
186
                gridBagConstraints = new java.awt.GridBagConstraints();
187
                gridBagConstraints.insets = new java.awt.Insets(5, 15, 5, 10);
188
                jPanCross.add(jLabTypeCross, gridBagConstraints);
189

    
190
                jPanAddressCross.setLayout(new java.awt.GridBagLayout());
191

    
192
                jTableAddressCross.setModel(new javax.swing.table.DefaultTableModel(
193
                                new Object[][] { { null, null, null }, { null, null, null },
194
                                                { null, null, null } }, new String[] { "Elements",
195
                                                "Values address 1 ", "Values address 2" }) {
196
                        Class[] types = new Class[] { java.lang.String.class,
197
                                        java.lang.String.class, java.lang.String.class };
198
                        boolean[] canEdit = new boolean[] { false, true, true };
199

    
200
                        public Class getColumnClass(int columnIndex) {
201
                                return types[columnIndex];
202
                        }
203

    
204
                        public boolean isCellEditable(int rowIndex, int columnIndex) {
205
                                return canEdit[columnIndex];
206
                        }
207
                });
208
                jScrollAddressCross.setViewportView(jTableAddressCross);
209

    
210
                gridBagConstraints = new java.awt.GridBagConstraints();
211
                gridBagConstraints.gridx = 0;
212
                gridBagConstraints.gridy = 0;
213
                gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
214
                gridBagConstraints.weightx = 1.0;
215
                gridBagConstraints.weighty = 1.0;
216
                jPanAddressCross.add(jScrollAddressCross, gridBagConstraints);
217

    
218
                gridBagConstraints = new java.awt.GridBagConstraints();
219
                gridBagConstraints.gridx = 1;
220
                gridBagConstraints.gridy = 0;
221
                gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
222
                gridBagConstraints.weightx = 1.0;
223
                gridBagConstraints.weighty = 1.0;
224
                gridBagConstraints.insets = new java.awt.Insets(10, 15, 10, 10);
225
                jPanCross.add(jPanAddressCross, gridBagConstraints);
226

    
227
                jTabbedComposed.addTab("tab1", jPanCross);
228

    
229
                jPanBetween.setLayout(new java.awt.GridBagLayout());
230

    
231
                gridBagConstraints = new java.awt.GridBagConstraints();
232
                gridBagConstraints.gridx = 0;
233
                gridBagConstraints.gridy = 0;
234
                gridBagConstraints.insets = new java.awt.Insets(5, 15, 5, 10);
235
                jPanBetween.add(jLabTypeBetween, gridBagConstraints);
236

    
237
                jPanAddressBetween.setLayout(new java.awt.GridBagLayout());
238

    
239
                jTableAddressBetween
240
                                .setModel(new javax.swing.table.DefaultTableModel(
241
                                                new Object[][] { { null, null, null, null },
242
                                                                { null, null, null, null },
243
                                                                { null, null, null, null } }, new String[] {
244
                                                                "Elements", "Values main address",
245
                                                                "Values address 2", "values address 3" }) {
246
                                        Class[] types = new Class[] { java.lang.String.class,
247
                                                        java.lang.String.class, java.lang.String.class,
248
                                                        java.lang.String.class };
249
                                        boolean[] canEdit = new boolean[] { false, true, true, true };
250

    
251
                                        public Class getColumnClass(int columnIndex) {
252
                                                return types[columnIndex];
253
                                        }
254

    
255
                                        public boolean isCellEditable(int rowIndex, int columnIndex) {
256
                                                return canEdit[columnIndex];
257
                                        }
258
                                });
259
                jScrollAddressBetween.setViewportView(jTableAddressBetween);
260

    
261
                gridBagConstraints = new java.awt.GridBagConstraints();
262
                gridBagConstraints.gridx = 1;
263
                gridBagConstraints.gridy = 0;
264
                gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
265
                gridBagConstraints.weightx = 1.0;
266
                gridBagConstraints.weighty = 1.0;
267
                jPanAddressBetween.add(jScrollAddressBetween, gridBagConstraints);
268

    
269
                gridBagConstraints = new java.awt.GridBagConstraints();
270
                gridBagConstraints.gridx = 1;
271
                gridBagConstraints.gridy = 0;
272
                gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
273
                gridBagConstraints.weightx = 1.0;
274
                gridBagConstraints.weighty = 1.0;
275
                gridBagConstraints.insets = new java.awt.Insets(10, 15, 10, 10);
276
                jPanBetween.add(jPanAddressBetween, gridBagConstraints);
277

    
278
                jTabbedComposed.addTab("tab2", jPanBetween);
279

    
280
                gridBagConstraints = new java.awt.GridBagConstraints();
281
                gridBagConstraints.gridx = 0;
282
                gridBagConstraints.gridy = 0;
283
                gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
284
                gridBagConstraints.weightx = 1.0;
285
                gridBagConstraints.weighty = 1.0;
286
                add(jTabbedComposed, gridBagConstraints);
287
        }
288

    
289
        /**
290
         * Create a simple tables models from literal components
291
         * 
292
         * @param lit
293
         */
294
        private void createSimpleTablesModels(Literal lit) {
295

    
296
                DefaultTableCellRenderer render = new DefaultTableCellRenderer();
297
                render.setBackground(new Color(255, 253, 224));
298

    
299
                // Cross tab
300
                DefaultTableModel modelcross = (DefaultTableModel) jTableAddressCross
301
                                .getModel();
302
                TableColumn colcross0 = jTableAddressCross.getColumnModel()
303
                                .getColumn(0);
304
                colcross0.setCellRenderer(render);
305

    
306
                // fill elements
307
                GeocoUtils.clearTableModel(modelcross);
308

    
309
                for (Object obj : lit) {
310
                        RelationsComponent comp = (RelationsComponent) obj;
311
                        String key = comp.getKeyElement();
312
                        Object[] row = { key, "", "" };
313
                        modelcross.addRow(row);
314
                }
315
                jTableAddressCross.setModel(modelcross);
316

    
317
                // Between tab
318
                DefaultTableModel modelbetween = (DefaultTableModel) jTableAddressBetween
319
                                .getModel();
320
                // first column
321
                TableColumn colbetween0 = jTableAddressBetween.getColumnModel()
322
                                .getColumn(0);
323
                colbetween0.setCellRenderer(render);
324

    
325
                // fill elements
326
                GeocoUtils.clearTableModel(modelbetween);
327

    
328
                for (Object obj : lit) {
329
                        RelationsComponent comp = (RelationsComponent) obj;
330
                        String key = comp.getKeyElement();
331
                        Object[] row = { key, "", "", "" };
332
                        modelbetween.addRow(row);
333
                }
334
                jTableAddressBetween.setModel(modelbetween);
335

    
336
        }
337

    
338
        /**
339
         * Create a table tables models from literal components
340
         * 
341
         * @param lit
342
         */
343
        private void createTableTablesModels(Literal lit,
344
                        List<FeatureAttributeDescriptor> descs) {
345

    
346
                DefaultTableCellRenderer render = new DefaultTableCellRenderer();
347
                render.setBackground(new Color(255, 253, 224));
348

    
349
                // Croos tab
350
                DefaultTableModel modelcross = (DefaultTableModel) jTableAddressCross
351
                                .getModel();
352

    
353
                // first column
354
                TableColumn columncross0 = jTableAddressCross.getColumnModel()
355
                                .getColumn(0);
356
                columncross0.setCellRenderer(render);
357

    
358
                // fill elements
359
                GeocoUtils.clearTableModel(modelcross);
360

    
361
                // Put combos in the column 1
362
                GeocoUtils.putCombosInTable(jTableAddressCross, descs, 1);
363

    
364
                // Put combos in the column 2
365
                GeocoUtils.putCombosInTable(jTableAddressCross, descs, 2);
366

    
367
                // put the elements in the column 0
368
                for (Object obj : lit) {
369
                        RelationsComponent comp = (RelationsComponent) obj;
370
                        // key
371
                        String key = comp.getKeyElement();
372

    
373
                        // insert
374
                        Object[] row = { key, "", "" };
375
                        modelcross.addRow(row);
376
                }
377
                jTableAddressCross.setModel(modelcross);
378

    
379
                // Between tab
380
                DefaultTableModel modelbetween = (DefaultTableModel) jTableAddressBetween
381
                                .getModel();
382

    
383
                // first column
384
                TableColumn columnbetween0 = jTableAddressBetween.getColumnModel()
385
                                .getColumn(0);
386
                columnbetween0.setCellRenderer(render);
387

    
388
                // fill elements
389
                GeocoUtils.clearTableModel(modelbetween);
390

    
391
                // Put combos in the column 1
392
                GeocoUtils.putCombosInTable(jTableAddressBetween, descs, 1);
393

    
394
                // Put combos in the column 2
395
                GeocoUtils.putCombosInTable(jTableAddressBetween, descs, 2);
396

    
397
                // Put combos in the column 3
398
                GeocoUtils.putCombosInTable(jTableAddressBetween, descs, 3);
399

    
400
                // put the elements in the column 0
401
                for (Object obj : lit) {
402
                        RelationsComponent comp = (RelationsComponent) obj;
403
                        // key
404
                        String key = comp.getKeyElement();
405

    
406
                        // insert
407
                        Object[] row = { key, "", "", "" };
408
                        modelbetween.addRow(row);
409
                }
410
                jTableAddressBetween.setModel(modelbetween);
411
        }
412

    
413
        /**
414
         * get address from user interface
415
         * 
416
         * @param model
417
         * @return
418
         */
419
        public Address getSimpleAddress() {
420
                int n = jTabbedComposed.getSelectedIndex();
421
                DefaultTableModel model = null;
422
                if(n == 0){
423
                        jTableAddressCross.setRowSelectionInterval(0, 0);
424
                        model = (DefaultTableModel)jTableAddressCross.getModel();
425
                }
426
                if(n == 1){
427
                        jTableAddressBetween.setRowSelectionInterval(0, 0);
428
                        model = (DefaultTableModel)jTableAddressBetween.getModel();
429
                }
430
                
431
                ComposeAddress address = new ComposeAddress();
432
                Literal mainLiteral = new Literal();
433
                Literal literal2 = new Literal();
434
                Literal literal3 = new Literal();
435
                List<Literal> intersectionLiterals = new ArrayList<Literal>();
436
                Vector vec = model.getDataVector();
437
                // get main and secon address
438
                for (int i = 0; i < vec.size(); i++) {
439
                        Vector vecc = (Vector) vec.elementAt(i);
440
                        String key = (String) vecc.elementAt(0);
441
                        String value = (String) vecc.elementAt(1);
442
                        String value2 = (String) vecc.elementAt(2);
443
                        mainLiteral.add(new AddressComponent(key, value));
444
                        literal2.add(new AddressComponent(key, value2));
445
                }
446
                address.setMainLiteral(mainLiteral);
447
                intersectionLiterals.add(literal2);
448
                // get third address if exist
449
                int num = ((Vector) vec.elementAt(0)).size();
450
                if (num == 4) {
451
                        for (int i = 0; i < vec.size(); i++) {
452
                                Vector vecc = (Vector) vec.elementAt(i);
453
                                String key = (String) vecc.elementAt(0);
454
                                String value3 = (String) vecc.elementAt(3);
455
                                literal3.add(new AddressComponent(key, value3));
456
                        }
457
                        intersectionLiterals.add(literal3);
458
                }
459

    
460
                address.setIntersectionLiteral(intersectionLiterals);
461

    
462
                return address;
463
        }
464

    
465
        /**
466
         * Get the addres from table
467
         * 
468
         * @param model
469
         * @param row
470
         * @return
471
         */
472
        public Address getTableAddress(DefaultTableModel model, int row) {
473
                // Get store from Gmodel and the feature
474
                FeatureStore store = control.getGmodel().getSelectedTableStore();
475
                FeatureSet features = null;
476
                Feature feature = null;
477
                try {
478
                        features = store.getFeatureSet();
479
                        Iterator<Feature> it = features.iterator(row);
480
                        feature = it.next();
481
                } catch (DataException e) {
482
                        log.error("Get the feature of FeatureStore", e);
483
                }
484

    
485
                // Create the address
486
                ComposeAddress address = new ComposeAddress();
487
                Literal mainLiteral = new Literal();
488
                Literal literal2 = new Literal();
489
                Literal literal3 = new Literal();
490
                List<Literal> intersectionLiterals = new ArrayList<Literal>();
491
                Vector vec = model.getDataVector();
492

    
493
                for (int i = 0; i < vec.size(); i++) {
494
                        Vector vecc = (Vector) vec.elementAt(i);
495
                        String key = (String) vecc.elementAt(0);
496
                        ComboDesc cdesc1 = (ComboDesc) vecc.elementAt(1);
497
                        ComboDesc cdesc2 = (ComboDesc) vecc.elementAt(2);
498
                        FeatureAttributeDescriptor desc1 = cdesc1.getDescriptor();
499
                        FeatureAttributeDescriptor desc2 = cdesc2.getDescriptor();
500
                        String fieldName1 = desc1.getName();
501
                        String fieldName2 = desc2.getName();
502
                        Object obj1 = feature.get(fieldName1);
503
                        Object obj2 = feature.get(fieldName2);
504
                        String value1 = obj1.toString();
505
                        String value2 = obj2.toString();
506
                        mainLiteral.add(new AddressComponent(key, value1));
507
                        literal2.add(new AddressComponent(key, value2));
508
                }
509
                
510
                address.setMainLiteral(mainLiteral);
511
                intersectionLiterals.add(literal2);
512
                
513
                // get third address if exist
514
                int num = ((Vector) vec.elementAt(0)).size();
515
                if (num == 4) {
516
                        for (int i = 0; i < vec.size(); i++) {
517
                                Vector vecc = (Vector) vec.elementAt(i);
518
                                String key = (String) vecc.elementAt(0);
519
                                ComboDesc cdesc3 = (ComboDesc) vecc.elementAt(3);
520
                                FeatureAttributeDescriptor desc3 = cdesc3.getDescriptor();
521
                                String fieldName3 = desc3.getName();
522
                                Object obj3 = feature.get(fieldName3);
523
                                String value3 = obj3.toString();
524
                                literal3.add(new AddressComponent(key, value3));
525
                        }
526
                        intersectionLiterals.add(literal3);
527
                }
528
                address.setIntersectionLiteral(intersectionLiterals);                
529

    
530
                return address;
531
        }
532

    
533
}