Statistics
| Revision:

gvsig-raster / org.gvsig.raster.wms / trunk / org.gvsig.raster.wms / org.gvsig.raster.wms.app.wmsclient / src / main / java / org / gvsig / raster / wms / app / wmsclient / gui / panel / WMSParamsPanel.java @ 4181

History | View | Annotate | Download (52.2 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
package org.gvsig.raster.wms.app.wmsclient.gui.panel;
24

    
25
import java.awt.Component;
26
import java.awt.Dimension;
27
import java.awt.event.FocusAdapter;
28
import java.awt.event.FocusEvent;
29
import java.awt.event.FocusListener;
30
import java.awt.event.MouseAdapter;
31
import java.awt.event.MouseEvent;
32
import java.lang.reflect.InvocationTargetException;
33
import java.net.URI;
34
import java.net.URISyntaxException;
35
import java.util.AbstractCollection;
36
import java.util.ArrayList;
37
import java.util.Hashtable;
38
import java.util.List;
39
import java.util.TreeSet;
40
import java.util.Vector;
41
import java.util.prefs.Preferences;
42

    
43
import javax.swing.JButton;
44
import javax.swing.JCheckBox;
45
import javax.swing.JList;
46
import javax.swing.JOptionPane;
47
import javax.swing.JPanel;
48
import javax.swing.JScrollPane;
49
import javax.swing.JTabbedPane;
50
import javax.swing.JTextField;
51
import javax.swing.tree.TreePath;
52

    
53
import org.gvsig.andami.IconThemeHelper;
54
import org.gvsig.andami.PluginServices;
55
import org.gvsig.andami.messages.NotificationManager;
56
import org.gvsig.app.gui.WizardPanel;
57
import org.gvsig.app.gui.wizards.FormatListModel;
58
import org.gvsig.app.gui.wizards.WizardListenerSupport;
59
import org.gvsig.app.project.documents.view.gui.AbstractViewPanel;
60
import org.gvsig.fmap.dal.DALLocator;
61
import org.gvsig.fmap.dal.DataManager;
62
import org.gvsig.fmap.dal.DataParameters;
63
import org.gvsig.fmap.dal.DataServerExplorerParameters;
64
import org.gvsig.fmap.dal.DataStoreParameters;
65
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
66
import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters;
67
import org.gvsig.fmap.dal.exception.InitializeException;
68
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
69
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
70
import org.gvsig.fmap.mapcontext.layers.FLayer;
71
import org.gvsig.fmap.mapcontext.layers.FLayers;
72
import org.gvsig.gui.beans.controls.dnd.JDnDListModel;
73
import org.gvsig.gui.beans.listeners.BeanListener;
74
import org.gvsig.raster.wms.app.wmsclient.gui.wizard.LayerTreeModel;
75
import org.gvsig.raster.wms.app.wmsclient.gui.wizard.SRSListModel;
76
import org.gvsig.raster.wms.app.wmsclient.layer.FLyrWMS;
77
import org.gvsig.raster.wms.io.RemoteWMSStyle;
78
import org.gvsig.raster.wms.io.WMSDataParameters;
79
import org.gvsig.raster.wms.io.WMSLayerNode;
80
import org.gvsig.raster.wms.io.WMSServerExplorer;
81
import org.gvsig.raster.wms.io.WMSServerExplorerParameters;
82
import org.gvsig.raster.wms.io.time.RemoteTimeDimension;
83

    
84

    
85
/**
86
 * This class implements the map option panel.
87
 *
88
 * It includes a set of Listeners that implement some control rules which
89
 * refresh the component values that depends on those selected in the other
90
 * components to avoid to choose an invalid set of options. It also includes a
91
 * method (isCorrectlyConfigured()) that checks if the current set of values is
92
 * enough to correctly launch a GetMap request.
93
 *
94
 * The information is obtained from a WMSWizardDataSource object.
95
 *
96
 *
97
 * Esta clase implementa el panel de opciones disponibles sobre el mapa
98
 *
99
 * Incluye una serie de Listeners que implementan unas reglas de control que
100
 * refrescan los valores de componentes cuyos valores dependen de aqu?llos
101
 * seleccionados en otros componentes para evitar que se escoja una combinaci?n
102
 * de opciones err?nea as? como una funci?n (isCorrectlyConfigured()) que
103
 * comprueba si la combinaci?n escogida actualmente es suficiente para lanzar
104
 * una operaci?n GetMap correctamente.
105
 *
106
 * La informaci?n obtiene a partir de un objeto WMSWizardDataSource.
107
 *
108
 * @author jaume - jaume dominguez faus
109
 *
110
 */
111
@SuppressWarnings("unchecked")
112
public class WMSParamsPanel extends WizardPanel {
113
        private static final long       serialVersionUID       = 1L;
114
        private JScrollPane             jScrollPane1           = null;
115
        private JScrollPane             jScrollPane2           = null;
116
        private JScrollPane             jScrollPane3           = null;
117
        private JScrollPane             jScrollPane5           = null;
118
        private JButton                 btnAdd                 = null;
119
        private JButton                 btnDel                 = null;
120
        private JScrollPane             jScrollPane6           = null;
121
        private JPanel                  jPanel2                = null;
122
        private JPanel                  tabFormats             = null;
123
        private JPanel                  jPanel4                = null;
124
        private JTextField              jTxtNomCapa            = null;
125
        private LayerList               lstSelectedLayers      = null;
126
        private ArrayList<TreePath>     selectedPaths          = new ArrayList<TreePath>();
127
        private JList                   lstSRSs                = null;
128
        private JList                   lstInfoFormats         = null;
129
        private LayerTree               treeLayers             = null;
130
        private JList                   lstFormats             = null;
131
        private WizardListenerSupport   listenerSupport;
132
        private JTabbedPane             jTabbedPane            = null;
133
        private JPanel                  tabLayers              = null;
134
        private JPanel                  jPanelFormats          = null;
135
        private JPanel                  jPanelAxisOrder        = null;
136
        private JPanel                  jPanelSrsSelection     = null;
137
        private JPanel                  jPanelInfoByPointFormat = null;
138
        private StylesPanel             tabStyle               = null;
139
        private JCheckBox               chkTransparency        = null;
140
        private JCheckBox               chkAxisOrder           = null;
141
        private InfoPanel               tabInfo                = null;
142
        private DimensionPanel          tabDimensions          = null;
143
        private int                     dimensionTabIndex;
144
        private int                     stylesTabIndex;
145
        private String                  oldSRS                 = null;
146
        private AbstractCollection      oldDimensions          = null;
147
        private Dimension               sizeFixed;
148
        private JCheckBox               chkExtendedNames       = null;
149
        private JButton                 btnUp                  = null;
150
        private JButton                 btnDown                = null;
151
        protected WMSServerExplorer     explorer               = null;
152
        private boolean                 updating               = fPrefs.getBoolean("refresh_capabilities", false);
153
        public static Preferences       fPrefs                 = Preferences.userRoot().node("gvsig.wms-wizard");
154
        //private Logger                  log                    = LoggerFactory.getLogger(WMSParamsPanel.class);
155
        private JCheckBox               chkDisagregate         = null;
156
        private boolean                 lastCached;
157
        private String                  groupName              = "WMS Group";
158

    
159
        public WMSParamsPanel() {
160
                super();
161
                initialize();
162
        }
163

    
164
        // TODO: crear nuevo constructor para a?adir los panels que quieras...
165
        public WMSParamsPanel(WMSServerExplorer data) {
166
                super();
167
                setWizardData(data);
168
                this.setLayout(null);
169
                this.setVisible(false);
170
                this.setBounds(0, 0, 510, 427);
171
                if (jTabbedPane == null) {
172
                        jTabbedPane = new JTabbedPane();
173
                        jTabbedPane.setBounds(4, 4, 502, 415);
174
                        StylesPanel sp = getTabStyle();
175
                        DimensionPanel dp = getTabDimensions();
176

    
177
                        jTabbedPane.addTab(PluginServices.getText(this, "capas"), null,
178
                                        getTabLayers(), null);
179
                        jTabbedPane.addTab(PluginServices.getText(this, "estilos"), null,
180
                                        sp, null);
181
                        stylesTabIndex = jTabbedPane.getTabCount() - 1;
182
                        jTabbedPane.addTab(PluginServices.getText(this, "dimensiones"),
183
                                        null, dp, null);
184
                        dimensionTabIndex = jTabbedPane.getTabCount() - 1;
185
                        jTabbedPane.addTab(PluginServices.getText(this, "formatos"), null,
186
                                        getTabFormats(), null);
187
                        jTabbedPane.setEnabledAt(dimensionTabIndex, false);
188
                        jTabbedPane.setEnabledAt(stylesTabIndex, false);
189
                }
190
                this.add(jTabbedPane, null);
191

    
192
                setListenerSupport(new WizardListenerSupport());
193
        }
194

    
195
        /**
196
         * This method initializes panelPage2
197
         *
198
         * @return Panel
199
         */
200
        private void initialize() {
201
                this.setLayout(null);
202
                this.setVisible(false);
203
                this.setBounds(0, 0, 510, 427);
204
                this.add(getJTabbedPane(), null);
205
        }
206

    
207
        public boolean isUpdatingCache() {
208
                return updating;
209
        }
210

    
211
        public void setUpdatingCache(boolean updating) {
212
                this.updating = updating;
213
        }
214

    
215
        /**
216
         * This method initializes jPanel2
217
         *
218
         * @return Panel
219
         */
220
        private JPanel getJPanel2() {
221
                if (jPanel2 == null) {
222
                        jPanel2 = new JPanel();
223
                        jPanel2.setLayout(null);
224
                        jPanel2.setBounds(5, 59, 485, 328);
225
                        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(
226
                                        null, PluginServices.getText(this, "select_layers"),
227
                                        javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
228
                                        javax.swing.border.TitledBorder.DEFAULT_POSITION, null,
229
                                        null));
230
                        jPanel2.add(getChkExtendedNames(), null);
231

    
232
                        jPanel2.add(getJScrollPane1(), null);
233
                        jPanel2.add(getBtnDel(), null);
234
                        jPanel2.add(getBtnAdd(), null);
235
                        jPanel2.add(getJScrollPane5(), null);
236
                        jPanel2.add(getBtnUp(), null);
237
                        jPanel2.add(getBtnDown(), null);
238
                        jPanel2.add(getChkDisagregate(), null);
239
                }
240

    
241
                return jPanel2;
242
        }
243

    
244
        /**
245
         * This method initializes jPanel4
246
         *
247
         * @return Panel
248
         */
249
        private JPanel getJPanel4() {
250
                if (jPanel4 == null) {
251
                        jPanel4 = new JPanel();
252
                        jPanel4.setLayout(null);
253
                        jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder(
254
                                        null, PluginServices.getText(this, "layer_name"),
255
                                        javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
256
                                        javax.swing.border.TitledBorder.DEFAULT_POSITION, null,
257
                                        null));
258
                        jPanel4.setBounds(5, 8, 485, 49);
259
                        jPanel4.add(getJTxtNomCapa(), null);
260
                }
261

    
262
                return jPanel4;
263
        }
