Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extWMS / src / com / iver / cit / gvsig / gui / panels / WMSParamsPanel.java @ 4473

History | View | Annotate | Download (40.2 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.Component;
44
import java.awt.Dimension;
45
import java.awt.event.FocusAdapter;
46
import java.awt.event.FocusEvent;
47
import java.awt.event.FocusListener;
48
import java.awt.event.MouseAdapter;
49
import java.awt.event.MouseEvent;
50
import java.awt.geom.Rectangle2D;
51
import java.util.AbstractCollection;
52
import java.util.ArrayList;
53
import java.util.Hashtable;
54
import java.util.TreeSet;
55
import java.util.Vector;
56
import java.util.prefs.Preferences;
57

    
58
import javax.swing.ImageIcon;
59
import javax.swing.JButton;
60
import javax.swing.JCheckBox;
61
import javax.swing.JOptionPane;
62
import javax.swing.JPanel;
63
import javax.swing.JTabbedPane;
64
import javax.swing.JTextField;
65
import javax.swing.tree.TreePath;
66

    
67
import org.cresques.cts.ICoordTrans;
68
import org.cresques.cts.IProjection;
69
import org.cresques.cts.ProjectionPool;
70
import org.cresques.cts.gt2.CoordSys;
71
import org.cresques.cts.gt2.CoordTrans;
72

    
73
import com.iver.andami.PluginServices;
74
import com.iver.andami.messages.NotificationManager;
75
import com.iver.cit.gvsig.fmap.drivers.wms.FMapWMSDriver;
76
import com.iver.cit.gvsig.fmap.exceptions.CannotReprojectException;
77
import com.iver.cit.gvsig.fmap.layers.FLayer;
78
import com.iver.cit.gvsig.fmap.layers.IFMapWMSDimension;
79
import com.iver.cit.gvsig.fmap.layers.WMSLayerNode;
80
import com.iver.cit.gvsig.fmap.layers.WMSLayerNode.FMapWMSStyle;
81
import com.iver.cit.gvsig.gui.WizardPanel;
82
import com.iver.cit.gvsig.gui.beans.controls.dnd.JDnDListModel;
83
import com.iver.cit.gvsig.gui.beans.listeners.BeanListener;
84
import com.iver.cit.gvsig.gui.wizards.FormatListModel;
85
import com.iver.cit.gvsig.gui.wizards.LayerTreeModel;
86
import com.iver.cit.gvsig.gui.wizards.SRSListModel;
87
import com.iver.cit.gvsig.gui.wizards.WMSWizardData;
88
import com.iver.cit.gvsig.gui.wizards.WizardListenerSupport;
89
/**
90
 * This class implements the map option panel.
91
 * 
92
 * It includes a set of Listeners that implement some control rules which
93
 * refresh the component values that depends on those selected in the other
94
 * components to avoid to choose an invalid set of options. It also includes a
95
 * method (isCorrectlyConfigured()) that checks if the current set of values is
96
 * enough to correctly launch a GetMap request.
97
 * 
98
 * The information is obtained from a WMSWizardDataSource object.
99
 * 
100
 * 
101
 * Esta clase implementa el panel de opciones disponibles sobre el mapa
102
 * 
103
 * Incluye una serie de Listeners que implementan unas reglas de control que
104
 * refrescan los valores de componentes cuyos valores dependen de aqu?llos 
105
 * seleccionados en otros componentes para evitar que se escoja una combinaci?n
106
 * de opciones err?nea as? como una funci?n (isCorrectlyConfigured()) que
107
 * comprueba si la combinaci?n escogida actualmente es suficiente para lanzar
108
 * una operaci?n GetMap correctamente.
109
 * 
110
 * La informaci?n obtiene a partir de un objeto WMSWizardDataSource.
111
 * 
112
 * @author jaume - jaume dominguez faus
113
 *
114
 */
115
public class WMSParamsPanel extends WizardPanel {
116
        
117
        private javax.swing.JScrollPane jScrollPane1 = null;
118
        private javax.swing.JScrollPane jScrollPane2 = null;
119
        private javax.swing.JScrollPane jScrollPane5 = null;
120
        private javax.swing.JButton btnAdd = null;
121
        private javax.swing.JButton btnDel = null;
122
        private javax.swing.JScrollPane jScrollPane6 = null;
123
        private javax.swing.JPanel jPanel2 = null;
124
        private javax.swing.JPanel tabFormats = null;
125
        private JPanel jPanel4 = null;
126
        private JTextField jTxtNomCapa = null;
127
        private LayerList lstSelectedLayers = null;
128
        private ArrayList selectedPaths = new ArrayList();
129
        private javax.swing.JList lstSRSs = null;
130
        private LayerTree treeLayers = null;
131
        private javax.swing.JList lstFormats = null;
132
        private JDnDListModel selectedLayersModel = new JDnDListModel();
133
        private WizardListenerSupport listenerSupport;
134
        public WMSWizardData dataSource;
135
        private JTabbedPane jTabbedPane = null;
136
        private JPanel tabLayers = null;
137
        private JPanel jPanel1 = null;
138
        private JPanel jPanel5 = null;
139
        private StylesPanel tabStyle = null;
140
        private JCheckBox chkTransparency = null;
141
    private InfoPanel tabInfo = null;
142
    private DimensionPanel tabDimensions = null;
143
    private int dimensionTabIndex;
144
    private int stylesTabIndex;
145
    private String oldSRS = null;
146
        //private HashMap oldStyles = null;
147
    //private Hashtable oldStyles = null;
148
        private AbstractCollection oldDimensions = null;
149
        private Dimension sizeFixed;
150
        private JCheckBox chkExtendedNames = null;
151
        private JButton btnUp = null;
152
        private JButton btnDown = null;
153
        public static Preferences fPrefs = Preferences.userRoot().node( "gvsig.wms-wizard" );
154
        private JCheckBox chkDisagregate = null;
155
    
156
    public WMSParamsPanel(){
157
                super();
158
                initialize();
159
        }
160
    
161
    //TODO: crear nuevo constructor para a?adir los panels que quieras...    
162
    public WMSParamsPanel(WMSWizardData data)
163
    {            
164
            super();
165
            setWizardData(data);
166
                this.setLayout(null);
167
                this.setVisible(false);
168
                this.setBounds(10, 5, 481, 427);
169
                                
170
                if (jTabbedPane == null) {
171
                        jTabbedPane = new JTabbedPane();
172
                        jTabbedPane.setBounds(3, 3, 475, 415);
173
            
174
            StylesPanel sp = getTabStyle();
175
            DimensionPanel dp = getTabDimensions();
176
                        
177
                        jTabbedPane.addTab(PluginServices.getText(this, "capas"), null, getTabLayers(), null);
178
                        jTabbedPane.addTab(PluginServices.getText(this, "estilos"), null, sp, null);
179
            stylesTabIndex = jTabbedPane.getTabCount()-1;
180
            jTabbedPane.addTab(PluginServices.getText(this, "dimensiones"), null, dp, null);
181
            dimensionTabIndex = jTabbedPane.getTabCount()-1;
182
            jTabbedPane.addTab(PluginServices.getText(this, "formatos"), null, getTabFormats(), null);
183
            jTabbedPane.setEnabledAt(dimensionTabIndex, false);
184
            jTabbedPane.setEnabledAt(stylesTabIndex, false);
185
                }
186
                this.add(jTabbedPane, null);
187
                
188
        setListenerSupport(new WizardListenerSupport());
189
    }
190
    
191
        
192
        /**
193
         * This method initializes panelPage2
194
         *
195
         * @return javax.swing.JPanel
196
         */
197
        private void initialize() {
198
                this.setLayout(null);
199
                this.setVisible(false);
200
                this.setBounds(10, 5, 481, 427);
201
                this.add(getJTabbedPane(), null);
202
        }
203
        /**
204
         * This method initializes jPanel2
205
         *
206
         * @return javax.swing.JPanel
207
         */
208
        private javax.swing.JPanel getJPanel2() {
209
                if (jPanel2 == null) {
210
                        jPanel2 = new javax.swing.JPanel();
211
                        jPanel2.setLayout(null);
212
                        jPanel2.setBounds(4, 59, 457, 328);
213
                        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(
214
                                        null, PluginServices.getText(this, "select_layers"),
215
                                        javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
216
                                        javax.swing.border.TitledBorder.DEFAULT_POSITION, null, null));
217
                        jPanel2.add(getChkExtendedNames(), null);
218
                        
219
                        jPanel2.add(getJScrollPane1(), null);
220
                        jPanel2.add(getBtnDel(), null);
221
                        jPanel2.add(getBtnAdd(), null);
222
                        jPanel2.add(getJScrollPane5(), null);
223
                        jPanel2.add(getBtnUp(), null);
224
                        jPanel2.add(getBtnDown(), null);
225
                        jPanel2.add(getChkDisagregate(), null);
226
                }
227

    
228
                return jPanel2;
229
        }
230
        
231
        /**
232
         * This method initializes jPanel4
233
         *
234
         * @return javax.swing.JPanel
235
         */
236
        private JPanel getJPanel4() {
237
                if (jPanel4 == null) {
238
                        jPanel4 = new JPanel();
239
                        jPanel4.setLayout(null);
240
                        jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder(
241
                                        null, PluginServices.getText(this, "layer_name"),
242
                                        javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
243
                                        javax.swing.border.TitledBorder.DEFAULT_POSITION, null, null));
244
                        jPanel4.setBounds(4, 8, 457, 49);
245
                        jPanel4.add(getJTxtNomCapa(), null);
246
                }
247

    
248
                return jPanel4;
249
        }
