Statistics
| Revision:

root / branches / gvSIG_WMSv2 / extensions / extWMS / src / com / iver / cit / gvsig / gui / panels / WMSParamsPanel.java @ 3655

History | View | Annotate | Download (42.3 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
*
3
* Copyright (C) 2005 IVER T.I. and Generalitat Valenciana.
4
*
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License
7
* as published by the Free Software Foundation; either version 2
8
* of the License, or (at your option) any later version.
9
*
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
* GNU General Public License for more details.
14
*
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
*
19
* For more information, contact:
20
*
21
*  Generalitat Valenciana
22
*   Conselleria d'Infraestructures i Transport
23
*   Av. Blasco Ib??ez, 50
24
*   46010 VALENCIA
25
*   SPAIN
26
*
27
*      +34 963862235
28
*   gvsig@gva.es
29
*      www.gvsig.gva.es
30
*
31
*    or
32
*
33
*   IVER T.I. S.A
34
*   Salamanca 50
35
*   46005 Valencia
36
*   Spain
37
*
38
*   +34 963163400
39
*   dac@iver.es
40
*/
41
package com.iver.cit.gvsig.gui.panels;
42

    
43
import java.awt.event.FocusEvent;
44
import java.awt.event.FocusListener;
45
import java.awt.geom.Rectangle2D;
46
import java.util.ArrayList;
47
import java.util.ConcurrentModificationException;
48
import java.util.HashSet;
49
import java.util.Iterator;
50
import java.util.TreeSet;
51
import java.util.Vector;
52

    
53
import javax.swing.DefaultListModel;
54
import javax.swing.JCheckBox;
55
import javax.swing.JEditorPane;
56
import javax.swing.JPanel;
57
import javax.swing.JScrollPane;
58
import javax.swing.JTabbedPane;
59
import javax.swing.JTextField;
60
import javax.swing.tree.TreePath;
61

    
62
import com.iver.andami.PluginServices;
63
import com.iver.cit.gvsig.fmap.layers.IFMapWMSDimension;
64
import com.iver.cit.gvsig.fmap.layers.WMSLayerNode;
65
import com.iver.cit.gvsig.fmap.layers.WMSLayerNode.FMapWMSStyle;
66
import com.iver.cit.gvsig.gui.beans.controls.dnd.JDnDList;
67
import com.iver.cit.gvsig.gui.beans.controls.dnd.JDnDListModel;
68
import com.iver.cit.gvsig.gui.wizards.FormatListModel;
69
import com.iver.cit.gvsig.gui.wizards.LayerTreeModel;
70
import com.iver.cit.gvsig.gui.wizards.SRSListModel;
71
import com.iver.cit.gvsig.gui.wizards.WMSWizardData;
72
import com.iver.cit.gvsig.gui.wizards.WizardListenerSupport;
73
/**
74
 * This class implements the map option panel.
75
 * 
76
 * It includes a set of Listeners that implement some control rules which
77
 * refresh the component values that depends on those selected in the other
78
 * components to avoid to choose an invalid set of options. It also includes a
79
 * method (isCorrectlyConfigured()) that checks if the current set of values is enough to
80
 * correctly launch a GetMap request.
81
 * 
82
 * The information is obtained from a WMSWizardDataSource object.
83
 * 
84
 * 
85
 * Esta clase implementa el panel de opciones disponibles sobre la cobertura.
86
 * 
87
 * Incluye una serie de Listeners que implementan unas reglas de control que
88
 * refrescan los valores de componentes cuyos valores dependen de aqu?llos 
89
 * seleccionados en otros componentes para evitar que se escoja una combinaci?n
90
 * de opciones err?nea as? como una funci?n (isCorrectlyConfigured()) que
91
 * comprueba si la combinaci?n escogida actualmente es suficiente para lanzar
92
 * una operaci?n GetMap correctamente.
93
 * 
94
 * La informaci?n obtiene a partir de un objeto WMSWizardDataSource.
95
 * 
96
 * @author jaume - jaume dominguez faus
97
 *
98
 */
99
public class WMSParamsPanel extends JPanel {
100
        private javax.swing.JScrollPane jScrollPane1 = null;
101
        private javax.swing.JScrollPane jScrollPane2 = null;
102
        private javax.swing.JScrollPane jScrollPane5 = null;
103
        private javax.swing.JButton btnAdd = null;
104
        private javax.swing.JButton btnDel = null;
105
        private javax.swing.JScrollPane jScrollPane6 = null;
106
        private javax.swing.JPanel jPanel2 = null;
107
        private javax.swing.JPanel tabFormats = null;
108
        private JPanel jPanel4 = null;
109
        private JTextField jTxtNomCapa = null;
110
        private JDnDList lstSelectedLayers = null;
111
        private javax.swing.JList lstSRSs = null;
112
        private LayerTree treeLayers = null;
113
        private javax.swing.JList lstFormats = null;
114
        private JDnDListModel selectedLayersModel = new JDnDListModel();
115
        private WizardListenerSupport listenerSupport;
116
        private WMSWizardData dataSource;
117
        private JTabbedPane jTabbedPane = null;
118
        private JPanel tabLayers = null;
119
        private JPanel jPanel1 = null;
120
        private JPanel jPanel5 = null;
121
        private StylesPanel tabStyle = null;
122
        private JCheckBox chkTransparency = null;
123
    private InfoPanel tabInfo = null;
124
    private DimensionPanel tabDimensions = null;
125
    private int dimensionTabIndex;
126
    private int stylesTabIndex;
127
   
128
    
129
    public WMSParamsPanel(){
130
                super();
131
                initialize();
132
        }
133
        
134
        /**
135
         * This method initializes panelPage2
136
         *
137
         * @return javax.swing.JPanel
138
         */
139
        private void initialize() {
140
                this.setLayout(null);
141
                this.setVisible(false);
142
                this.setBounds(10, 5, 481, 427);
143
                this.add(getJTabbedPane(), null);
144
        }
145
        /**
146
         * This method initializes jPanel2
147
         *
148
         * @return javax.swing.JPanel
149
         */
150
        private javax.swing.JPanel getJPanel2() {
151
                if (jPanel2 == null) {
152
                        jPanel2 = new javax.swing.JPanel();
153
                        jPanel2.setLayout(null);
154
                        jPanel2.setBounds(4, 59, 454, 328);
155
                        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(
156
                                        null, PluginServices.getText(this, "seleccionar_capas"),
157
                                        javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
158
                                        javax.swing.border.TitledBorder.DEFAULT_POSITION, null, null));
159
                        jPanel2.add(getJScrollPane1(), null);
160
                        jPanel2.add(getBtnDel(), null);
161
                        jPanel2.add(getBtnAdd(), null);
162
                        jPanel2.add(getJScrollPane5(), null);
163
                }
164

    
165
                return jPanel2;
166
        }
167
        
168
        /**
169
         * This method initializes jPanel4
170
         *
171
         * @return javax.swing.JPanel
172
         */
173
        private JPanel getJPanel4() {
174
                if (jPanel4 == null) {
175
                        jPanel4 = new JPanel();
176
                        jPanel4.setLayout(null);
177
                        jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder(
178
                                        null, PluginServices.getText(this, "nombre_capa"),
179
                                        javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
180
                                        javax.swing.border.TitledBorder.DEFAULT_POSITION, null, null));
181
                        jPanel4.setBounds(4, 8, 457, 49);
182
                        jPanel4.add(getJTxtNomCapa(), null);
183
                }
184

    
185
                return jPanel4;
186
        }
