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 @ 2317

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.fmap.dal.DALLocator;
57
import org.gvsig.fmap.dal.DataManager;
58
import org.gvsig.fmap.dal.DataParameters;
59
import org.gvsig.fmap.dal.DataStoreParameters;
60
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
61
import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters;
62
import org.gvsig.fmap.dal.exception.InitializeException;
63
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
64
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
65
import org.gvsig.fmap.mapcontext.layers.FLayer;
66
import org.gvsig.fmap.mapcontext.layers.FLayers;
67
import org.gvsig.gui.beans.controls.dnd.JDnDListModel;
68
import org.gvsig.gui.beans.listeners.BeanListener;
69
import org.gvsig.raster.wms.app.wmsclient.gui.wizard.LayerTreeModel;
70
import org.gvsig.raster.wms.app.wmsclient.gui.wizard.SRSListModel;
71
import org.gvsig.raster.wms.app.wmsclient.layer.FLyrWMS;
72
import org.gvsig.raster.wms.io.RemoteWMSStyle;
73
import org.gvsig.raster.wms.io.WMSDataParameters;
74
import org.gvsig.raster.wms.io.WMSLayerNode;
75
import org.gvsig.raster.wms.io.WMSServerExplorer;
76
import org.gvsig.raster.wms.io.time.RemoteTimeDimension;
77
import org.slf4j.Logger;
78
import org.slf4j.LoggerFactory;
79

    
80

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

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

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

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

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

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

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

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

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

    
235
                return jPanel2;
236
        }
237

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

    
256
                return jPanel4;
257
        }
258

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

    
273
                return tabFormats;
274
        }
275

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

    
289
                return jScrollPane1;
290
        }
291

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

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

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

    
349
                return jScrollPane5;
350
        }
351

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

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

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

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

    
446
                return jScrollPane6;
447
        }
448

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

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

    
478
                return jScrollPane3;
479
        }
480

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

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

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

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

    
530
                return treeLayers;
531
        }
532

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

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

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

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

    
560
                return b;
561
        }
562

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

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

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

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

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

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

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

    
639
        }
640

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

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

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

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

    
678
        }
679

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

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

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

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

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

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

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

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

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

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

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

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

    
804
                return lstSelectedLayers;
805
        }
806

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

    
847
                return lstInfoFormats;
848
        }
849

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

    
866
                return lstFormats;
867
        }
868

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

    
876
                SRSListModel model = new SRSListModel();
877

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

    
895
        }
896

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

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

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

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

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

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

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

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

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

    
950
                return layersQuery;
951

    
952
        }
953

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

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

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

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

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

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

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

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

    
1013
                                break;
1014
                        }
1015
                }
1016

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

    
1023
                return layersQuery;
1024
        }
1025

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

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

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

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

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

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

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

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

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

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

    
1184
        }
1185

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

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

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

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

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

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

    
1286
                }
1287
                return chkTransparency;
1288
        }
1289

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

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

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

    
1338
                }
1339
                return tabInfo;
1340
        }
1341

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

    
1351
        }
1352

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

    
1375
                }
1376
                return tabDimensions;
1377
        }
1378

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

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

    
1393
        public void initWizard() {
1394
        }
1395

    
1396
        public void execute() {
1397
        }
1398

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

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

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

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

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

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

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

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

    
1591
                        } else {
1592
                                return null;
1593
                        }
1594
                }
1595
        }
1596

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

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

    
1682
        public Dimension getFixedSize() {
1683
                return sizeFixed;
1684
        }
1685

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

    
1717
                }
1718
                return chkExtendedNames;
1719
        }
1720

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

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

    
1780
        public void setFixedSize(Dimension sz) {
1781
                sizeFixed = sz;
1782
        }
1783

    
1784
        public ArrayList getSelectedPaths() {
1785
                return selectedPaths;
1786
        }
1787

    
1788
        public LayerTree getJustTreeLayer() {
1789
                return treeLayers;
1790
        }
1791

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

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

    
1806
                }
1807
                return chkDisagregate;
1808
        }
1809

    
1810
        public boolean getDisagregatedLayers() {
1811
                return chkDisagregate.isSelected();
1812
        }
1813

    
1814
        public void disableDisagregatedLayers() {
1815
                chkDisagregate.setEnabled(false);
1816
        }
1817

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

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