Statistics
| Revision:

gvsig-raster / org.gvsig.raster.wms / branches / org.gvsig.raster.wms_dataaccess_refactoring / org.gvsig.raster.wms.app.wmsclient / src / main / java / org / gvsig / raster / wms / app / wmsclient / gui / panel / WMSParamsPanel.java @ 2376

History | View | Annotate | Download (51.3 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.util.AbstractCollection;
34
import java.util.ArrayList;
35
import java.util.Hashtable;
36
import java.util.TreeSet;
37
import java.util.Vector;
38
import java.util.prefs.Preferences;
39

    
40
import javax.swing.JButton;
41
import javax.swing.JCheckBox;
42
import javax.swing.JList;
43
import javax.swing.JOptionPane;
44
import javax.swing.JPanel;
45
import javax.swing.JScrollPane;
46
import javax.swing.JTabbedPane;
47
import javax.swing.JTextField;
48
import javax.swing.tree.TreePath;
49

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

    
79

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

    
152
        public WMSParamsPanel() {
153
                super();
154
                initialize();
155
        }
156

    
157
        // TODO: crear nuevo constructor para a?adir los panels que quieras...
158
        public WMSParamsPanel(WMSServerExplorer data) {
159
                super();
160
                setWizardData(data);
161
                this.setLayout(null);
162
                this.setVisible(false);
163
                this.setBounds(0, 0, 510, 427);
164
                if (jTabbedPane == null) {
165
                        jTabbedPane = new JTabbedPane();
166
                        jTabbedPane.setBounds(4, 4, 502, 415);
167
                        StylesPanel sp = getTabStyle();
168
                        DimensionPanel dp = getTabDimensions();
169

    
170
                        jTabbedPane.addTab(PluginServices.getText(this, "capas"), null,
171
                                        getTabLayers(), null);
172
                        jTabbedPane.addTab(PluginServices.getText(this, "estilos"), null,
173
                                        sp, null);
174
                        stylesTabIndex = jTabbedPane.getTabCount() - 1;
175
                        jTabbedPane.addTab(PluginServices.getText(this, "dimensiones"),
176
                                        null, dp, null);
177
                        dimensionTabIndex = jTabbedPane.getTabCount() - 1;
178
                        jTabbedPane.addTab(PluginServices.getText(this, "formatos"), null,
179
                                        getTabFormats(), null);
180
                        jTabbedPane.setEnabledAt(dimensionTabIndex, false);
181
                        jTabbedPane.setEnabledAt(stylesTabIndex, false);
182
                }
183
                this.add(jTabbedPane, null);
184

    
185
                setListenerSupport(new WizardListenerSupport());
186
        }
187

    
188
        /**
189
         * This method initializes panelPage2
190
         *
191
         * @return Panel
192
         */
193
        private void initialize() {
194
                this.setLayout(null);
195
                this.setVisible(false);
196
                this.setBounds(0, 0, 510, 427);
197
                this.add(getJTabbedPane(), null);
198
        }
199
        
200
        public boolean isUpdatingCache() {
201
                return updating;
202
        }
203

    
204
        public void setUpdatingCache(boolean updating) {
205
                this.updating = updating;
206
        }
207

    
208
        /**
209
         * This method initializes jPanel2
210
         *
211
         * @return Panel
212
         */
213
        private JPanel getJPanel2() {
214
                if (jPanel2 == null) {
215
                        jPanel2 = new JPanel();
216
                        jPanel2.setLayout(null);
217
                        jPanel2.setBounds(5, 59, 485, 328);
218
                        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(
219
                                        null, PluginServices.getText(this, "select_layers"),
220
                                        javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
221
                                        javax.swing.border.TitledBorder.DEFAULT_POSITION, null,
222
                                        null));
223
                        jPanel2.add(getChkExtendedNames(), null);
224

    
225
                        jPanel2.add(getJScrollPane1(), null);
226
                        jPanel2.add(getBtnDel(), null);
227
                        jPanel2.add(getBtnAdd(), null);
228
                        jPanel2.add(getJScrollPane5(), null);
229
                        jPanel2.add(getBtnUp(), null);
230
                        jPanel2.add(getBtnDown(), null);
231
                        jPanel2.add(getChkDisagregate(), null);
232
                }
233

    
234
                return jPanel2;
235
        }
236

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

    
255
                return jPanel4;
256
        }
257

    
258
        /**
259
         * This method initializes jPanel3
260
         *
261
         * @return Panel
262
         */
263
        private JPanel getTabFormats() {
264
                if (tabFormats == null) {
265
                        tabFormats = new JPanel();
266
                        tabFormats.setLayout(null);
267
                        tabFormats.add(getJPanelFormats(), null);
268
                        tabFormats.add(getJPanelSrsSelection(), null);
269
                        tabFormats.add(getJPanelInfoByPointFormat(), null);
270
                }
271

    
272
                return tabFormats;
273
        }
274

    
275
        /**
276
         * This method initializes jScrollPane1
277
         *
278
         * @return ScrollPane
279
         */
280
        private JScrollPane getJScrollPane1() {
281
                if (jScrollPane1 == null) {
282
                        jScrollPane1 = new JScrollPane();
283
                        jScrollPane1.setBounds(11, 22, 460, 123);
284
                        jScrollPane1.setViewportView(getTreeLayers());
285
                        jScrollPane1.setPreferredSize(new java.awt.Dimension(205, 75));
286
                }
287

    
288
                return jScrollPane1;
289
        }
290

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

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

    
335
        /**
336
         * This method initializes jScrollPane5
337
         *
338
         * @return ScrollPane
339
         */
340
        private JScrollPane getJScrollPane5() {
341
                if (jScrollPane5 == null) {
342
                        jScrollPane5 = new JScrollPane();
343
                        jScrollPane5.setBounds(11, 155, 422, 120);
344
                        jScrollPane5.setViewportView(getLstSelectedLayers());
345
                        jScrollPane5.setPreferredSize(new java.awt.Dimension(205, 75));
346
                }
347

    
348
                return jScrollPane5;
349
        }
350

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

    
368
                return jTxtNomCapa;
369
        }
370
        
371
        /**
372
         * This method initializes jPanel1
373
         *
374
         * @return Panel
375
         */
376
        private JPanel getJPanelFormats() {
377
                if (jPanelFormats == null) {
378
                        jPanelFormats = new JPanel();
379
                        jPanelFormats.setLayout(null);
380
                        jPanelFormats.setBorder(javax.swing.BorderFactory.createTitledBorder(
381
                                        null, PluginServices.getText(this, "select_formats"),
382
                                        javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
383
                                        javax.swing.border.TitledBorder.DEFAULT_POSITION, null,
384
                                        null));
385
                        jPanelFormats.setBounds(5, 10, 485, 140);
386
                        jPanelFormats.add(getJScrollPane6(), null);
387
                        jPanelFormats.add(getChkTransparency(), null);
388
                }
389
                return jPanelFormats;
390
        }
391

    
392
        /**
393
         * This method initializes jPanel5
394
         *
395
         * @return Panel
396
         */
397
        private JPanel getJPanelSrsSelection() {
398
                if (jPanelSrsSelection == null) {
399
                        jPanelSrsSelection = new JPanel();
400
                        jPanelSrsSelection.setLayout(null);
401
                        jPanelSrsSelection.setBorder(javax.swing.BorderFactory.createTitledBorder(
402
                                        null, PluginServices.getText(this, "seleccionar_srs"),
403
                                        javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
404
                                        javax.swing.border.TitledBorder.DEFAULT_POSITION, null,
405
                                        null));
406
                        jPanelSrsSelection.setBounds(5, 150, 485, 140);
407
                        jPanelSrsSelection.add(getJScrollPane2(), null);
408
                }
409
                return jPanelSrsSelection;
410
        }
