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

History | View | Annotate | Download (36.8 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 four controls.
422
            txtUser.setEnabled(false);
423
            txtPassword.setEnabled(false);
424
            lblUser.setEnabled(false);
425
            lblPassword.setEnabled(false);
426

    
427

    
428
            chkRefreshCache.setEnabled(true);
429
            btnConnect.setEnabled(true);
430
            btnCancel.setEnabled(false);
431

    
432
            chkRefreshLocalCache.setEnabled(false);
433
            chkInvertAxisOrder.setEnabled(false);
434
            txtInformation.setEnabled(false);
435

    
436
            tabWMTS.setEnabledAt(TAB_LAYERS_INDEX, false);
437
            tabWMTS.setEnabledAt(TAB_STYLES_INDEX, false);
438
            tabWMTS.setEnabledAt(TAB_DIMENSIONS_INDEX, false);
439
            tabWMTS.setEnabledAt(TAB_FORMATS_INDEX, false);
440
        } else {
441
            cboServerList.setEnabled(false);
442
            txtUser.setEnabled(false);
443
            txtPassword.setEnabled(false);
444
            lblUser.setEnabled(false);
445
            lblPassword.setEnabled(false);
446
            chkRefreshCache.setEnabled(false);
447
            btnConnect.setEnabled(false);
448
            btnCancel.setEnabled(false);
449

    
450
            chkRefreshLocalCache.setEnabled(true);
451
            chkInvertAxisOrder.setEnabled(true);
452
            txtInformation.setEnabled(true);
453

    
454
            tabWMTS.setEnabledAt(TAB_LAYERS_INDEX, true);
455
        }
456

    
457
    }
458

    
459
    private void fillConnections() {
460
        DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
461

    
462
        DataServerExplorerPool pool = DALLocator.getDataManager().getDataServerExplorerPool();
463
        Iterator it = pool.iterator();
464
        while (it.hasNext()) {
465
            DataServerExplorerPoolEntry entry = (DataServerExplorerPoolEntry) it.next();
466
            DataServerExplorerParameters parameters = entry.getExplorerParameters();
467
            if (parameters instanceof WMTSRasterServerExplorerParameters) {
468
                model.addElement(((URL) parameters
469
                    .getDynValue(WMTSRasterServerExplorerParameters.WMTS_SERVICE_PARAMETER_NAME)).toString());
470
            }
471
        }
472

    
473
        this.cboServerList.setModel(model);
474
    }
475

    
476
    private void initializeLstFormats() {
477
        final DefaultListModel<String> model = new DefaultListModel<>();
478
        lstFormats.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
479
        lstFormats.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
480

    
481
            @Override
482
            public void valueChanged(ListSelectionEvent e) {
483
                int index = lstFormats.getSelectedIndex();
484
                if (index >= 0) {
485
                    format = model.getElementAt(index);
486
                } else {
487
                    format = "";
488
                }
489
            }
490
        });
491
        lstFormats.setModel(model);
492
    }
493

    
494
    private void updateLstFormats(List<String> formats) {
495
        final DefaultListModel<String> model = (DefaultListModel<String>) (lstFormats.getModel());
496
        model.clear();
497
        if (formats != null) {
498
            for (Iterator<String> iterator = formats.iterator(); iterator.hasNext();) {
499
                model.addElement(iterator.next());
500
            }
501
        }
502
        selectFormat();
503
    }
504

    
505
    private void initializeLstInfoFormats() {
506

    
507
        final DefaultListModel<String> model = new DefaultListModel<>();
508
        lstInfoFormats.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
509
        lstInfoFormats.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
510

    
511
            @Override
512
            public void valueChanged(ListSelectionEvent e) {
513
                int index = lstInfoFormats.getSelectedIndex();
514
                if (index >= 0) {
515
                    infoFormat = model.getElementAt(index);
516
                } else {
517
                    infoFormat = "";
518
                }
519
            }
520
        });
521
        lstInfoFormats.setModel(model);
522
    }
523

    
524
    private void updateLstInfoFormats(List<String> infoFormats) {
525

    
526
        final DefaultListModel<String> model = (DefaultListModel<String>) (lstInfoFormats.getModel());
527
        model.clear();
528
        if (infoFormats != null) {
529
            for (Iterator<String> iterator = infoFormats.iterator(); iterator.hasNext();) {
530
                model.addElement(iterator.next());
531
            }
532
        }
533
        selectInfoFormat();
534
    }
535

    
536
    private void fillLayers(TreeNode node) {
537
        TreeModel treeModel = new DefaultTreeModel(node, true);
538
        treeLayersSelector.setModel(treeModel);
539
    }
540

    
541
    /**
542
     *
543
     */