250
        
251
        /**
252
         * This method initializes jPanel3
253
         *
254
         * @return javax.swing.JPanel
255
         */
256
        private javax.swing.JPanel getTabFormats() {
257
                if (tabFormats == null) {
258
                        tabFormats = new javax.swing.JPanel();
259
                        tabFormats.setLayout(null);
260
                        tabFormats.add(getJPanel1(), null);
261
                        tabFormats.add(getJPanel5(), null);
262
                }
263

    
264
                return tabFormats;
265
        }
266
        /**
267
         * This method initializes jScrollPane1
268
         *
269
         * @return javax.swing.JScrollPane
270
         */
271
        private javax.swing.JScrollPane getJScrollPane1() {
272
                if (jScrollPane1 == null) {
273
                        jScrollPane1 = new javax.swing.JScrollPane();
274
                        jScrollPane1.setBounds(11, 22, 430, 123);
275
                        jScrollPane1.setViewportView(getTreeLayers());
276
                        jScrollPane1.setPreferredSize(new java.awt.Dimension(205, 75));
277
                }
278

    
279
                return jScrollPane1;
280
        }
281
        
282
        /**
283
         * This method initializes btnDel
284
         *
285
         * @return javax.swing.JButton
286
         */
287
        private javax.swing.JButton getBtnDel() {
288
                if (btnDel == null) {
289
                        btnDel = new javax.swing.JButton();
290
                        //btnDel.setPreferredSize(new java.awt.Dimension(23, 23));
291
                        btnDel.setText(PluginServices.getText(this, "remove"));
292
                        btnDel.setMargin(new java.awt.Insets(2, 0, 2, 0));
293
                        btnDel.setBounds(339, 300, 101, 20);
294
                        btnDel.setEnabled(false);
295
                        btnDel.addActionListener(new java.awt.event.ActionListener() {
296
                                        public void actionPerformed(java.awt.event.ActionEvent e) {
297
                                                delLayer();
298
                                        }
299
                                });
300
                }
301
                return btnDel;
302
        }
303
        
304
        /**
305
         * This method initializes btnAdd
306
         *
307
         * @return javax.swing.JButton
308
         */
309
        private javax.swing.JButton getBtnAdd() {
310
                if (btnAdd == null) {
311
                        btnAdd = new javax.swing.JButton();
312
                        //btnAdd.setPreferredSize(new java.awt.Dimension(23, 23));
313
                        btnAdd.setText(PluginServices.getText(this, "add"));
314
                        btnAdd.setMargin(new java.awt.Insets(2, 0, 2, 0));
315
                        btnAdd.setBounds(236, 300, 101, 20);
316
                        btnAdd.setEnabled(false);
317
                        btnAdd.addActionListener(new java.awt.event.ActionListener() {
318
                                        public void actionPerformed(java.awt.event.ActionEvent e) {
319
                                                addLayer();
320
                                        }
321
                                });
322
                }
323
                return btnAdd;
324
        }
325
        
326
        /**
327
         * This method initializes jScrollPane5
328
         *
329
         * @return javax.swing.JScrollPane
330
         */