187
        
188
        /**
189
         * This method initializes jPanel3
190
         *
191
         * @return javax.swing.JPanel
192
         */
193
        private javax.swing.JPanel getTabFormats() {
194
                if (tabFormats == null) {
195
                        tabFormats = new javax.swing.JPanel();
196
                        tabFormats.setLayout(null);
197
                        tabFormats.add(getJPanel1(), null);
198
                        tabFormats.add(getJPanel5(), null);
199
                }
200

    
201
                return tabFormats;
202
        }
203
        /**
204
         * This method initializes jScrollPane1
205
         *
206
         * @return javax.swing.JScrollPane
207
         */
208
        private javax.swing.JScrollPane getJScrollPane1() {
209
                if (jScrollPane1 == null) {
210
                        jScrollPane1 = new javax.swing.JScrollPane();
211
                        jScrollPane1.setBounds(11, 22, 430, 124);
212
                        jScrollPane1.setViewportView(getTreeLayers());
213
                        jScrollPane1.setPreferredSize(new java.awt.Dimension(205, 75));
214
                }
215

    
216
                return jScrollPane1;
217
        }
218
        
219
        /**
220
         * This method initializes btnDel
221
         *
222
         * @return javax.swing.JButton
223
         */
224
        public javax.swing.JButton getBtnDel() {
225
                if (btnDel == null) {
226
                        btnDel = new javax.swing.JButton();
227
                        btnDel.setPreferredSize(new java.awt.Dimension(23, 23));
228
                        btnDel.setText(PluginServices.getText(this, "quitar"));
229
                        btnDel.setMargin(new java.awt.Insets(2, 0, 2, 0));
230
                        btnDel.setBounds(246, 158, 101, 23);
231
                        btnDel.setEnabled(false);
232
                        btnDel.addActionListener(new java.awt.event.ActionListener() {
233
                                        public void actionPerformed(java.awt.event.ActionEvent e) {
234
                                                delLayer();
235
                                        }
236
                                });
237
                }
238
                return btnDel;
239
        }
240
        
241
        /**
242
         * This method initializes btnAdd
243
         *
244
         * @return javax.swing.JButton
245
         */
246
        public javax.swing.JButton getBtnAdd() {
247
                if (btnAdd == null) {
248
                        btnAdd = new javax.swing.JButton();
249
                        btnAdd.setPreferredSize(new java.awt.Dimension(23, 23));
250
                        btnAdd.setText(PluginServices.getText(this, "anadir"));
251
                        btnAdd.setMargin(new java.awt.Insets(2, 0, 2, 0));
252
                        btnAdd.setBounds(133, 158, 101, 23);
253
                        btnAdd.setEnabled(false);
254
                        btnAdd.addActionListener(new java.awt.event.ActionListener() {
255
                                        public void actionPerformed(java.awt.event.ActionEvent e) {
256
                                                addLayer();
257
                                        }
258
                                });
259
                }
260

    
261
                return btnAdd;
262
        }
263
        
264
        /**
265
         * This method initializes jScrollPane5
266
         *
267
         * @return javax.swing.JScrollPane
268
         */
269
        private javax.swing.JScrollPane getJScrollPane5() {
270
                if (jScrollPane5 == null) {
271
                        jScrollPane5 = new javax.swing.JScrollPane();
272
                        jScrollPane5.setBounds(11, 190, 431, 130);
273
                        jScrollPane5.setViewportView(getLstSelectedLayers());
274
                        jScrollPane5.setPreferredSize(new java.awt.Dimension(205, 75));
275
                }
276

    
277
                return jScrollPane5;
278
        }
279
        
280
        /**
281
         * This method initializes jTextField
282
         *
283
         * @return javax.swing.JTextField
284
         */
285
        public JTextField getJTxtNomCapa() {
286
                if (jTxtNomCapa == null) {
287
                        jTxtNomCapa = new JTextField();
288
                        jTxtNomCapa.setBounds(10, 19, 437, 20);
289
                        jTxtNomCapa.setText(PluginServices.getText(this, "capaWMS"));
290
                }
291

    
292
                return jTxtNomCapa;
293
        }
294

    
295

    
296
        /**
297
         * This method initializes jScrollPane6
298
         *
299
         * @return javax.swing.JScrollPane
300
         */
301
        private javax.swing.JScrollPane getJScrollPane6() {
302
                if (jScrollPane6 == null) {
303
                        jScrollPane6 = new javax.swing.JScrollPane();
304
                        jScrollPane6.setBounds(5, 23, 442, 140);
305
                        jScrollPane6.setViewportView(getLstFormats());
306
                        jScrollPane6.setPreferredSize(new java.awt.Dimension(250, 200));
307
                }
308

    
309
                return jScrollPane6;
310
        }
311
        
312
        /**
313
         * This method initializes jScrollPane2
314
         *
315
         * @return javax.swing.JScrollPane
316
         */
317
        private javax.swing.JScrollPane getJScrollPane2() {
318
                if (jScrollPane2 == null) {
319
                        jScrollPane2 = new javax.swing.JScrollPane();
320
                        jScrollPane2.setBounds(5, 23, 442, 141);
321
                        jScrollPane2.setViewportView(getLstSRSs());
322
                        jScrollPane2.setPreferredSize(new java.awt.Dimension(100, 200));
323
                }
324

    
325
                return jScrollPane2;
326
        }
327
        
328
        /**
329
         * This method initializes treeLayers
330
         *
331
         * @return javax.swing.JTree
332
         */
