Statistics
| Revision:

svn-gvsig-desktop / branches / gvSIG_WMSv2 / extensions / extWMS / src / com / iver / cit / gvsig / gui / panels / WMSParamsPanel.java @ 3627

History | View | Annotate | Download (41.7 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 javax.swing.JTree 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.
198
                        tabFormats.add(getJPanel1(), null);
199
                        tabFormats.add(getJPanel5(), null);
200
                }
201

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

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

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

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

    
293
                return jTxtNomCapa;
294
        }
295

    
296

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

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

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

    
364
                return treeLayers;
365
        }
366
        
367

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
579
                return lstSRSs;
580
        }
581

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

    
599
                return lstFormats;
600
        }
601

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

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

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

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

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

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

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

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

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

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

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

    
704
                return layersQuery;
705
                
706
        }
707

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

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

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

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

    
788
                return ret;
789
        }
790

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

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

    
806
                                break;
807
                        }
808
                }
809

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

    
816
                return layersQuery;
817
        }
818

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

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

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

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

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

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

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

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

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

    
1092

    
1093

    
1094

    
1095

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

    
1110
    
1111

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

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

    
1127

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

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

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

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

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

    
1284
class StylesPanel extends JPanel{
1285
    private JScrollPane jScrollPane = null;
1286
    private StyleTree treeStyles = null;
1287
    public StylesPanel(){
1288
        super();
1289
        setLayout(null);
1290
        add(getJScrollPane(), null);
1291
    }
1292
    /**
1293
     * This method initializes jScrollPane3 
1294
     *  
1295
     * @return javax.swing.JScrollPane  
1296
     */    
1297
    private JScrollPane getJScrollPane() {
1298
        if (jScrollPane == null) {
1299
            jScrollPane = new JScrollPane();
1300
            jScrollPane.setBounds(7, 50, 455, 327);
1301
            jScrollPane.setViewportView(getStyleTree());
1302
        }
1303
        return jScrollPane;
1304
    }
1305
    
1306
    /**
1307
     * This method initializes treeStyles   
1308
     *  
1309
     * @return javax.swing.JTree    
1310
     */    
1311
    public StyleTree getStyleTree() {
1312
        if (treeStyles == null) {
1313
            treeStyles = new StyleTree();
1314
        }
1315
        return treeStyles;
1316
    }
1317
}
1318

    
1319
class DimensionPanel extends JPanel {
1320
    
1321
    private JScrollPane jScrollPane;
1322
    private DimensionTree tree;
1323

    
1324
    public DimensionPanel(){
1325
        super();
1326
        setLayout(null);
1327
        setLayout(null);
1328
        add(getJScrollPane(), null);
1329
        
1330
    }
1331
    /**
1332
     * This method initializes jScrollPane3 
1333
     *  
1334
     * @return javax.swing.JScrollPane  
1335
     */    
1336
    private JScrollPane getJScrollPane() {
1337
        if (jScrollPane == null) {
1338
            jScrollPane = new JScrollPane();
1339
            jScrollPane.setBounds(7, 50, 455, 327);
1340
            jScrollPane.setViewportView(getDimensionTree());
1341
        }
1342
        return jScrollPane;
1343
    }
1344
    
1345
    /**
1346
     * This method initializes treeStyles   
1347
     *  
1348
     * @return javax.swing.JTree    
1349
     */    
1350
    public DimensionTree getDimensionTree() {
1351
        if (tree == null) {
1352
            tree = new DimensionTree();
1353
        }
1354
        return tree;
1355
    }
1356
}