411
        
412
        /**
413
         * This method initializes jPanel6
414
         *
415
         * @return Panel
416
         */
417
        private JPanel getJPanelInfoByPointFormat() {
418
                if (jPanelInfoByPointFormat == null) {
419
                        jPanelInfoByPointFormat = new JPanel();
420
                        jPanelInfoByPointFormat.setLayout(null);
421
                        jPanelInfoByPointFormat.setBorder(javax.swing.BorderFactory.createTitledBorder(
422
                                        null, PluginServices.getText(this, "seleccionar_infobypoint_format"),
423
                                        javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
424
                                        javax.swing.border.TitledBorder.DEFAULT_POSITION, null,
425
                                        null));
426
                        jPanelInfoByPointFormat.setBounds(5, 295, 485, 78);
427
                        jPanelInfoByPointFormat.add(getJScrollPane3(), null);
428
                }
429
                return jPanelInfoByPointFormat;
430
        }
431

    
432
        /**
433
         * This method initializes jScrollPane6
434
         *
435
         * @return ScrollPane
436
         */
437
        private JScrollPane getJScrollPane6() {
438
                if (jScrollPane6 == null) {
439
                        jScrollPane6 = new JScrollPane();
440
                        jScrollPane6.setBounds(5, 23, 470, 110);
441
                        jScrollPane6.setViewportView(getLstFormats());
442
                        jScrollPane6.setPreferredSize(new java.awt.Dimension(250, 180));
443
                }
444

    
445
                return jScrollPane6;
446
        }
447

    
448
        /**
449
         * This method initializes jScrollPane2
450
         *
451
         * @return ScrollPane
452
         */
453
        private JScrollPane getJScrollPane2() {
454
                if (jScrollPane2 == null) {
455
                        jScrollPane2 = new JScrollPane();
456
                        jScrollPane2.setBounds(5, 23, 470, 110);
457
                        jScrollPane2.setViewportView(getLstSRSs());
458
                        jScrollPane2.setPreferredSize(new java.awt.Dimension(250, 180));
459
                }
460

    
461
                return jScrollPane2;
462
        }
463
        
464
        /**
465
         * This method initializes jScrollPane3
466
         *
467
         * @return ScrollPane
468
         */
469
        private JScrollPane getJScrollPane3() {
470
                if (jScrollPane3 == null) {
471
                        jScrollPane3 = new JScrollPane();
472
                        jScrollPane3.setBounds(5, 23, 470, 45);
473
                        jScrollPane3.setViewportView(getLstInfoFormats());
474
                        jScrollPane3.setPreferredSize(new java.awt.Dimension(250, 120));
475
                }
476

    
477
                return jScrollPane3;
478
        }
479

    
480
        /**
481
         * Gets the available layers in WMS maintaining the tree structure
482
         *
483
         * @return
484
         */
485
        public LayerTree getLayerStructure() {
486
                return treeLayers;
487
        }
488

    
489
        /**
490
         * This method initializes treeLayers
491
         *
492
         * @return Tree
493
         */
494
        private LayerTree getTreeLayers() {
495
                if (treeLayers == null) {
496
                        treeLayers = new LayerTree();
497
                        treeLayers.setRootVisible(true);
498
                        treeLayers.addMouseListener(new java.awt.event.MouseAdapter() {
499
                                public void mouseClicked(java.awt.event.MouseEvent e) {
500
                                        if (e.getClickCount() == 2) {
501
                                                addLayer();
502
                                        }
503
                                }
504
                        });
505
                        treeLayers
506
                                        .addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
507
                                                public void valueChanged(
508
                                                                javax.swing.event.TreeSelectionEvent e) {
509

    
510
                                                        boolean isGetMapable = false; 
511
                                                        TreePath[] selecciones = getTreeLayers()
512
                                                                        .getSelectionPaths();
513
                                                        if (selecciones != null) {
514
                                                                for (int i = 0; i < selecciones.length
515
                                                                                && !isGetMapable; i++) {
516
                                                                        WMSLayerNode layer = ((WMSLayerNode) selecciones[i]
517
                                                                                        .getLastPathComponent());
518
                                                                        isGetMapable = layer.getChildren().size() == 0
519
                                                                                        || layer.getName() != null;
520
                                                                }
521

    
522
                                                        }
523
                                                        getBtnAdd().setEnabled(isGetMapable);
524
                                                        fireWizardComplete(isCorrectlyConfigured());
525
                                                }
526
                                        });
527
                }
528

    
529
                return treeLayers;
530
        }
531

    
532
        /**
533
         * This method checks for the options selected within the configuration
534
         * dialog are correct and enough to perform a GetMap request.
535
         *
536
         * @return true if you're done, false if not.
537
         */
538
        public boolean isCorrectlyConfigured() {
539

    
540
                boolean b;
541
                this.repaint();
542
                boolean infoFormatOk = ((getLstInfoFormats().getModel().getSize()!= 0 && 
543
                                                                getLstInfoFormats().getSelectedIndex() != -1) || 
544
                                                                getLstInfoFormats().getModel().getSize() == 0);
545
                if ((getLstSRSs().getSelectedIndex() != -1)
546
                                && (getLstFormats().getSelectedIndex() != -1)
547
                                && infoFormatOk
548
                                && (getLstSelectedLayers().getModel().getSize() > 0)) {
549
                        b = true;
550
                } else {
551
                        b = false;
552
                }
553

    
554
                // Enable or disable del button.
555
                int[] selectedIndices = getLstSelectedLayers().getSelectedIndices();
556

    
557
                getBtnDel().setEnabled(selectedIndices != null && selectedIndices.length > 0);
558

    
559
                return b;
560
        }
561

    
562
        public WMSLayerNode[] selectedLayersToArray() {
563
                JDnDListModel modelo = ((JDnDListModel) lstSelectedLayers.getModel());
564
                ArrayList elements = modelo.getElements();
565
                WMSLayerNode[] layers = (WMSLayerNode[]) elements
566
                                .toArray(new WMSLayerNode[0]);
567
                return layers;
568
        }
569

    
570
        /**
571
         * DOCUMENT ME!
572
         */
573
        private void delLayer() {
574
                int[] indices = lstSelectedLayers.getSelectedIndices();
575

    
576
                try {
577
                        ArrayList removeList = new ArrayList();
578
                        WMSLayerNode[] infos = selectedLayersToArray();
579
                        JDnDListModel modelo = ((JDnDListModel) lstSelectedLayers
580
                                        .getModel());
581
                        for (int i = 0; i < indices.length; i++) {
582
                                removeList.add(infos[indices[i]]);
583
                        }
584
                        modelo.delIndices(indices);
585
                        lstSelectedLayers.clearSelection();
586
                        fireWizardComplete(isCorrectlyConfigured());
587

    
588
                        // delete from selectedPaths as well
589
                        WMSLayerNode elemento = null;
590
                        WMSLayerNode last = null;
591
                        TreePath path = null;
592
                        for (int i = removeList.size() - 1; i >= 0; i--) {
593
                                elemento = (WMSLayerNode) removeList.get(i);
594
                                for (int j = 0; j < selectedPaths.size(); j++) {
595
                                        path = (TreePath) selectedPaths.get(j);
596
                                        last = (WMSLayerNode) path.getLastPathComponent();
597
                                        if (last.getTitle().compareTo(elemento.getTitle()) == 0) {
598
                                                selectedPaths.remove(path);
599
                                        }
600
                                }
601
                        }
602

    
603
                        refreshData();
604
                        refreshInfo();
605
                } catch (ArrayIndexOutOfBoundsException ex) {
606
                        // if you reach this, please, tell me how you did it.
607
                        ex.printStackTrace();
608
                }
609
        }