333
        public LayerTree getTreeLayers() {
334
                if (treeLayers == null) {
335
                        treeLayers = new LayerTree();
336
                        treeLayers.setRootVisible(true);
337
                        treeLayers.addMouseListener(new java.awt.event.MouseAdapter() { 
338
                                public void mouseClicked(java.awt.event.MouseEvent e) {    
339
                                        if (e.getClickCount() == 2){
340
                        addLayer();
341
                    }
342
                                }
343
                        });
344
                        treeLayers.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
345
                                        public void valueChanged(
346
                                                javax.swing.event.TreeSelectionEvent e) {
347
                                                
348
                        boolean isGetMapable = false; // pffff, jajaja
349
                        TreePath[] selecciones = getTreeLayers().getSelectionPaths();
350
                        if (selecciones!=null) // no entenc perqu? peta ac? i li arriba null a voltes...
351
                        {
352
                                for (int i = 0; i < selecciones.length && !isGetMapable; i++) {
353
                                        isGetMapable = ((WMSLayerNode) selecciones[i].getLastPathComponent()).getChildren().size()==0;
354
                                }
355
                                
356
                        }
357
                        getBtnAdd().setEnabled(isGetMapable);
358
                            listenerSupport.callStateChanged(isCorretlyConfigured());
359
                                        }
360
                                });
361
                }
362

    
363
                return treeLayers;
364
        }
365
        
366

    
367
    /**
368
         * This method checks for the options selected within the configuration dialog are 
369
         * correct and enough to perform a GetMap request.
370
         * @return true if you're done, false if not.
371
         */
372
        public boolean isCorretlyConfigured() {
373
        
374
                boolean b;
375
        this.repaint();
376
                if ((getLstSRSs().getSelectedIndex() != -1) &&
377
                                (getLstFormats().getSelectedIndex() != -1) &&
378
                                (getLstSelectedLayers().getModel().getSize() > 0)) {
379
                        b = true;
380
                } else {
381
                        b = false;
382
                }
383
        
384
        // Enable or disable the delete layer button.
385
        getBtnDel().setEnabled(
386
                getLstSelectedLayers().getSelectedIndices()!=null 
387
                && getLstSelectedLayers().getSelectedIndices().length>0
388
                );
389
        return b;
390
        }
391

    
392
        /**
393
         * DOCUMENT ME!
394
         */
395
        private void delLayer() {
396
                int[] indices = lstSelectedLayers.getSelectedIndices();
397

    
398
                ArrayList removeList = new ArrayList();
399
        JDnDListModel modelo = ((JDnDListModel) lstSelectedLayers.getModel()); 
400
        ArrayList elements = modelo.getElements();
401
        WMSLayerNode[] infos = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
402
        
403
                for (int i = 0; i < indices.length; i++) {
404
                        removeList.add(infos[indices[i]]);
405
                }
406

    
407
                modelo.delIndices(indices);
408
                lstSelectedLayers.clearSelection();
409
                listenerSupport.callStateChanged(true);
410
                //activarVisualizarBotones();
411

    
412
                refresh();
413
        
414
        }
415
        
416
        /**
417
     * Refreshes the content shown by this.
418
     */
419
    public void refresh() {
420
        refreshSRS();
421
        getLstSelectedLayers().repaint();
422
        refreshStyleTree();
423
        refreshDimensionTree();
424
        getTabInfo().refresh(dataSource, 
425
                             selectedLayersVector(),
426
                             getStyleTitles(),
427
                             getFormat(),
428
                             getSRS(),
429
                             getDimensions());
430
        
431
    }
432

    
433
    private void refreshDimensionTree() {
434
            int size = getLstSelectedLayers().getModel().getSize();
435
            
436
            WMSLayerNode dimensionRoot = new WMSLayerNode();
437
            dimensionRoot.setTitle(PluginServices.getText(this, "selected_themes"));
438
            
439
            DimensionTreeModel model = new DimensionTreeModel(dimensionRoot);
440
        jTabbedPane.setEnabledAt(dimensionTabIndex, false);
441
            for (int i=0; i<size; i++) {
442
                    WMSLayerNode node = (WMSLayerNode) getLstSelectedLayers().getModel().getElementAt(i);
443
                    WMSLayerNode myNode = new WMSLayerNode();
444
            myNode.setName(node.getName());
445
            myNode.setTitle(node.getTitle());
446
            if (node.getDimensions()==null)
447
                        continue;
448

    
449
            for (int j = 0; j < node.getDimensions().size(); j++) {
450
                    IFMapWMSDimension dim = (IFMapWMSDimension) node.getDimensions().get(j);
451
                myNode.addDimension(dim.getName(), dim.getUnit(), dim.getUnitSymbol(), dim.getExpression());
452
            }
453
            // If any of the layers defines dimensions, the tab will be enabled.
454
            if (model.addLayerBranch(myNode))
455
                jTabbedPane.setEnabledAt(dimensionTabIndex, true);
456
            }
457
            getDimensionTree().setModel(model);
458
        
459
        getDimensionTree().repaint();
460
    }
461
    /**
462
     * 
463
     */
464
    private void refreshStyleTree() {
465
        int size = getLstSelectedLayers().getModel().getSize();
466
        
467
        WMSLayerNode styleRoot = new WMSLayerNode();
468
        styleRoot.setTitle(PluginServices.getText(this, "selected_themes"));
469
        
470
        StylesTreeModel model = new StylesTreeModel(styleRoot);
471
        jTabbedPane.setEnabledAt(stylesTabIndex, false);
472
        for (int i=0; i<size; i++){
473
            WMSLayerNode node = (WMSLayerNode)getLstSelectedLayers().getModel().getElementAt(i);
474
            WMSLayerNode myNode = new WMSLayerNode();
475
            myNode.setName(node.getName());
476
            myNode.setTitle(node.getTitle());
477

    
478
            if (node.getStyles()==null)
479
                continue;
480

    
481
            for (int j = 0; j < node.getStyles().size(); j++) {
482
                FMapWMSStyle sty = (FMapWMSStyle) node.getStyles().get(j);
483
                myNode.addStyle(sty.name, sty.title, sty.styleAbstract);
484
            }
485

    
486
            // If any of the layers defines styles, the tab will be enabled.
487
            if (model.addLayerBranch(myNode)){
488
                jTabbedPane.setEnabledAt(stylesTabIndex, true);
489
            }
490
        }
491
        getStyleTree().setModel(model);
492
        getStyleTree().expandAll();
493
        getStyleTree().repaint();
494
    }
495
    
496
    /**
497
     * Gets the currently shown style tree.
498
     * @return
499
     */
500
    public StyleTree getStyleTree() {
501
        return getTabStyle().getStyleTree();
502
    }
503
    
504
    /**
505
     * Gets the currently shown style tree.
506
     * @return
507
     */
508
    public DimensionTree getDimensionTree() {
509
        return getTabDimensions().getDimensionTree();
510
    }
511

    
512
    /**
513
         * DOCUMENT ME!
514
         */
