Statistics
| Revision:

gvsig-raster / org.gvsig.raster / branches / org.gvsig.raster.2.4 / org.gvsig.wmts / org.gvsig.wmts.swing / org.gvsig.wmts.swing.impl / src / main / java / org / gvsig / wmts / swing / impl / DefaultWMTSParametersPanelController.java @ 8700

History | View | Annotate | Download (36.7 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2018 gvSIG Association
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., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.wmts.swing.impl;
24

    
25
import java.awt.Color;
26
import java.awt.Component;
27
import java.awt.event.ActionEvent;
28
import java.awt.event.ActionListener;
29
import java.awt.event.MouseAdapter;
30
import java.awt.event.MouseEvent;
31
import java.net.URL;
32
import java.util.Iterator;
33
import java.util.List;
34

    
35
import javax.swing.DefaultComboBoxModel;
36
import javax.swing.DefaultListModel;
37
import javax.swing.JComponent;
38
import javax.swing.JLabel;
39
import javax.swing.JPanel;
40
import javax.swing.JRadioButton;
41
import javax.swing.JTree;
42
import javax.swing.ListSelectionModel;
43
import javax.swing.SwingUtilities;
44
import javax.swing.event.ListSelectionEvent;
45
import javax.swing.event.ListSelectionListener;
46
import javax.swing.event.TreeModelListener;
47
import javax.swing.tree.DefaultTreeCellRenderer;
48
import javax.swing.tree.DefaultTreeModel;
49
import javax.swing.tree.TreeModel;
50
import javax.swing.tree.TreeNode;
51
import javax.swing.tree.TreePath;
52

    
53
import org.apache.commons.lang3.StringUtils;
54
import org.cresques.cts.IProjection;
55
import org.slf4j.Logger;
56
import org.slf4j.LoggerFactory;
57

    
58
import org.gvsig.fmap.crs.CRSFactory;
59
import org.gvsig.fmap.dal.DALLocator;
60
import org.gvsig.fmap.dal.DataManager;
61
import org.gvsig.fmap.dal.DataServerExplorerParameters;
62
import org.gvsig.fmap.dal.DataServerExplorerPool;
63
import org.gvsig.fmap.dal.DataServerExplorerPoolEntry;
64
import org.gvsig.tools.ToolsLocator;
65
import org.gvsig.tools.dispose.DisposeUtils;
66
import org.gvsig.tools.dynobject.DynObject;
67
import org.gvsig.tools.i18n.I18nManager;
68
import org.gvsig.tools.swing.api.ToolsSwingLocator;
69
import org.gvsig.tools.swing.icontheme.IconTheme;
70
import org.gvsig.wmts.provider.WMTSRasterProviderParameters;
71
import org.gvsig.wmts.provider.WMTSRasterServerExplorer;
72
import org.gvsig.wmts.provider.WMTSRasterServerExplorerParameters;
73
import org.gvsig.wmts.provider.tree.WMTSLayerNode;
74
import org.gvsig.wmts.provider.tree.WMTSNode;
75
import org.gvsig.wmts.provider.tree.WMTSStyleData;
76
import org.gvsig.wmts.swing.api.WMTSParametersPanel;
77

    
78
/**
79
 * @author fdiaz
80
 *
81
 */
82
public class DefaultWMTSParametersPanelController extends DefaultWMTSParametersPanelView implements WMTSParametersPanel {
83

    
84
    private static final String NAME = "DefaultGoogleMapsParametersPanelController";
85
    private static final Logger logger = LoggerFactory.getLogger(DefaultWMTSParametersPanelController.class);
86
    private static final int TAB_CONNECTION_INDEX = 0;
87
    private static final int TAB_LAYERS_INDEX = 1;
88
    private static final int TAB_STYLES_INDEX = 2;
89
    private static final int TAB_DIMENSIONS_INDEX = 3;
90
    private static final int TAB_FORMATS_INDEX = 4;
91
    // List<WMSParametersEntry> parameterList;
92
    WMTSRasterServerExplorer explorer;
93
    private WMTSRasterServerExplorer serverExplorer;
94
    private String format = null;
95
    private String infoFormat = null;
96
    private String projection = "";
97
    private IProjection mapCtxProj = null;
98

    
99
    private Thread connectionThread;
100
    private WMTSLayerNode selectedLayer;
101
    protected String selectedStyle;
102

    
103
    /**
104
     *
105
     */
106
    public DefaultWMTSParametersPanelController() {
107
        super();
108
        initComponents();
109
        translate();
110
    }
111

    
112
    @Override
113
    public void setPreferredProjection(IProjection proj) {
114
        mapCtxProj = proj;
115
    }
116

    
117
    private void translate() {
118
        I18nManager i18nManager = ToolsLocator.getI18nManager();
119
        // Title tab translate
120
        for (int i = 0; i < tabWMTS.getTabCount(); i++) {
121
            tabWMTS.setTitleAt(i, i18nManager.getTranslation(tabWMTS.getTitleAt(i)));
122
        }
123

    
124
        // Tab connection
125
        lblServer.setText(i18nManager.getTranslation(lblServer.getText()));
126
        lblServer.setToolTipText(i18nManager.getTranslation(lblServer.getToolTipText()));
127

    
128
        cboServerList.setToolTipText(i18nManager.getTranslation(cboServerList.getToolTipText()));
129

    
130
        lblUser.setText(i18nManager.getTranslation(lblUser.getText()));
131
        lblUser.setToolTipText(i18nManager.getTranslation(lblUser.getToolTipText()));
132

    
133
        txtUser.setToolTipText(i18nManager.getTranslation(txtUser.getToolTipText()));
134

    
135
        lblPassword.setText(i18nManager.getTranslation(lblPassword.getText()));
136
        lblPassword.setToolTipText(i18nManager.getTranslation(lblPassword.getToolTipText()));
137

    
138
        txtPassword.setToolTipText(i18nManager.getTranslation(txtPassword.getToolTipText()));
139

    
140
        chkRefreshCache.setText(i18nManager.getTranslation(chkRefreshCache.getText()));
141
        chkRefreshCache.setToolTipText(i18nManager.getTranslation(chkRefreshCache.getToolTipText()));
142

    
143
        btnConnect.setText(i18nManager.getTranslation(btnConnect.getText()));
144
        btnConnect.setToolTipText(i18nManager.getTranslation(btnConnect.getToolTipText()));
145

    
146
        btnCancel.setText(i18nManager.getTranslation(btnCancel.getText()));
147
        btnCancel.setToolTipText(i18nManager.getTranslation(btnCancel.getToolTipText()));
148

    
149
        chkRefreshLocalCache.setText(i18nManager.getTranslation(chkRefreshLocalCache.getText()));
150
        chkRefreshLocalCache.setToolTipText(i18nManager.getTranslation(chkRefreshLocalCache.getToolTipText()));
151

    
152
        chkInvertAxisOrder.setText(i18nManager.getTranslation(chkInvertAxisOrder.getText()));
153
        chkInvertAxisOrder.setToolTipText(i18nManager.getTranslation(chkInvertAxisOrder.getToolTipText()));
154

    
155
        lblInformation.setText(i18nManager.getTranslation(lblInformation.getText()));
156
        lblInformation.setToolTipText(i18nManager.getTranslation(lblInformation.getToolTipText()));
157

    
158
        lblSelectLayers.setText(i18nManager.getTranslation(lblSelectLayers.getText()));
159
        lblSelectLayers.setToolTipText(i18nManager.getTranslation(lblSelectLayers.getToolTipText()));
160

    
161
        treeLayersSelector.setToolTipText(i18nManager.getTranslation(treeLayersSelector.getToolTipText()));
162

    
163
        lblSelectedLayer.setText(i18nManager.getTranslation(lblSelectedLayer.getText()));
164
        lblSelectedLayer.setToolTipText(i18nManager.getTranslation(lblSelectedLayer.getToolTipText()));
165

    
166
        txtSelectedLayer.setToolTipText(i18nManager.getTranslation(txtSelectedLayer.getToolTipText()));
167

    
168
        btnAddLayer.setText(""); // btnAddLayer.getText()));
169
        btnAddLayer.setToolTipText(i18nManager.getTranslation(btnAddLayer.getToolTipText()));
170

    
171
        btnRemoveLayer.setText(""); // btnRemoveLayer.getText()));
172
        btnRemoveLayer.setToolTipText(i18nManager.getTranslation(btnRemoveLayer.getToolTipText()));
173

    
174
        // Tab styles
175
        treeStyles.setToolTipText(i18nManager.getTranslation(treeStyles.getToolTipText()));
176

    
177
        // Tab dimensions
178
        lblSettings.setText(i18nManager.getTranslation(lblSettings.getText()));
179
        lblSettings.setToolTipText(i18nManager.getTranslation(lblSettings.getToolTipText()));
180

    
181
        lstDimensionsSettings.setToolTipText(i18nManager.getTranslation(lstDimensionsSettings.getToolTipText()));
182

    
183
        lblSettingsEditor.setText(i18nManager.getTranslation(lblSettingsEditor.getText()));
184
        lblSettingsEditor.setToolTipText(i18nManager.getTranslation(lblSettingsEditor.getToolTipText()));
185

    
186
        lstDimensions.setToolTipText(i18nManager.getTranslation(lstDimensions.getToolTipText()));
187

    
188
        lblValue.setText(i18nManager.getTranslation(lblValue.getText()));
189
        lblValue.setToolTipText(i18nManager.getTranslation(lblValue.getToolTipText()));
190

    
191
        lblFieldValue.setText("");
192
        lblFieldValue.setToolTipText(i18nManager.getTranslation(lblFieldValue.getToolTipText()));
193

    
194
        sldValues.setToolTipText(i18nManager.getTranslation(sldValues.getToolTipText()));
195

    
196
        btnFirst.setText(""); // btnFirst.getText()));
197
        btnFirst.setToolTipText(i18nManager.getTranslation(btnFirst.getToolTipText()));
198

    
199
        btnPrevious.setText(""); // btnPrevious.getText()));
200
        btnPrevious.setToolTipText(i18nManager.getTranslation(btnPrevious.getToolTipText()));
201

    
202
        txtDimensionNumber.setToolTipText(i18nManager.getTranslation(txtDimensionNumber.getToolTipText()));
203

    
204
        btnNext.setText(""); // btnNext.getText()));
205
        btnNext.setToolTipText(i18nManager.getTranslation(btnNext.getToolTipText()));
206

    
207
        btnLast.setText(""); // btnLast.getText()));
208
        btnLast.setToolTipText(i18nManager.getTranslation(btnLast.getToolTipText()));
209

    
210
        rdbSimpleValue.setText(i18nManager.getTranslation(rdbSimpleValue.getText()));
211
        rdbSimpleValue.setToolTipText(i18nManager.getTranslation(rdbSimpleValue.getToolTipText()));
212

    
213
        rdbMultipleValue.setText(i18nManager.getTranslation(rdbMultipleValue.getText()));
214
        rdbMultipleValue.setToolTipText(i18nManager.getTranslation(rdbMultipleValue.getToolTipText()));
215

    
216
        rdbInterval.setText(i18nManager.getTranslation(rdbInterval.getText()));
217
        rdbInterval.setToolTipText(i18nManager.getTranslation(rdbInterval.getToolTipText()));
218

    
219
        btnAddSetting.setText(i18nManager.getTranslation(btnAddSetting.getText()));
220
        btnAddSetting.setToolTipText(i18nManager.getTranslation(btnAddSetting.getToolTipText()));
221

    
222
        btnClearSetting.setText(i18nManager.getTranslation(btnClearSetting.getText()));
223
        btnClearSetting.setToolTipText(i18nManager.getTranslation(btnClearSetting.getToolTipText()));
224

    
225
        txtSetting.setToolTipText(i18nManager.getTranslation(txtSetting.getToolTipText()));
226

    
227
        btnSet.setText(i18nManager.getTranslation(btnSet.getText()));
228
        btnSet.setToolTipText(i18nManager.getTranslation(btnSet.getToolTipText()));
229

    
230
        // Tab formats
231
        lblFormats.setText(i18nManager.getTranslation(lblFormats.getText()));
232
        lblFormats.setToolTipText(i18nManager.getTranslation(lblFormats.getToolTipText()));
233

    
234
        lstFormats.setToolTipText(i18nManager.getTranslation(lstFormats.getToolTipText()));
235

    
236
        lblProjection.setText(i18nManager.getTranslation(lblProjection.getText()));
237
        lblProjection.setToolTipText(i18nManager.getTranslation(lblProjection.getToolTipText()));
238

    
239
        lstProjections.setToolTipText(i18nManager.getTranslation(lstProjections.getToolTipText()));
240

    
241
        lblInfoFormat.setText(i18nManager.getTranslation(lblInfoFormat.getText()));
242
        lblInfoFormat.setToolTipText(i18nManager.getTranslation(lblInfoFormat.getToolTipText()));
243

    
244
        lstInfoFormats.setToolTipText(i18nManager.getTranslation(lstInfoFormats.getToolTipText()));
245

    
246
    }
247

    
248
    private void initComponents() {
249
        fillConnections();
250

    
251
        IconTheme iconTheme = ToolsSwingLocator.getIconThemeManager().getCurrent();
252

    
253
        this.btnAddLayer.setIcon(iconTheme.get("add-layer-icon"));
254
        this.btnRemoveLayer.setIcon(iconTheme.get("remove-layer-icon"));
255

    
256
        this.btnFirst.setIcon(iconTheme.get("first-value-icon"));
257
        this.btnPrevious.setIcon(iconTheme.get("previous-value-icon"));
258
        this.btnNext.setIcon(iconTheme.get("next-value-icon"));
259
        this.btnLast.setIcon(iconTheme.get("last-value-icon"));
260

    
261
        this.btnConnect.addActionListener(new ActionListener() {
262

    
263
            @Override
264
            public void actionPerformed(ActionEvent e) {
265
                doConnect();
266
            }
267
        });
268

    
269
        this.btnCancel.addActionListener(new ActionListener() {
270

    
271
            @Override
272
            public void actionPerformed(ActionEvent e) {
273
                doCancelConnection();
274
            }
275
        });
276

    
277
        initializeTreeLayerSelector();
278
        initializeLstProjections();
279
        initializeTreeStyles();
280
        initializeLstFormats();
281
        initializeLstInfoFormats();
282
        // initializeTblDimensions();
283

    
284
        this.btnAddLayer.setEnabled(false);
285
        this.btnAddLayer.addActionListener(new ActionListener() {
286

    
287
            @Override
288
            public void actionPerformed(ActionEvent e) {
289
                WMTSNode node = (WMTSNode) treeLayersSelector.getLastSelectedPathComponent();
290
                if (node == null) {
291
                    return;
292
                }
293
                if (node instanceof WMTSLayerNode && node.isLeaf()) {
294
                    doSelectLayer(node);
295
                }
296
            }
297
        });
298

    
299
        this.btnRemoveLayer.setEnabled(false);
300
        this.btnRemoveLayer.addActionListener(new ActionListener() {
301

    
302
            @Override
303
            public void actionPerformed(ActionEvent e) {
304
                selectedLayer = null;
305
                updateTxtSelectedLayer();
306
            }
307
        });
308

    
309
        updateComponents();
310
    }
311

    
312
    protected void updateTxtSelectedLayer() {
313
        if (selectedLayer != null) {
314
            txtSelectedLayer.setText(selectedLayer.getTitle());
315
        } else {
316
            txtSelectedLayer.setText("");
317
        }
318
    }
319

    
320
    @Override
321
    public JComponent asJComponent() {
322
        return this;
323
    }
324

    
325
    @Override
326
    public void dispose() {
327
        DisposeUtils.disposeQuietly(explorer);
328
    }
329

    
330
    public void putParameters(DynObject parameters) {
331
        // TODO:
332
    }
333

    
334
    public void fetchParameters(DynObject parameters) {
335

    
336
    }
337

    
338
    private void doConnect() {
339
        final String selectedItem = (String) cboServerList.getSelectedItem();
340
        if (StringUtils.isEmpty(selectedItem)) {
341
            return;
342
        }
343

    
344
        btnConnect.setEnabled(false);
345
        btnCancel.setEnabled(true);
346

    
347
        connectionThread = new Thread(new Runnable() {
348

    
349
            @Override
350
            public void run() {
351
                DataManager manager = DALLocator.getDataManager();
352
                final DataServerExplorerParameters parameters;
353
                try {
354
                    parameters = manager.createServerExplorerParameters("WMTS");
355
                    parameters.setDynValue(WMTSRasterServerExplorerParameters.WMTS_SERVICE_PARAMETER_NAME, new URL(
356
                        selectedItem)); // "service"
357
                    // parameters.setDynValue(WMTSRasterServerExplorerParameters.WMTS_OVERRIDE_CAPABILITIES_PARAMETER_NAME,
358
                    // chkRefreshCache.isSelected()); // "override_capabilities"
359

    
360
                    final WMTSRasterServerExplorer serverExplorer =
361
                        (WMTSRasterServerExplorer) manager.openServerExplorer("WMTS", parameters);
362

    
363
                    // List layers = serverExplorer.list();
364

    
365
                    SwingUtilities.invokeLater(new Runnable() {
366

    
367
                        @Override
368
                        public void run() {
369
                            // if(Thread.interrupted()){
370
                            // return;
371
                            // }
372
                            setServerExplorer(serverExplorer);
373
                            DataServerExplorerPool pool = DALLocator.getDataManager().getDataServerExplorerPool();
374

    
375
                            pool.add(((URL) parameters
376
                                .getDynValue(WMTSRasterServerExplorerParameters.WMTS_SERVICE_PARAMETER_NAME))
377
                                .toString(), serverExplorer.getParameters());
378

    
379
                        }
380
                    });
381
                } catch (Exception e) {
382
                    // FIXME: ?Mostrar di?logo para preguntar si se desea
383
                    // eliminar el servidor del pool de servidores en caso de
384
                    // existir ah??
385
                    setServerExplorer(null);
386
                }
387

    
388
            }
389
        }, "WMSConnection");
390
        connectionThread.start();
391
        try {
392
            Thread.sleep(2);
393
        } catch (InterruptedException e) {
394
        }
395
    }
396

    
397
    protected void doCancelConnection() {
398
        // if(connectionThread != null && connectionThread.isAlive()){
399
        // connectionThread.interrupt();
400
        // }
401
    }
402

    
403
    private void setServerExplorer(WMTSRasterServerExplorer serverExplorer) {
404
        this.serverExplorer = serverExplorer;
405

    
406
        this.updateComponents();
407

    
408
        WMTSNode node = (WMTSNode) this.serverExplorer.getListAsTree();
409
        fillLayers(node);
410

    
411
        txtInformation.setText(serverExplorer.getInfoString());
412

    
413
        tabWMTS.setEnabledAt(4, true);
414
    }
415

    
416
    private void updateComponents() {
417

    
418
        if (serverExplorer == null) {
419
            cboServerList.setEnabled(true);
420
            // Authentication of WMS servers is not yet implemented, when
421
            // implemented, enabling the following two controls.
422
            txtUser.setEnabled(false);
423
            txtPassword.setEnabled(false);
424

    
425
            chkRefreshCache.setEnabled(true);
426
            btnConnect.setEnabled(true);
427
            btnCancel.setEnabled(false);
428

    
429
            chkRefreshLocalCache.setEnabled(false);
430
            chkInvertAxisOrder.setEnabled(false);
431
            txtInformation.setEnabled(false);
432

    
433
            tabWMTS.setEnabledAt(TAB_LAYERS_INDEX, false);
434
            tabWMTS.setEnabledAt(TAB_STYLES_INDEX, false);
435
            tabWMTS.setEnabledAt(TAB_DIMENSIONS_INDEX, false);
436
            tabWMTS.setEnabledAt(TAB_FORMATS_INDEX, false);
437
        } else {
438
            cboServerList.setEnabled(false);
439
            txtUser.setEnabled(false);
440
            txtPassword.setEnabled(false);
441
            chkRefreshCache.setEnabled(false);
442
            btnConnect.setEnabled(false);
443
            btnCancel.setEnabled(false);
444

    
445
            chkRefreshLocalCache.setEnabled(true);
446
            chkInvertAxisOrder.setEnabled(true);
447
            txtInformation.setEnabled(true);
448

    
449
            tabWMTS.setEnabledAt(TAB_LAYERS_INDEX, true);
450
        }
451

    
452
    }
453

    
454
    private void fillConnections() {
455
        DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
456

    
457
        DataServerExplorerPool pool = DALLocator.getDataManager().getDataServerExplorerPool();
458
        Iterator it = pool.iterator();
459
        while (it.hasNext()) {
460
            DataServerExplorerPoolEntry entry = (DataServerExplorerPoolEntry) it.next();
461
            DataServerExplorerParameters parameters = entry.getExplorerParameters();
462
            if (parameters instanceof WMTSRasterServerExplorerParameters) {
463
                model.addElement(((URL) parameters
464
                    .getDynValue(WMTSRasterServerExplorerParameters.WMTS_SERVICE_PARAMETER_NAME)).toString());
465
            }
466
        }
467

    
468
        this.cboServerList.setModel(model);
469
    }
470

    
471
    private void initializeLstFormats() {
472
        final DefaultListModel<String> model = new DefaultListModel<>();
473
        lstFormats.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
474
        lstFormats.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
475

    
476
            @Override
477
            public void valueChanged(ListSelectionEvent e) {
478
                int index = lstFormats.getSelectedIndex();
479
                if (index >= 0) {
480
                    format = model.getElementAt(index);
481
                } else {
482
                    format = "";
483
                }
484
            }
485
        });
486
        lstFormats.setModel(model);
487
    }