331
        private javax.swing.JScrollPane getJScrollPane5() {
332
                if (jScrollPane5 == null) {
333
                        jScrollPane5 = new javax.swing.JScrollPane();
334
                        jScrollPane5.setBounds(47, 155, 394, 120);
335
                        jScrollPane5.setViewportView(getLstSelectedLayers());
336
                        jScrollPane5.setPreferredSize(new java.awt.Dimension(205, 75));
337
                }
338

    
339
                return jScrollPane5;
340
        }
341
        
342
        /**
343
         * This method initializes jTextField
344
         *
345
         * @return javax.swing.JTextField
346
         */
347
        private JTextField getJTxtNomCapa() {
348
                if (jTxtNomCapa == null) {
349
                        jTxtNomCapa = new JTextField();
350
                        jTxtNomCapa.setBounds(10, 19, 437, 20);
351
                        jTxtNomCapa.setText(PluginServices.getText(this, "WMSLayer"));
352
                        jTxtNomCapa.addKeyListener(new java.awt.event.KeyAdapter() { 
353
                                public void keyTyped(java.awt.event.KeyEvent e) {    
354
                                        fireWizardComplete(isCorrectlyConfigured());
355
                                }
356
                        });
357
                }
358

    
359
                return jTxtNomCapa;
360
        }
361

    
362

    
363
        /**
364
         * This method initializes jScrollPane6
365
         *
366
         * @return javax.swing.JScrollPane
367
         */
368
        private javax.swing.JScrollPane getJScrollPane6() {
369
                if (jScrollPane6 == null) {
370
                        jScrollPane6 = new javax.swing.JScrollPane();
371
                        jScrollPane6.setBounds(5, 23, 442, 140);
372
                        jScrollPane6.setViewportView(getLstFormats());
373
                        jScrollPane6.setPreferredSize(new java.awt.Dimension(250, 200));
374
                }
375

    
376
                return jScrollPane6;
377
        }
378
        
379
        /**
380
         * This method initializes jScrollPane2
381
         *
382
         * @return javax.swing.JScrollPane
383
         */
384
        private javax.swing.JScrollPane getJScrollPane2() {
385
                if (jScrollPane2 == null) {
386
                        jScrollPane2 = new javax.swing.JScrollPane();
387
                        jScrollPane2.setBounds(5, 23, 442, 141);
388
                        jScrollPane2.setViewportView(getLstSRSs());
389
                        jScrollPane2.setPreferredSize(new java.awt.Dimension(100, 200));
390
                }
391

    
392
                return jScrollPane2;
393
        }
394
        
395
        /**
396
         * Gets the available layers in WMS maintaining the tree structure
397
         * @return
398
         */
399
        public LayerTree getLayerStructure(){
400
                return treeLayers;
401
        }
402
        
403
        /**
404
         * This method initializes treeLayers
405
         *
406
         * @return javax.swing.JTree
407
         */
408
        private LayerTree getTreeLayers() {
409
                if (treeLayers == null) {
410
                        treeLayers = new LayerTree();
411
                        treeLayers.setRootVisible(true);
412
                        treeLayers.addMouseListener(new java.awt.event.MouseAdapter() { 
413
                                public void mouseClicked(java.awt.event.MouseEvent e) {    
414
                                        if (e.getClickCount() == 2){
415
                        addLayer();
416
                    }
417
                                }
418
                        });
419
                        treeLayers.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
420
                                        public void valueChanged(
421
                                                javax.swing.event.TreeSelectionEvent e) {
422
                                                
423
                        boolean isGetMapable = false; // pffff, jajaja
424
                        TreePath[] selecciones = getTreeLayers().getSelectionPaths();
425
                        if (selecciones!=null) // no entenc perqu? peta ac? i li arriba null a voltes...
426
                        {
427
                                for (int i = 0; i < selecciones.length && !isGetMapable; i++) {
428
                                        WMSLayerNode layer = ((WMSLayerNode) selecciones[i].getLastPathComponent());
429
                                        isGetMapable = layer.getChildren().size()==0 || layer.getName()!=null;
430
                                }
431
                                
432
                        }
433
                        getBtnAdd().setEnabled(isGetMapable);
434
                            fireWizardComplete(isCorrectlyConfigured());
435
                                        }
436
                                });
437
                }
438

    
439
                return treeLayers;
440
        }
441
        
442

    
443
    /**
444
         * This method checks for the options selected within the configuration dialog are 
445
         * correct and enough to perform a GetMap request.
446
         * @return true if you're done, false if not.
447
         */
448
        public boolean isCorrectlyConfigured() {
449
        
450
                boolean b;
451
        this.repaint();
452
                if ((getLstSRSs().getSelectedIndex() != -1) &&
453
                                (getLstFormats().getSelectedIndex() != -1) &&
454
                                (getLstSelectedLayers().getModel().getSize() > 0)) {
455
                        b = true;
456
                } else {
457
                        b = false;
458
                }
459
        
460
        // Enable or disable del button.
461
                int[] selectedIndices = getLstSelectedLayers().getSelectedIndices();
462
                
463
        getBtnDel().setEnabled(
464
                        selectedIndices != null 
465
                && selectedIndices.length>0
466
                );
467
        
468
        return b;
469
        }
470
        
471
        public WMSLayerNode[] selectedLayersToArray() {
472
                JDnDListModel modelo = ((JDnDListModel) lstSelectedLayers.getModel()); 
473
        ArrayList elements = modelo.getElements();
474
        WMSLayerNode[] layers = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
475
        return layers;
476
        }
477
        
478
        /**
479
         * DOCUMENT ME!
480
         */
481
        private void delLayer() {
482
                int[] indices = lstSelectedLayers.getSelectedIndices();
483

    
484
                try {
485
                        ArrayList removeList = new ArrayList();
486
                        
487
                        WMSLayerNode[] infos = selectedLayersToArray();
488
                        JDnDListModel modelo = ((JDnDListModel) lstSelectedLayers.getModel()); 
489
                        
490
                        for (int i = 0; i < indices.length; i++) {
491
                                removeList.add(infos[indices[i]]);
492
                        }
493
                        
494
                        modelo.delIndices(indices);
495
                        lstSelectedLayers.clearSelection();
496
                        fireWizardComplete(isCorrectlyConfigured());
497
                        
498
                        refreshData();
499
                        refreshInfo();
500
                } catch (ArrayIndexOutOfBoundsException ex) {
501
                        // if you reach this, please, tell me how you did it.
502
                        ex.printStackTrace();
503
                }
504
        }