515
        private void addLayer() {
516
                boolean alguno = false;
517

    
518
                TreePath[] selecciones = getTreeLayers().getSelectionPaths();
519

    
520
                for (int i = 0; i < selecciones.length; i++) {
521
                        WMSLayerNode nodo = (WMSLayerNode) selecciones[i].getLastPathComponent();
522
                        if (nodo.getChildren().size()>0)
523
                // no es un nodo hijo
524
                continue;
525
                        //Se a?ade a la lista de layers seleccionados
526
                        JDnDListModel modelo = (JDnDListModel) lstSelectedLayers.getModel();
527

    
528
                        if (modelo.addElement(0, nodo.clone())) {
529
                                alguno = true;
530
                        }
531
            
532
                }
533

    
534
                if (alguno) {
535
                        refresh();
536
                }
537
        
538
        }
539
        
540
        /**
541
         * This method initializes lstSelectedLayers
542
         *
543
         * @return javax.swing.JList
544
         */
545
        public javax.swing.JList getLstSelectedLayers() {
546
                if (lstSelectedLayers == null) {
547
            lstSelectedLayers = new JDnDList();
548
                        lstSelectedLayers.setModel(selectedLayersModel);
549
                        lstSelectedLayers.setSelectionMode(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
550
                        lstSelectedLayers.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
551
                            public void valueChanged(javax.swing.event.ListSelectionEvent e) {
552
                                listenerSupport.callStateChanged(isCorretlyConfigured());
553
                            }
554
                        });
555
                }
556

    
557
                return lstSelectedLayers;
558
        }
559
    
560
        /**
561
         * This method initializes lstSRSs
562
         *
563
         * @return javax.swing.JList
564
         */
565
        public javax.swing.JList getLstSRSs() {
566
                if (lstSRSs == null) {
567
                        lstSRSs = new javax.swing.JList();
568
                        lstSRSs.setModel(new SRSListModel());
569
                        lstSRSs.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
570
                        lstSRSs.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
571
                                public void valueChanged(
572
                                                javax.swing.event.ListSelectionEvent e) {
573
                                        listenerSupport.callStateChanged(isCorretlyConfigured());
574
                                }
575
                        });
576
                }
577

    
578
                return lstSRSs;
579
        }
580

    
581
        /**
582
         * This method initializes lstFormats1
583
         *
584
         * @return javax.swing.JList
585
         */
586
        public javax.swing.JList getLstFormats() {
587
                if (lstFormats == null) {
588
                        lstFormats = new javax.swing.JList();
589
                        lstFormats.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
590
                        lstFormats.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
591
                                public void valueChanged(
592
                                                javax.swing.event.ListSelectionEvent e) {
593
                                        listenerSupport.callStateChanged(isCorretlyConfigured());
594
                                }
595
                        });
596
                }
597

    
598
                return lstFormats;
599
        }
600

    
601
        /**
602
         * DOCUMENT ME!
603
         */
604
        private void refreshSRS() {
605
        String oldSrs = (String) getLstSRSs().getSelectedValue();
606
        ArrayList elements = ((JDnDListModel) lstSelectedLayers.getModel()).getElements();
607
        WMSLayerNode[] layers = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
608
                
609

    
610
                if (layers.length == 0) {
611
                        lstSRSs.setModel(new DefaultListModel());
612
                } else {
613
                        TreeSet srsSet = new TreeSet();
614
                        srsSet.addAll(layers[0].getAllSrs());
615
            
616
            // I'm adding the layer specific SRS
617
            for (int i = 1; i < layers.length; i++) {
618
                                HashSet nuevo = new HashSet(layers[i].getAllSrs());
619
                try{
620
                    Iterator it = srsSet.iterator();
621
                                    while (it.hasNext()) {
622
                                        String srs = (String) it.next();
623
                                        
624
                                        if (!nuevo.contains(srs)) {
625
                                            srsSet.remove(srs);
626
                                        }
627
                                    }
628
                                } catch (ConcurrentModificationException e){
629
                    // just ignore it and wait the user for do something.
630
                    // this is tipically caused by a fast dialog manipulation.
631
                                }
632
                        }
633
            // And now, I'm adding the service SRS
634
            srsSet.addAll(((WMSLayerNode)getTreeLayers().getModel().getRoot()).getAllSrs());
635
            
636
                        DefaultListModel model = new DefaultListModel();
637
                        String[] array = (String[]) srsSet.toArray(new String[0]);
638

    
639
                        for (int i = 0; i < array.length; i++) {
640
                                model.addElement(array[i]);
641
                        }
642

    
643
                        lstSRSs.setModel(model);
644
                }
645
        int srsIndex = getSRSIndex( oldSrs );
646
        if (srsIndex!=-1)
647
            getLstSRSs().setSelectedIndex(srsIndex);
648
        
649
        }
650

    
651
        public void setListenerSupport(WizardListenerSupport support) {
652
                listenerSupport = support;
653
        }
654

    
655
        public void setWizardData(WMSWizardData data) {
656
                this.dataSource = data;
657
                ((JDnDListModel) getLstSelectedLayers().getModel()).clear();
658
                getLstSelectedLayers().repaint();
659
        
660
                getLstFormats().setModel(new FormatListModel(this.dataSource.getFormats()));
661
                getTreeLayers().setModel(new LayerTreeModel(this.dataSource.getLayer()));
662
        
663
        getTabInfo().refresh(dataSource, 
664
                             selectedLayersVector(),
665
                             getStyleTitles(),
666
                             getFormat(),
667
                             getSRS(),
668
                             getDimensions());
669
        }
670

    
671
        
672
    private Vector getStyleTitles() {
673
        return getTabStyle().getStyleTree().getStyleSelectionTitles();
674
    }
675

    
676
    /**
677
     * @return
678
     */
679
    private Vector selectedLayersVector() {
680
        JDnDListModel mod = (JDnDListModel) getLstSelectedLayers().getModel();
681
        Vector lyrs = new Vector();
682
        for (int i = 0; i < mod.getSize(); i++) {
683
            lyrs.add(mod.getElementAt(i));
684
        }
685
        return lyrs;
686
    }
687

    
688
    public String getFormat() {
689
                return (String) getLstFormats().getSelectedValue();
690
        }
691

    
692
        public String getLayersQuery() {
693
        ArrayList elements = ((JDnDListModel) getLstSelectedLayers().getModel()).getElements();
694
        WMSLayerNode[] layers = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
695
        
696
                //Nombre separado por comas de las capas
697
                String layersQuery = layers[0].getName();
698

    
699
                for (int i = 1; i < layers.length; i++) {
700
                        layersQuery += ("," + layers[i].getName());
701
                }
702

    
703
                return layersQuery;
704
                
705
        }