610

    
611
        /**
612
         * Fires a notification to this wizard listeners telling them if the
613
         * configuration is fair enough to send a GetMap request.
614
         *
615
         * @param b
616
         */
617
        private void fireWizardComplete(boolean b) {
618
                listenerSupport.callStateChanged(b);
619
                callStateChanged(b);
620
        }
621

    
622
        /**
623
         * Refreshes the content shown by this.
624
         */
625
        public void refreshData() {
626
                JDnDListModel model = (JDnDListModel) lstSelectedLayers.getModel();
627
                if(model.getSize() > 1)
628
                        setLayerName(groupName);
629
                else if(model.getSize() == 1)
630
                        setLayerName(model.getElementAt(0).toString());
631
                else
632
                        setLayerName(PluginServices.getText(this, "WMSLayer"));
633
                refreshSRS();
634
                getLstSelectedLayers().repaint();
635
                refreshStyleTree();
636
                refreshDimensions();
637

    
638
        }
639

    
640
        /**
641
         * Refreshes the info tab
642
         *
643
         */
644
        public void refreshInfo() {
645
                getTabInfo().refresh(explorer, selectedLayersVector(),
646
                                getStyleTitles(), getFormat(), getInfoFormat(), getSRS(), getDimensions());
647
        }
648

    
649
        private void refreshDimensions() {
650
                int size = getLstSelectedLayers().getModel().getSize();
651
                boolean enable = false;
652
                for (int i = 0; i < size; i++) {
653
                        WMSLayerNode node = (WMSLayerNode) getLstSelectedLayers()
654
                                        .getModel().getElementAt(i);
655
                        if (node.getDimensions() == null) {
656
                                continue;
657
                        }
658

    
659
                        for (int j = 0; j < node.getDimensions().size(); j++) {
660
                                RemoteTimeDimension dim = (RemoteTimeDimension) node
661
                                                .getDimensions().get(j);
662

    
663
                                try {
664
                                        getTabDimensions().addDimension(dim);
665
                                        enable = true;
666
                                } catch (IllegalArgumentException e) {
667
                                        NotificationManager.addWarning(
668
                                                        "Unrecognized dimension expression: "
669
                                                                        + dim.getExpression() + " (for "
670
                                                                        + dim.getName() + " in layer '"
671
                                                                        + node.getName() + "')", null);
672
                                }
673
                        }
674
                }
675
                jTabbedPane.setEnabledAt(dimensionTabIndex, enable);
676

    
677
        }
678

    
679
        /**
680
         *
681
         */
682
        private void refreshStyleTree() {
683

    
684
                int size = getLstSelectedLayers().getModel().getSize();
685
                WMSLayerNode styleRoot = new WMSLayerNode();
686
                styleRoot.setTitle(PluginServices.getText(this, "selected_layers"));
687

    
688
                StyleTreeModel model = new StyleTreeModel(styleRoot);
689
                jTabbedPane.setEnabledAt(stylesTabIndex, false);
690
                for (int i = 0; i < size; i++) {
691
                        WMSLayerNode node = (WMSLayerNode) getLstSelectedLayers()
692
                                        .getModel().getElementAt(i);
693
                        // If any of the layers defines styles, the tab will be enabled.
694
                        if (model.addLayerBranch(node)) {
695
                                jTabbedPane.setEnabledAt(stylesTabIndex, true);
696
                        }
697
                }
698

    
699
                getStyleTree().setModel(model);
700
                getStyleTree().expandAll();
701
                getStyleTree().repaint();
702
        }
703

    
704
        /**
705
         * Takes the array of selected layers and a vector containing the style
706
         * names and set them as selected in the styles panel
707
         *
708
         * @param selectedLayers
709
         * @param styles
710
         */
711
        public void setStyleSelections(Vector<RemoteWMSStyle> styles) {
712

    
713
                WMSLayerNode[] layers = selectedLayersToArray();
714
                int length = layers.length;
715
                for (int i = 0; i < length; i++) {
716
                        String styleName = styles.get(i).getName();
717
                        layers[length - i - 1].setSelectedStyleByName(styleName);
718
                }
719
        }
720

    
721
        /**
722
         * Gets the currently shown style tree.
723
         *
724
         * @return
725
         */
726
        private StyleTree getStyleTree() {
727
                return getTabStyle().getStyleTree();
728
        }
729

    
730
        /**
731
         * Method called when pressing the Add layer button or when double-clicking
732
         * on a layer from the server's layer tree.
733
         */
734
        public void addLayer() {
735
                boolean alguno = false;
736

    
737
                TreePath[] selecciones = getTreeLayers().getSelectionPaths();
738
                if (selecciones == null) {
739
                        return;
740
                }
741
                for (int i = 0; i < selecciones.length; i++) {
742
                        selectedPaths.add(selecciones[i]);
743
                        WMSLayerNode nodo = (WMSLayerNode) selecciones[i]
744
                                        .getLastPathComponent();
745
                        if (nodo.getName() == null || nodo.getName().equals("")) {
746
                                continue;
747
                        }
748
                        if (nodo.isSizeFixed()) {
749
                                if (sizeFixed == null) {
750
                                        sizeFixed = nodo.getFixedSize();
751
                                } else if ((sizeFixed.getHeight() != nodo.getFixedSize()
752
                                                .getHeight())
753
                                                || (sizeFixed.getWidth() != nodo.getFixedSize()
754
                                                                .getWidth())) {
755
                                        JOptionPane.showMessageDialog((Component) PluginServices
756
                                                        .getMainFrame(), PluginServices.getText(this,
757
                                                        "server_cant_render_layers"));
758
                                        continue;
759
                                }
760
                        }
761
                        // s'afegeix a la llista de capes seleccionades
762
                        JDnDListModel modelo = (JDnDListModel) lstSelectedLayers.getModel();
763

    
764
                        try {
765
                                if (modelo.addElement(modelo.getSize(), nodo.clone())) {
766
                                        alguno = true;
767
                                }
768
                        } catch (CloneNotSupportedException e) {
769
                        }
770
                }
771

    
772
                if (alguno) {
773
                        refreshData();
774
                }
775
                refreshInfo();
776
        }
777

    
778
        /**
779
         * This method initializes lstSelectedLayers
780
         *
781
         * @return List
782
         */
783
        public LayerList getLstSelectedLayers() {
784
                if (lstSelectedLayers == null) {
785
                        lstSelectedLayers = new LayerList();
786
                        lstSelectedLayers.setModel(new JDnDListModel());
787
                        lstSelectedLayers
788
                                        .setSelectionMode(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
789
                        lstSelectedLayers
790
                                        .addListSelectionListener(new javax.swing.event.ListSelectionListener() {
791
                                                public void valueChanged(
792
                                                                javax.swing.event.ListSelectionEvent e) {
793
                                                        fireWizardComplete(isCorrectlyConfigured());
794
                                                }
795
                                        });
796
                        lstSelectedLayers.addMouseListener(new MouseAdapter() {
797
                                public void mouseReleased(MouseEvent e) {
798
                                        refreshData();
799
                                }
800
                        });
801
                }
802

    
803
                return lstSelectedLayers;
804
        }
805

    
806
        /**
807
         * This method initializes lstSRSs
808
         *
809
         * @return JList
810
         */
811
        public JList getLstSRSs() {
812
                if (lstSRSs == null) {
813
                        lstSRSs = new JList();
814
                        lstSRSs.setModel(new SRSListModel());
815
                        lstSRSs.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
816
                        lstSRSs.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
817
                                public void valueChanged(javax.swing.event.ListSelectionEvent e) {
818
                                        int i = lstSRSs.getSelectedIndex();
819
                                        if (i != -1) {
820
                                                oldSRS = (String) lstSRSs.getModel().getElementAt(i);
821
                                        }
822
                                        fireWizardComplete(isCorrectlyConfigured());
823
                                }
824
                        });
825
                }