264

    
265
        /**
266
         * This method initializes jPanel3
267
         *
268
         * @return Panel
269
         */
270
        private JPanel getTabFormats() {
271
                if (tabFormats == null) {
272
                        tabFormats = new JPanel();
273
                        tabFormats.setLayout(null);
274
                        tabFormats.add(getJPanelFormats(), null);
275
                        tabFormats.add(getJPanelSrsSelection(), null);
276
                        tabFormats.add(getJPanelInfoByPointFormat(), null);
277
                }
278

    
279
                return tabFormats;
280
        }
281

    
282
        /**
283
         * This method initializes jScrollPane1
284
         *
285
         * @return ScrollPane
286
         */
287
        private JScrollPane getJScrollPane1() {
288
                if (jScrollPane1 == null) {
289
                        jScrollPane1 = new JScrollPane();
290
                        jScrollPane1.setBounds(11, 22, 460, 123);
291
                        jScrollPane1.setViewportView(getTreeLayers());
292
                        jScrollPane1.setPreferredSize(new java.awt.Dimension(205, 75));
293
                }
294

    
295
                return jScrollPane1;
296
        }
297

    
298
        /**
299
         * This method initializes btnDel
300
         *
301
         * @return Button
302
         */
303
        private JButton getBtnDel() {
304
                if (btnDel == null) {
305
                        btnDel = new JButton();
306
                        // btnDel.setPreferredSize(new java.awt.Dimension(23, 23));
307
                        btnDel.setText(PluginServices.getText(this, "remove"));
308
                        btnDel.setMargin(new java.awt.Insets(2, 0, 2, 0));
309
                        btnDel.setBounds(339, 300, 101, 20);
310
                        btnDel.setEnabled(false);
311
                        btnDel.addActionListener(new java.awt.event.ActionListener() {
312
                                public void actionPerformed(java.awt.event.ActionEvent e) {
313
                                        delLayer();
314
                                }
315
                        });
316
                }
317
                return btnDel;
318
        }
319

    
320
        /**
321
         * This method initializes btnAdd
322
         *
323
         * @return Button
324
         */
325
        private JButton getBtnAdd() {
326
                if (btnAdd == null) {
327
                        btnAdd = new JButton();
328
                        // btnAdd.setPreferredSize(new java.awt.Dimension(23, 23));
329
                        btnAdd.setText(PluginServices.getText(this, "add"));
330
                        btnAdd.setMargin(new java.awt.Insets(2, 0, 2, 0));
331
                        btnAdd.setBounds(236, 300, 101, 20);
332
                        btnAdd.setEnabled(false);
333
                        btnAdd.addActionListener(new java.awt.event.ActionListener() {
334
                                public void actionPerformed(java.awt.event.ActionEvent e) {
335
                                        addLayer();
336
                                }
337
                        });
338
                }
339
                return btnAdd;
340
        }
341

    
342
        /**
343
         * This method initializes jScrollPane5
344
         *
345
         * @return ScrollPane
346
         */
347
        private JScrollPane getJScrollPane5() {
348
                if (jScrollPane5 == null) {
349
                        jScrollPane5 = new JScrollPane();
350
                        jScrollPane5.setBounds(11, 155, 422, 120);
351
                        jScrollPane5.setViewportView(getLstSelectedLayers());
352
                        jScrollPane5.setPreferredSize(new java.awt.Dimension(205, 75));
353
                }
354

    
355
                return jScrollPane5;
356
        }
357

    
358
        /**
359
         * This method initializes jTextField
360
         *
361
         * @return TextField
362
         */
363
        private JTextField getJTxtNomCapa() {
364
                if (jTxtNomCapa == null) {
365
                        jTxtNomCapa = new JTextField();
366
                        jTxtNomCapa.setBounds(10, 19, 460, 20);
367
                        jTxtNomCapa.setText(PluginServices.getText(this, "WMSLayer"));
368
                        jTxtNomCapa.addKeyListener(new java.awt.event.KeyAdapter() {
369
                                public void keyTyped(java.awt.event.KeyEvent e) {
370
                                        fireWizardComplete(isCorrectlyConfigured());
371
                                }
372
                        });
373
                }
374

    
375
                return jTxtNomCapa;
376
        }
377

    
378
        /**
379
         * This method initializes jPanel1
380
         *
381
         * @return Panel
382
         */
383
        private JPanel getJPanelFormats() {
384
                if (jPanelFormats == null) {
385
                        jPanelFormats = new JPanel();
386
                        jPanelFormats.setLayout(null);
387
                        jPanelFormats.setBorder(javax.swing.BorderFactory.createTitledBorder(
388
                                        null, PluginServices.getText(this, "select_formats"),
389
                                        javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
390
                                        javax.swing.border.TitledBorder.DEFAULT_POSITION, null,
391
                                        null));
392
                        jPanelFormats.setBounds(5, 10, 485, 145);
393
                        jPanelFormats.add(getJScrollPaneFormats(), null);
394
                        jPanelFormats.add(getChkTransparency(), null);
395
                }
396
                return jPanelFormats;
397
        }
398

    
399
        /**
400
         * This method initializes jPanel5
401
         *
402
         * @return Panel
403
         */
404
        private JPanel getJPanelSrsSelection() {
405
                if (jPanelSrsSelection == null) {
406
                        jPanelSrsSelection = new JPanel();
407
                        jPanelSrsSelection.setLayout(null);
408
                        jPanelSrsSelection.setBorder(javax.swing.BorderFactory.createTitledBorder(
409
                                        null, PluginServices.getText(this, "seleccionar_srs"),
410
                                        javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
411
                                        javax.swing.border.TitledBorder.DEFAULT_POSITION, null,
412
                                        null));
413
                        jPanelSrsSelection.setBounds(5, 162, 485, 126);
414
                        jPanelSrsSelection.add(getJScrollPane2(), null);
415
                }
416
                return jPanelSrsSelection;
417
        }
418

    
419
        /**
420
         * This method initializes jPanel6
421
         *
422
         * @return Panel
423
         */
424
        private JPanel getJPanelInfoByPointFormat() {
425
                if (jPanelInfoByPointFormat == null) {
426
                        jPanelInfoByPointFormat = new JPanel();
427
                        jPanelInfoByPointFormat.setLayout(null);
428
                        jPanelInfoByPointFormat.setBorder(javax.swing.BorderFactory.createTitledBorder(
429
                                        null, PluginServices.getText(this, "seleccionar_infobypoint_format"),
430
                                        javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
431
                                        javax.swing.border.TitledBorder.DEFAULT_POSITION, null,
432
                                        null));
433
                        jPanelInfoByPointFormat.setBounds(5, 273, 485, 78);
434
                        jPanelInfoByPointFormat.add(getJScrollPane3(), null);
435
                }
436
                return jPanelInfoByPointFormat;
437
        }
