Statistics
| Revision:

root / org.gvsig.proj / branches / refactor2018 / org.gvsig.proj / org.gvsig.proj.swing / org.gvsig.proj.swing.impl / src / main / java / org / gvsig / proj / swing / impl / CtSelectorController.java @ 868

History | View | Annotate | Download (21.2 KB)

1
package org.gvsig.proj.swing.impl;
2

    
3
import java.awt.event.ActionEvent;
4
import java.awt.event.ActionListener;
5
import java.beans.PropertyChangeListener;
6
import java.text.ParseException;
7
import java.util.ArrayList;
8
import java.util.List;
9

    
10
import javax.swing.Action;
11
import javax.swing.Icon;
12
import javax.swing.ImageIcon;
13
import javax.swing.JComponent;
14
import javax.swing.JTree;
15
import javax.swing.event.TreeSelectionEvent;
16
import javax.swing.event.TreeSelectionListener;
17
import javax.swing.tree.DefaultTreeCellRenderer;
18
import javax.swing.tree.DefaultTreeModel;
19
import javax.swing.tree.TreeNode;
20
import javax.swing.tree.TreePath;
21
import javax.swing.tree.TreeSelectionModel;
22

    
23
import org.apache.commons.io.FilenameUtils;
24
import org.apache.commons.lang3.StringUtils;
25
import org.gvsig.proj.CoordinateReferenceSystem;
26
import org.gvsig.proj.CoordinateTransformation;
27
import org.gvsig.proj.catalog.TransformationDefinition;
28
import org.gvsig.proj.catalog.exception.UnsupportedTransformationException;
29
import org.gvsig.proj.swing.CoordinateReferenceSystemSelectorComponent;
30
import org.gvsig.proj.swing.CoordinateTransformationSelectorComponent;
31
import org.gvsig.proj.swing.impl.tree.BranchNode;
32
import org.gvsig.proj.swing.impl.tree.CtLoader;
33
import org.gvsig.proj.swing.impl.tree.CtTreeNode;
34
import org.gvsig.proj.swing.impl.tree.DirectGroupLoader;
35
import org.gvsig.proj.swing.impl.tree.GroupLoader;
36
import org.gvsig.proj.swing.impl.tree.LeafNode;
37
import org.gvsig.proj.swing.impl.tree.LoadedGroup;
38
import org.gvsig.proj.swing.impl.tree.LoadingNode;
39
import org.gvsig.proj.swing.impl.tree.TreeContainer;
40
import org.gvsig.tools.ToolsLocator;
41
import org.gvsig.tools.i18n.I18nManager;
42
import org.gvsig.tools.swing.api.ActionListenerSupport;
43
import org.gvsig.tools.swing.api.Component;
44
import org.gvsig.tools.swing.api.ToolsSwingLocator;
45
import org.gvsig.tools.swing.api.ToolsSwingManager;
46
import org.gvsig.tools.swing.api.windowmanager.Dialog;
47
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
48
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
49
import org.gvsig.tools.swing.icontheme.IconTheme;
50
import org.slf4j.Logger;
51
import org.slf4j.LoggerFactory;
52

    
53
public class CtSelectorController extends CtSelectorView
54
        implements CoordinateTransformationSelectorComponent, 
55
                                                                                                Component,