488

    
489
    private void updateLstFormats(List<String> formats) {
490
        final DefaultListModel<String> model = (DefaultListModel<String>) (lstFormats.getModel());
491
        model.clear();
492
        if (formats != null) {
493
            for (Iterator<String> iterator = formats.iterator(); iterator.hasNext();) {
494
                model.addElement(iterator.next());
495
            }
496
        }
497
        selectFormat();
498
    }
499

    
500
    private void initializeLstInfoFormats() {
501

    
502
        final DefaultListModel<String> model = new DefaultListModel<>();
503
        lstInfoFormats.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
504
        lstInfoFormats.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
505

    
506
            @Override
507
            public void valueChanged(ListSelectionEvent e) {
508
                int index = lstInfoFormats.getSelectedIndex();
509
                if (index >= 0) {
510
                    infoFormat = model.getElementAt(index);
511
                } else {
512
                    infoFormat = "";
513
                }
514
            }
515
        });
516
        lstInfoFormats.setModel(model);
517
    }
518

    
519
    private void updateLstInfoFormats(List<String> infoFormats) {
520

    
521
        final DefaultListModel<String> model = (DefaultListModel<String>) (lstInfoFormats.getModel());
522
        model.clear();
523
        if (infoFormats != null) {
524
            for (Iterator<String> iterator = infoFormats.iterator(); iterator.hasNext();) {
525
                model.addElement(iterator.next());
526
            }
527
        }
528
        selectInfoFormat();
529
    }