505
        
506
        /**
507
         * Fires a notification to this wizard listeners telling them if the
508
         * configuration is fair enough to send a GetMap request.
509
         * @param b
510
         */
511
        private void fireWizardComplete(boolean b){
512
                listenerSupport.callStateChanged(b);
513
                callStateChanged(b);
514
        }
515
        
516
        /**
517
     * Refreshes the content shown by this.
518
     */
519
    public void refreshData() {
520
        refreshSRS();
521
        getLstSelectedLayers().repaint();
522
        refreshStyleTree();
523
        refreshDimensions();
524
        
525
    }
526
    
527
    /**
528
     * Refreshes the info tab
529
     *
530
     */
531
    public void refreshInfo() {
532
            getTabInfo().refresh(dataSource, 
533
                selectedLayersVector(),
534
                getStyleTitles(),
535
                getFormat(),
536
                getSRS(),
537
                getDimensions());
538
    }
539

    
540
    private void refreshDimensions() {
541
            int size = getLstSelectedLayers().getModel().getSize();
542
            boolean enable = false;
543
            for (int i=0; i<size; i++) {
544
                    WMSLayerNode node = (WMSLayerNode) getLstSelectedLayers().getModel().getElementAt(i);
545
                    if (node.getDimensions()==null)
546
                        continue;
547

    
548
            for (int j = 0; j < node.getDimensions().size(); j++) {
549
                    IFMapWMSDimension dim = (IFMapWMSDimension) node.getDimensions().get(j);
550
                        
551
                    try {
552
                            getTabDimensions().addDimension(dim);
553
                            enable = true;
554
                    } catch (IllegalArgumentException e) {
555
                            NotificationManager.addWarning("Unrecognized dimension expression: " + dim.getExpression()
556
                                            + " (for " + dim.getName() + " in layer '"+node.getName()+"')", null);
557
                    }
558
            }
559
        }
560
            jTabbedPane.setEnabledAt(dimensionTabIndex, enable);
561
            
562
    }
563

    
564
    /**
565
     * 
566
     */
567
    private void refreshStyleTree() {
568
            
569
        int size = getLstSelectedLayers().getModel().getSize();
570
        WMSLayerNode styleRoot = new WMSLayerNode();
571
        styleRoot.setTitle(PluginServices.getText(this, "selected_themes"));
572
        
573
        StyleTreeModel model = new StyleTreeModel(styleRoot);
574
        jTabbedPane.setEnabledAt(stylesTabIndex, false);
575
        for (int i=0; i<size; i++){
576
            WMSLayerNode node = (WMSLayerNode) getLstSelectedLayers().getModel().getElementAt(i);
577
            // If any of the layers defines styles, the tab will be enabled.
578
            if (model.addLayerBranch(node)) {
579
                jTabbedPane.setEnabledAt(stylesTabIndex, true);
580
            }
581
        }
582
        
583
        getStyleTree().setModel(model);
584
        getStyleTree().expandAll();
585
        getStyleTree().repaint();
586
    }
587
    
588
    /**
589
     * Takes the array of selected layers and a vector containing the style names
590
     * and set them as selected in the styles panel
591
     * @param selectedLayers
592
     * @param styles
593
     */
594
    public void setStyleSelections(Vector styles) {
595
            
596
            WMSLayerNode[] layers = selectedLayersToArray();
597
            int length = layers.length;
598
            for (int i = 0; i < length; i++) {
599
                        String styleName = (String) styles.get(i);
600
                        layers[length - i - 1].setSelectedStyleByName(styleName);
601
                }
602
    }
603
    
604
    /**
605
     * Gets the currently shown style tree.
606
     * @return
607
     */
608
    private StyleTree getStyleTree() {
609
        return getTabStyle().getStyleTree();
610
    }
611
    
612
  
613

    
614
    /**
615
         * Method called when pressing the Add layer button or when double-clicking on
616
         * a layer from the server's layer tree.
617
         */
618
        private void addLayer() {
619
                boolean alguno = false;
620

    
621
                TreePath[] selecciones = getTreeLayers().getSelectionPaths();
622
                if (selecciones == null)
623
                        return;
624
                for (int i = 0; i < selecciones.length; i++) {
625
                        selectedPaths.add(selecciones[i]); 
626
                        WMSLayerNode nodo = (WMSLayerNode) selecciones[i].getLastPathComponent();
627
                        if (nodo.getName() == null || nodo.getName().equals(""))
628
                                // no es un node que es puga demanar
629
                                continue;
630
                        if (nodo.isSizeFixed()) {
631
                                if (sizeFixed == null)
632
                                        sizeFixed = nodo.getFixedSize();
633
                                else if ((sizeFixed.getHeight() != nodo.getFixedSize().getHeight()) ||
634
                                                 (sizeFixed.getWidth() != nodo.getFixedSize().getWidth())) {
635
                                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame()
636
                                                        ,PluginServices.getText(this, "server_cant_render_layers"));
637
                                        continue;
638
                                }
639
                        }
640
                        // s'afegeix a la llista de capes seleccionades
641
                        JDnDListModel modelo = (JDnDListModel) lstSelectedLayers.getModel();
642

    
643
                        if (modelo.addElement(0, nodo.clone())) {
644
                                alguno = true;
645
                        }
646
        }
647

    
648
                if (alguno) {
649
                        refreshData();
650
                }
651
        refreshInfo();
652
        }
653
        
654
        /**
655
         * This method initializes lstSelectedLayers
656
         *
657
         * @return javax.swing.JList
658
         */
659
        public LayerList getLstSelectedLayers() {
660
                if (lstSelectedLayers == null) {
661
            lstSelectedLayers = new LayerList();
662
                        lstSelectedLayers.setModel(selectedLayersModel);
663
                        lstSelectedLayers.setSelectionMode(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
664
                        lstSelectedLayers.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
665
                            public void valueChanged(javax.swing.event.ListSelectionEvent e) {
666
                                fireWizardComplete(isCorrectlyConfigured());
667
                            }
668
                        });
669
                        lstSelectedLayers.addMouseListener(new MouseAdapter(){
670
                                public void mouseReleased(MouseEvent e) {
671
                                        refreshData();        
672
                                }
673
                        });
674
                }
675

    
676
                return lstSelectedLayers;
677
        }
678
    