438

    
439
        /**
440
         * This method initializes jScrollPane6
441
         *
442
         * @return ScrollPane
443
         */
444
        private JScrollPane getJScrollPaneFormats() {
445
                if (jScrollPane6 == null) {
446
                        jScrollPane6 = new JScrollPane();
447
                        jScrollPane6.setBounds(5, 23, 470, 85);
448
                        jScrollPane6.setViewportView(getLstFormats());
449
                        jScrollPane6.setPreferredSize(new java.awt.Dimension(250, 85));
450
                }
451

    
452
                return jScrollPane6;
453
        }
454

    
455

    
456
        /**
457
         * This method initializes chkTrasparency
458
         *
459
         * @return CheckBox
460
         */
461
        private JCheckBox getChkTransparency() {
462
                if (chkTransparency == null) {
463
                        chkTransparency = new JCheckBox();
464
                        chkTransparency.setText(PluginServices.getText(this,
465
                                        "wms_transparency"));
466
                        chkTransparency.setSelected(true);
467
                        chkTransparency.addItemListener(new java.awt.event.ItemListener() {
468
                                public void itemStateChanged(java.awt.event.ItemEvent e) {
469
                                        fireWizardComplete(isCorrectlyConfigured());
470
                                }
471
                        });
472
                        chkTransparency.setBounds(15, 115, 421, 21);
473
                        chkTransparency.setVisible(true);
474
                }
475
                return chkTransparency;
476
        }
477

    
478
        /**
479
         * This method initializes jScrollPane2
480
         *
481
         * @return ScrollPane
482
         */
483
        private JScrollPane getJScrollPane2() {
484
                if (jScrollPane2 == null) {
485
                        jScrollPane2 = new JScrollPane();
486
                        jScrollPane2.setBounds(5, 23, 470, 91);
487
                        jScrollPane2.setViewportView(getLstSRSs());
488
                        jScrollPane2.setPreferredSize(new java.awt.Dimension(250, 91));
489
                }
490

    
491
                return jScrollPane2;
492
        }
493

    
494
        /**
495
         * This method initializes jScrollPane3
496
         *
497
         * @return ScrollPane
498
         */
499
        private JScrollPane getJScrollPane3() {
500
                if (jScrollPane3 == null) {
501
                        jScrollPane3 = new JScrollPane();
502
                        jScrollPane3.setBounds(5, 23, 470, 45);
503
                        jScrollPane3.setViewportView(getLstInfoFormats());
504
                        jScrollPane3.setPreferredSize(new java.awt.Dimension(250, 120));
505
                }
506

    
507
                return jScrollPane3;
508
        }
509

    
510
        /**
511
         * Gets the available layers in WMS maintaining the tree structure
512
         *
513
         * @return
514
         */
515
        public LayerTree getLayerStructure() {
516
                return treeLayers;
517
        }
518

    
519
        /**
520
         * This method initializes treeLayers
521
         *
522
         * @return Tree
523
         */
524
        private LayerTree getTreeLayers() {
525
                if (treeLayers == null) {
526
                        treeLayers = new LayerTree();
527
                        treeLayers.setRootVisible(true);
528
                        treeLayers.addMouseListener(new java.awt.event.MouseAdapter() {
529
                                public void mouseClicked(java.awt.event.MouseEvent e) {
530
                                        if (e.getClickCount() == 2) {
531
                                                addLayer();
532
                                        }
533
                                }
534
                        });
535
                        treeLayers
536
                                        .addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
537
                                                public void valueChanged(
538
                                                                javax.swing.event.TreeSelectionEvent e) {
539

    
540
                                                        boolean isGetMapable = false;
541
                                                        TreePath[] selecciones = getTreeLayers()
542
                                                                        .getSelectionPaths();
543
                                                        if (selecciones != null) {
544
                                                                for (int i = 0; i < selecciones.length
545
                                                                                && !isGetMapable; i++) {
546
                                                                        WMSLayerNode layer = ((WMSLayerNode) selecciones[i]
547
                                                                                        .getLastPathComponent());
548
                                                                        isGetMapable = layer.getChildren().size() == 0
549
                                                                                        || layer.getName() != null;
550
                                                                }
551

    
552
                                                        }
553
                                                        getBtnAdd().setEnabled(isGetMapable);
554
                                                        fireWizardComplete(isCorrectlyConfigured());
555
                                                }
556
                                        });
557
                }
558

    
559
                return treeLayers;
560
        }
561

    
562
        /**
563
         * This method checks for the options selected within the configuration
564
         * dialog are correct and enough to perform a GetMap request.
565
         *
566
         * @return true if you're done, false if not.
567
         */
568
        public boolean isCorrectlyConfigured() {
569

    
570
                boolean b;
571
                this.repaint();
572
                boolean infoFormatOk = ((getLstInfoFormats().getModel().getSize()!= 0 &&
573
                                                                getLstInfoFormats().getSelectedIndex() != -1) ||
574
                                                                getLstInfoFormats().getModel().getSize() == 0);
575
                if ((getLstSRSs().getSelectedIndex() != -1)
576
                                && (getLstFormats().getSelectedIndex() != -1)
577
                                && infoFormatOk
578
                                && (getLstSelectedLayers().getModel().getSize() > 0)) {
579
                        b = true;
580
                } else {
581
                        b = false;
582
                }
583

    
584
                // Enable or disable del button.
585
                int[] selectedIndices = getLstSelectedLayers().getSelectedIndices();
586

    
587
                getBtnDel().setEnabled(selectedIndices != null && selectedIndices.length > 0);
588

    
589
                return b;
590
        }
591

    
592
        public WMSLayerNode[] selectedLayersToArray() {
593
                JDnDListModel modelo = ((JDnDListModel) lstSelectedLayers.getModel());
594
                ArrayList elements = modelo.getElements();
595
                WMSLayerNode[] layers = (WMSLayerNode[]) elements
596
                                .toArray(new WMSLayerNode[0]);
597
                return layers;
598
        }
599

    
600
        /**
601
         * DOCUMENT ME!
602
         */
603
        private void delLayer() {
604
                int[] indices = lstSelectedLayers.getSelectedIndices();
605

    
606
                try {
607
                        ArrayList removeList = new ArrayList();
608
                        WMSLayerNode[] infos = selectedLayersToArray();
609
                        JDnDListModel modelo = ((JDnDListModel) lstSelectedLayers
610
                                        .getModel());
611
                        for (int i = 0; i < indices.length; i++) {
612
                                removeList.add(infos[indices[i]]);
613
                        }
614
                        modelo.delIndices(indices);
615
                        lstSelectedLayers.clearSelection();
616
                        fireWizardComplete(isCorrectlyConfigured());
617

    
618
                        // delete from selectedPaths as well
619
                        WMSLayerNode elemento = null;
620
                        WMSLayerNode last = null;
621
                        TreePath path = null;
622
                        for (int i = removeList.size() - 1; i >= 0; i--) {
623
                                elemento = (WMSLayerNode) removeList.get(i);
624
                                for (int j = 0; j < selectedPaths.size(); j++) {
625
                                        path = (TreePath) selectedPaths.get(j);
626
                                        last = (WMSLayerNode) path.getLastPathComponent();
627
                                        if (last.getTitle().compareTo(elemento.getTitle()) == 0) {
628
                                                selectedPaths.remove(path);
629
                                        }
630
                                }
631
                        }
632

    
633
                        refreshData();
634
                        refreshInfo();
635
                } catch (ArrayIndexOutOfBoundsException ex) {
636
                        // if you reach this, please, tell me how you did it.
637
                        ex.printStackTrace();
638
                }
639
        }
640

    
641
        /**
642
         * Fires a notification to this wizard listeners telling them if the
643
         * configuration is fair enough to send a GetMap request.
644
         *
645
         * @param b
646
         */
647
        private void fireWizardComplete(boolean b) {
648
                listenerSupport.callStateChanged(b);
649
                callStateChanged(b);
650
        }
651

    
652
        /**
653
         * Refreshes the content shown by this.
654
         */
655
        public void refreshData() {
656
                JDnDListModel model = (JDnDListModel) lstSelectedLayers.getModel();
657
                if(model.getSize() > 1)
658
                        setLayerName(groupName);
659
                else if(model.getSize() == 1)
660
                        setLayerName(model.getElementAt(0).toString());
661
                else
662
                        setLayerName(PluginServices.getText(this, "WMSLayer"));
663
                refreshSRS();
664
                getLstSelectedLayers().repaint();
665
                refreshStyleTree();
666
                refreshDimensions();
667

    
668
        }
669

    
670
        /**
671
         * Refreshes the info tab
672
         *
673
         */
674
        public void refreshInfo() {
675
                getTabInfo().refresh(explorer, selectedLayersVector(),
676
                                getStyleTitles(), getFormat(), getInfoFormat(), getSRS(), getDimensions());
677
        }