530

    
531
    private void fillLayers(TreeNode node) {
532
        TreeModel treeModel = new DefaultTreeModel(node, true);
533
        treeLayersSelector.setModel(treeModel);
534
    }
535

    
536
    /**
537
     *
538
     */
539
    private void initializeTreeLayerSelector() {
540
        treeLayersSelector.setCellRenderer(new DefaultTreeCellRenderer() {
541

    
542
            /**
543
             *
544
             */
545
            private static final long serialVersionUID = -6800758982020754819L;
546

    
547
            @Override
548
            public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
549
                boolean leaf, int row, boolean hasFocus) {
550
                Component comp =
551
                    super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
552
                String text;
553
                if (value instanceof WMTSNode) {
554
                    WMTSNode node = (WMTSNode) value;
555
                    text = node.getTitle();
556
                    setText(text);
557
                }
558
                return comp;
559
            }
560
        });
561

    
562
        treeLayersSelector.addMouseListener(new MouseAdapter() {
563

    
564
            @Override
565
            public void mouseClicked(MouseEvent e) {
566
                if (e.getClickCount() == 1) {
567
                    WMTSNode node = (WMTSNode) treeLayersSelector.getLastSelectedPathComponent();
568
                    btnAddLayer.setEnabled(node != null && node.isLeaf() && node instanceof WMTSLayerNode);
569
                } else if (e.getClickCount() == 2) {
570
                    WMTSNode node = (WMTSNode) treeLayersSelector.getLastSelectedPathComponent();
571
                    if (node == null)
572
                        return;
573
                    if (node.isLeaf() && node instanceof WMTSLayerNode) {
574
                        doSelectLayer((WMTSLayerNode) node);
575
                    }
576
                }
577
            }
578
        });