56
                                                                                                TreeContainer {
57
        private static final long serialVersionUID = -5281166703625751190L;
58
        private CoordinateTransformation selectedCt = null;
59
        private ActionListenerSupport listenerSupport = ToolsSwingLocator.getToolsSwingManager().createActionListenerSupport();
60
        public static final String CT_SELECTED_ACTION_COMMAND = "CtSelected";
61
        protected ImageIcon RECENT_ICON;
62
        protected ImageIcon FAVOURITE_ICON;
63
        private ImageIcon CT_ICON;
64
        private ImageIcon FOLDER_OPEN_ICON;
65
        private ImageIcon FOLDER_CLOSED_ICON;
66
        private static Logger logger = LoggerFactory.getLogger(CtSelectorController.class);
67
        protected DefaultTreeModel model;
68
        protected BranchNode root;
69
        protected LoadedGroup recent;
70
        protected LoadedGroup favorite;
71
        protected BranchNode customNode; 
72
        protected IconTheme iconTheme = null;
73
        protected I18nManager i18nManager = null;
74
        final protected DefaultCoordinateReferenceSystemSwingManager manager;
75
        private CoordinateReferenceSystem sourceCRS;
76
        private CoordinateReferenceSystem targetCRS;
77
        
78
        public CtSelectorController(DefaultCoordinateReferenceSystemSwingManager manager) {
79
                super();
80
                this.manager = manager;
81
                initIcons();
82
                initComponents();
83
                initTree();
84
                setSearchAvailability();
85
                initActionListeners();
86
                resetSearchCombo(null);
87
                initSearchActions();
88
        }
89
        
90
        @Override
91
        public ImageIcon loadImage( String imageName ) {
92
                return getIconTheme().get(FilenameUtils.getBaseName(imageName));
93
        }
94
        
95
        private IconTheme getIconTheme() {
96
                if (iconTheme == null) {
97
                        iconTheme = ToolsSwingLocator.getIconThemeManager().getCurrent();
98
                }
99
                return iconTheme;
100
        }
101
        
102
        private I18nManager getI18nManager() {
103
                if (i18nManager == null) {
104
                        i18nManager = ToolsLocator.getI18nManager();
105
                }
106
                return i18nManager;
107
        }
108
        
109
        
110
        protected void initComponents() {
111
                IconTheme theme = getIconTheme();
112

    
113
                this.btnSearch.setIcon(theme.get("crs-ctselector-search"));
114
                this.btnSearchRemove.setIcon(theme.get("crs-ctselector-search-remove"));
115
                this.lblFilterAlpha.setIcon(theme.get("crs-ctselector-text-filter"));
116
                this.btnCtAdd.setIcon(theme.get("crs-ctselector-ct-new"));
117
                this.btnRecentRemove.setIcon(theme.get("crs-ctselector-recent-remove"));
118
                this.btnFavoritesAdd.setIcon(theme.get("crs-ctselector-favorite-add"));
119
                this.btnFavoritesRemove.setIcon(theme.get("crs-ctselector-favorite-remove"));
120
                this.btnSelectSoureCRS.setIcon(getIconTheme().get("crs-ctselector-crs"));
121
                this.btnSelectTargetCRS.setIcon(getIconTheme().get("crs-ctselector-crs"));
122
                
123
                ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
124
                // hide recent remove since it is currently not supported
125
                this.btnRecentRemove.setVisible(false);
126

    
127
                swingManager.translate(this.btnSearch);
128
                swingManager.translate(this.btnSearchRemove);
129
                swingManager.translate(this.btnCtAdd);
130
                swingManager.translate(this.btnRecentRemove);
131
                swingManager.translate(this.btnFavoritesAdd);
132
                swingManager.translate(this.btnFavoritesRemove);                
133
                swingManager.translate(this.lblCurrentCt);
134
                
135
            this.txtDescription.setEditable(false);
136
                this.txtDescription.setText("");
137
                this.txtDescription.setLineWrap(true);
138
                this.txtDescription.setWrapStyleWord(true);
139
                this.txtCtWkt.setEditable(false);
140
                this.txtCtWkt.setText("");
141
                
142
                /**
143
                 * TODO Update strings in CrsPanel and change the name of some components
144
                 *
145
                this.btnSearch.setToolTipText(manager.getTranslation("Search"));
146
            this.btnSearchRemove.setToolTipText(manager.getTranslation("Clear search"));
147
            this.btnFavoritesAdd.setToolTipText(manager.getTranslation("Add selected CRS to favorites"));
148
            this.btnFavoritesAdd1.setToolTipText(manager.getTranslation("Remove selected CRS from favorites"));
149
            this.btnCrsAdd.setToolTipText(manager.getTranslation("Create a new CRS"));
150
            this.btnFavoritesAdd2.setToolTipText(manager.getTranslation("Remove selected CRS from recents"));
151
            this.lbl_currentCrs.setText(manager.getTranslation("Current coordinate system:"));
152
            this.jtxt_description.setEditable(false);
153
                this.jtxt_description.setText("");
154
                this.jtxt_description.setLineWrap(true);
155
                this.jtxt_description.setWrapStyleWord(true);
156
                this.txtCrsWkt.setEditable(false);
157
                this.txtCrsWkt.setText("");
158
                */
159
                
160

    
161
                
162
        }
163

    
164
        protected void initActionListeners() {
165
                this.btnFavoritesAdd.addActionListener(new ActionListener() {
166
                        @Override
167
                        public void actionPerformed(ActionEvent e) {
168
                                CoordinateTransformation selectedCt = CtSelectorController.this.getCoordinateTransformation();
169
                                if (selectedCt != null) {
170
                                        manager.getTransformationFavorites().add(selectedCt.getDefinition());
171
                                        favorite.reloadChildren();
172
                                }
173
                        }
174
                });
175
                
176
                this.btnFavoritesRemove.addActionListener(new ActionListener() {
177
                        @Override
178
                        public void actionPerformed(ActionEvent e) {
179
                                CoordinateTransformation selectedCt = CtSelectorController.this.getCoordinateTransformation();
180
                                if (selectedCt != null) {
181
                                        manager.getTransformationFavorites().remove(selectedCt.getDefinition());
182
                                        favorite.reloadChildren();
183
                                }
184
                        }
185
                });
186
                
187
                this.btnSelectSoureCRS.addActionListener(new ActionListener() {
188
                        
189
                        @Override
190
                        public void actionPerformed(ActionEvent e) {
191
                                WindowManager_v2 manager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
192
                                CoordinateReferenceSystemSelectorComponent c = getManager().createCoordinateReferenceSystemSelectionComponent();
193
                                Dialog d = manager.createDialog(c.asJComponent(),
194
                                                getI18nManager().getTranslation("Source CRS"),
195
                                                getI18nManager().getTranslation("Source CRS"),
196
                                                WindowManager_v2.BUTTONS_OK_CANCEL);
197
                                d.show(WindowManager.MODE.DIALOG);
198

    
199
                                if (d.getAction()==WindowManager_v2.BUTTON_OK) {
200
                                        setSourceCoordinateReferenceSystem(c.getCoordinateReferenceSystem());
201
                                }
202
                        }
203
                });
204
                this.btnSelectTargetCRS.addActionListener(new ActionListener() {
205
                        
206
                        @Override
207
                        public void actionPerformed(ActionEvent e) {
208
                                WindowManager_v2 manager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
209
                                CoordinateReferenceSystemSelectorComponent c = getManager().createCoordinateReferenceSystemSelectionComponent();
210
                                Dialog d = manager.createDialog(c.asJComponent(),
211
                                                getI18nManager().getTranslation("Target CRS"),
212
                                                getI18nManager().getTranslation("Target CRS"),
213
                                                WindowManager_v2.BUTTONS_OK_CANCEL);
214
                                d.show(WindowManager.MODE.DIALOG);
215
                                if (d.getAction()==WindowManager_v2.BUTTON_OK) {
216
                                        setTargetCoordinateReferenceSystem(c.getCoordinateReferenceSystem());
217
                                        resetSearch();
218
                                }
219
                        }
220
                });
221
                
222
                /*
223
                this.btnRecentCrsRemove.addActionListener(new ActionListener() {
224
                        @Override
225
                        public void actionPerformed(ActionEvent e) {
226
                                CoordinateReferenceSystem selectedCrs = CrsSelectorController.this.getCoordinateReferenceSystem();
227
                                if (selectedCrs != null) {
228
                                        manager.getCoordinateReferenceSystemHistory().remove(selectedCrs.getDefinition());
229
                                }
230
                        }
231
                });*/
232
        }
233
        
234
        protected void search() {
235
                String filter = getAlphanumericFilter();
236
                if (filter != null && !filter.equals("")) {
237
                        manager.getTransformationTextFilterHistory().add(filter);
238
                }
239
                for (int i=0; i<root.getChildCount(); i++) {
240
                        TreeNode node = root.getChildAt(i);
241
                        if (node instanceof BranchNode) {
242
                                ((BranchNode)node).reloadChildren();
243
                        }
244
                }
245
                resetSearchCombo(filter);
246
                model.reload();
247
            expandBranches(this.root);
248
        }
249
        
250
        private void expandBranches(TreeNode root) {
251
                for (int i=0; i<root.getChildCount(); i++) {
252
                        TreeNode node = root.getChildAt(i);
253
                        if (node instanceof BranchNode) {
254
                                TreeNode[] path = this.model.getPathToRoot(node);
255
                                if (path != null) {
256
                                        this.treeResults.expandPath(new TreePath(path));
257
                                }
258
                                expandBranches(node);
259
                        }
260
                }
261
        }
262
        
263
        protected void resetSearchCombo(String selectedItem) {
264
                this.cboFilterAlpha.removeAllItems();
265
                if ("".equals(selectedItem)) {
266
                        this.cboFilterAlpha.insertItemAt(selectedItem, 0);
267
                }
268
                for (String filter: manager.getTransformationTextFilterHistory()) {
269
                        this.cboFilterAlpha.addItem(filter);        
270
                }
271
                this.cboFilterAlpha.setSelectedItem(selectedItem);
272
        }
273
        
274
        protected void initSearchActions() {
275
                this.cboFilterAlpha.getActionMap().put("enterPressed", new Action() {
276
                        
277
                        @Override
278
                        public void actionPerformed(ActionEvent e) {
279
                                search();        
280
                        }
281
                        
282
                        @Override
283
                        public void setEnabled(boolean b) {
284
                                // TODO Auto-generated method stub
285
                                
286
                        }
287
                        
288
                        @Override
289
                        public void removePropertyChangeListener(PropertyChangeListener listener) {
290
                                // TODO Auto-generated method stub
291
                                
292
                        }
293
                        
294
                        @Override
295
                        public void putValue(String key, Object value) {
296
                                // TODO Auto-generated method stub
297
                                
298
                        }
299
                        
300
                        @Override
301
                        public boolean isEnabled() {
302
                                return true;
303
                        }
304
                        
305
                        @Override
306
                        public Object getValue(String key) {
307
                                // TODO Auto-generated method stub
308
                                return null;
309
                        }
310
                        
311
                        @Override
312
                        public void addPropertyChangeListener(PropertyChangeListener listener) {
313
                                // TODO Auto-generated method stub
314
                                
315
                        }
316
                });
317
                
318
                this.btnSearch.addActionListener(new ActionListener() {
319
                        
320
                        @Override
321
                        public void actionPerformed(ActionEvent e) {
322
                                search();
323
                                
324
                        }
325
                });
326
                
327
                this.btnSearchRemove.addActionListener(new ActionListener() {
328
                        
329
                        @Override
330
                        public void actionPerformed(ActionEvent e) {
331
                                resetSearchCombo("");
332
                                search();
333
                        }
334
                });
335
                
336
        }
337
        
338
        protected void reloadBranchNodes() {
339
                
340
        }
341
        
342
        protected void initIcons() {
343
                RECENT_ICON = getIconTheme().get("crs-ctselector-recent");
344
                FAVOURITE_ICON = getIconTheme().get("crs-ctselector-favorite");
345
                CT_ICON = getIconTheme().get("crs-ctselector-ct");
346
                FOLDER_OPEN_ICON = getIconTheme().get("crs-branchnode-tree-group-expanded");
347
                FOLDER_CLOSED_ICON = getIconTheme().get("crs-branchnode-tree-group-collapsed");
348
        }
349
        
350
        protected void initTree() {
351
                root = new BranchNode(null, this, "root");
352
                model = new DefaultTreeModel(root, false);
353
                
354
                JTree tree = this.treeResults;
355
                tree.getSelectionModel().setSelectionMode
356
                (TreeSelectionModel.SINGLE_TREE_SELECTION);
357
                listenerSupport = ToolsSwingLocator.getToolsSwingManager().createActionListenerSupport();
358
                tree.addTreeSelectionListener(new TreeSelectionListener() {
359
                        @Override
360
                        public void valueChanged(TreeSelectionEvent e) {
361
                                CtSelectorController.this.treeSelectedValueChanged(e);
362
                        }
363
                });
364
                CellRenderer renderer = new CellRenderer();
365
                tree.setCellRenderer(renderer);
366
                
367
                recent = new LoadedGroup(root, this, getI18nManager().getTranslation("Recent"), RECENT_ICON);
368
                recent.setLoader(new RecentLoader(recent));
369
                recent.loadChildren();
370
                root.add(recent);
371
                
372
                favorite = new LoadedGroup(root, this, getI18nManager().getTranslation("Favorites"), FAVOURITE_ICON);
373
                favorite.setLoader(new FavoritesLoader(favorite));
374
                favorite.loadChildren();
375
                root.add(favorite);
376
                
377
                AuthorityLoadedGroup authorityNode = new AuthorityLoadedGroup(root, getI18nManager().getTranslation("Transformations"));
378
                root.add(authorityNode);
379
                tree.setModel(model);
380
        }
381

    
382
        protected void treeSelectedValueChanged(TreeSelectionEvent e) {
383
                TreeNode selection = (TreeNode) this.treeResults.getLastSelectedPathComponent();
384
                if (selection==null) {
385
                        return;
386
                }
387
                if (selection instanceof CtTreeNode) {
388
                        TransformationDefinition def = ((CtTreeNode)selection).getCT();
389
                        if (!compareSourceAndTarget(def)) {
390
                                this.txtDescription.setText(getI18nManager().getTranslation("The selected transformation does not match the source and"
391
                                                + " target CRSs"));
392
                                this.txtCtWkt.setText("");
393
                                return;
394
                        }
395
                        try {
396
                                selectedCt = manager.getCRSManager().getCoordinateTransformation(def);
397
                                this.txtDescription.setText(def.getDescription());
398
                                this.txtDescription.setCaretPosition(0);
399
                                this.txtCtWkt.setText(def.toWKT());
400
                                this.txtCtWkt.setCaretPosition(0);
401
                                listenerSupport.fireActionEvent(new ActionEvent(selection, ActionEvent.ACTION_FIRST, CT_SELECTED_ACTION_COMMAND));
402
                        } catch (UnsupportedTransformationException | ParseException e1) {
403
                                logger.debug("Coordinate operation not supported", e);
404
                        }                        
405
                }
406
        }
407
        
408
        protected void clearSelection() {
409
                this.selectedCt = null;
410
                this.treeResults.clearSelection();
411
                this.txtDescription.setText("");
412
                this.txtCtWkt.setText("");
413
        }
414
        
415
        /**
416
         * Enables search buttons and results when the source and target CRSs have
417
         * been defined and disables them otherwise
418
         */
419
        protected boolean setSearchAvailability() {
420
                boolean enabled = (getSourceCoordinateReferenceSystem()!=null && getTargetCoordinateReferenceSystem()!=null);
421
                this.btnSearch.setEnabled(enabled);
422
                this.btnSearchRemove.setEnabled(enabled);
423
                this.treeResults.setEnabled(enabled);
424
                return enabled;
425
        }
426
        
427
        protected void resetSearch() {
428
                if (setSearchAvailability()) {
429
                        search();
430
                }
431
        }
432

    
433
        @Override
434
        public JComponent asJComponent() {
435
                return this;
436
        }
437

    
438
        @Override
439
        public void enableAlphanumericFilter(String searchString) {
440
                cboFilterAlpha.addItem(searchString);
441
                cboFilterAlpha.setSelectedItem(searchString);
442
        }
443
        
444
        protected String getAlphanumericFilter() {
445
                return (String) cboFilterAlpha.getSelectedItem();
446
        }
447
        
448
        protected boolean compareSourceAndTarget(TransformationDefinition def) {
449
                if (def!=null && sourceCRS!=null && targetCRS != null
450
                                && def.getSourceDefinition().equals(sourceCRS.getDefinition())
451
                                && def.getTargetDefinition().equals(targetCRS.getDefinition())) {
452
                        return true;
453
                }
454
                return false;
455
        }
456
        
457
        public class RecentLoader extends DirectGroupLoader {
458
                public RecentLoader(LoadedGroup caller) {
459
                        super(caller);
460
                }
461
                
462
                @Override
463
                public List<TreeNode> doExecute() {
464
                        String filter;
465
                        if (CtSelectorController.this.getAlphanumericFilter()!=null) {
466
                                filter = CtSelectorController.this.getAlphanumericFilter().toLowerCase();
467
                        }
468
                        else {
469
                                filter = null;
470
                        }
471
                        ArrayList<TreeNode> results = new ArrayList<TreeNode>();
472
                        for (TransformationDefinition ctDef: manager.getTransformationHistory()) {
473
                                if (StringUtils.isEmpty(filter) || ctDef.toString().toLowerCase().contains(filter)) {
474
                                        results.add(new CtTreeNode(ctDef, caller, compareSourceAndTarget(ctDef)));
475
                                }
476
                        }
477
                        return results;
478
                }
479
        }
480
        
481
        public class FavoritesLoader extends DirectGroupLoader {
482
        
483
                public FavoritesLoader(LoadedGroup caller) {
484
                        super(caller);
485
                }
486
                
487
                @Override
488
                public List<TreeNode> doExecute() {
489
                        String filter;
490
                        if (CtSelectorController.this.getAlphanumericFilter()!=null) {
491
                                filter = CtSelectorController.this.getAlphanumericFilter().toLowerCase();
492
                        }
493
                        else {
494
                                filter = null;
495
                        }
496
                        ArrayList<TreeNode> results = new ArrayList<TreeNode>();
497
                        for (TransformationDefinition ctDef: manager.getTransformationFavorites()) {
498
                                if (StringUtils.isEmpty(filter) || ctDef.toString().toLowerCase().contains(filter)) {
499
                                        results.add(new CtTreeNode(ctDef, caller, compareSourceAndTarget(ctDef)));
500
                                }                        
501
                        }
502
                        return results;
503
                }
504
        }
505
        
506
        public class AuthorityLoadedGroup extends LoadedGroup {
507
                public AuthorityLoadedGroup(TreeNode parent, String message, Icon icon) {
508
                        super(parent, CtSelectorController.this, message, icon);
509
                }
510
                
511
                public AuthorityLoadedGroup(TreeNode parent, String message) {
512
                        super(parent, CtSelectorController.this, message, null);
513
                }
514

    
515
                protected GroupLoader getLoader() {
516
                        String textFilter = CtSelectorController.this.getAlphanumericFilter();
517
                        if (sourceCRS!=null && targetCRS!=null) {
518
                                return new CtLoader(textFilter, this,
519
                                        getSourceCoordinateReferenceSystem().getDefinition(),
520
                                        getTargetCoordinateReferenceSystem().getDefinition(),
521
                                        CtSelectorController.this.manager.getCatalogManager());
522
                        }
523
                        return null;
524
                }
525
        }
526

    
527
        public class CellRenderer extends DefaultTreeCellRenderer {
528
                @Override
529
                public java.awt.Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
530
                                boolean leaf, int row, boolean hasFocus) {
531
                        java.awt.Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
532
                        if (value instanceof BranchNode) {
533
                                Icon icon = ((BranchNode)value).getIcon(expanded);
534
                                if (icon!=null) {
535
                                        this.setIcon(icon);
536
                                }
537
                                else {
538
                                        if (expanded) {
539
                                                this.setIcon(FOLDER_OPEN_ICON);
540
                                        }
541
                                        else {
542
                                                this.setIcon(FOLDER_CLOSED_ICON);
543
                                        }
544
                                }
545
                        }
546
                        else if (value instanceof CtTreeNode) {
547
                                if (!((CtTreeNode) value).isEnabled()) {
548
                                        this.setDisabledIcon(CT_ICON);
549
                                }
550
                                this.setIcon(CT_ICON);
551
                        }
552
                        else if (value instanceof LeafNode) {
553
                                Icon icon = ((LeafNode)value).getIcon();
554
                                if (icon != null) {
555
                                        this.setIcon(icon);
556
                                }
557
                        }
558
                        return this;
559
                }
560
        }