678

    
679
        private void refreshDimensions() {
680
                int size = getLstSelectedLayers().getModel().getSize();
681
                boolean enable = false;
682
                for (int i = 0; i < size; i++) {
683
                        WMSLayerNode node = (WMSLayerNode) getLstSelectedLayers()
684
                                        .getModel().getElementAt(i);
685
                        if (node.getDimensions() == null) {
686
                                continue;
687
                        }
688

    
689
                        for (int j = 0; j < node.getDimensions().size(); j++) {
690
                                RemoteTimeDimension dim = (RemoteTimeDimension) node
691
                                                .getDimensions().get(j);
692

    
693
                                try {
694
                                        getTabDimensions().addDimension(dim);
695
                                        enable = true;
696
                                } catch (IllegalArgumentException e) {
697
                                        NotificationManager.addWarning(
698
                                                        "Unrecognized dimension expression: "
699
                                                                        + dim.getExpression() + " (for "
700
                                                                        + dim.getName() + " in layer '"
701
                                                                        + node.getName() + "')", null);
702
                                }
703
                        }
704
                }
705
                jTabbedPane.setEnabledAt(dimensionTabIndex, enable);
706

    
707
        }
708

    
709
        /**
710
         *
711
         */
712
        private void refreshStyleTree() {
713

    
714
                int size = getLstSelectedLayers().getModel().getSize();
715
                WMSLayerNode styleRoot = new WMSLayerNode();
716
                styleRoot.setTitle(PluginServices.getText(this, "selected_layers"));
717

    
718
                StyleTreeModel model = new StyleTreeModel(styleRoot);
719
                jTabbedPane.setEnabledAt(stylesTabIndex, false);
720
                for (int i = 0; i < size; i++) {
721
                        WMSLayerNode node = (WMSLayerNode) getLstSelectedLayers()
722
                                        .getModel().getElementAt(i);
723
                        // If any of the layers defines styles, the tab will be enabled.
724
                        if (model.addLayerBranch(node)) {
725
                                jTabbedPane.setEnabledAt(stylesTabIndex, true);
726
                        }
727
                }
728

    
729
                getStyleTree().setModel(model);
730
                getStyleTree().expandAll();
731
                getStyleTree().repaint();
732
        }
733

    
734
        /**
735
         * Takes the array of selected layers and a vector containing the style
736
         * names and set them as selected in the styles panel
737
         *
738
         * @param selectedLayers
739
         * @param styles
740
         */
741
        public void setStyleSelections(List<RemoteWMSStyle> styles) {
742

    
743
                WMSLayerNode[] layers = selectedLayersToArray();
744
                int length = layers.length;
745
                for (int i = 0; i < length; i++) {
746
                        String styleName = styles.get(i).getName();
747
                        layers[length - i - 1].setSelectedStyleByName(styleName);
748
                }
749
        }
750

    
751
        /**
752
         * Gets the currently shown style tree.
753
         *
754
         * @return
755
         */
756
        private StyleTree getStyleTree() {
757
                return getTabStyle().getStyleTree();
758
        }
759

    
760
        /**
761
         * Method called when pressing the Add layer button or when double-clicking
762
         * on a layer from the server's layer tree.
763
         */
764
        public void addLayer() {
765
                boolean alguno = false;
766

    
767
                TreePath[] selecciones = getTreeLayers().getSelectionPaths();
768
                if (selecciones == null) {
769
                        return;
770
                }
771
                for (int i = 0; i < selecciones.length; i++) {
772
                        selectedPaths.add(selecciones[i]);
773
                        WMSLayerNode nodo = (WMSLayerNode) selecciones[i]
774
                                        .getLastPathComponent();
775
                        if (nodo.getName() == null || nodo.getName().equals("")) {
776
                                continue;
777
                        }
778
                        if (nodo.isSizeFixed()) {
779
                                if (sizeFixed == null) {
780
                                        sizeFixed = nodo.getFixedSize();
781
                                } else if ((sizeFixed.getHeight() != nodo.getFixedSize()
782
                                                .getHeight())
783
                                                || (sizeFixed.getWidth() != nodo.getFixedSize()
784
                                                                .getWidth())) {
785
                                        JOptionPane.showMessageDialog((Component) PluginServices
786
                                                        .getMainFrame(), PluginServices.getText(this,
787
                                                        "server_cant_render_layers"));
788
                                        continue;
789
                                }
790
                        }
791
                        // s'afegeix a la llista de capes seleccionades
792
                        JDnDListModel modelo = (JDnDListModel) lstSelectedLayers.getModel();
793

    
794
                        try {
795
                                if (modelo.addElement(modelo.getSize(), nodo.clone())) {
796
                                        alguno = true;
797
                                }
798
                        } catch (CloneNotSupportedException e) {
799
                        }
800
                }
801

    
802
                if (alguno) {
803
                        refreshData();
804
                }
805
                refreshInfo();
806
        }
807

    
808
        /**
809
         * This method initializes lstSelectedLayers
810
         *
811
         * @return List
812
         */
813
        public LayerList getLstSelectedLayers() {
814
                if (lstSelectedLayers == null) {
815
                        lstSelectedLayers = new LayerList();
816
                        lstSelectedLayers.setModel(new JDnDListModel());
817
                        lstSelectedLayers
818
                                        .setSelectionMode(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
819
                        lstSelectedLayers
820
                                        .addListSelectionListener(new javax.swing.event.ListSelectionListener() {
821
                                                public void valueChanged(
822
                                                                javax.swing.event.ListSelectionEvent e) {
823
                                                        fireWizardComplete(isCorrectlyConfigured());
824
                                                }
825
                                        });
826
                        lstSelectedLayers.addMouseListener(new MouseAdapter() {
827
                                public void mouseReleased(MouseEvent e) {
828
                                        refreshData();
829
                                }
830
                        });
831
                }
832

    
833
                return lstSelectedLayers;
834
        }
835

    
836
        /**
837
         * This method initializes lstSRSs
838
         *
839
         * @return JList
840
         */
841
        public JList getLstSRSs() {
842
                if (lstSRSs == null) {
843
                        lstSRSs = new JList();
844
                        lstSRSs.setModel(new SRSListModel());
845
                        lstSRSs.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
846
                        lstSRSs.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
847
                                public void valueChanged(javax.swing.event.ListSelectionEvent e) {
848
                                        int i = lstSRSs.getSelectedIndex();
849
                                        if (i != -1) {
850
                                                oldSRS = (String) lstSRSs.getModel().getElementAt(i);
851
                                        }
852
                                        fireWizardComplete(isCorrectlyConfigured());
853
                                }
854
                        });
855
                }
856
                return lstSRSs;
857
        }
858

    
859
        /**
860
         * This method initializes lstSRSs
861
         *
862
         * @return JList
863
         */
864
        public JList getLstInfoFormats() {
865
                if (lstInfoFormats == null) {
866
                        lstInfoFormats = new JList();
867
                        lstInfoFormats.setModel(new SRSListModel());
868
                        lstInfoFormats.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
869
                        lstInfoFormats.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
870
                                public void valueChanged(javax.swing.event.ListSelectionEvent e) {
871
                                        fireWizardComplete(isCorrectlyConfigured());
872
                                }
873
                        });
874
                }
875

    
876
                return lstInfoFormats;
877
        }
878

    
879
        /**
880
         * This method initializes lstFormats
881
         *
882
         * @return List
883
         */
884
        public JList getLstFormats() {
885
                if (lstFormats == null) {
886
                        lstFormats = new JList();
887
                        lstFormats.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
888
                        lstFormats.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
889
                                public void valueChanged(javax.swing.event.ListSelectionEvent e) {
890
                                        fireWizardComplete(isCorrectlyConfigured());
891
                                }
892
                        });
893
                }
894

    
895
                return lstFormats;
896
        }
897

    
898
        /**
899
         * Refreshes the SRS list
900
         */
901
        private void refreshSRS() {
902
                ArrayList<?> elements = ((JDnDListModel) lstSelectedLayers.getModel()).getElements();
903
                WMSLayerNode[] layers = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
904

    
905
                SRSListModel model = new SRSListModel();
906

    
907
                if (layers.length == 0) {
908
                        lstSRSs.setModel(model);// new DefaultListModel());
909
                        sizeFixed = null;
910
                } else {
911
                        TreeSet srsSet = new TreeSet();
912
                        srsSet.addAll(layers[0].getAllSrs());
913
                        model.setAll(srsSet);
914
                        for (int i = 1; i < layers.length; i++) {
915
                                model.setAll(model.intersect(layers[i].getAllSrs()));
916
                        }
917
                        lstSRSs.setModel(model);
918
                }
919
                int srsIndex = getSRSIndex(oldSRS);
920
                if (srsIndex != -1) {
921
                        getLstSRSs().setSelectedIndex(srsIndex);
922
                }
923

    
924
        }
925

    
926
        public void setListenerSupport(WizardListenerSupport support) {
927
                listenerSupport = support;
928
        }