579
    }
580

    
581
    protected void doSelectLayer(Object selected) {
582
        if (selected instanceof WMTSLayerNode) {
583
            WMTSLayerNode node = (WMTSLayerNode) selected;
584
            this.selectedLayer = node;
585
            updateTxtSelectedLayer();
586

    
587
            List<String> formats = null;
588
            if (selectedLayer != null) {
589
                formats = this.selectedLayer.getFormats();
590
            }
591

    
592
            updateLstFormats(formats);
593
            int formatIndex = -1;
594
            if (!StringUtils.isEmpty(format)) {
595
                if (formats.contains(format)) {
596
                    formatIndex = formats.indexOf(format);
597
                }
598
            } else {
599
                if (formats.size() > 0) {
600
                    formatIndex = 0;
601
                    format = formats.get(formatIndex);
602
                }
603
            }
604
            lstFormats.getSelectionModel().setSelectionInterval(formatIndex, formatIndex);
605

    
606
            List<String> infoFormats = null;
607
            if (selectedLayer != null) {
608
                infoFormats = this.selectedLayer.getInfoFormats();
609
            }
610
            updateLstInfoFormats(infoFormats);
611
            int formatInfoIndex = -1;
612
            if (infoFormats != null) {
613
                if (!StringUtils.isEmpty(infoFormat)) {
614
                    if (infoFormats.contains(infoFormat)) {
615
                        formatInfoIndex = infoFormats.indexOf(infoFormat);
616
                    }
617
                } else {
618
                    if (infoFormats.size() > 0) {
619
                        formatInfoIndex = 0;
620
                        infoFormat = infoFormats.get(formatInfoIndex);
621
                    }
622
                }
623
                lstInfoFormats.getSelectionModel().setSelectionInterval(formatInfoIndex, formatInfoIndex);
624
            }
625
            updateLstProjections();
626
            updateTreeStyles();
627
        }
628
    }