826
                return lstSRSs;
827
        }
828
        
829
        /**
830
         * This method initializes lstSRSs
831
         *
832
         * @return JList
833
         */
834
        public JList getLstInfoFormats() {
835
                if (lstInfoFormats == null) {
836
                        lstInfoFormats = new JList();
837
                        lstInfoFormats.setModel(new SRSListModel());
838
                        lstInfoFormats.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
839
                        lstInfoFormats.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
840
                                public void valueChanged(javax.swing.event.ListSelectionEvent e) {
841
                                        fireWizardComplete(isCorrectlyConfigured());
842
                                }
843
                        });
844
                }
845

    
846
                return lstInfoFormats;
847
        }
848

    
849
        /**
850
         * This method initializes lstFormats
851
         *
852
         * @return List
853
         */
854
        public JList getLstFormats() {
855
                if (lstFormats == null) {
856
                        lstFormats = new JList();
857
                        lstFormats.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
858
                        lstFormats.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
859
                                public void valueChanged(javax.swing.event.ListSelectionEvent e) {
860
                                        fireWizardComplete(isCorrectlyConfigured());
861
                                }
862
                        });
863
                }
864

    
865
                return lstFormats;
866
        }
867

    
868
        /**
869
         * Refreshes the SRS list
870
         */
871
        private void refreshSRS() {
872
                ArrayList<?> elements = ((JDnDListModel) lstSelectedLayers.getModel()).getElements();
873
                WMSLayerNode[] layers = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
874

    
875
                SRSListModel model = new SRSListModel();
876

    
877
                if (layers.length == 0) {
878
                        lstSRSs.setModel(model);// new DefaultListModel());
879
                        sizeFixed = null;
880
                } else {
881
                        TreeSet srsSet = new TreeSet();
882
                        srsSet.addAll(layers[0].getAllSrs());
883
                        model.setAll(srsSet);
884
                        for (int i = 1; i < layers.length; i++) {
885
                                model.setAll(model.intersect(layers[i].getAllSrs()));
886
                        }
887
                        lstSRSs.setModel(model);
888
                }
889
                int srsIndex = getSRSIndex(oldSRS);
890
                if (srsIndex != -1) {
891
                        getLstSRSs().setSelectedIndex(srsIndex);
892
                }
893

    
894
        }
895

    
896
        public void setListenerSupport(WizardListenerSupport support) {
897
                listenerSupport = support;
898
        }
899

    
900
        public void setWizardData(WMSServerExplorer data) {
901
                this.explorer = data;
902
                ((JDnDListModel) getLstSelectedLayers().getModel()).clear();
903
                getLstSelectedLayers().repaint();
904

    
905
                getLstFormats().setModel(
906
                                new FormatListModel(this.explorer.getFormats()));
907
                getLstInfoFormats().setModel(
908
                                new FormatListModel(this.explorer.getInfoFormats()));
909
                getTreeLayers()
910
                                .setModel(new LayerTreeModel(this.explorer.getLayerTree()));
911
                refreshInfo();
912
        }
913

    
914
        private Vector getStyleTitles() {
915
                return getTabStyle().getStyleTree().getStyleSelectionTitles();
916
        }
917

    
918
        /**
919
         * @return
920
         */
921
        private Vector selectedLayersVector() {
922
                JDnDListModel mod = (JDnDListModel) getLstSelectedLayers().getModel();
923
                Vector lyrs = new Vector();
924
                for (int i = 0; i < mod.getSize(); i++) {
925
                        lyrs.add(mod.getElementAt(i));
926
                }
927
                return lyrs;
928
        }
929

    
930
        public String getFormat() {
931
                return (String) getLstFormats().getSelectedValue();
932
        }
933
        
934
        public String getInfoFormat() {
935
                return (String) getLstInfoFormats().getSelectedValue();
936
        }
937

    
938
        public String getLayersQuery() {
939
                ArrayList<?> elements = ((JDnDListModel) getLstSelectedLayers().getModel()).getElements();
940
                WMSLayerNode[] layers = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
941

    
942
                // Nombre separado por comas de las capas
943
                String layersQuery = layers[layers.length - 1].getName();
944

    
945
                for (int i = layers.length - 2; i >= 0; i--) {
946
                        layersQuery += ("," + layers[i].getName());
947
                }
948

    
949
                return layersQuery;
950

    
951
        }
952

    
953
        /**
954
         * Returns the current selected SRS.
955
         *
956
         * @return
957
         */
958
        public String getSRS() {
959
                return (String) getLstSRSs().getSelectedValue();
960
        }
961

    
962
        /**
963
         * Returns the name of the layer that the user has typed-in
964
         *
965
         * @return
966
         */
967
        public String getLayerName() {
968
                return getJTxtNomCapa().getText();
969
        }
970

    
971
        public void setLayerName(String name) {
972
                getJTxtNomCapa().setText(name);
973
        }
974

    
975
        /*
976
         * Comento est? metodo pq el extent completo debe proporcionarlo el provider. Eliminar
977
         * por completo en futuras versiones si todo funciona bien 16/12/2013
978
         * public Rectangle2D getLayersRectangle() throws ProjectionLayerException {
979
                ArrayList<?> elements = ((JDnDListModel) getLstSelectedLayers().getModel()).getElements();
980
                WMSLayerNode[] layers = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
981
                String[] layerNames = new String[layers.length];
982
                for (int i = 0; i < layerNames.length; i++) {
983
                        layerNames[i] = layers[i].getName();
984
                }
985
                return explorer.getBoundingBox(layerNames, getSRS());
986
        }*/
987

    
988
        public TreePath[] getSelectedLayers() {
989
                return getTreeLayers().getSelectionPaths();
990
        }
991

    
992
        public Hashtable getOnlineResources() {
993
                return explorer.getOnlineResources();
994
        }
995

    
996
        /**
997
         * The piece of the GetMap request that has the layer names.
998
         *
999
         * @return
1000
         */
1001
        public String getQueryableLayerQuery() {
1002
                ArrayList<?> elements = ((JDnDListModel) getLstSelectedLayers().getModel()).getElements();
1003
                WMSLayerNode[] layers = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
1004
                // Nombre separado por comas de las capas
1005
                String layersQuery = "";
1006
                int i;
1007

    
1008
                for (i = 0; i < layers.length; i++) {
1009
                        if (layers[i].isQueryable()) {
1010
                                layersQuery = layers[i].getName();
1011

    
1012
                                break;
1013
                        }
1014
                }
1015

    
1016
                for (int j = i + 1; j < layers.length; j++) {
1017
                        if (layers[j].isQueryable()) {
1018
                                layersQuery += ("," + layers[j].getName());
1019
                        }
1020
                }
1021

    
1022
                return layersQuery;
1023
        }