561
        
562
        public DefaultCoordinateReferenceSystemSwingManager getManager() {
563
                return manager;
564
        }
565
        
566
        public DefaultTreeModel getModel() {
567
                return this.model;
568
        }
569
        
570
        public LoadingNode createLoadingNode(BranchNode parent) {
571
                return new LoadingNode(parent,
572
                                this,
573
                                getI18nManager().getTranslation("Loading..."));
574
        }
575

    
576

    
577
        @Override
578
        public JTree getTree() {
579
                return this.treeResults;
580
        }
581

    
582
        @Override
583
        public CoordinateReferenceSystem getSourceCoordinateReferenceSystem() {
584
                return sourceCRS;
585
        }
586

    
587
        @Override
588
        public CoordinateReferenceSystem getTargetCoordinateReferenceSystem() {
589
                return targetCRS;
590
        }
591

    
592
        @Override
593
        public CoordinateTransformation getCoordinateTransformation() {
594
                return selectedCt;
595
        }
596

    
597
        @Override
598
        public void setCoordinateTransformation(CoordinateTransformation transformation) {
599
                selectedCt = transformation;
600
                if (transformation!=null) {
601
                        setSourceCoordinateReferenceSystem(transformation.getSourceCRS(), isSourceCoordinateReferenceSystemEditable());
602
                        setTargetCoordinateReferenceSystem(transformation.getTargetCRS(), isTargetCoordinateReferenceSystemEditable());
603
                }
604
                boolean searchEnabled = setSearchAvailability();
605

    
606
                if (transformation!=null) {
607
                        // add the provided node to recent nodes and select it
608
                        CtTreeNode node = new CtTreeNode(transformation.getDefinition(), recent);
609
                        recent.add(node);
610
                        model.reload(recent);
611
                        this.treeResults.setSelectionPath(new TreePath(model.getPathToRoot(node)));
612
                }
613
                else {
614
                        this.treeResults.clearSelection();
615
                }
616
                if (searchEnabled) {
617
                        search();
618
                }
619
                this.treeResults.repaint();
620
        }