629

    
630
    @SuppressWarnings("unchecked")
631
    private void initializeLstProjections() {
632

    
633
        final DefaultListModel<String> model = new DefaultListModel<>();
634

    
635
        lstProjections.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
636

    
637
        ListSelectionModel selectionModel = lstProjections.getSelectionModel();
638
        selectionModel.addListSelectionListener(new ListSelectionListener() {
639

    
640
            @Override
641
            public void valueChanged(ListSelectionEvent e) {
642
                int selectedRow = lstProjections.getSelectedIndex();
643
                if (selectedRow >= 0 && selectedRow < model.getSize()) {
644
                    projection = model.getElementAt(selectedRow);
645
                }
646
            }
647
        });
648

    
649
        lstProjections.setModel(model);
650
    }
651

    
652
    private void updateLstProjections() {
653
        @SuppressWarnings("unchecked")
654
        DefaultListModel<String> model = (DefaultListModel<String>) lstProjections.getModel();
655
        model.clear();
656
        if (selectedLayer != null) {
657
            List<String> srss = selectedLayer.getSrsList();
658
            for (Iterator<String> iterator = srss.iterator(); iterator.hasNext();) {
659
                model.addElement(iterator.next());
660
            }
661
            selectProjection();
662
        } else {
663
            this.projection = null;
664
        }
665
    }