929

    
930
        public void setWizardData(WMSServerExplorer data) {
931
                this.explorer = data;
932
                ((JDnDListModel) getLstSelectedLayers().getModel()).clear();
933
                getLstSelectedLayers().repaint();
934

    
935
                getLstFormats().setModel(
936
                                new FormatListModel(this.explorer.getFormats()));
937
                getLstInfoFormats().setModel(
938
                                new FormatListModel(this.explorer.getInfoFormats()));
939
                getTreeLayers()
940
                                .setModel(new LayerTreeModel(this.explorer.getLayerTree()));
941
                refreshInfo();
942
        }
943

    
944
        private Vector getStyleTitles() {
945
                return getTabStyle().getStyleTree().getStyleSelectionTitles();
946
        }
947

    
948
        /**
949
         * @return
950
         */
951
        private Vector selectedLayersVector() {
952
                JDnDListModel mod = (JDnDListModel) getLstSelectedLayers().getModel();
953
                Vector lyrs = new Vector();
954
                for (int i = 0; i < mod.getSize(); i++) {
955
                        lyrs.add(mod.getElementAt(i));
956
                }
957
                return lyrs;
958
        }
959

    
960
        public String getFormat() {
961
                return (String) getLstFormats().getSelectedValue();
962
        }
963

    
964
        public String getInfoFormat() {
965
                return (String) getLstInfoFormats().getSelectedValue();
966
        }
967

    
968
        public String getLayersQuery() {
969
                ArrayList<?> elements = ((JDnDListModel) getLstSelectedLayers().getModel()).getElements();
970
                WMSLayerNode[] layers = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
971

    
972
                // Nombre separado por comas de las capas
973
                String layersQuery = layers[layers.length - 1].getName();
974

    
975
                for (int i = layers.length - 2; i >= 0; i--) {
976
                        layersQuery += ("," + layers[i].getName());
977
                }
978

    
979
                return layersQuery;
980

    
981
        }
982

    
983
        /**
984
         * Returns the current selected SRS.
985
         *
986
         * @return
987
         */
988
        public String getSRS() {
989
                return (String) getLstSRSs().getSelectedValue();
990
        }
991

    
992
        /**
993
         * Returns the name of the layer that the user has typed-in
994
         *
995
         * @return
996
         */
997
        public String getLayerName() {
998
                return getJTxtNomCapa().getText();
999
        }
1000

    
1001
        public void setLayerName(String name) {
1002
                getJTxtNomCapa().setText(name);
1003
        }
1004

    
1005
        /*
1006
         * Comento est? metodo pq el extent completo debe proporcionarlo el provider. Eliminar
1007
         * por completo en futuras versiones si todo funciona bien 16/12/2013
1008
         * public Rectangle2D getLayersRectangle() throws ProjectionLayerException {
1009
                ArrayList<?> elements = ((JDnDListModel) getLstSelectedLayers().getModel()).getElements();
1010
                WMSLayerNode[] layers = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
1011
                String[] layerNames = new String[layers.length];
1012
                for (int i = 0; i < layerNames.length; i++) {
1013
                        layerNames[i] = layers[i].getName();
1014
                }
1015
                return explorer.getBoundingBox(layerNames, getSRS());
1016
        }*/
1017

    
1018
        public TreePath[] getSelectedLayers() {
1019
                return getTreeLayers().getSelectionPaths();
1020
        }
1021

    
1022
        public Hashtable getOnlineResources() {
1023
                return explorer.getOnlineResources();
1024
        }
1025

    
1026
        /**
1027
         * The piece of the GetMap request that has the layer names.
1028
         *
1029
         * @return
1030
         */
1031
        public String getQueryableLayerQuery() {
1032
                ArrayList<?> elements = ((JDnDListModel) getLstSelectedLayers().getModel()).getElements();
1033
                WMSLayerNode[] layers = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
1034
                // Nombre separado por comas de las capas
1035
                String layersQuery = "";
1036
                int i;
1037

    
1038
                for (i = 0; i < layers.length; i++) {
1039
                        if (layers[i].isQueryable()) {
1040
                                layersQuery = layers[i].getName();
1041

    
1042
                                break;
1043
                        }
1044
                }
1045

    
1046
                for (int j = i + 1; j < layers.length; j++) {
1047
                        if (layers[j].isQueryable()) {
1048
                                layersQuery += ("," + layers[j].getName());
1049
                        }
1050
                }
1051

    
1052
                return layersQuery;
1053
        }
1054

    
1055
        /**
1056
         * Returns the index of the CRS within the CRS list.
1057
         *
1058
         * Devuelve la posicion que ocupa el CRS en la lista de CRS
1059
         *
1060
         * @param crs
1061
         * @return The CRS's index if it exists, -1 if it not exists.
1062
         */
1063
        public int getSRSIndex(String crs) {
1064
                for (int i = 0; i < getLstSRSs().getModel().getSize(); i++) {
1065
                        if (crs != null
1066
                                        && crs.equals(getLstSRSs().getModel().getElementAt(i))) {
1067
                                return i;
1068
                        }
1069
                }
1070
                return -1;
1071
        }
1072

    
1073
        /**
1074
         * Returns the index of the format within the formats list.
1075
         *
1076
         * Devuelve la posicion que ocupa el formato en la lista de formatos
1077
         *
1078
         * @param format
1079
         *
1080
         * @return The format's index if it exists, -1 if it not exists.
1081
         */
1082
        public int getFormatIndex(String format) {
1083
                for (int i = 0; i < getLstFormats().getModel().getSize(); i++) {
1084
                        if (format != null
1085
                                        && format
1086
                                                        .equals(getLstFormats().getModel().getElementAt(i))) {
1087
                                return i;
1088
                        }
1089
                }
1090
                return -1;
1091
        }
1092

    
1093
        /**
1094
         * Returns the index of the format within the formats list.
1095
         *
1096
         * Devuelve la posicion que ocupa el formato en la lista de formatos
1097
         *
1098
         * @param format
1099
         *
1100
         * @return The format's index if it exists, -1 if it not exists.
1101
         */
1102
        public int getInfoFormatIndex(String infoformat) {
1103
                for (int i = 0; i < getLstInfoFormats().getModel().getSize(); i++) {
1104
                        if (infoformat != null
1105
                                        && infoformat.equals(getLstInfoFormats().getModel().getElementAt(i))) {
1106
                                return i;
1107
                        }
1108
                }
1109
                return -1;
1110
        }
1111

    
1112
        /**
1113
         * This method initializes jTabbedPane
1114
         *
1115
         * @return TabbedPane
1116
         */
1117
        public JTabbedPane getJTabbedPane() {
1118
                if (jTabbedPane == null) {
1119
                        jTabbedPane = new JTabbedPane();
1120
                        jTabbedPane.setBounds(4, 4, 502, 415);
1121
                        InfoPanel ip = getTabInfo();
1122
                        ip.addFocusListener(new FocusListener() {
1123
                                public void focusGained(FocusEvent e) {
1124
                                        refreshInfo();
1125
                                }
1126

    
1127
                                public void focusLost(FocusEvent e) {
1128
                                }
1129
                        });
1130

    
1131
                        StylesPanel sp = getTabStyle();
1132
                        DimensionPanel dp = getTabDimensions();
1133

    
1134
                        jTabbedPane.addTab(PluginServices.getText(this, "info"), null, ip,
1135
                                        null);
1136
                        jTabbedPane.addTab(PluginServices.getText(this, "capas"), null,
1137
                                        getTabLayers(), null);
1138
                        jTabbedPane.addTab(PluginServices.getText(this, "estilos"), null,
1139
                                        sp, null);
1140
                        stylesTabIndex = jTabbedPane.getTabCount() - 1;
1141
                        jTabbedPane.addTab(PluginServices.getText(this, "dimensiones"),
1142
                                        null, dp, null);
1143
                        dimensionTabIndex = jTabbedPane.getTabCount() - 1;
1144
                        jTabbedPane.addTab(PluginServices.getText(this, "formatos"), null,
1145
                                        getTabFormats(), null);
1146
                        jTabbedPane.setEnabledAt(dimensionTabIndex, false);
1147
                        jTabbedPane.setEnabledAt(stylesTabIndex, false);
1148
                }
1149
                return jTabbedPane;
1150
        }
1151

    
1152
        /**
1153
         * This method initializes jPanel
1154
         *
1155
         * @return Panel
1156
         */
1157
        private JPanel getTabLayers() {
1158
                if (tabLayers == null) {
1159
                        tabLayers = new JPanel();
1160
                        tabLayers.setLayout(null);
1161
                        tabLayers.add(getJPanel4(), null);
1162
                        tabLayers.add(getJPanel2(), null);
1163
                }
1164
                return tabLayers;
1165
        }
1166

    
1167
        /**
1168
         * This method initializes jPanel6
1169
         *
1170
         * @return Panel
1171
         */