679
        /**
680
         * This method initializes lstSRSs
681
         *
682
         * @return javax.swing.JList
683
         */
684
        public javax.swing.JList getLstSRSs() {
685
                if (lstSRSs == null) {
686
                        lstSRSs = new javax.swing.JList();
687
                        lstSRSs.setModel(new SRSListModel());
688
                        lstSRSs.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
689
                        lstSRSs.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
690
                                public void valueChanged(
691
                                                javax.swing.event.ListSelectionEvent e) {
692
                                        int i = lstSRSs.getSelectedIndex();
693
                                        if (i!=-1)
694
                                                oldSRS = (String) lstSRSs.getModel().getElementAt(i);
695
                                        fireWizardComplete(isCorrectlyConfigured());
696
                                }
697
                        });
698
                }
699

    
700
                return lstSRSs;
701
        }
702

    
703
        /**
704
         * This method initializes lstFormats
705
         *
706
         * @return javax.swing.JList
707
         */
708
        public javax.swing.JList getLstFormats() {
709
                if (lstFormats == null) {
710
                        lstFormats = new javax.swing.JList();
711
                        lstFormats.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
712
                        lstFormats.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
713
                                public void valueChanged(javax.swing.event.ListSelectionEvent e) {
714
                                        fireWizardComplete(isCorrectlyConfigured());
715
                                }
716
                        });
717
                }
718

    
719
                return lstFormats;
720
        }
721

    
722
        /**
723
         * Refreshes the SRS list
724
         */
725
        private void refreshSRS() {
726
        ArrayList elements = ((JDnDListModel) lstSelectedLayers.getModel()).getElements();
727
        WMSLayerNode[] layers = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
728
                
729
                SRSListModel model = new SRSListModel(); 
730

    
731
                if (layers.length == 0) {
732
                        lstSRSs.setModel(model);//new DefaultListModel());
733
                        sizeFixed = null;
734
                } else {
735
                        TreeSet srsSet = new TreeSet();
736
                        srsSet.addAll(layers[0].getAllSrs());
737
                        model.setAll(srsSet);
738
                        for (int i = 1; i < layers.length; i++) {
739
                                model.setAll(model.intersect(layers[i].getAllSrs()));
740
                        }
741
                        lstSRSs.setModel(model);
742
                }
743
        int srsIndex = getSRSIndex( oldSRS );
744
        if (srsIndex!=-1)
745
            getLstSRSs().setSelectedIndex(srsIndex);
746
        
747
        }
748

    
749
        public void setListenerSupport(WizardListenerSupport support) {
750
                listenerSupport = support;
751
        }
752

    
753
        public void setWizardData(WMSWizardData data) {
754
                this.dataSource = data;
755
                ((JDnDListModel) getLstSelectedLayers().getModel()).clear();
756
                getLstSelectedLayers().repaint();
757
        
758
                getLstFormats().setModel(new FormatListModel(this.dataSource.getFormats()));
759
                getTreeLayers().setModel(new LayerTreeModel(this.dataSource.getLayer()));
760
        
761
        refreshInfo();
762
        }
763
        
764
    private Vector getStyleTitles() {
765
        return getTabStyle().getStyleTree().getStyleSelectionTitles();
766
    }
767

    
768
    /**
769
     * @return
770
     */
771
    private Vector selectedLayersVector() {
772
        JDnDListModel mod = (JDnDListModel) getLstSelectedLayers().getModel();
773
        Vector lyrs = new Vector();
774
        for (int i = 0; i < mod.getSize(); i++) {
775
            lyrs.add(mod.getElementAt(i));
776
        }
777
        return lyrs;
778
    }
779

    
780
    public String getFormat() {
781
                return (String) getLstFormats().getSelectedValue();
782
        }
783

    
784
        public String getLayersQuery() {
785
        ArrayList elements = ((JDnDListModel) getLstSelectedLayers().getModel()).getElements();
786
        WMSLayerNode[] layers = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
787
        
788
                //Nombre separado por comas de las capas
789
                String layersQuery = layers[layers.length-1].getName();
790

    
791
                for (int i = layers.length-2; i >= 0; i--) {
792
                        layersQuery += ("," + layers[i].getName());
793
                }
794

    
795
                return layersQuery;
796
                
797
        }
798

    
799
        /**
800
         * Returns the current selected SRS.
801
         * @return
802
         */
803
        public String getSRS() {
804
                return (String) getLstSRSs().getSelectedValue();
805
        }
806

    
807
        /**
808
         * Returns the name of the layer that the user has typed-in 
809
         * @return
810
         */
811
        public String getLayerName() {
812
                return getJTxtNomCapa().getText();        
813
        }
814
        
815
        public void setLayerName(String name) {
816
                getJTxtNomCapa().setText(name);        
817
        }
818
        
819
    public Rectangle2D getLayersRectangle() throws CannotReprojectException{
820
        ArrayList elements = ((JDnDListModel) getLstSelectedLayers().getModel()).getElements();
821
        WMSLayerNode[] layers = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
822
        String[] layerNames = new String[layers.length];
823
        for (int i = 0; i < layerNames.length; i++) {
824
            layerNames[i] = layers[i].getName();
825
        }
826
        //Boundingbox de todas las capas
827
        //ArrayList rectangulos = new ArrayList();
828
        
829
        Rectangle2D rect;
830
        String latLonID;
831
        
832
        rect = dataSource.getBoundingBox(layerNames, getSRS());
833
        if(rect == null) {
834
                latLonID = "EPSG:4326";
835
                rect = dataSource.getBoundingBox(layerNames, latLonID);
836
                if (rect == null) {
837
                        rect = dataSource.getBoundingBox(layerNames, "CRS:84");
838
                }
839
                
840
                   IProjection reqProj = ProjectionPool.get(getSRS());
841
                IProjection latLonProj = ProjectionPool.get(latLonID);                    
842
                if ((reqProj != null) && (latLonProj != null)) {
843
                    ICoordTrans ct = new CoordTrans((CoordSys) latLonProj, (CoordSys) reqProj);
844
                    Rectangle2D reprojectedRect;
845
                    reprojectedRect = ct.convert(rect);
846
                    rect = reprojectedRect;
847
                } else {
848
                        throw new CannotReprojectException(PluginServices.getText(this, "cannotReproject") + " " + getSRS() + " -> " + latLonID);
849
                }
850
        }
851
            
852
        return rect;
853
    }
854
    