666

    
667
    @SuppressWarnings("unchecked")
668
    private void selectProjection() {
669
        if (!StringUtils.isEmpty(projection)) {
670
            DefaultListModel<String> model = (DefaultListModel<String>) lstProjections.getModel();
671
            for (int i = 0; i < model.size(); i++) {
672
                if (projection.equals(model.elementAt(i))) {
673
                    lstProjections.setSelectedIndex(i);
674
                    return;
675
                }
676
            }
677
        } else if (mapCtxProj != null) {
678
            DefaultListModel<String> model = (DefaultListModel<String>) lstProjections.getModel();
679
            for (int i = 0; i < model.size(); i++) {
680

    
681
                String srs = model.elementAt(i);
682
                try {
683
                    IProjection crs = CRSFactory.getCRS(model.elementAt(i));
684
                    if (crs != null && crs.equals(mapCtxProj)) {
685
                        lstProjections.setSelectedIndex(i);
686
                        return;
687
                    }
688
                } catch (Exception e) {
689
                    logger.info("Can't get crs from: '" + srs + "' code", e);
690
                }
691
            }
692
        }
693
        ;
694
        if (lstProjections.getModel().getSize() > 0) {
695
            lstProjections.setSelectedIndex(0);
696
        }
697
    }
698

    
699
    @SuppressWarnings("unchecked")
700
    private void selectFormat() {
701
        DefaultListModel<String> model = (DefaultListModel<String>) lstFormats.getModel();
702
        if (!StringUtils.isEmpty(format)) {
703
            for (int i = 0; i < model.size(); i++) {
704
                if (format.equals(model.elementAt(i))) {
705
                    lstFormats.setSelectedIndex(i);
706
                    return;
707
                }
708
            }
709
        }
710
        if (model.getSize() > 0) {
711
            lstFormats.setSelectedIndex(0);
712
        }
713
    }