706

    
707
        public String getSRS() {
708
                return (String) getLstSRSs().getSelectedValue();
709
        }
710

    
711
        public String getLayerName() {
712
                return getJTxtNomCapa().getText();        
713
        }
714
        
715
    public Rectangle2D getLayersRectangle(){
716
        ArrayList elements = ((JDnDListModel) getLstSelectedLayers().getModel()).getElements();
717
        WMSLayerNode[] layers = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
718
        String[] layerNames = new String[layers.length];
719
        for (int i = 0; i < layerNames.length; i++) {
720
            layerNames[i] = layers[i].getName();
721
        }
722
        //Boundingbox de todas las capas
723
        ArrayList rectangulos = new ArrayList();
724
        
725
        Rectangle2D rect;
726
        
727
        for (int i = 0; i < layers.length; i++) {
728
            rect = dataSource.getBoundingBox(layerNames, getSRS());
729
            
730
            if (rect != null) {
731
                rectangulos.add(rect);
732
            }
733
        }
734
        
735
        rect = getRectangle((Rectangle2D.Double[]) rectangulos.toArray(
736
                new Rectangle2D.Double[0]));
737
        
738
        return rect;
739
    }
740
    
741
    public Rectangle2D _getLayersRectangle(){        
742
                TreePath[] layers = getSelectedLayers();
743
                
744
                //Boundingbox de todas las capas
745
                ArrayList rectangulos = new ArrayList();
746
                
747
                Rectangle2D rect;
748
                
749
                for (int i = 0; i < layers.length; i++) {
750
                        String[] rutaCapa = new String[layers[i].getPathCount()];
751
                        
752
                        for (int j = 0; j < layers[i].getPathCount(); j++) {
753
                                rutaCapa[j] = ((WMSLayerNode) layers[i].getPathComponent(j)).getTitle();
754
                        }
755
                        
756
                        rect = dataSource.getBoundingBox(rutaCapa, getSRS());
757
                        
758
                        if (rect != null) {
759
                                rectangulos.add(rect);
760
                        }
761
                }
762
                
763
                rect = getRectangle((Rectangle2D.Double[]) rectangulos.toArray(
764
                                new Rectangle2D.Double[0]));
765
                
766
                return rect;
767
        }
768

    
769
        public TreePath[] getSelectedLayers() {
770
                return getTreeLayers().getSelectionPaths();
771
        }
772
        
773
        /**
774
         * Obtiene el rect?ngulo que contiene a todos los otros
775
         *
776
         * @param rects rectangulos
777
         *
778
         * @return Rectangulo que contiene a todos los demas
779
         */
780
        private Rectangle2D getRectangle(Rectangle2D[] rects) {
781
                Rectangle2D ret = rects[0];
782

    
783
                for (int i = 1; i < rects.length; i++) {
784
                        ret.add(rects[i]);
785
                }
786

    
787
                return ret;
788
        }
789

    
790
    /**
791
     * The piece of the GetMap request that has the layer names.
792
     * @return
793
     */
794
        public String getQueryableLayerQuery() {
795
        ArrayList elements = ((JDnDListModel) getLstSelectedLayers().getModel()).getElements();
796
        WMSLayerNode[] layers = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
797
        //Nombre separado por comas de las capas
798
                String layersQuery = "";
799
                int i;
800

    
801
                for (i = 0; i < layers.length; i++) {
802
                        if (layers[i].isQueryable()) {
803
                                layersQuery = layers[i].getName();
804

    
805
                                break;
806
                        }
807
                }
808

    
809
                for (int j = i + 1; j < layers.length; j++) {
810
                        if (layers[j].isQueryable()) {
811
                                layersQuery += ("," + layers[j].getName());
812
                        }
813
                }
814

    
815
                return layersQuery;
816
        }
817

    
818
        /**
819
         * Returns the index of the CRS within the CRS list.
820
         * 
821
         * Devuelve la posicion que ocupa el CRS en la lista de CRS
822
         * 
823
         * @param crs
824
         * @return The CRS's index if it exists, -1 if it not exists.
825
         */
826
        public int getSRSIndex(String crs) {
827
                for (int i=0; i<getLstSRSs().getModel().getSize(); i++){
828
                        if (crs!=null && crs.equals(getLstSRSs().getModel().getElementAt(i)))
829
                                return i;
830
                }
831
                return -1;
832
        }
833
        
834
        /**
835
         * Returns the index of the format within the formats list.
836
         * 
837
         * Devuelve la posicion que ocupa el formato en la lista de formatos
838
         * @param format
839
         * 
840
         * @return The format's index if it exists, -1 if it not exists.
841
         */
842
        public int getFormatIndex(String format) {
843
                for (int i=0; i<getLstFormats().getModel().getSize(); i++){
844
                        if (format!=null && format.equals(getLstFormats().getModel().getElementAt(i)))
845
                                return i;
846
                }
847
                return -1;
848
        }
849

    
850
        /**
851
         * This method initializes jTabbedPane        
852
         *         
853
         * @return javax.swing.JTabbedPane        
854
         */    
855
        public JTabbedPane getJTabbedPane() {
856
                if (jTabbedPane == null) {
857
                        jTabbedPane = new JTabbedPane();
858
                        jTabbedPane.setBounds(3, 3, 475, 415);
859
            InfoPanel ip = getTabInfo();
860
            ip.addFocusListener(new FocusListener(){
861
                public void focusGained(FocusEvent e) {
862
                    getTabInfo().refresh(dataSource, 
863
                                         selectedLayersVector(),
864
                                         getStyleTitles(),
865
                                         getFormat(),
866
                                         getSRS(),
867
                                         getDimensions());
868
                }
869
                public void focusLost(FocusEvent e) {
870
                }
871
            });
872
            
873
            StylesPanel sp = getTabStyle();
874
            DimensionPanel dp = getTabDimensions();
875
            
876
            
877
                        jTabbedPane.addTab(PluginServices.getText(this, "info"), null, ip, null);
878
                        jTabbedPane.addTab(PluginServices.getText(this, "capas"), null, getTabLayers(), null);
879
                        jTabbedPane.addTab(PluginServices.getText(this, "estilos"), null, sp, null);
880
            stylesTabIndex = jTabbedPane.getTabCount()-1;
881
            jTabbedPane.addTab(PluginServices.getText(this, "dimensiones"), null, dp, null);
882
            dimensionTabIndex = jTabbedPane.getTabCount()-1;
883
            jTabbedPane.addTab(PluginServices.getText(this, "formatos"), null, getTabFormats(), null);
884
            jTabbedPane.setEnabledAt(dimensionTabIndex, false);
885
            jTabbedPane.setEnabledAt(stylesTabIndex, false);
886
                }
887
                return jTabbedPane;
888
        }