1172
        private StylesPanel getTabStyle() {
1173
                if (tabStyle == null) {
1174
                        tabStyle = new StylesPanel(this);
1175
                        tabStyle.setEnabled(false);
1176
                        tabStyle.addListener(new BeanListener() {
1177
                                public void beanValueChanged(Object value) {
1178
                                        fireWizardComplete(isCorrectlyConfigured());
1179
                                };
1180
                        });
1181
                        tabStyle.addFocusListener(new FocusAdapter() {
1182
                                public void focusGained(FocusEvent e) {
1183
                                        refreshStyleTree();
1184
                                }
1185
                        });
1186
                }
1187
                return tabStyle;
1188
        }
1189

    
1190
        /**
1191
         * Sets the focus to the tab next to the current one.
1192
         *
1193
         * Enfoca a la solapa siguiente a la actualmente enfocada del TabbedPane
1194
         *
1195
         */
1196
        public void avanzaTab() {
1197
                int currentPage = currentPage();
1198
                int nPages = getNumTabs();
1199
                if (nPages - 1 > currentPage) {
1200
                        getJTabbedPane().setSelectedIndex(nextEnabledPage());
1201
                }
1202
        }
1203

    
1204
        /**
1205
         * Sets the focus to the tab previous to the current one.
1206
         *
1207
         * Enfoca a la solapa anterior a la actualmente enfocada del TabbedPane
1208
         *
1209
         */
1210
        public void retrocedeTab() {
1211
                this.getJTabbedPane().setSelectedIndex(previousEnabledPage());
1212

    
1213
        }
1214

    
1215
        /**
1216
         * Returns the index of the current tab.
1217
         *
1218
         * Devuelve el ?ndice de la p?gina actual del wizard.
1219
         *
1220
         * @return
1221
         */
1222
        public int currentPage() {
1223
                return getJTabbedPane().getSelectedIndex();
1224
        }
1225

    
1226
        /**
1227
         * Returns the tab amount that the WMSParamsPanel currently have
1228
         *
1229
         * Devuelve el numero de solapas que tiene actualmente el WMSParamsPanel
1230
         *
1231
         * @return int
1232
         */
1233
        public int getNumTabs() {
1234
                return getJTabbedPane().getTabCount();
1235
        }
1236

    
1237
        /**
1238
         * <p>
1239
         * Returns the index of the previous enabled tab.
1240
         * </p>
1241
         * <p>
1242
         * Devuelve el ?ndice de la anterior p?gina habilitada del wizard o -1
1243
         * si no hay ninguna.
1244
         * </p>
1245
         *
1246
         * @return The index, or -1 if there is no one.
1247
         */
1248
        public int previousEnabledPage() {
1249
                int currentPage = currentPage();
1250
                int j = 0;
1251
                if (currentPage == 0) {
1252
                        j = -1;
1253
                }
1254
                for (int i = currentPage - 1; i > -1; i--) {
1255
                        if (getJTabbedPane().isEnabledAt(i)) {
1256
                                j = i;
1257
                                break;
1258
                        }
1259
                }
1260
                return j;
1261
        }
1262

    
1263
        /**
1264
         * <p>
1265
         * Returns the previous of the previous enabled tab.
1266
         * </p>
1267
         * <p>
1268
         * Devuelve el ?ndice de la siguiente p?gina habilitada del wizard o -1
1269
         * si no hay ninguna.
1270
         * </p>
1271
         *
1272
         * @return The index, or -1 if there is no one.
1273
         */
1274
        public int nextEnabledPage() {
1275
                int currentPage = currentPage();
1276
                int nPages = getNumTabs();
1277
                if (currentPage == nPages) {
1278
                        return -1;
1279
                }
1280
                for (int i = currentPage + 1; i < nPages; i++) {
1281
                        if (getJTabbedPane().isEnabledAt(i)) {
1282
                                return i;
1283
                        }
1284
                }
1285
                return -1;
1286
        }
1287

    
1288
        /**
1289
         * Selects/deselects the transparency checkbox.
1290
         *
1291
         * @param b
1292
         */
1293
        public void setTransparent(boolean b) {
1294
                getChkTransparency().setSelected(b);
1295
        }
1296

    
1297

    
1298
        /**
1299
         * Returns true if the WMS protocol version in use is
1300
         * >= 1.3.0, and false otherwise.
1301
         * @return
1302
         */
1303
        private boolean checkAxisVersion() {
1304
                try {
1305
                        if (explorer!=null && explorer.getVersion()!=null) {
1306
                                String version = explorer.getVersion();
1307
                                String[] parts = version.split("\\.");
1308
                                if (parts.length>=2) {
1309
                                        int major = Integer.parseInt(parts[0]);
1310
                                        int minor = Integer.parseInt(parts[1]);
1311
                                        if ((major==1 && minor <3) || major < 1) {
1312
                                                return false;
1313
                                        }
1314
                                }
1315
                                else if (parts.length>0) {
1316
                                        int major = Integer.parseInt(parts[0]);
1317
                                        if (major<2) {
1318
                                                return false;
1319
                                        }
1320
                                }
1321
                        }
1322
                }
1323
                catch (NumberFormatException ex) {}
1324
                return true;
1325
        }
1326

    
1327
        /**
1328
         * Returns a vector of strings containing the styles selected for the
1329
         * layers. A blank style is correct and means that default style will be
1330
         * used.
1331
         *
1332
         * @return Vector
1333
         */
1334
        public Vector<RemoteWMSStyle> getStyles() {
1335
                WMSLayerNode[] layers = selectedLayersToArray();
1336
                Vector<RemoteWMSStyle> v = new Vector<RemoteWMSStyle>(layers.length);
1337
                int posInsertion = 0;
1338

    
1339
                for (int i = layers.length - 1; i >= 0; i--) {
1340
                        RemoteWMSStyle sty = layers[i].getSelectedStyle();
1341
                        if(sty != null)
1342
                                v.add(posInsertion, sty);
1343
                        else {
1344
                                RemoteWMSStyle s = new RemoteWMSStyle();
1345
                                s.name = "default";
1346
                                v.add(posInsertion, s);
1347
                        }
1348
                        posInsertion ++;
1349
                }
1350
                return v;
1351
        }
1352

    
1353
        public Vector<RemoteWMSStyle> getLayerStyle(String layerName) {
1354
                Vector<RemoteWMSStyle> v = new Vector<RemoteWMSStyle>();
1355
                WMSLayerNode[] layers = selectedLayersToArray();
1356
                for (int i = 0; i < layers.length; i++) {
1357
                        if (layers[i].getName().equalsIgnoreCase(layerName)) {
1358
                                RemoteWMSStyle sty = layers[i].getSelectedStyle();
1359
                                v.add(sty);
1360
                                return v;
1361
                        }
1362
                }
1363
                return v;
1364
        }
1365

    
1366
        /**
1367
         * This method initializes tabInfo
1368
         *
1369
         * @return Panel
1370
         */
1371
        private InfoPanel getTabInfo() {
1372
                if (tabInfo == null) {
1373
                        tabInfo = new InfoPanel();
1374

    
1375
                }
1376
                return tabInfo;
1377
        }
1378

    
1379
        public void setDimensions(Vector dimensions) {
1380
                for (int i = 0; i < dimensions.size(); i++) {
1381
                        String st = (String) dimensions.get(i);
1382
                        if (st.split("=").length == 2) {
1383
                                String[] s = st.split("=");
1384
                                getTabDimensions().setDimensionValue(s[0], s[1]);
1385
                        }
1386
                }
1387

    
1388
        }
1389

    
1390
        /**
1391
         * This method initializes tabDimension
1392
         *
1393
         * @return Panel
1394
         */
1395
        private DimensionPanel getTabDimensions() {
1396
                if (tabDimensions == null) {
1397
                        tabDimensions = new DimensionPanel();
1398
                        tabDimensions.setEnabled(false);
1399
                        tabDimensions.addListener(new BeanListener() {
1400
                                public void beanValueChanged(Object value) {
1401
                                        Vector myDimensions = (Vector) value;
1402
                                        if (value != null
1403
                                                        && (oldDimensions == null || !(oldDimensions.size() == myDimensions
1404
                                                                        .size() && oldDimensions
1405
                                                                        .containsAll(myDimensions)))) {
1406
                                                oldDimensions = myDimensions;
1407
                                        }
1408
                                        fireWizardComplete(isCorrectlyConfigured());
1409
                                }
1410
                        });
1411

    
1412
                }
1413
                return tabDimensions;
1414
        }
1415

    
1416
        /**
1417
         * @return
1418
         */
1419
        public boolean getTransparency() {
1420
                return getChkTransparency().isSelected();
1421
        }
1422

    
1423
        /**
1424
         * @return
1425
         */
1426
        public Vector<String> getDimensions() {
1427
                return getTabDimensions().getDimensions();
1428
        }
1429

    
1430
        public void initWizard() {
1431
        }
1432

    
1433
        public void execute() {
1434
        }
1435

    
1436
        // Gets all the layers available in the WMS Server