1024

    
1025
        /**
1026
         * Returns the index of the CRS within the CRS list.
1027
         *
1028
         * Devuelve la posicion que ocupa el CRS en la lista de CRS
1029
         *
1030
         * @param crs
1031
         * @return The CRS's index if it exists, -1 if it not exists.
1032
         */
1033
        public int getSRSIndex(String crs) {
1034
                for (int i = 0; i < getLstSRSs().getModel().getSize(); i++) {
1035
                        if (crs != null
1036
                                        && crs.equals(getLstSRSs().getModel().getElementAt(i))) {
1037
                                return i;
1038
                        }
1039
                }
1040
                return -1;
1041
        }
1042

    
1043
        /**
1044
         * Returns the index of the format within the formats list.
1045
         *
1046
         * Devuelve la posicion que ocupa el formato en la lista de formatos
1047
         *
1048
         * @param format
1049
         *
1050
         * @return The format's index if it exists, -1 if it not exists.
1051
         */
1052
        public int getFormatIndex(String format) {
1053
                for (int i = 0; i < getLstFormats().getModel().getSize(); i++) {
1054
                        if (format != null
1055
                                        && format
1056
                                                        .equals(getLstFormats().getModel().getElementAt(i))) {
1057
                                return i;
1058
                        }
1059
                }
1060
                return -1;
1061
        }
1062
        
1063
        /**
1064
         * Returns the index of the format within the formats list.
1065
         *
1066
         * Devuelve la posicion que ocupa el formato en la lista de formatos
1067
         *
1068
         * @param format
1069
         *
1070
         * @return The format's index if it exists, -1 if it not exists.
1071
         */
1072
        public int getInfoFormatIndex(String infoformat) {
1073
                for (int i = 0; i < getLstInfoFormats().getModel().getSize(); i++) {
1074
                        if (infoformat != null
1075
                                        && infoformat.equals(getLstInfoFormats().getModel().getElementAt(i))) {
1076
                                return i;
1077
                        }
1078
                }
1079
                return -1;
1080
        }
1081

    
1082
        /**
1083
         * This method initializes jTabbedPane
1084
         *
1085
         * @return TabbedPane
1086
         */
1087
        public JTabbedPane getJTabbedPane() {
1088
                if (jTabbedPane == null) {
1089
                        jTabbedPane = new JTabbedPane();
1090
                        jTabbedPane.setBounds(4, 4, 502, 415);
1091
                        InfoPanel ip = getTabInfo();
1092
                        ip.addFocusListener(new FocusListener() {
1093
                                public void focusGained(FocusEvent e) {
1094
                                        refreshInfo();
1095
                                }
1096

    
1097
                                public void focusLost(FocusEvent e) {
1098
                                }
1099
                        });
1100

    
1101
                        StylesPanel sp = getTabStyle();
1102
                        DimensionPanel dp = getTabDimensions();
1103

    
1104
                        jTabbedPane.addTab(PluginServices.getText(this, "info"), null, ip,
1105
                                        null);
1106
                        jTabbedPane.addTab(PluginServices.getText(this, "capas"), null,
1107
                                        getTabLayers(), null);
1108
                        jTabbedPane.addTab(PluginServices.getText(this, "estilos"), null,
1109
                                        sp, null);
1110
                        stylesTabIndex = jTabbedPane.getTabCount() - 1;
1111
                        jTabbedPane.addTab(PluginServices.getText(this, "dimensiones"),
1112
                                        null, dp, null);
1113
                        dimensionTabIndex = jTabbedPane.getTabCount() - 1;
1114
                        jTabbedPane.addTab(PluginServices.getText(this, "formatos"), null,
1115
                                        getTabFormats(), null);
1116
                        jTabbedPane.setEnabledAt(dimensionTabIndex, false);
1117
                        jTabbedPane.setEnabledAt(stylesTabIndex, false);
1118
                }
1119
                return jTabbedPane;
1120
        }
1121

    
1122
        /**
1123
         * This method initializes jPanel
1124
         *
1125
         * @return Panel
1126
         */
1127
        private JPanel getTabLayers() {
1128
                if (tabLayers == null) {
1129
                        tabLayers = new JPanel();
1130
                        tabLayers.setLayout(null);
1131
                        tabLayers.add(getJPanel4(), null);
1132
                        tabLayers.add(getJPanel2(), null);
1133
                }
1134
                return tabLayers;
1135
        }
1136

    
1137
        /**
1138
         * This method initializes jPanel6
1139
         *
1140
         * @return Panel
1141
         */
1142
        private StylesPanel getTabStyle() {
1143
                if (tabStyle == null) {
1144
                        tabStyle = new StylesPanel(this);
1145
                        tabStyle.setEnabled(false);
1146
                        tabStyle.addListener(new BeanListener() {
1147
                                public void beanValueChanged(Object value) {
1148
                                        fireWizardComplete(isCorrectlyConfigured());
1149
                                };
1150
                        });
1151
                        tabStyle.addFocusListener(new FocusAdapter() {
1152
                                public void focusGained(FocusEvent e) {
1153
                                        refreshStyleTree();
1154
                                }
1155
                        });
1156
                }
1157
                return tabStyle;
1158
        }
1159

    
1160
        /**
1161
         * Sets the focus to the tab next to the current one.
1162
         *
1163
         * Enfoca a la solapa siguiente a la actualmente enfocada del TabbedPane
1164
         *
1165
         */
1166
        public void avanzaTab() {
1167
                int currentPage = currentPage();
1168
                int nPages = getNumTabs();
1169
                if (nPages - 1 > currentPage) {
1170
                        getJTabbedPane().setSelectedIndex(nextEnabledPage());
1171
                }
1172
        }
1173

    
1174
        /**
1175
         * Sets the focus to the tab previous to the current one.
1176
         *
1177
         * Enfoca a la solapa anterior a la actualmente enfocada del TabbedPane
1178
         *
1179
         */
1180
        public void retrocedeTab() {
1181
                this.getJTabbedPane().setSelectedIndex(previousEnabledPage());
1182

    
1183
        }
1184

    
1185
        /**
1186
         * Returns the index of the current tab.
1187
         *
1188
         * Devuelve el ?ndice de la p?gina actual del wizard.
1189
         *
1190
         * @return
1191
         */
1192
        public int currentPage() {
1193
                return getJTabbedPane().getSelectedIndex();
1194
        }
1195

    
1196
        /**
1197
         * Returns the tab amount that the WMSParamsPanel currently have
1198
         *
1199
         * Devuelve el n?mero de solapas que tiene actualmente el WMSParamsPanel
1200
         *
1201
         * @return int
1202
         */
1203
        public int getNumTabs() {
1204
                return getJTabbedPane().getTabCount();
1205
        }
1206

    
1207
        /**
1208
         * <p>
1209
         * Returns the index of the previous enabled tab.
1210
         * </p>
1211
         * <p>
1212
         * Devuelve el ?ndice de la anterior p?gina habilitada del wizard o -1
1213
         * si no hay ninguna.
1214
         * </p>
1215
         *
1216
         * @return The index, or -1 if there is no one.
1217
         */
1218
        public int previousEnabledPage() {
1219
                int currentPage = currentPage();
1220
                int j = 0;
1221
                if (currentPage == 0) {
1222
                        j = -1;
1223
                }
1224
                for (int i = currentPage - 1; i > -1; i--) {
1225
                        if (getJTabbedPane().isEnabledAt(i)) {
1226
                                j = i;
1227
                                break;
1228
                        }
1229
                }
1230
                return j;
1231
        }