889

    
890
        /**
891
         * This method initializes jPanel        
892
         *         
893
         * @return javax.swing.JPanel        
894
         */    
895
        private JPanel getTabLayers() {
896
                if (tabLayers == null) {
897
                        tabLayers = new JPanel();
898
                        tabLayers.setLayout(null);
899
                        tabLayers.add(getJPanel4(), null);
900
                        tabLayers.add(getJPanel2(), null);
901
                }
902
                return tabLayers;
903
        }
904

    
905
        /**
906
         * This method initializes jPanel1        
907
         *         
908
         * @return javax.swing.JPanel        
909
         */    
910
        private JPanel getJPanel1() {
911
                if (jPanel1 == null) {
912
                        jPanel1 = new JPanel();
913
                        jPanel1.setLayout(null);
914
            jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(
915
                    null, PluginServices.getText(this, "seleccionar_formato"),
916
                    javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
917
                    javax.swing.border.TitledBorder.DEFAULT_POSITION, null, null));
918
                        jPanel1.setBounds(7, 10, 453, 194);
919
                        jPanel1.add(getJScrollPane6(), null);
920
                        jPanel1.add(getChkTransparency(), null);
921
                }
922
                return jPanel1;
923
        }
924

    
925
        /**
926
         * This method initializes jPanel5        
927
         *         
928
         * @return javax.swing.JPanel        
929
         */    
930
        private JPanel getJPanel5() {
931
                if (jPanel5 == null) {
932
                        jPanel5 = new JPanel();
933
                        jPanel5.setLayout(null);
934
            jPanel5.setBorder(javax.swing.BorderFactory.createTitledBorder(
935
                    null, PluginServices.getText(this, "seleccionar_srs"),
936
                    javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
937
                    javax.swing.border.TitledBorder.DEFAULT_POSITION, null, null));
938
                        jPanel5.setBounds(7, 210, 453, 168);
939
                        jPanel5.add(getJScrollPane2(), null);
940
                }
941
                return jPanel5;
942
        }
943

    
944
        /**
945
         * This method initializes jPanel6        
946
         *         
947
         * @return javax.swing.JPanel        
948
         */    
949
        public StylesPanel getTabStyle() {
950
                if (tabStyle == null) {
951
                        tabStyle = new StylesPanel();
952
            tabStyle.setEnabled(false);
953
                }
954
                return tabStyle;
955
        }
956
                
957
        /**
958
         * Sets the focus to the tab next to the current one.
959
         * 
960
         * Enfoca a la solapa siguiente a la actualmente enfocada del TabbedPane
961
         *
962
         */
963
        public void avanzaTab(){
964
                int currentPage = currentPage();
965
                int nPages = getNumTabs();
966
                if (nPages -1 > currentPage){
967
                        getJTabbedPane().setSelectedIndex(nextEnabledPage());
968
                }
969
        }
970
        
971
        /**
972
         * Sets the focus to the tab previous to the current one. 
973
         * 
974
         * Enfoca a la solapa anterior a la actualmente enfocada del TabbedPane
975
         * 
976
         */
977
        public void retrocedeTab(){
978
                this.getJTabbedPane().setSelectedIndex(previousEnabledPage());
979
                
980
        }
981
    /**
982
     * Returns the index of the current tab.
983
     * 
984
     * Devuelve el ?ndice de la p?gina actual del wizard.
985
     * 
986
     * @return
987
     */
988
    public int currentPage(){
989
        return getJTabbedPane().getSelectedIndex();
990
    }
991
    
992
        /**
993
         * Returns the tab amount that the WMSParamsPanel currently have
994
         * 
995
         * Devuelve el n?mero de solapas que tiene actualmente el WMSParamsPanel
996
         * 
997
         * @return int
998
         */
999
        public int getNumTabs(){
1000
                return getJTabbedPane().getTabCount();
1001
        }
1002
        
1003
    
1004
        /**
1005
     * <p>
1006
     * Returns the index of the previous enabled tab.
1007
     * </p>
1008
     * <p>
1009
     * Devuelve el ?ndice de la anterior p?gina habilitada del wizard o -1 si no hay
1010
     * ninguna.
1011
     * </p>
1012
    * @return The index, or -1 if there is no one.
1013
     */
1014
    public int previousEnabledPage(){
1015
        int currentPage = currentPage();
1016
        int j=0;
1017
        if (currentPage == 0)
1018
            j= -1;
1019
        for (int i = currentPage-1; i>-1; i--){
1020
            if (getJTabbedPane().isEnabledAt(i)){
1021
                j= i;
1022
                    break;
1023
            }
1024
        }
1025
        return j;
1026
    }
1027
    
1028
    /**
1029
     * <p>
1030
     * Returns the previous of the previous enabled tab.
1031
     * </p>
1032
     * <p>
1033
     * Devuelve el ?ndice de la siguiente p?gina habilitada del wizard o -1 si no hay
1034
     * ninguna.
1035
     * </p>
1036
     * @return The index, or -1 if there is no one.
1037
     */
1038
    public int nextEnabledPage() {
1039
        int currentPage = currentPage();
1040
        int nPages = getNumTabs();
1041
        if (currentPage == nPages)
1042
                return -1;
1043
        for (int i=currentPage+1; i<nPages; i++){
1044
            if (getJTabbedPane().isEnabledAt(i)){
1045
                return i;
1046
            }
1047
        }
1048
        return -1;
1049
    }
1050

    
1051
    /**
1052
     * This method initializes chkTrasparency        
1053
     *         
1054
     * @return javax.swing.JCheckBox        
1055
     */    
1056
    public JCheckBox getChkTransparency() {
1057
            if (chkTransparency == null) {
1058
                    chkTransparency = new JCheckBox();
1059
            chkTransparency.setText(PluginServices.getText(this, "wms_transparency"));
1060
            chkTransparency.setSelected(true);
1061
                    chkTransparency.setBounds(5, 168, 441, 21);
1062
            }
1063
            return chkTransparency;
1064
    }
1065

    
1066
    
1067
    /**
1068
     * Returns a vector of strings containing the styles selected for the
1069
     * layers. A blank style is correct and means that default style will 
1070
     * be used.
1071
     * 
1072
     * @return Vector
1073
     */
1074
    public Vector getStyles() {
1075
        return getTabStyle().getStyleTree().getStylesSelection();
1076
    }
1077

    
1078
    /**
1079
     * This method initializes tabInfo        
1080
     *         
1081
     * @return javax.swing.JPanel        
1082
     */    
1083
    private InfoPanel getTabInfo() {
1084
            if (tabInfo == null) {
1085
                    tabInfo = new InfoPanel();
1086
                    
1087
            }
1088
            return tabInfo;
1089
    }