1437
        protected FLayer getAllSubTree(WMSLayerNode node) throws LoadLayerException {
1438
                if (node.getChildren().size() > 0) {
1439
                        FLayers l = null;
1440
                        if (this.getMapCtrl() == null) {
1441
                                org.gvsig.app.project.documents.view.gui.AbstractViewPanel v = (org.gvsig.app.project.documents.view.gui.AbstractViewPanel) PluginServices
1442
                                                .getMDIManager().getActiveWindow();
1443
                                l = new FLayers();
1444
                                l.setMapContext(v.getMapControl().getMapContext());
1445
                        } else {
1446
                                l = new FLayers();
1447
                                l.setMapContext(this.getMapCtrl().getMapContext());
1448
                        }
1449

    
1450
                        l.setName(node.getTitle());
1451
                        l.setVisible(false);
1452
                        for (int i = 0; i < node.getChildren().size(); i++) {
1453
                                FLayer lyr = getAllSubTree((WMSLayerNode) node.getChildren()
1454
                                                .get(i));
1455
                                if (lyr != null) {
1456
                                        l.addLayer(lyr);
1457
                                }
1458
                        }
1459
                        return l;
1460
                } else {
1461
                        DataStoreParameters parameters = explorer.getStoredParameters();
1462
                        WMSDataParameters par = null;
1463
                        if(parameters instanceof WMSDataParameters) {
1464
                                par = (WMSDataParameters) parameters;
1465
                        }
1466
                        if(parameters instanceof TileDataParameters) {
1467
                                DataParameters p = ((TileDataParameters) parameters).getDataParameters();
1468
                                if(p instanceof WMSDataParameters)
1469
                                        par = (WMSDataParameters) p;
1470
                        }
1471
                        par.setFormat(getFormat());
1472
                        par.setInfoFormat(getInfoFormat());
1473
                        par.setLayerQuery(node.getName());
1474
                        par.setInfoLayerQuery(getQueryableLayerQuery());
1475
                        par.setSRS(getSRS());
1476
                        par.setWmsTransparency(getTransparency());
1477
                        par.setStyles(getLayerStyle(node.getName()));
1478
                        par.setDimensions(getDimensions());
1479
                        par.setOnlineResources(getOnlineResources());
1480
                        par.setFixedSize(getFixedSize());
1481
                        par.setQueryable(explorer.isQueryable());
1482
                        par.setName(node.getTitle());
1483
                        try {
1484
                par.setURI(new URI(explorer.getHost()));
1485
            } catch (URISyntaxException e1) {
1486
                throw new LoadLayerException("Can't create URI from "+explorer.getHost(), e1);
1487
            }
1488
                        par.deleteCache(updating);
1489
                        par.setXyAxisOrder(getXYAxisorder());
1490

    
1491
                        FLyrWMS layer = new FLyrWMS();
1492
                        try {
1493
                                layer.setParameters(parameters);
1494
                                layer.setExplorer(explorer);
1495
                                //layer.setFullExtent(getLayersRectangle());
1496
                        } catch (InitializeException e) {
1497
                                throw new LoadLayerException("Error initializating layer", e);
1498
                        }
1499
                        layer.setVisible(false);
1500
                        return layer;
1501
                }
1502
        }
1503

    
1504
        // Gets all the layers available in the WMS Server
1505
        public FLayer getAllLayers() throws LoadLayerException {
1506
                LayerTree layerTree = getLayerStructure();
1507
                return getAllSubTree((WMSLayerNode) layerTree.getModel().getRoot());
1508
        }
1509

    
1510
        // changed by Laura:
1511
        // To delegate getLayer to ParamsPanel from WMSWizard and WMSProps
1512
        // public FLayer getLayer() { return null; }
1513
        public FLayer getLayer(boolean cached) throws InitializeException {
1514
                lastCached = cached;
1515
                if (getDisagregatedLayers()) {
1516
                        return getLayerTree();
1517
                } else {
1518
                        return getLayerPlain(cached);
1519
                }
1520
        }
1521

    
1522
        public FLayer getLayer() throws InitializeException {
1523
                return getLayer(lastCached);
1524
        }
1525

    
1526
        /**
1527
         * If user does not select the chekbox Disagregate layers, will get the
1528
         * layer tree in WMS
1529
         *
1530
         * @return
1531
         * @throws LoadLayerException
1532
         */
1533
        protected FLayer getLayerTree() throws InitializeException {
1534
                LayerTree layerTree = getLayerStructure();
1535
                TreePath[] selection = (TreePath[]) getSelectedPaths().toArray(new TreePath[0]);
1536
                if (selection != null) {
1537
                        return getSubTree((WMSLayerNode) layerTree.getModel().getRoot(), selection);
1538
                }
1539
                return null;
1540
        }
1541

    
1542
        protected boolean nodeSelected(TreePath[] selection, WMSLayerNode node) {
1543
                for (int i = 0; i < selection.length; i++) {
1544
                        Object[] components = selection[i].getPath();
1545
                        for (int j = 0; j < components.length; j++) {
1546
                                if (components[j] instanceof WMSLayerNode) {
1547
                                        if (((WMSLayerNode) components[j]).getTitle().compareTo(
1548
                                                        node.getTitle()) == 0) {
1549
                                                return true;
1550
                                        }
1551
                                }
1552
                        }
1553
                }
1554
                return false;
1555
        }
1556

    
1557
        protected FLayer getSubTree(WMSLayerNode node, TreePath[] selection) throws InitializeException {
1558
                if (node.getChildren().size() > 0) {
1559
                        FLayers l = null;
1560
                        if (this.getMapCtrl() == null) {
1561
                                AbstractViewPanel v =
1562
                                                (AbstractViewPanel) PluginServices.getMDIManager().getActiveWindow();
1563
                                l = new FLayers();
1564
                                l.setMapContext(v.getMapControl().getMapContext());
1565
                        } else {
1566
                                l = new FLayers();
1567
                                l.setMapContext(this.getMapCtrl().getMapContext());
1568
                        }
1569

    
1570
                        l.setName(node.getTitle());
1571
                        for (int i = 0; i < node.getChildren().size(); i++) {
1572
                                if (nodeSelected(selection, (WMSLayerNode) (node.getChildren().get(i)))) {
1573
                                        FLayer lyr = getSubTree((WMSLayerNode) node.getChildren().get(i), selection);
1574
                                        if (lyr != null) {
1575
                                                l.addLayer(lyr);
1576
                                        }
1577
                                }
1578
                        }
1579
                        return l;
1580
                } else {
1581
                        if (nodeSelected(selection, node)) {
1582

    
1583
                                DataStoreParameters parameters = explorer.getStoredParameters();
1584
                                WMSDataParameters par = null;
1585
                                if(parameters instanceof WMSDataParameters) {
1586
                                        par = (WMSDataParameters) parameters;
1587
                                }
1588
                                if(parameters instanceof TileDataParameters) {
1589
                                        DataParameters p = ((TileDataParameters) parameters).getDataParameters();
1590
                                        if(p instanceof WMSDataParameters)
1591
                                                par = (WMSDataParameters) p;
1592
                                }
1593
                                par.setFormat(getFormat());
1594
                                par.setInfoFormat(getInfoFormat());
1595
                                par.setLayerQuery(node.getName());
1596
                                par.setInfoLayerQuery(getQueryableLayerQuery());
1597
                                par.setSRS(getSRS());
1598
                                par.setWmsTransparency(getTransparency());
1599
                                par.setStyles(getLayerStyle(node.getName()));
1600
                                par.setDimensions(getDimensions());
1601
                                par.setOnlineResources(explorer.getOnlineResources());
1602
                                par.setFixedSize(getFixedSize());
1603
                                par.setQueryable(node.isQueryable());
1604
                                par.setName(node.getTitle());
1605
                    try {
1606
                        par.setURI(new URI(explorer.getHost()));
1607
                    } catch (URISyntaxException e1) {
1608
                        throw new InitializeException("Can't create URI from "+explorer.getHost(), e1);
1609
                    }
1610
                                par.deleteCache(updating);
1611
                                par.setXyAxisOrder(getXYAxisorder());
1612

    
1613
                                FLyrWMS layer = new FLyrWMS();
1614
                                layer.setParameters(parameters);
1615
                                layer.setName(node.getName());
1616
                                layer.setExplorer(explorer);
1617
                                return layer;
1618

    
1619
                        } else {
1620
                                return null;
1621
                        }
1622
                }
1623
        }
1624

    
1625
        private boolean getXYAxisorder() {
1626
                DataServerExplorerParameters dsExplParams = explorer.getParameters();
1627
                if (dsExplParams instanceof WMSServerExplorerParameters) {
1628
                        return ((WMSServerExplorerParameters)dsExplParams).isXyAxisOrder();
1629
                }
1630
                return false;
1631

    
1632
        }
1633

    
1634
        /**
1635
         * If user selects the chekbox Disagregate layers, will get the selected
1636
         * layers rendered in one the tree structure in WMS will be lost.
1637
         *
1638
         * @return
1639
         */