1232

    
1233
        /**
1234
         * <p>
1235
         * Returns the previous of the previous enabled tab.
1236
         * </p>
1237
         * <p>
1238
         * Devuelve el ?ndice de la siguiente p?gina habilitada del wizard o -1
1239
         * si no hay ninguna.
1240
         * </p>
1241
         *
1242
         * @return The index, or -1 if there is no one.
1243
         */
1244
        public int nextEnabledPage() {
1245
                int currentPage = currentPage();
1246
                int nPages = getNumTabs();
1247
                if (currentPage == nPages) {
1248
                        return -1;
1249
                }
1250
                for (int i = currentPage + 1; i < nPages; i++) {
1251
                        if (getJTabbedPane().isEnabledAt(i)) {
1252
                                return i;
1253
                        }
1254
                }
1255
                return -1;
1256
        }
1257

    
1258
        /**
1259
         * Selects/deselects the transparency checkbox.
1260
         *
1261
         * @param b
1262
         */
1263
        public void setTransparent(boolean b) {
1264
                getChkTransparency().setSelected(b);
1265
        }
1266

    
1267
        /**
1268
         * This method initializes chkTrasparency
1269
         *
1270
         * @return CheckBox
1271
         */
1272
        private JCheckBox getChkTransparency() {
1273
                if (chkTransparency == null) {
1274
                        chkTransparency = new JCheckBox();
1275
                        chkTransparency.setText(PluginServices.getText(this,
1276
                                        "wms_transparency"));
1277
                        chkTransparency.setSelected(true);
1278
                        chkTransparency.addItemListener(new java.awt.event.ItemListener() {
1279
                                public void itemStateChanged(java.awt.event.ItemEvent e) {
1280
                                        fireWizardComplete(isCorrectlyConfigured());
1281
                                }
1282
                        });
1283
                        chkTransparency.setBounds(5, 168, 441, 21);
1284

    
1285
                }
1286
                return chkTransparency;
1287
        }
1288

    
1289
        /**
1290
         * Returns a vector of strings containing the styles selected for the
1291
         * layers. A blank style is correct and means that default style will be
1292
         * used.
1293
         *
1294
         * @return Vector
1295
         */
1296
        public Vector<RemoteWMSStyle> getStyles() {
1297
                WMSLayerNode[] layers = selectedLayersToArray();
1298
                Vector<RemoteWMSStyle> v = new Vector<RemoteWMSStyle>(layers.length);
1299
                int posInsertion = 0;
1300
                
1301
                for (int i = layers.length - 1; i >= 0; i--) {
1302
                        RemoteWMSStyle sty = layers[i].getSelectedStyle();
1303
                        if(sty != null)
1304
                                v.add(posInsertion, sty);
1305
                        else {
1306
                                RemoteWMSStyle s = new RemoteWMSStyle();
1307
                                s.name = "default";
1308
                                v.add(posInsertion, s);
1309
                        }
1310
                        posInsertion ++;
1311
                }
1312
                return v;
1313
        }
1314

    
1315
        public Vector<RemoteWMSStyle> getLayerStyle(String layerName) {
1316
                Vector<RemoteWMSStyle> v = new Vector<RemoteWMSStyle>();
1317
                WMSLayerNode[] layers = selectedLayersToArray();
1318
                for (int i = 0; i < layers.length; i++) {
1319
                        if (layers[i].getName().equalsIgnoreCase(layerName)) {
1320
                                RemoteWMSStyle sty = layers[i].getSelectedStyle();
1321
                                v.add(sty);
1322
                                return v;
1323
                        }
1324
                }
1325
                return v;
1326
        }
1327

    
1328
        /**
1329
         * This method initializes tabInfo
1330
         *
1331
         * @return Panel
1332
         */
1333
        private InfoPanel getTabInfo() {
1334
                if (tabInfo == null) {
1335
                        tabInfo = new InfoPanel();
1336

    
1337
                }
1338
                return tabInfo;
1339
        }
1340

    
1341
        public void setDimensions(Vector dimensions) {
1342
                for (int i = 0; i < dimensions.size(); i++) {
1343
                        String st = (String) dimensions.get(i);
1344
                        if (st.split("=").length == 2) {
1345
                                String[] s = st.split("=");
1346
                                getTabDimensions().setDimensionValue(s[0], s[1]);
1347
                        }
1348
                }
1349

    
1350
        }
1351

    
1352
        /**
1353
         * This method initializes tabDimension
1354
         *
1355
         * @return Panel
1356
         */
1357
        private DimensionPanel getTabDimensions() {
1358
                if (tabDimensions == null) {
1359
                        tabDimensions = new DimensionPanel();
1360
                        tabDimensions.setEnabled(false);
1361
                        tabDimensions.addListener(new BeanListener() {
1362
                                public void beanValueChanged(Object value) {
1363
                                        Vector myDimensions = (Vector) value;
1364
                                        if (value != null
1365
                                                        && (oldDimensions == null || !(oldDimensions.size() == myDimensions
1366
                                                                        .size() && oldDimensions
1367
                                                                        .containsAll(myDimensions)))) {
1368
                                                oldDimensions = myDimensions;
1369
                                        }
1370
                                        fireWizardComplete(isCorrectlyConfigured());
1371
                                }
1372
                        });
1373

    
1374
                }
1375
                return tabDimensions;
1376
        }
1377

    
1378
        /**
1379
         * @return
1380
         */
1381
        public boolean getTransparency() {
1382
                return getChkTransparency().isSelected();
1383
        }
1384

    
1385
        /**
1386
         * @return
1387
         */
1388
        public Vector<String> getDimensions() {
1389
                return getTabDimensions().getDimensions();
1390
        }
1391

    
1392
        public void initWizard() {
1393
        }
1394

    
1395
        public void execute() {
1396
        }
1397

    
1398
        // Gets all the layers available in the WMS Server
1399
        protected FLayer getAllSubTree(WMSLayerNode node) throws LoadLayerException {
1400
                if (node.getChildren().size() > 0) {
1401
                        FLayers l = null;
1402
                        if (this.getMapCtrl() == null) {
1403
                                org.gvsig.app.project.documents.view.gui.AbstractViewPanel v = (org.gvsig.app.project.documents.view.gui.AbstractViewPanel) PluginServices
1404
                                                .getMDIManager().getActiveWindow();
1405
                                l = new FLayers();
1406
                                l.setMapContext(v.getMapControl().getMapContext());
1407
                        } else {
1408
                                l = new FLayers();
1409
                                l.setMapContext(this.getMapCtrl().getMapContext());
1410
                        }
1411

    
1412
                        l.setName(node.getTitle());
1413
                        l.setVisible(false);
1414
                        for (int i = 0; i < node.getChildren().size(); i++) {
1415
                                FLayer lyr = getAllSubTree((WMSLayerNode) node.getChildren()
1416
                                                .get(i));
1417
                                if (lyr != null) {
1418
                                        l.addLayer(lyr);
1419
                                }
1420
                        }
1421
                        return l;
1422
                } else {
1423
                        DataStoreParameters parameters = explorer.getStoredParameters();
1424
                        WMSDataParameters par = null;
1425
                        if(parameters instanceof WMSDataParameters) {
1426
                                par = (WMSDataParameters) parameters;
1427
                        }
1428
                        if(parameters instanceof TileDataParameters) {
1429
                                DataParameters p = ((TileDataParameters) parameters).getDataParameters();
1430
                                if(p instanceof WMSDataParameters)
1431
                                        par = (WMSDataParameters) p;
1432
                        }
1433
                        par.setFormat(getFormat());
1434
                        par.setInfoFormat(getInfoFormat());
1435
                        par.setLayerQuery(node.getName());
1436
                        par.setInfoLayerQuery(getQueryableLayerQuery());
1437
                        par.setSRS(getSRS());
1438
                        par.setWmsTransparency(getTransparency());
1439
                        par.setStyles(getLayerStyle(node.getName()));
1440
                        par.setDimensions(getDimensions());
1441
                        par.setOnlineResources(getOnlineResources());
1442
                        par.setFixedSize(getFixedSize());
1443
                        par.setQueryable(explorer.isQueryable());
1444
                        par.setName(node.getTitle());
1445
                        par.setURI(explorer.getHost());
1446
                        par.deleteCache(updating);
1447
                        
1448
                        FLyrWMS layer = new FLyrWMS();
1449
                        try {
1450
                                layer.setParameters(parameters);
1451
                                layer.setExplorer(explorer);
1452
                                //layer.setFullExtent(getLayersRectangle());
1453
                        } catch (InitializeException e) {
1454
                                throw new LoadLayerException("Error initializating layer", e);
1455
                        }
1456
                        layer.setVisible(false);
1457
                        return layer;
1458
                }
1459
        }