1090

    
1091

    
1092

    
1093

    
1094

    
1095
    /**
1096
     * This method initializes tabDimension        
1097
     *         
1098
     * @return javax.swing.JPanel        
1099
     */    
1100
    private DimensionPanel getTabDimensions() {
1101
            if (tabDimensions == null) {
1102
                    tabDimensions = new DimensionPanel();
1103
            tabDimensions.setEnabled(false);
1104
            
1105
            }
1106
            return tabDimensions;
1107
    }
1108

    
1109
    
1110

    
1111
    /**
1112
     * @return
1113
     */
1114
    public boolean getTransparency() {
1115
        return getChkTransparency().isEnabled();
1116
    }
1117

    
1118
    /**
1119
     * @return
1120
     */
1121
    public Vector getDimensions() {
1122
        return getDimensionTree().getDimensions();
1123
    }
1124
}  //  @jve:decl-index=0:visual-constraint="10,10"
1125

    
1126

    
1127
/**
1128
 * Panel de informaci?n del Service
1129
 */
1130

    
1131
class InfoPanel extends JPanel {
1132
    private final String bgColor0 = "\"#FEEDD6\""; // light salmon
1133
    private final String bgColor1 = "\"#EAEAEA\""; // light grey
1134
    private final String bgColor2 = "\"#F2FEFF\""; // light blue
1135
    private final String bgColor3 = "\"#FBFFE1\""; // light yellow
1136
    
1137
    private final String service_title       = PluginServices.getText(this, "service_info");
1138
    private final String server              = PluginServices.getText(this, "server");
1139
    private final String server_type         = PluginServices.getText(this, "server_type");
1140
    private final String server_abstract     = PluginServices.getText(this, "server_abstract");
1141
    private final String server_title        = PluginServices.getText(this, "server_title");
1142
    private final String layers_title        = PluginServices.getText(this, "selected_layers");
1143
    private final String layer_title         = PluginServices.getText(this, "layer_title");
1144
    private final String layer_abstract      = PluginServices.getText(this, "layer_abstract");
1145
    private final String selected_dimensions = PluginServices.getText(this, "selected_dimensions");
1146
    private final String style               = PluginServices.getText(this, "style");
1147
    private final String format_title        = PluginServices.getText(this, "format");
1148
    private final String srs_title           = "SRS";
1149
        private JEditorPane editor = null;
1150
    
1151
    
1152
    
1153
        public InfoPanel() {
1154
                super();
1155
        setLayout(null);
1156
        JScrollPane src = new JScrollPane();
1157
        src.setBounds(5, 5, 455, 375);
1158
        add(src, null);
1159
        src.setViewportView(getEditor());
1160
        }
1161

    
1162
    /**
1163
     * This method initializes tblInfo  
1164
     *  
1165
     * @return javax.swing.JTable   
1166
     */    
1167
    private JEditorPane getEditor() {
1168
        if (editor == null) {
1169
            editor = new JEditorPane(); 
1170
        }
1171
        return editor;
1172
    }
1173

    
1174
    
1175
    /**
1176
     * Rellena la tabla de datos de informaci?n del servicio.
1177
     * @param dataSource
1178
     */
1179
    
1180
    public void refresh(WMSWizardData dataSource, Vector layers, Vector styles, String format, String srs, Vector dimensions) {
1181
        
1182
        String server_text = dataSource.getHost();
1183
        String server_type_text = dataSource.getServerType();
1184
        String server_title_text = dataSource.getTitle(); 
1185
        String server_abstract_text = dataSource.getAbstract();
1186
        
1187
        if (server_text == null) 
1188
            server_text = "-";
1189
        if (server_type_text == null)
1190
            server_type_text = "-";
1191
        if (server_title_text == null)
1192
            server_title_text = "-";
1193
        if (server_abstract_text == null)
1194
            server_abstract_text = "-";
1195
        
1196
        if (format == null)
1197
            format = PluginServices.getText(this, "none_selected");
1198
        if (srs == null)
1199
            srs = PluginServices.getText(this, "none_selected");
1200
        
1201
        String layers_html = "";
1202
        for (int i = 0; i < layers.size(); i++) {
1203
            WMSLayerNode layer = (WMSLayerNode) layers.get(i);
1204
            String style_title = (String) styles.get(i);//((FMapWMSStyle) selectedStyles.get(i)).title;
1205
            String layer_abstract_text = layer.getAbstract();
1206
            String layer_title_text = layer.getTitle();
1207
            String layer_html =
1208
                "  <tr valign=\"top\">" +
1209
                "     <td width=\"119\" height=\"18\" bgcolor=\"#D6D6D6\" align=\"right\"><font face=\"Arial\" size=\"3\"><b>"+layer_title+"</b></font></td>" +
1210
                "     <td width=\"322\" height=\"18\" bgcolor="+bgColor1+"><font face=\"Arial\" size=\"3\">"+layer_title_text+"</font></td>" +
1211
                "  </tr>" +
1212
                "  <tr valign=\"top\">" +
1213
                "     <td bgcolor=\"#D6D6D6\" align=\"right\"><font face=\"Arial\" size=\"3\" align=\"right\"><b>"+layer_abstract+"</b></font></td>" +
1214
                "     <td bgcolor="+bgColor0+"><font face=\"Arial\" size=\"3\">"+layer_abstract_text+"</font></td>" +
1215
                "  </tr>" +
1216
                "  <tr valign=\"top\">" +
1217
                "     <td bgcolor=\"#D6D6D6\" align=\"right\"><font face=\"Arial\" size=\"3\" align=\"right\"><b>"+style+"</b></font></td>" +
1218
                "     <td bgcolor="+bgColor2+"><font face=\"Arial\" size=\"3\">"+style_title+"</font></td>" +
1219
                "  </tr>" +
1220
                "  <tr>" +
1221
                "  </tr>";
1222
            layers_html += layer_html;
1223
        }
1224
        if (!layers_html.equals(""))
1225
            layers_html =
1226
                "  <tr valign=\"top\" bgcolor=\"#FFFFFF\">" +
1227
                "    <td width=\"92\" height=\"18\" bgcolor="+bgColor3+" colspan=\"2\"><font face=\"Arial\" size=\"4\"><b>"+layers_title+"</font></b></td>" +
1228
                "  </tr>" + layers_html;
1229
        String dimension_html = "";
1230
        boolean swap = false;
1231
        for (int i = 0; i < dimensions.size(); i++) {
1232
            String color = swap ? bgColor0 : bgColor1;
1233
            String[] dimension = ((String) dimensions.get(i)).split("=");
1234
            dimension_html +=
1235
                "  <tr valign=\"top\" bgcolor="+color+">" +
1236
                "    <td width=\"120\" height=\"18\" bgcolor=\"#D6D6D6\" align=\"right\"><b>"+dimension[0]+"</b></td>" +
1237
                "    <td width=\"322\" height=\"18\">"+dimension[1]+"</td>" +
1238
                "  </tr>";
1239
            swap = !swap;
1240
        }
1241
            
1242
        if (!dimension_html.equals(""))
1243
            dimension_html = 
1244
              "  <tr valign=\"top\">" +
1245
              "    <td width=\"92\" height=\"18\" bgcolor="+bgColor3+" colspan=\"2\"><font face=\"Arial\" size=\"4\"><b>"+selected_dimensions+"</font></b></td>" +
1246
              "  </tr>" + dimension_html;
1247
        String html = 
1248

    
1249
            "<html>" +
1250
            "<body>" +
1251
            "<p>" +
1252
            "<table align=\"center\" width=\"437\" height=\"156\" border=\"0\" cellpadding=\"4\" cellspacing=\"4\">" +
1253
            "  <tr valign=\"top\" bgcolor=\"#FFFFFF\">" +
1254
            "    <td width=\"92\" height=\"18\" bgcolor="+bgColor3+" colspan=\"2\"><font face=\"Arial\" size=\"4\"><b>"+service_title+"</font></b></td>" +
1255
            "  </tr>" +
1256
            "  <tr valign=\"top\" bgcolor="+bgColor0+">" +
1257
            "    <td width=\"92\" height=\"18\" bgcolor=\"#D6D6D6\" align=\"right\"><font face=\"Arial\" size=\"3\"><b>"+server+"</font></b></td>" +
1258
            "    <td width=\"268\"><font face=\"Arial\" size=\"3\">"+server_text+"</font></td>" +
1259
            "  </tr>" +
1260
            "  <tr valign=\"top\" bgcolor="+bgColor1+">" +
1261
            "    <td height=\"18\" bgcolor=\"#D6D6D6\" align=\"right\"><font face=\"Arial\" size=\"3\"><b>"+server_type+"</b></font></td>" +
1262
            "    <td><font face=\"Arial\" size=\"3\">"+server_type_text+"</font></td>" +
1263
            "  </tr>" +
1264
            "  <tr valign=\"top\" bgcolor="+bgColor0+">" +
1265
            "    <td height=\"18\" bgcolor=\"#D6D6D6\" align=\"right\"><font face=\"Arial\" size=\"3\"><b>"+server_title+"</b></font></td>" +
1266
            "    <td><font face=\"Arial\" size=\"3\"><font face=\"Arial\" size=\"3\">"+server_title_text+"</font></td>" +
1267
            "  </tr>" +
1268
            "  <tr valign=\"top\" bgcolor="+bgColor1+">" +
1269
            "    <td height=\"18\" bgcolor=\"#D6D6D6\" align=\"right\"><font face=\"Arial\" size=\"3\"><b>"+server_abstract+"</font></b></td>" +
1270
            "    <td><font face=\"Arial\" size=\"3\">"+server_abstract_text+"</font></td>" +
1271
            "  </tr>" +
1272
            "  <tr valign=\"top\" bgcolor="+bgColor0+">" +
1273
            "    <td height=\"18\" bgcolor=\"#D6D6D6\" align=\"right\"><font face=\"Arial\" size=\"3\"><b>"+format_title+"</b></font></td>" +
1274
            "    <td><font face=\"Arial\" size=\"3\"><font face=\"Arial\" size=\"3\">"+format+"</font></td>" +
1275
            "  </tr>" +
1276
            "  <tr valign=\"top\" bgcolor="+bgColor1+">" +
1277
            "    <td height=\"18\" bgcolor=\"#D6D6D6\" align=\"right\"><font face=\"Arial\" size=\"3\"><b>"+srs_title+"</font></b></td>" +
1278
            "    <td><font face=\"Arial\" size=\"3\">"+srs+"</font></td>" +
1279
            "  </tr>" +
1280
            
1281
            "  <tr>" +
1282
            "  </tr>" +
1283
            layers_html +
1284
            dimension_html +
1285
            "</table>" +
1286
            "</p>" +
1287
            "</body>" +
1288
            "</html>";
1289
        
1290
        getEditor().setContentType("text/html");
1291
        getEditor().setText(html);
1292
    }
1293
}
1294

    
1295
class StylesPanel extends JPanel{
1296
    private JScrollPane jScrollPane = null;
1297
    private StyleTree treeStyles = null;
1298
    public StylesPanel(){
1299
        super();
1300
        setLayout(null);
1301
        add(getJScrollPane(), null);
1302
    }
1303
    /**
1304
     * This method initializes jScrollPane3 
1305
     *  
1306
     * @return javax.swing.JScrollPane  
1307
     */    
1308
    private JScrollPane getJScrollPane() {
1309
        if (jScrollPane == null) {
1310
            jScrollPane = new JScrollPane();
1311
            jScrollPane.setBounds(7, 50, 455, 327);
1312
            jScrollPane.setViewportView(getStyleTree());
1313
        }
1314
        return jScrollPane;
1315
    }
1316
    
1317
    /**
1318
     * This method initializes treeStyles   
1319
     *  
1320
     * @return javax.swing.JTree    
1321
     */    
1322
    public StyleTree getStyleTree() {
1323
        if (treeStyles == null) {
1324
            treeStyles = new StyleTree();
1325
        }
1326
        return treeStyles;
1327
    }
1328
}
1329

    
1330
class DimensionPanel extends JPanel {
1331
    
1332
    private JScrollPane jScrollPane;
1333
    private DimensionTree tree;
1334

    
1335
    public DimensionPanel(){
1336
        super();
1337
        setLayout(null);
1338
        setLayout(null);
1339
        add(getJScrollPane(), null);
1340
        
1341
    }
1342
    /**
1343
     * This method initializes jScrollPane3 
1344
     *  
1345
     * @return javax.swing.JScrollPane  
1346
     */    
1347
    private JScrollPane getJScrollPane() {
1348
        if (jScrollPane == null) {
1349
            jScrollPane = new JScrollPane();
1350
            jScrollPane.setBounds(7, 50, 455, 327);
1351
            jScrollPane.setViewportView(getDimensionTree());
1352
        }
1353
        return jScrollPane;
1354
    }
1355
    
1356
    /**
1357
     * This method initializes treeStyles   
1358
     *  
1359
     * @return javax.swing.JTree    
1360
     */    
1361
    public DimensionTree getDimensionTree() {
1362
        if (tree == null) {
1363
            tree = new DimensionTree();
1364
        }
1365
        return tree;
1366
    }
1367
}