714

    
715
    @SuppressWarnings("unchecked")
716
    private void selectInfoFormat() {
717
        DefaultListModel<String> model = (DefaultListModel<String>) lstInfoFormats.getModel();
718
        if (!StringUtils.isEmpty(infoFormat)) {
719
            for (int i = 0; i < model.size(); i++) {
720
                if (format.equals(model.elementAt(i))) {
721
                    lstInfoFormats.setSelectedIndex(i);
722
                    return;
723
                }
724
            }
725
        }
726
        if (model.getSize() > 0) {
727
            lstInfoFormats.setSelectedIndex(0);
728
        }
729
    }
730

    
731
    /**
732
    *
733
    */
734
    private void initializeTreeStyles() {
735
        treeStyles.setToggleClickCount(1);
736
        treeStyles.setRowHeight(22);
737

    
738
        treeStyles.setCellRenderer(new DefaultTreeCellRenderer() {
739

    
740
            /**
741
             *
742
             */
743
            private static final long serialVersionUID = 4821777811489883864L;
744

    
745
            @Override
746
            public java.awt.Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
747
                boolean expanded, boolean leaf, int row, boolean hasFocus) {
748
                if (leaf) {
749
                    JPanel leafComponent = new JPanel();
750
                    leafComponent.setBackground(Color.WHITE);
751
                    JRadioButton leafRadioButton =
752
                        new JRadioButton("", ((StyleTreeModel) treeStyles.getModel()).isSelected((WMTSStyleData) value));
753

    
754
                    leafRadioButton.setBackground(Color.WHITE);
755
                    leafComponent.add(leafRadioButton);
756
                    String text = ((WMTSStyleData) value).getTitle();
757
                    if (StringUtils.isEmpty(text)) {
758
                        text = ((WMTSStyleData) value).getIdentifier();
759
                    }
760
                    leafComponent.add(new JLabel(((WMTSStyleData) value).getIdentifier()));
761
                    return leafComponent;
762
                } else {
763
                    super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
764
                    if (value instanceof WMTSLayerNode) {
765
                        WMTSLayerNode layerNode = (WMTSLayerNode) value;
766
                        String text = "";
767
                        if (layerNode != null) {
768
                            text = layerNode.getTitle();
769
                        }
770
                        setText(text);
771
                    } else if (value instanceof String) {
772
                        setText((String) value);
773
                    }
774
                    return this;
775
                }
776
            }
777
        });
778

    
779
        treeStyles.addMouseListener(new java.awt.event.MouseAdapter() {
780

    
781
            @Override
782
            public void mouseClicked(java.awt.event.MouseEvent e) {
783
                ((StyleTreeModel) treeStyles.getModel()).setSelectedLeaf(treeStyles.getSelectionPath());
784
                selectedStyle = ((WMTSNode) treeStyles.getSelectionPath().getLastPathComponent()).getIdentifier();
785
                treeStyles.clearSelection();
786
                repaint();
787
            }
788
        });
789
    }
790

    
791
    private void updateTreeStyles() {
792

    
793
        tabWMTS.setEnabledAt(TAB_STYLES_INDEX, selectedLayer != null);
794

    
795
        StyleTreeModel model = new StyleTreeModel(selectedLayer);
796

    
797
        treeStyles.setModel(model);
798
        expandAllNodes(treeStyles);
799
    }
800

    
801
    private void expandAllNodes(JTree tree) {
802
        int j = tree.getRowCount();
803
        int i = 0;
804
        while (i < j) {
805
            tree.expandRow(i);
806
            i += 1;
807
            j = tree.getRowCount();
808
        }
809
    }