1460

    
1461
        // Gets all the layers available in the WMS Server
1462
        public FLayer getAllLayers() throws LoadLayerException {
1463
                LayerTree layerTree = getLayerStructure();
1464
                return getAllSubTree((WMSLayerNode) layerTree.getModel().getRoot());
1465
        }
1466

    
1467
        // changed by Laura:
1468
        // To delegate getLayer to ParamsPanel from WMSWizard and WMSProps
1469
        // public FLayer getLayer() { return null; }
1470
        public FLayer getLayer(boolean cached) throws InitializeException {
1471
                lastCached = cached;
1472
                if (getDisagregatedLayers()) {
1473
                        return getLayerTree();
1474
                } else {
1475
                        return getLayerPlain(cached);
1476
                }
1477
        }
1478
        
1479
        public FLayer getLayer() throws InitializeException {
1480
                return getLayer(lastCached);
1481
        }
1482

    
1483
        /**
1484
         * If user does not select the chekbox Disagregate layers, will get the
1485
         * layer tree in WMS
1486
         *
1487
         * @return
1488
         * @throws LoadLayerException 
1489
         */
1490
        protected FLayer getLayerTree() throws InitializeException {
1491
                LayerTree layerTree = getLayerStructure();
1492
                TreePath[] selection = (TreePath[]) getSelectedPaths().toArray(new TreePath[0]);
1493
                if (selection != null) {
1494
                        return getSubTree((WMSLayerNode) layerTree.getModel().getRoot(), selection);
1495
                }
1496
                return null;
1497
        }
1498

    
1499
        protected boolean nodeSelected(TreePath[] selection, WMSLayerNode node) {
1500
                for (int i = 0; i < selection.length; i++) {
1501
                        Object[] components = selection[i].getPath();
1502
                        for (int j = 0; j < components.length; j++) {
1503
                                if (components[j] instanceof WMSLayerNode) {
1504
                                        if (((WMSLayerNode) components[j]).getTitle().compareTo(
1505
                                                        node.getTitle()) == 0) {
1506
                                                return true;
1507
                                        }
1508
                                }
1509
                        }
1510
                }
1511
                return false;
1512
        }
1513

    
1514
        protected FLayer getSubTree(WMSLayerNode node, TreePath[] selection) throws InitializeException {
1515
                if (node.getChildren().size() > 0) {
1516
                        FLayers l = null;
1517
                        if (this.getMapCtrl() == null) {
1518
                                AbstractViewPanel v = 
1519
                                                (AbstractViewPanel) PluginServices.getMDIManager().getActiveWindow();
1520
                                l = new FLayers();
1521
                                l.setMapContext(v.getMapControl().getMapContext());
1522
                        } else {
1523
                                l = new FLayers();
1524
                                l.setMapContext(this.getMapCtrl().getMapContext());
1525
                        }
1526

    
1527
                        l.setName(node.getTitle());
1528
                        for (int i = 0; i < node.getChildren().size(); i++) {
1529
                                if (nodeSelected(selection, (WMSLayerNode) (node.getChildren().get(i)))) {
1530
                                        FLayer lyr = getSubTree((WMSLayerNode) node.getChildren().get(i), selection);
1531
                                        if (lyr != null) {
1532
                                                l.addLayer(lyr);
1533
                                        }
1534
                                }
1535
                        }
1536
                        return l;
1537
                } else {
1538
                        if (nodeSelected(selection, node)) {
1539
                                
1540
                                DataStoreParameters parameters = explorer.getStoredParameters();
1541
                                WMSDataParameters par = null;
1542
                                if(parameters instanceof WMSDataParameters) {
1543
                                        par = (WMSDataParameters) parameters;
1544
                                }
1545
                                if(parameters instanceof TileDataParameters) {
1546
                                        DataParameters p = ((TileDataParameters) parameters).getDataParameters();
1547
                                        if(p instanceof WMSDataParameters)
1548
                                                par = (WMSDataParameters) p;
1549
                                }
1550
                                par.setFormat(getFormat());
1551
                                par.setInfoFormat(getInfoFormat());
1552
                                par.setLayerQuery(node.getName());
1553
                                par.setInfoLayerQuery(getQueryableLayerQuery());
1554
                                par.setSRS(getSRS());
1555
                                par.setWmsTransparency(getTransparency());
1556
                                par.setStyles(getLayerStyle(node.getName()));
1557
                                par.setDimensions(getDimensions());
1558
                                par.setOnlineResources(explorer.getOnlineResources());
1559
                                par.setFixedSize(getFixedSize());
1560
                                par.setQueryable(node.isQueryable());
1561
                                par.setName(node.getTitle());
1562
                                par.setURI(explorer.getHost());
1563
                                par.deleteCache(updating);
1564
                                
1565
                                FLyrWMS layer = new FLyrWMS();
1566
                                layer.setParameters(parameters);
1567
                                layer.setName(node.getName());
1568
                                layer.setExplorer(explorer);
1569
                                
1570
                                /*try {
1571
                                        layer.setFullExtent(getLayersRectangle());
1572
                                } catch (InitializeException e) {
1573
                                        if (e.getCause() instanceof InvocationTargetException) {
1574
                                                Throwable t = ((InvocationTargetException)e.getCause()).getTargetException().getCause();
1575
                                                if(t != null) {
1576
                                                        String msg = t.getMessage();
1577
                                                        JOptionPane.showMessageDialog(this, msg, Messages.getText("Error"), JOptionPane.ERROR_MESSAGE);
1578
                                                }
1579
                                                log.info(e.getMessage(), e);
1580
                                        } else {
1581
                                                throw e;
1582
                                        }
1583
                                        return null;
1584
                                } catch (ProjectionLayerException e) {
1585
                                        throw new InitializeException(e);
1586
                                }*/
1587
                                return layer;
1588

    
1589
                        } else {
1590
                                return null;
1591
                        }
1592
                }
1593
        }
1594

    
1595
        /**
1596
         * If user selects the chekbox Disagregate layers, will get the selected
1597
         * layers rendered in one the tree structure in WMS will be lost.
1598
         *
1599
         * @return
1600
         */