855
        public TreePath[] getSelectedLayers() {
856
                return getTreeLayers().getSelectionPaths();
857
        }
858
        
859
        public Hashtable getOnlineResources() {
860
                return dataSource.getOnlineResources();
861
        }
862

    
863
    /**
864
     * The piece of the GetMap request that has the layer names.
865
     * @return
866
     */
867
        public String getQueryableLayerQuery() {
868
        ArrayList elements = ((JDnDListModel) getLstSelectedLayers().getModel()).getElements();
869
        WMSLayerNode[] layers = (WMSLayerNode[]) elements.toArray(new WMSLayerNode[0]);
870
        //Nombre separado por comas de las capas
871
                String layersQuery = "";
872
                int i;
873

    
874
                for (i = 0; i < layers.length; i++) {
875
                        if (layers[i].isQueryable()) {
876
                                layersQuery = layers[i].getName();
877

    
878
                                break;
879
                        }
880
                }
881

    
882
                for (int j = i + 1; j < layers.length; j++) {
883
                        if (layers[j].isQueryable()) {
884
                                layersQuery += ("," + layers[j].getName());
885
                        }
886
                }
887

    
888
                return layersQuery;
889
        }
890

    
891
        /**
892
         * Returns the index of the CRS within the CRS list.
893
         * 
894
         * Devuelve la posicion que ocupa el CRS en la lista de CRS
895
         * 
896
         * @param crs
897
         * @return The CRS's index if it exists, -1 if it not exists.
898
         */
899
        public int getSRSIndex(String crs) {
900
                for (int i=0; i<getLstSRSs().getModel().getSize(); i++){
901
                        if (crs!=null && crs.equals(getLstSRSs().getModel().getElementAt(i)))
902
                                return i;
903
                }
904
                return -1;
905
        }
906
        
907
        /**
908
         * Returns the index of the format within the formats list.
909
         * 
910
         * Devuelve la posicion que ocupa el formato en la lista de formatos
911
         * @param format
912
         * 
913
         * @return The format's index if it exists, -1 if it not exists.
914
         */
915
        public int getFormatIndex(String format) {
916
                for (int i=0; i<getLstFormats().getModel().getSize(); i++){
917
                        if (format!=null && format.equals(getLstFormats().getModel().getElementAt(i)))
918
                                return i;
919
                }
920
                return -1;
921
        }
922

    
923
        /**
924
         * This method initializes jTabbedPane        
925
         *         
926
         * @return javax.swing.JTabbedPane        
927
         */    
928
        public JTabbedPane getJTabbedPane() {
929
                if (jTabbedPane == null) {
930
                        jTabbedPane = new JTabbedPane();
931
                        jTabbedPane.setBounds(3, 3, 475, 415);
932
            InfoPanel ip = getTabInfo();
933
            ip.addFocusListener(new FocusListener(){
934
                public void focusGained(FocusEvent e) {
935
                    refreshInfo();
936
                }
937
                public void focusLost(FocusEvent e) {
938
                }
939
            });
940
            
941
            StylesPanel sp = getTabStyle();
942
            DimensionPanel dp = getTabDimensions();
943
            
944
            
945
                        jTabbedPane.addTab(PluginServices.getText(this, "info"), null, ip, null);
946
                        jTabbedPane.addTab(PluginServices.getText(this, "capas"), null, getTabLayers(), null);
947
                        jTabbedPane.addTab(PluginServices.getText(this, "estilos"), null, sp, null);
948
            stylesTabIndex = jTabbedPane.getTabCount()-1;
949
            jTabbedPane.addTab(PluginServices.getText(this, "dimensiones"), null, dp, null);
950
            dimensionTabIndex = jTabbedPane.getTabCount()-1;
951
            jTabbedPane.addTab(PluginServices.getText(this, "formatos"), null, getTabFormats(), null);
952
            jTabbedPane.setEnabledAt(dimensionTabIndex, false);
953
            jTabbedPane.setEnabledAt(stylesTabIndex, false);
954
                }
955
                return jTabbedPane;
956
        }
957

    
958
        /**
959
         * This method initializes jPanel        
960
         *         
961
         * @return javax.swing.JPanel        
962
         */    
963
        private JPanel getTabLayers() {
964
                if (tabLayers == null) {
965
                        tabLayers = new JPanel();
966
                        tabLayers.setLayout(null);
967
                        tabLayers.add(getJPanel4(), null);
968
                        tabLayers.add(getJPanel2(), null);
969
                }
970
                return tabLayers;
971
        }
972

    
973
        /**
974
         * This method initializes jPanel1        
975
         *         
976
         * @return javax.swing.JPanel        
977
         */    
978
        private JPanel getJPanel1() {
979
                if (jPanel1 == null) {
980
                        jPanel1 = new JPanel();
981
                        jPanel1.setLayout(null);
982
            jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(
983
                    null, PluginServices.getText(this, "select_formats"),
984
                    javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
985
                    javax.swing.border.TitledBorder.DEFAULT_POSITION, null, null));
986
                        jPanel1.setBounds(7, 10, 453, 194);
987
                        jPanel1.add(getJScrollPane6(), null);
988
                        jPanel1.add(getChkTransparency(), null);
989
                }
990
                return jPanel1;
991
        }
992

    
993
        /**
994
         * This method initializes jPanel5        
995
         *         
996
         * @return javax.swing.JPanel        
997
         */    
998
        private JPanel getJPanel5() {
999
                if (jPanel5 == null) {
1000
                        jPanel5 = new JPanel();
1001
                        jPanel5.setLayout(null);
1002
            jPanel5.setBorder(javax.swing.BorderFactory.createTitledBorder(
1003
                    null, PluginServices.getText(this, "seleccionar_srs"),
1004
                    javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
1005
                    javax.swing.border.TitledBorder.DEFAULT_POSITION, null, null));
1006
                        jPanel5.setBounds(7, 210, 453, 168);
1007
                        jPanel5.add(getJScrollPane2(), null);
1008
                }
1009
                return jPanel5;
1010
        }
1011

    
1012
        /**
1013
         * This method initializes jPanel6        
1014
         *         
1015
         * @return javax.swing.JPanel        
1016
         */    