1640
        protected FLayer getLayerPlain(boolean cached) throws InitializeException {
1641
                WMSDataParameters par = (WMSDataParameters)explorer.getStoredParameters();
1642
                DataStoreParameters parameters = par;
1643

    
1644
                if(cached) {
1645
                        DataManager manager = DALLocator.getDataManager();
1646
                        TileDataParameters tileParams = null;
1647
                        try {
1648
                                tileParams = (TileDataParameters) manager.createStoreParameters("Tile Store");
1649
                        } catch (ProviderNotRegisteredException e) {
1650
                                throw new InitializeException(e.getMessage(), e);
1651
                        }
1652
                        tileParams.setDataParameters(par);
1653
                        parameters = tileParams;
1654
                }
1655

    
1656
                par.setFormat(getFormat());
1657
                par.setInfoFormat(getInfoFormat());
1658
                par.setLayerQuery(getLayersQuery());
1659
                par.setInfoLayerQuery(getQueryableLayerQuery());
1660
                par.setSRS(getSRS());
1661
                par.setWmsTransparency(getTransparency());
1662
                par.setStyles(getStyles());
1663
                par.setDimensions(getDimensions());
1664
                par.setOnlineResources(explorer.getOnlineResources());
1665
                par.setFixedSize(getFixedSize());
1666
                par.setQueryable(explorer.isQueryable());
1667
                par.setName(getLayerName());
1668
        try {
1669
            par.setURI(new URI(explorer.getHost()));
1670
        } catch (URISyntaxException e1) {
1671
            throw new InitializeException("Can't create URI from "+explorer.getHost(), e1);
1672
        }                par.deleteCache(updating);
1673
                par.setXyAxisOrder(getXYAxisorder());
1674

    
1675
                FLyrWMS layer = new FLyrWMS();
1676
                layer.setParameters(parameters);
1677
                layer.setExplorer(explorer);
1678
                layer.setName(getLayerName());
1679
                return layer;
1680
        }
1681

    
1682
        /**
1683
         * Gets the <code>RasterDriverException</code> message. The message
1684
         * of this exception is returned by the server
1685
         * @param e
1686
         * @return
1687
         */
1688
        private String getDriverExceptionMessage(InitializeException e) {
1689
                Throwable ex = e;
1690
                final int MAX_DEEP = 10;
1691
                int deep = 0;
1692
                while(deep < MAX_DEEP) {
1693
                        Throwable t = null;
1694
                        if(ex instanceof RasterDriverException) {
1695
                                return ex.getMessage();
1696
                        } else if(ex instanceof InitializeException) {
1697
                                t = ex.getCause();
1698
                        } else if(ex instanceof InvocationTargetException) {
1699
                                t = ((InvocationTargetException)ex).getTargetException();
1700
                        }
1701
                        if(t == null)
1702
                                return null;
1703
                        else
1704
                                ex = t;
1705
                        deep++;
1706
                }
1707
                return null;
1708
        }
1709

    
1710
        public Dimension getFixedSize() {
1711
                return sizeFixed;
1712
        }
1713

    
1714
        /**
1715
         * This method initializes chkExtendedNames
1716
         *
1717
         * @return CheckBox
1718
         */
1719
        private JCheckBox getChkExtendedNames() {
1720
                if (chkExtendedNames == null) {
1721
                        chkExtendedNames = new JCheckBox();
1722
                        chkExtendedNames.setText(PluginServices.getText(this,
1723
                                        "show_layer_names"));
1724
                        chkExtendedNames.addItemListener(new java.awt.event.ItemListener() {
1725
                                public void itemStateChanged(java.awt.event.ItemEvent e) {
1726
                                        boolean b = chkExtendedNames.isSelected();
1727
                                        getTreeLayers().showLayerNames = b;
1728
                                        getTreeLayers().repaint();
1729
                                        getLstSelectedLayers().showLayerNames = b;
1730
                                        getLstSelectedLayers().repaint();
1731
                                        getStyleTree().showLayerNames = b;
1732
                                }
1733
                        });
1734
                        chkExtendedNames
1735
                                        .addActionListener(new java.awt.event.ActionListener() {
1736
                                                public void actionPerformed(java.awt.event.ActionEvent e) {
1737
                                                        fPrefs.putBoolean("show_layer_names",
1738
                                                                        chkExtendedNames.isSelected());
1739
                                                }
1740
                                        });
1741
                        chkExtendedNames.setBounds(19, 300, 212, 20);
1742
                        chkExtendedNames.setSelected(fPrefs.getBoolean("show_layer_names",
1743
                                        false));
1744

    
1745
                }
1746
                return chkExtendedNames;
1747
        }
1748

    
1749
        /**
1750
         * This method initializes btnUp
1751
         *
1752
         * @return Button
1753
         */
1754
        private JButton getBtnUp() {
1755
                if (btnUp == null) {
1756
                        btnUp = new JButton();
1757
                        btnUp.setBounds(438, 184, 30, 30);
1758
                        btnUp.setToolTipText(PluginServices.getText(this, "move_layer_up"));
1759
                        btnUp.addActionListener(new java.awt.event.ActionListener() {
1760
                                public void actionPerformed(java.awt.event.ActionEvent e) {
1761
                                        LayerList list = getLstSelectedLayers();
1762
                                        int[] selectedIndices = list.getSelectedIndices();
1763
                                        int index = list.getSelectedIndex();
1764
                                        if (selectedIndices != null && selectedIndices.length == 1
1765
                                                        && index > 0) {
1766
                                                JDnDListModel m = (JDnDListModel) list.getModel();
1767
                                                m.itemsMoved(index - 1, new int[] { index });
1768
                                                list.setSelectedIndex(index - 1);
1769
                                        }
1770
                                }
1771
                        });
1772
                        btnUp.setIcon(IconThemeHelper.getImageIcon("aplication-preferences-uparrow"));
1773
                }
1774
                return btnUp;
1775
        }
1776

    
1777
        /**
1778
         * This method initializes btnDown
1779
         *
1780
         * @return Button
1781
         */
1782
        private JButton getBtnDown() {
1783
                if (btnDown == null) {
1784
                        btnDown = new JButton();
1785
                        btnDown.setBounds(438, 215, 30, 30);
1786
                        btnDown.setToolTipText(PluginServices.getText(this,
1787
                                        "move_layer_down"));
1788
                        btnDown.addActionListener(new java.awt.event.ActionListener() {
1789
                                public void actionPerformed(java.awt.event.ActionEvent e) {
1790
                                        LayerList list = getLstSelectedLayers();
1791
                                        int[] selectedIndices = list.getSelectedIndices();
1792
                                        int index = list.getSelectedIndex();
1793
                                        if (selectedIndices != null
1794
                                                        && selectedIndices.length == 1
1795
                                                        && index < getLstSelectedLayers().getModel()
1796
                                                                        .getSize() - 1) {
1797
                                                JDnDListModel m = (JDnDListModel) list.getModel();
1798
                                                m.itemsMoved(index + 1, new int[] { index });
1799
                                                list.setSelectedIndex(index + 1);
1800
                                        }
1801
                                }
1802
                        });
1803
                        btnDown.setIcon(IconThemeHelper.getImageIcon("aplication-preferences-downarrow"));
1804
                }
1805
                return btnDown;
1806
        }
1807

    
1808
        public void setFixedSize(Dimension sz) {
1809
                sizeFixed = sz;
1810
        }
1811

    
1812
        public ArrayList<TreePath> getSelectedPaths() {
1813
                return selectedPaths;
1814
        }
1815

    
1816
        public LayerTree getJustTreeLayer() {
1817
                return treeLayers;
1818
        }
1819

    
1820
        /**
1821
         * This method initializes chkDisagregate
1822
         *
1823
         * @return CheckBox
1824
         */
1825
        private JCheckBox getChkDisagregate() {
1826
                if (chkDisagregate == null) {
1827

    
1828
                        chkDisagregate = new JCheckBox();
1829
                        chkDisagregate.setBounds(new java.awt.Rectangle(19,276,269,20));
1830
                        chkDisagregate.setText(PluginServices.getText(this,
1831
                                        "disagregate_layers"));
1832
                        chkDisagregate.setSelected(false);
1833

    
1834
                }
1835
                return chkDisagregate;
1836
        }
1837

    
1838
        public boolean getDisagregatedLayers() {
1839
                return chkDisagregate.isSelected();
1840
        }
1841

    
1842
        public void disableDisagregatedLayers() {
1843
                chkDisagregate.setEnabled(false);
1844
        }
1845

    
1846
        @Override
1847
        public DataStoreParameters[] getParameters() {
1848
                // TODO Auto-generated method stub
1849
                return null;
1850
        }
1851

    
1852
        @Override
1853
        public void close() {
1854
                // Nothing to do
1855
        }
1856

    
1857
        public WMSServerExplorer getExplorer() {
1858
                return explorer;
1859
        }
1860
} // @jve:decl-index=0:visual-constraint="10,10"