1601
        protected FLayer getLayerPlain(boolean cached) throws InitializeException {
1602
                WMSDataParameters par = (WMSDataParameters)explorer.getStoredParameters();
1603
                DataStoreParameters parameters = par;
1604
                
1605
                if(cached) {
1606
                        DataManager manager = DALLocator.getDataManager();
1607
                        TileDataParameters tileParams = null;
1608
                        try {
1609
                                tileParams = (TileDataParameters) manager.createStoreParameters("Tile Store");
1610
                        } catch (ProviderNotRegisteredException e) {
1611
                                throw new InitializeException(e.getMessage(), e);
1612
                        }
1613
                        tileParams.setDataParameters(par);
1614
                        parameters = tileParams;
1615
                }
1616
                
1617
                par.setFormat(getFormat());
1618
                par.setInfoFormat(getInfoFormat());
1619
                par.setLayerQuery(getLayersQuery());
1620
                par.setInfoLayerQuery(getQueryableLayerQuery());
1621
                par.setSRS(getSRS());
1622
                par.setWmsTransparency(getTransparency());
1623
                par.setStyles(getStyles());
1624
                par.setDimensions(getDimensions());
1625
                par.setOnlineResources(explorer.getOnlineResources());
1626
                par.setFixedSize(getFixedSize());
1627
                par.setQueryable(explorer.isQueryable());
1628
                par.setName(getLayerName());
1629
                par.setURI(explorer.getHost());
1630
                par.deleteCache(updating);
1631
                
1632
                FLyrWMS layer = new FLyrWMS();
1633
                layer.setParameters(parameters);
1634
                layer.setExplorer(explorer);
1635
                layer.setName(getLayerName());
1636
                
1637
                /*try {
1638
                        layer.setFullExtent(getLayersRectangle());
1639
                } catch (InitializeException e) {
1640
                        String msg = getDriverExceptionMessage(e);
1641
                        if(msg != null) {
1642
                                JOptionPane.showMessageDialog(this, msg, Messages.getText("Error"), JOptionPane.ERROR_MESSAGE);
1643
                                return null;
1644
                        } else
1645
                                throw e;
1646
                } catch (ProjectionLayerException e) {
1647
                        throw new InitializeException(e);
1648
                }*/
1649
                return layer;
1650
        }
1651

    
1652
        /**
1653
         * Gets the <code>RasterDriverException</code> message. The message 
1654
         * of this exception is returned by the server
1655
         * @param e
1656
         * @return
1657
         */
1658
        private String getDriverExceptionMessage(InitializeException e) {
1659
                Throwable ex = e;
1660
                final int MAX_DEEP = 10;
1661
                int deep = 0;
1662
                while(deep < MAX_DEEP) {
1663
                        Throwable t = null;
1664
                        if(ex instanceof RasterDriverException) {
1665
                                return ex.getMessage();
1666
                        } else if(ex instanceof InitializeException) {
1667
                                t = ex.getCause();
1668
                        } else if(ex instanceof InvocationTargetException) {
1669
                                t = ((InvocationTargetException)ex).getTargetException();
1670
                        } 
1671
                        if(t == null)
1672
                                return null;
1673
                        else
1674
                                ex = t;
1675
                        deep++;
1676
                }
1677
                return null;
1678
        }
1679

    
1680
        public Dimension getFixedSize() {
1681
                return sizeFixed;
1682
        }
1683

    
1684
        /**
1685
         * This method initializes chkExtendedNames
1686
         *
1687
         * @return CheckBox
1688
         */
1689
        private JCheckBox getChkExtendedNames() {
1690
                if (chkExtendedNames == null) {
1691
                        chkExtendedNames = new JCheckBox();
1692
                        chkExtendedNames.setText(PluginServices.getText(this,
1693
                                        "show_layer_names"));
1694
                        chkExtendedNames.addItemListener(new java.awt.event.ItemListener() {
1695
                                public void itemStateChanged(java.awt.event.ItemEvent e) {
1696
                                        boolean b = chkExtendedNames.isSelected();
1697
                                        getTreeLayers().showLayerNames = b;
1698
                                        getTreeLayers().repaint();
1699
                                        getLstSelectedLayers().showLayerNames = b;
1700
                                        getLstSelectedLayers().repaint();
1701
                                        getStyleTree().showLayerNames = b;
1702
                                }
1703
                        });
1704
                        chkExtendedNames
1705
                                        .addActionListener(new java.awt.event.ActionListener() {
1706
                                                public void actionPerformed(java.awt.event.ActionEvent e) {
1707
                                                        fPrefs.putBoolean("show_layer_names",
1708
                                                                        chkExtendedNames.isSelected());
1709
                                                }
1710
                                        });
1711
                        chkExtendedNames.setBounds(19, 300, 212, 20);
1712
                        chkExtendedNames.setSelected(fPrefs.getBoolean("show_layer_names",
1713
                                        false));
1714

    
1715
                }
1716
                return chkExtendedNames;
1717
        }
1718

    
1719
        /**
1720
         * This method initializes btnUp
1721
         *
1722
         * @return Button
1723
         */
1724
        private JButton getBtnUp() {
1725
                if (btnUp == null) {
1726
                        btnUp = new JButton();
1727
                        btnUp.setBounds(438, 184, 30, 30);
1728
                        btnUp.setToolTipText(PluginServices.getText(this, "move_layer_up"));
1729
                        btnUp.addActionListener(new java.awt.event.ActionListener() {
1730
                                public void actionPerformed(java.awt.event.ActionEvent e) {
1731
                                        LayerList list = getLstSelectedLayers();
1732
                                        int[] selectedIndices = list.getSelectedIndices();
1733
                                        int index = list.getSelectedIndex();
1734
                                        if (selectedIndices != null && selectedIndices.length == 1
1735
                                                        && index > 0) {
1736
                                                JDnDListModel m = (JDnDListModel) list.getModel();
1737
                                                m.itemsMoved(index - 1, new int[] { index });
1738
                                                list.setSelectedIndex(index - 1);
1739
                                        }
1740
                                }
1741
                        });
1742
                        btnUp.setIcon(IconThemeHelper.getImageIcon("aplication-preferences-uparrow"));
1743
                }
1744
                return btnUp;
1745
        }
1746

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

    
1778
        public void setFixedSize(Dimension sz) {
1779
                sizeFixed = sz;
1780
        }
1781

    
1782
        public ArrayList<TreePath> getSelectedPaths() {
1783
                return selectedPaths;
1784
        }
1785

    
1786
        public LayerTree getJustTreeLayer() {
1787
                return treeLayers;
1788
        }
1789

    
1790
        /**
1791
         * This method initializes chkDisagregate
1792
         *
1793
         * @return CheckBox
1794
         */
1795
        private JCheckBox getChkDisagregate() {
1796
                if (chkDisagregate == null) {
1797

    
1798
                        chkDisagregate = new JCheckBox();
1799
                        chkDisagregate.setBounds(new java.awt.Rectangle(19,276,269,20));
1800
                        chkDisagregate.setText(PluginServices.getText(this,
1801
                                        "disagregate_layers"));
1802
                        chkDisagregate.setSelected(false);
1803

    
1804
                }
1805
                return chkDisagregate;
1806
        }
1807

    
1808
        public boolean getDisagregatedLayers() {
1809
                return chkDisagregate.isSelected();
1810
        }
1811

    
1812
        public void disableDisagregatedLayers() {
1813
                chkDisagregate.setEnabled(false);
1814
        }
1815

    
1816
        @Override
1817
        public DataStoreParameters[] getParameters() {
1818
                // TODO Auto-generated method stub
1819
                return null;
1820
        }
1821

    
1822
        @Override
1823
        public void close() {
1824
                // Nothing to do
1825
        }
1826
        
1827
        public WMSServerExplorer getExplorer() {
1828
                return explorer;
1829
        }
1830
} // @jve:decl-index=0:visual-constraint="10,10"