1017
        private StylesPanel getTabStyle() {
1018
                if (tabStyle == null) {
1019
                        tabStyle = new StylesPanel(this);
1020
            tabStyle.setEnabled(false);
1021
            tabStyle.addListener(new BeanListener(){
1022
                    public void beanValueChanged(Object value) {
1023
                        fireWizardComplete(isCorrectlyConfigured());
1024
                    };
1025
            });
1026
            tabStyle.addFocusListener(new FocusAdapter() {
1027
                    public void focusGained(FocusEvent e) {
1028
                            refreshStyleTree();
1029
                    }
1030
            });
1031
                }
1032
                return tabStyle;
1033
        }
1034
                
1035
        /**
1036
         * Sets the focus to the tab next to the current one.
1037
         * 
1038
         * Enfoca a la solapa siguiente a la actualmente enfocada del TabbedPane
1039
         *
1040
         */
1041
        public void avanzaTab(){
1042
                int currentPage = currentPage();
1043
                int nPages = getNumTabs();
1044
                if (nPages -1 > currentPage){
1045
                        getJTabbedPane().setSelectedIndex(nextEnabledPage());
1046
                }
1047
        }
1048
        
1049
        /**
1050
         * Sets the focus to the tab previous to the current one. 
1051
         * 
1052
         * Enfoca a la solapa anterior a la actualmente enfocada del TabbedPane
1053
         * 
1054
         */
1055
        public void retrocedeTab(){
1056
                this.getJTabbedPane().setSelectedIndex(previousEnabledPage());
1057
                
1058
        }
1059
    /**
1060
     * Returns the index of the current tab.
1061
     * 
1062
     * Devuelve el ?ndice de la p?gina actual del wizard.
1063
     * 
1064
     * @return
1065
     */
1066
    public int currentPage(){
1067
        return getJTabbedPane().getSelectedIndex();
1068
    }
1069
    
1070
        /**
1071
         * Returns the tab amount that the WMSParamsPanel currently have
1072
         * 
1073
         * Devuelve el n?mero de solapas que tiene actualmente el WMSParamsPanel
1074
         * 
1075
         * @return int
1076
         */
1077
        public int getNumTabs(){
1078
                return getJTabbedPane().getTabCount();
1079
        }
1080
    
1081
        /**
1082
     * <p>
1083
     * Returns the index of the previous enabled tab.
1084
     * </p>
1085
     * <p>
1086
     * Devuelve el ?ndice de la anterior p?gina habilitada del wizard o -1 si no hay
1087
     * ninguna.
1088
     * </p>
1089
    * @return The index, or -1 if there is no one.
1090
     */
1091
    public int previousEnabledPage(){
1092
        int currentPage = currentPage();
1093
        int j=0;
1094
        if (currentPage == 0)
1095
            j= -1;
1096
        for (int i = currentPage-1; i>-1; i--){
1097
            if (getJTabbedPane().isEnabledAt(i)){
1098
                j= i;
1099
                    break;
1100
            }
1101
        }
1102
        return j;
1103
    }
1104
    
1105
    /**
1106
     * <p>
1107
     * Returns the previous of the previous enabled tab.
1108
     * </p>
1109
     * <p>
1110
     * Devuelve el ?ndice de la siguiente p?gina habilitada del wizard o -1 si no hay
1111
     * ninguna.
1112
     * </p>
1113
     * @return The index, or -1 if there is no one.
1114
     */
1115
    public int nextEnabledPage() {
1116
        int currentPage = currentPage();
1117
        int nPages = getNumTabs();
1118
        if (currentPage == nPages)
1119
                return -1;
1120
        for (int i=currentPage+1; i<nPages; i++){
1121
            if (getJTabbedPane().isEnabledAt(i)){
1122
                return i;
1123
            }
1124
        }
1125
        return -1;
1126
    }
1127
    
1128
    /**
1129
     * Selects/deselects the transparency checkbox.
1130
     * @param b
1131
     */
1132
    public void setTransparent(boolean b) {
1133
            getChkTransparency().setSelected(b);
1134
    }
1135
    /**
1136
     * This method initializes chkTrasparency        
1137
     *         
1138
     * @return javax.swing.JCheckBox        
1139
     */    
1140
    private JCheckBox getChkTransparency() {
1141
            if (chkTransparency == null) {
1142
                    chkTransparency = new JCheckBox();
1143
            chkTransparency.setText(PluginServices.getText(this, "wms_transparency"));
1144
            chkTransparency.setSelected(true);
1145
            chkTransparency.addItemListener(new java.awt.event.ItemListener() { 
1146
                    public void itemStateChanged(java.awt.event.ItemEvent e) {    
1147
                            fireWizardComplete(isCorrectlyConfigured());
1148
                    }
1149
            });
1150
                    chkTransparency.setBounds(5, 168, 441, 21);
1151
                    
1152
            }
1153
            return chkTransparency;
1154
    }
1155
    
1156
    /**
1157
     * Returns a vector of strings containing the styles selected for the
1158
     * layers. A blank style is correct and means that default style will 
1159
     * be used.
1160
     * 
1161
     * @return Vector
1162
     */
1163
    public Vector getStyles() {
1164
            Vector v = new Vector();
1165
            WMSLayerNode[] layers = selectedLayersToArray();
1166
            for (int i = 0; i < layers.length; i++) {
1167
                        FMapWMSStyle sty = layers[i].getSelectedStyle();
1168
                        String s = (sty!=null)? sty.name : "";
1169
                        v.add(s);
1170
                }
1171
            return v;
1172
    }
1173
    
1174
    /**
1175
     * This method initializes tabInfo        
1176
     *         
1177
     * @return javax.swing.JPanel        
1178
     */    
1179
    private InfoPanel getTabInfo() {
1180
            if (tabInfo == null) {
1181
                    tabInfo = new InfoPanel();
1182
                    
1183
            }
1184
            return tabInfo;
1185
    }
1186

    
1187
    public void setDimensions(Vector dimensions) {
1188
            for (int i = 0; i < dimensions.size(); i++) {
1189
                    String st = (String) dimensions.get(i);
1190
                    if (st.split("=").length == 2) {
1191
                            String[] s = st.split("=");
1192
                            getTabDimensions().setDimensionValue(s[0], s[1]);
1193
                    }
1194
                }
1195
            
1196
    }
1197

    
1198
    /**
1199
     * This method initializes tabDimension        
1200
     *         
1201
     * @return javax.swing.JPanel        
1202
     */    