810

    
811
    class StyleTreeModel implements TreeModel {
812

    
813
        WMTSLayerNode layerNode;
814

    
815
        public StyleTreeModel(WMTSLayerNode layerNode) {
816
            this.layerNode = layerNode;
817
        }
818

    
819
        /**
820
         * Will return true if this style is selected.
821
         *
822
         * @param WMSStyle
823
         * @return true if this style is selected.
824
         */
825
        public boolean isSelected(WMTSStyleData style) {
826
            if (layerNode.getSelectedStyle().equals(style)) {
827
                return true;
828
            }
829
            return false;
830
        }
831

    
832
        /**
833
         * Gets the name of the selected style.
834
         *
835
         * @return the names of the selected styles into a List using the same
836
         *         order as they was represented in the StylesTree.
837
         */
838
        public String getStyleSelectionTitles() {
839
            WMTSStyleData sty = layerNode.getSelectedStyle();
840
            if (sty == null) {
841
                return "";
842
            } else {
843
                return sty.getTitle();
844
            }
845
        }
846

    
847
        /**
848
         * Sets the selected style in the StylesTree. A blank or null string
849
         * will
850
         * leave the default style for that layer.
851
         *
852
         * @param styleNames
853
         *            , Vector containing the style names.
854
         *            The styles order <b>must match</b> with the layer order.
855
         */
856
        public void setStylesSelection(String styleIdentifier) {
857
            List<WMTSStyleData> styles = layerNode.getStyles();
858
            for (int j = 0; j < styles.size(); j++) {
859
                WMTSStyleData sty = styles.get(j);
860
                if (sty.getIdentifier().equals(styleIdentifier)) {
861
                    layerNode.setSelectedStyleIndex(j);
862
                    break;
863
                }
864
            }
865
        }
866

    
867
        /**
868
         * Sets a leaf (an style) selected.
869
         *
870
         * @param selectionPath
871
         *            to this leaf.
872
         */
873
        protected void setSelectedLeaf(TreePath selectionPath) {
874
            if (selectionPath != null) {
875
                Object[] objects = selectionPath.getPath();
876
                Object item = objects[objects.length - 1];
877
                if (isLeaf(item)) {
878
                    WMTSStyleData style = (WMTSStyleData) item;
879
                    WMTSLayerNode layerNode = (WMTSLayerNode) selectionPath.getParentPath().getLastPathComponent();
880
                    List<WMTSStyleData> styles = layerNode.getStyles();
881
                    for (int i = 0; i < styles.size(); i++) {
882
                        WMTSStyleData sty = styles.get(i);
883
                        if (sty.getIdentifier().equals(style.getIdentifier())) {
884
                            layerNode.setSelectedStyleIndex(i);
885
                            return;
886
                        }
887
                    }
888
                }
889
            }
890
        }
891

    
892
        @Override
893
        public Object getRoot() {
894
            return layerNode; // ToolsLocator.getI18nManager().getTranslation("_selected_layers");
895
        }
896

    
897
        @Override
898
        public int getChildCount(Object parent) {
899
            return ((WMTSLayerNode) parent).getStyles().size();
900
        }
901

    
902
        @Override
903
        public boolean isLeaf(Object node) {
904
            return (node instanceof WMTSStyleData);
905
        }
906

    
907
        @Override
908
        public Object getChild(Object parent, int index) {
909
            if (parent instanceof WMTSStyleData) {
910
                return null;
911
            }
912
            return ((WMTSLayerNode) parent).getStyles().get(index);
913
        }
914

    
915
        @Override
916
        public int getIndexOfChild(Object parent, Object child) {
917
            if (parent instanceof WMTSStyleData) {
918
                return -1;
919
            }
920

    
921
            WMTSLayerNode node = (WMTSLayerNode) parent;
922
            for (int i = 0; i < node.getStyles().size(); i++) {
923
                if (node.getStyles().get(i).equals(child)) {
924
                    return i;
925
                }
926
            }
927
            return -1;
928
        }
929

    
930
        @Override
931
        public void addTreeModelListener(TreeModelListener l) {
932
            // TODO Auto-generated method stub
933

    
934
        }
935

    
936
        @Override
937
        public void removeTreeModelListener(TreeModelListener l) {
938
            // TODO Auto-generated method stub
939

    
940
        }
941

    
942
        @Override
943
        public void valueForPathChanged(TreePath path, Object newValue) {
944
            // TODO Auto-generated method stub
945

    
946
        }
947
    }
948

    
949
    @Override
950
    public WMTSLayerNode getParameters() {
951
        String identifier = selectedLayer.getIdentifier();
952

    
953
        WMTSNode root = serverExplorer.getListAsTree(true);
954
        WMTSLayerNode layerNode = (WMTSLayerNode) findLayer(root, selectedLayer.getIdentifier());
955
        fillParametersInNode(layerNode);
956

    
957
        return layerNode;
958
    }
959

    
960
    private WMTSNode findLayer(WMTSNode node, String identifier) {
961
        if (node.isLeaf() && node instanceof WMTSLayerNode && identifier.equals(node.getIdentifier())) {
962
            return node;
963
        }
964
        for (int i = 0; i < node.getChildCount(); i++) {
965
            WMTSNode child = (WMTSNode) node.getChildAt(i);
966
            WMTSNode found = findLayer(child, identifier);
967
            if(found!=null) {
968
                return found;
969
            }
970
        }
971
        return null;
972
    }
973

    
974
    private WMTSLayerNode fillParametersInNode(WMTSLayerNode node) {
975

    
976
        WMTSRasterProviderParameters parameters = (WMTSRasterProviderParameters) node.getParameters();
977
        parameters.setFormat(format);
978
        parameters.setInfoFormat(infoFormat);
979
        parameters.setStyle(selectedStyle);
980
        parameters.setForceChangeAxisOrder(chkInvertAxisOrder.isSelected());
981
        try {
982
            IProjection crs = CRSFactory.getCRS(projection);
983
            parameters.setCRS(crs);
984
        } catch (Exception e) {
985
            logger.info("Can't get crs from: '" + projection + "' code", e);
986
        }
987

    
988
        return node;
989
    }
990

    
991
    @Override
992
    public boolean refreshLocalCache() {
993
        return chkRefreshLocalCache.isSelected();
994
    }
995
}