621
        
622
        @Override
623
        public void setSourceCoordinateReferenceSystem(CoordinateReferenceSystem source) {
624
                setSourceCoordinateReferenceSystem(source, true);
625
        }
626

    
627
        @Override
628
        public void setSourceCoordinateReferenceSystem(CoordinateReferenceSystem source, boolean editable) {
629
                this.sourceCRS = source;
630
                this.btnSelectSoureCRS.setEnabled(editable);
631
                this.txtSourceCRS.setText(source.toString());
632
                ensureCompatibleSelection();
633
                resetSearch();
634
        }
635

    
636
        @Override
637
        public void setTargetCoordinateReferenceSystem(CoordinateReferenceSystem target) {
638
                setTargetCoordinateReferenceSystem(target, true);
639
        }
640

    
641
        @Override
642
        public void setTargetCoordinateReferenceSystem(CoordinateReferenceSystem target, boolean editable) {
643
                this.targetCRS = target;
644
                this.btnSelectTargetCRS.setEnabled(editable);
645
                this.txtTargetCRS.setText(target.toString());
646
                ensureCompatibleSelection();
647
                resetSearch();
648
        }
649
        
650
        protected void ensureCompatibleSelection() {
651
                if (selectedCt != null) {
652
                        if (selectedCt.getSourceCRS() != this.sourceCRS
653
                                        || selectedCt.getTargetCRS() != this.targetCRS){
654
                                clearSelection();
655
                        }
656
                }
657
        }
658

    
659
        @Override
660
        public boolean isSourceCoordinateReferenceSystemEditable() {
661
                return this.btnSelectSoureCRS.isEnabled();
662
        }
663

    
664
        @Override
665
        public boolean isTargetCoordinateReferenceSystemEditable() {
666
                return this.btnSelectTargetCRS.isEnabled();
667
        }
668

    
669
        @Override
670
        public void addCoordinateTransformationSelectionListener(ActionListener listener) {
671
                listenerSupport.addActionListener(listener);
672
        }
673

    
674

    
675
}