1203
    private DimensionPanel getTabDimensions() {
1204
            if (tabDimensions == null) {
1205
                    tabDimensions = new DimensionPanel();
1206
            tabDimensions.setEnabled(false);
1207
            tabDimensions.addListener(new BeanListener(){
1208
                    public void beanValueChanged(Object value) {
1209
                            Vector myDimensions = (Vector) value;
1210
                            if (value!=null && (  oldDimensions == null || 
1211
                                                        !(oldDimensions.size() == myDimensions.size()
1212
                                                       && oldDimensions.containsAll(myDimensions)))
1213
                                                       ){
1214
                                    oldDimensions = myDimensions;
1215
                                }
1216
                            fireWizardComplete(isCorrectlyConfigured());
1217
                    }
1218
            });
1219
            
1220
            }
1221
            return tabDimensions;
1222
    }
1223

    
1224
    /**
1225
     * @return
1226
     */
1227
    public boolean getTransparency() {
1228
        return getChkTransparency().isSelected();
1229
    }
1230

    
1231
    /**
1232
     * @return
1233
     */
1234
    public Vector getDimensions() {
1235
        return getTabDimensions().getDimensions();
1236
    }
1237

    
1238
        public void initWizard() {}
1239
        public void execute() {        }
1240
        public FLayer getLayer() {        return null; }
1241

    
1242
        public FMapWMSDriver getDriver() {
1243
                return dataSource.getDriver();
1244
        }
1245

    
1246
        public Dimension getFixedSize() {
1247
                return sizeFixed;
1248
        }
1249

    
1250
        /**
1251
         * This method initializes chkExtendedNames        
1252
         *         
1253
         * @return javax.swing.JCheckBox        
1254
         */    
1255
        private JCheckBox getChkExtendedNames() {
1256
                if (chkExtendedNames == null) {
1257
                        chkExtendedNames = new JCheckBox();
1258
                        chkExtendedNames.setText(PluginServices.getText(this, "show_layer_names"));
1259
                        chkExtendedNames.addItemListener(new java.awt.event.ItemListener() { 
1260
                                public void itemStateChanged(java.awt.event.ItemEvent e) {
1261
                                        boolean b = chkExtendedNames.isSelected();
1262
                                        getTreeLayers().showLayerNames = b;
1263
                                        getTreeLayers().repaint();
1264
                                        getLstSelectedLayers().showLayerNames = b;
1265
                                        getLstSelectedLayers().repaint();
1266
                                        getStyleTree().showLayerNames = b;
1267
                                }
1268
                        });
1269
                        chkExtendedNames.addActionListener(new java.awt.event.ActionListener() { 
1270
                                public void actionPerformed(java.awt.event.ActionEvent e) {    
1271
                                        fPrefs.putBoolean("show_layer_names", chkExtendedNames.isSelected());
1272
                                }
1273
                        });
1274
                        chkExtendedNames.setBounds(46, 300, 150, 20);
1275
                        chkExtendedNames.setSelected(fPrefs.getBoolean("show_layer_names", false));
1276
                        
1277
                }
1278
                return chkExtendedNames;
1279
        }
1280

    
1281
        /**
1282
         * This method initializes btnUp        
1283
         *         
1284
         * @return javax.swing.JButton        
1285
         */    
1286
        private JButton getBtnUp() {
1287
                if (btnUp == null) {
1288
                        btnUp = new JButton();
1289
                        btnUp.setBounds(11, 184, 30, 30);
1290
                        btnUp.setToolTipText(PluginServices.getText(this, "move_layer_up"));
1291
                        btnUp.addActionListener(new java.awt.event.ActionListener() { 
1292
                                public void actionPerformed(java.awt.event.ActionEvent e) {
1293
                                        LayerList list = getLstSelectedLayers();
1294
                                        int[] selectedIndices = list.getSelectedIndices();
1295
                                        int index = list.getSelectedIndex();
1296
                                        if (selectedIndices != null && selectedIndices.length==1 && index > 0 ) {
1297
                                                JDnDListModel m = (JDnDListModel) list.getModel();
1298
                                                m.itemsMoved(index - 1, new int[] {index});
1299
                                                list.setSelectedIndex(index - 1);
1300
                                        }
1301
                                }
1302
                        });
1303
                        btnUp.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/up-arrow.png")));
1304
                }
1305
                return btnUp;
1306
        }
1307

    
1308
        /**
1309
         * This method initializes btnDown        
1310
         *         
1311
         * @return javax.swing.JButton        
1312
         */    
1313
        private JButton getBtnDown() {
1314
                if (btnDown == null) {
1315
                        btnDown = new JButton();
1316
                        btnDown.setBounds(11, 215, 30, 30);
1317
                        btnDown.setToolTipText(PluginServices.getText(this, "move_layer_down"));
1318
                        btnDown.addActionListener(new java.awt.event.ActionListener() { 
1319
                                public void actionPerformed(java.awt.event.ActionEvent e) {
1320
                                        LayerList list = getLstSelectedLayers();
1321
                                        int[] selectedIndices = list.getSelectedIndices();
1322
                                        int index = list.getSelectedIndex();
1323
                                        if (selectedIndices != null && selectedIndices.length == 1 && index < getLstSelectedLayers().getModel().getSize()-1) {
1324
                                                JDnDListModel m = (JDnDListModel) list.getModel();
1325
                                                m.itemsMoved(index + 1, new int[] {index});
1326
                                                list.setSelectedIndex( index + 1);
1327
                                        }
1328
                                }
1329
                        });
1330
                        btnDown.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/down-arrow.png")));
1331
                }
1332
                return btnDown;
1333
        }
1334

    
1335
        public void setFixedSize(Dimension sz) {
1336
                sizeFixed = sz;
1337
        }
1338

    
1339
        public ArrayList getSelectedPaths(){
1340
                return selectedPaths;
1341
        }
1342
        /**
1343
         * This method initializes chkDisagregate        
1344
         *         
1345
         * @return javax.swing.JCheckBox        
1346
         */
1347
        private JCheckBox getChkDisagregate() {
1348
                if (chkDisagregate == null) {
1349
                        chkDisagregate = new JCheckBox();
1350
                        chkDisagregate.setBounds(new java.awt.Rectangle(46,276,150, 20));
1351
                        chkDisagregate.setText(PluginServices.getText(this, "disagregate_layers"));
1352
                }
1353
                return chkDisagregate;
1354
        }
1355
        
1356
        public boolean getDisagregatedLayers(){
1357
                return chkDisagregate.isSelected();                
1358
        }
1359
}  //  @jve:decl-index=0:visual-constraint="10,10"