544
    private void initializeTreeLayerSelector() {
545
        treeLayersSelector.setCellRenderer(new DefaultTreeCellRenderer() {
546

    
547
            /**
548
             *
549
             */
550
            private static final long serialVersionUID = -6800758982020754819L;
551

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

    
567
        treeLayersSelector.addMouseListener(new MouseAdapter() {
568

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

    
586
    protected void doSelectLayer(Object selected) {
587
        if (selected instanceof WMTSLayerNode) {
588
            WMTSLayerNode node = (WMTSLayerNode) selected;
589
            this.selectedLayer = node;
590
            updateTxtSelectedLayer();
591

    
592
            List<String> formats = null;
593
            if (selectedLayer != null) {
594
                formats = this.selectedLayer.getFormats();
595
            }
596

    
597
            updateLstFormats(formats);
598
            int formatIndex = -1;
599
            if (!StringUtils.isEmpty(format)) {
600
                if (formats.contains(format)) {
601
                    formatIndex = formats.indexOf(format);
602
                }
603
            } else {
604
                if (formats.size() > 0) {
605
                    formatIndex = 0;
606
                    format = formats.get(formatIndex);
607
                }
608
            }
609
            lstFormats.getSelectionModel().setSelectionInterval(formatIndex, formatIndex);
610

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

    
635
    @SuppressWarnings("unchecked")
636
    private void initializeLstProjections() {
637

    
638
        final DefaultListModel<String> model = new DefaultListModel<>();
639

    
640
        lstProjections.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
641

    
642
        ListSelectionModel selectionModel = lstProjections.getSelectionModel();
643
        selectionModel.addListSelectionListener(new ListSelectionListener() {
644

    
645
            @Override
646
            public void valueChanged(ListSelectionEvent e) {
647
                int selectedRow = lstProjections.getSelectedIndex();
648
                if (selectedRow >= 0 && selectedRow < model.getSize()) {
649
                    projection = model.getElementAt(selectedRow);
650
                }
651
            }
652
        });
653

    
654
        lstProjections.setModel(model);
655
    }
656

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

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

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

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

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

    
736
    /**
737
    *
738
    */
739
    private void initializeTreeStyles() {
740
        treeStyles.setToggleClickCount(1);
741
        treeStyles.setRowHeight(22);
742

    
743
        treeStyles.setCellRenderer(new DefaultTreeCellRenderer() {
744

    
745
            /**
746
             *
747
             */
748
            private static final long serialVersionUID = 4821777811489883864L;
749

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

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

    
784
        treeStyles.addMouseListener(new java.awt.event.MouseAdapter() {
785

    
786
            @Override
787
            public void mouseClicked(java.awt.event.MouseEvent e) {
788
                ((StyleTreeModel) treeStyles.getModel()).setSelectedLeaf(treeStyles.getSelectionPath());
789
                selectedStyle = ((WMTSNode) treeStyles.getSelectionPath().getLastPathComponent()).getIdentifier();
790
                treeStyles.clearSelection();
791
                repaint();
792
            }
793
        });
794
    }
795

    
796
    private void updateTreeStyles() {
797

    
798
        tabWMTS.setEnabledAt(TAB_STYLES_INDEX, selectedLayer != null);
799

    
800
        StyleTreeModel model = new StyleTreeModel(selectedLayer);
801

    
802
        treeStyles.setModel(model);
803
        expandAllNodes(treeStyles);
804
    }
805

    
806
    private void expandAllNodes(JTree tree) {
807
        int j = tree.getRowCount();
808
        int i = 0;
809
        while (i < j) {
810
            tree.expandRow(i);
811
            i += 1;
812
            j = tree.getRowCount();
813
        }
814
    }
815

    
816
    class StyleTreeModel implements TreeModel {
817

    
818
        WMTSLayerNode layerNode;
819

    
820
        public StyleTreeModel(WMTSLayerNode layerNode) {
821
            this.layerNode = layerNode;
822
        }
823

    
824
        /**
825
         * Will return true if this style is selected.
826
         *
827
         * @param WMSStyle
828
         * @return true if this style is selected.
829
         */
830
        public boolean isSelected(WMTSStyleData style) {
831
            if (layerNode.getSelectedStyle().equals(style)) {
832
                return true;
833
            }
834
            return false;
835
        }
836

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

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

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

    
897
        @Override
898
        public Object getRoot() {
899
            return layerNode; // ToolsLocator.getI18nManager().getTranslation("_selected_layers");
900
        }
901

    
902
        @Override
903
        public int getChildCount(Object parent) {
904
            return ((WMTSLayerNode) parent).getStyles().size();
905
        }
906

    
907
        @Override
908
        public boolean isLeaf(Object node) {
909
            return (node instanceof WMTSStyleData);
910
        }
911

    
912
        @Override
913
        public Object getChild(Object parent, int index) {
914
            if (parent instanceof WMTSStyleData) {
915
                return null;
916
            }
917
            return ((WMTSLayerNode) parent).getStyles().get(index);
918
        }
919

    
920
        @Override
921
        public int getIndexOfChild(Object parent, Object child) {
922
            if (parent instanceof WMTSStyleData) {
923
                return -1;
924
            }
925

    
926
            WMTSLayerNode node = (WMTSLayerNode) parent;
927
            for (int i = 0; i < node.getStyles().size(); i++) {
928
                if (node.getStyles().get(i).equals(child)) {
929
                    return i;
930
                }
931
            }
932
            return -1;
933
        }
934

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

    
939
        }
940

    
941
        @Override
942
        public void removeTreeModelListener(TreeModelListener l) {
943
            // TODO Auto-generated method stub
944

    
945
        }
946

    
947
        @Override
948
        public void valueForPathChanged(TreePath path, Object newValue) {
949
            // TODO Auto-generated method stub
950

    
951
        }
952
    }
953

    
954
    @Override
955
    public WMTSLayerNode getParameters() {
956
        String identifier = selectedLayer.getIdentifier();
957

    
958
        WMTSNode root = serverExplorer.getListAsTree(true);
959
        WMTSLayerNode layerNode = (WMTSLayerNode) findLayer(root, selectedLayer.getIdentifier());
960
        fillParametersInNode(layerNode);
961

    
962
        return layerNode;
963
    }
964

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

    
979
    private WMTSLayerNode fillParametersInNode(WMTSLayerNode node) {
980

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

    
993
        return node;
994
    }
995

    
996
    @Override
997
    public boolean refreshLocalCache() {
998
        return chkRefreshLocalCache.isSelected();
999
    }
1000
}