Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.fmap.control / src / main / java / org / gvsig / fmap / mapcontrol / impl / DefaultMapControlManager.java @ 43953

History | View | Annotate | Download (15.3 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
/*
25
 * AUTHORS (In addition to CIT):
26
 * 2009 {Iver T.I.}   {Task}
27
 */
28

    
29
package org.gvsig.fmap.mapcontrol.impl;
30

    
31
import java.awt.Color;
32
import java.util.ArrayList;
33
import java.util.Iterator;
34
import java.util.LinkedHashSet;
35
import java.util.List;
36
import java.util.Map;
37
import java.util.Set;
38
import java.util.prefs.Preferences;
39
import javax.swing.JButton;
40
import javax.swing.JComboBox;
41
import javax.swing.JTextField;
42
import javax.swing.JToggleButton;
43
import javax.swing.tree.TreeModel;
44
import org.cresques.cts.IProjection;
45
import org.gvsig.fmap.mapcontrol.LayersTreeModel;
46

    
47
import org.slf4j.Logger;
48
import org.slf4j.LoggerFactory;
49

    
50
import org.gvsig.fmap.geom.Geometry;
51
import org.gvsig.fmap.mapcontext.MapContext;
52
import org.gvsig.fmap.mapcontext.MapContextLocator;
53
import org.gvsig.fmap.mapcontext.MapContextManager;
54
import org.gvsig.fmap.mapcontext.layers.FLayers;
55
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
56
import org.gvsig.fmap.mapcontrol.AreaAndPerimeterCalculator;
57
import org.gvsig.fmap.mapcontrol.CompoundLayersTreeModel;
58
import org.gvsig.fmap.mapcontrol.MapControl;
59
import org.gvsig.fmap.mapcontrol.MapControlCreationException;
60
import org.gvsig.fmap.mapcontrol.MapControlCreationListener;
61
import org.gvsig.fmap.mapcontrol.MapControlDrawer;
62
import org.gvsig.fmap.mapcontrol.MapControlManager;
63
import org.gvsig.fmap.mapcontrol.swing.dynobject.LayersDynObjectSetComponent;
64
import org.gvsig.fmap.mapcontrol.swing.dynobject.impl.DefaultLayersDynObjectSetComponent;
65
import org.gvsig.fmap.mapcontrol.swing.pickercontroller.impl.EnvelopePickerControllerImpl;
66
import org.gvsig.fmap.mapcontrol.swing.pickercontroller.impl.ScalePickerControllerImpl;
67
import org.gvsig.fmap.mapcontrol.tools.snapping.snappers.ISnapper;
68
import org.gvsig.tools.ToolsLocator;
69
import org.gvsig.tools.dynobject.DynObjectSet;
70
import org.gvsig.tools.extensionpoint.ExtensionPoint;
71
import org.gvsig.tools.extensionpoint.ExtensionPoint.Extension;
72
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
73

    
74
/**
75
 * @author <a href="mailto:jpiera@gvsig.org">Jorge Piera</a>
76
 */
77
public class DefaultMapControlManager implements MapControlManager{
78
        private static final Logger logger = LoggerFactory.getLogger(MapControlManager.class);
79
        private static final String MAPCONTROL_MANAGER_EXTENSION_POINT = "MapControlManagerExtensionPoint";
80
        private static final String DEFAULT_MAPCONTROLMANAGER_NAME = null;
81
        private static final String SNAPPING_EXTENSION_POINT = "Snapper";
82

    
83
        private ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
84
        private int snappingTolerance = 4;
85
        private ISymbol selectionSymbol = null;
86
        private ISymbol axisReferencesSymbol = null;
87
        private ISymbol geometrySelectionSymbol = null;
88
        private ISymbol handlerSymbol = null;
89
        private static MapContextManager mapContextManager = MapContextLocator
90
        .getMapContextManager();
91
        private Preferences prefs = Preferences.userRoot().node( "cadtooladapter" );
92
        private static Preferences prefSnappers = Preferences.userRoot().node("snappers");
93
        private List<ISnapper> snappers = null;
94
        private Set<MapControlCreationListener> mapControlCreationListeners = new LinkedHashSet<MapControlCreationListener>();
95

    
96

    
97
        public DefaultMapControlManager() {
98
                super();
99
                snappers = new ArrayList<ISnapper>();
100
        }
101

    
102
        /* (non-Javadoc)
103
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#createDefaultMapControlDrawer()
104
         */
105
        public MapControlDrawer createDefaultMapControlDrawer() throws MapControlCreationException {
106
                ExtensionPoint ep = extensionPoints.add(MAPCONTROL_MANAGER_EXTENSION_POINT);
107
                try {
108
                        return (MapControlDrawer)ep.create(DEFAULT_MAPCONTROLMANAGER_NAME);
109
                } catch (Exception e) {
110
                        throw new MapControlCreationException(e);
111
                }
112
        }
113

    
114
        /*
115
         * (non-Javadoc)
116
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#createMapControlDrawer(java.lang.String)
117
         */
118
        public MapControlDrawer createMapControlDrawer(String name) throws MapControlCreationException {
119
                ExtensionPoint ep = extensionPoints.add(MAPCONTROL_MANAGER_EXTENSION_POINT);
120
                try {
121
                        return (MapControlDrawer)ep.create(name);
122
                } catch (Exception e) {
123
                        throw new MapControlCreationException(e);
124
                }
125
        }
126

    
127
        /* (non-Javadoc)
128
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#registerDefaultMapControlDrawer(java.lang.Class)
129
         */
130
        public void registerDefaultMapControlDrawer(Class mapControlDrawerClass) {
131
                if (!MapControlDrawer.class.isAssignableFrom(mapControlDrawerClass)) {
132
                        throw new IllegalArgumentException(mapControlDrawerClass.getName()
133
                                        + " must implement the MapControlDrawer interface");
134
                }
135

    
136
                ExtensionPoint extensionPoint = extensionPoints.add(MAPCONTROL_MANAGER_EXTENSION_POINT, "");
137
                extensionPoint.append(DEFAULT_MAPCONTROLMANAGER_NAME, "Default MapControl", mapControlDrawerClass);
138
        }
139

    
140
        /* (non-Javadoc)
141
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#registerMapControlDrawer(int, java.lang.Class)
142
         */
143
        public void registerMapControlDrawer(String name,
144
                        Class mapControlDrawerClass) {
145

    
146
                if (!MapControlDrawer.class.isAssignableFrom(mapControlDrawerClass)) {
147
                        throw new IllegalArgumentException(mapControlDrawerClass.getName()
148
                                        + " must implement the MapControlDrawer interface");
149
                }
150

    
151
                ExtensionPoint extensionPoint = extensionPoints.add(MAPCONTROL_MANAGER_EXTENSION_POINT, "");
152
                extensionPoint.append(name, "Default MapControl", mapControlDrawerClass);
153
        }
154

    
155
        /* (non-Javadoc)
156
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#getSnappingTolerance()
157
         */
158
        public int getTolerance() {
159
                return snappingTolerance;
160
        }
161

    
162
        /* (non-Javadoc)
163
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#setSnappingTolerance(int)
164
         */
165
        public void setTolerance(int tolerance) {
166
                snappingTolerance = tolerance;
167
        }
168

    
169
        /* (non-Javadoc)
170
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#clearSnappers()
171
         */
172
        public void clearSnappers() {
173
                snappers.clear();
174
        }
175

    
176
        /* (non-Javadoc)
177
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#getAxisReferenceSymbol()
178
         */
179
        public ISymbol getAxisReferenceSymbol() {
180
                if (axisReferencesSymbol == null){
181
                        axisReferencesSymbol =
182
                                        mapContextManager.getSymbolManager()
183
                        .createSymbol(Geometry.TYPES.GEOMETRY,
184
                                        new Color(100, 100, 100, 100));
185
                }
186
                return axisReferencesSymbol;
187
        }
188

    
189
        /* (non-Javadoc)
190
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#getGeometrySelectionSymbol()
191
         */
192
        public ISymbol getGeometrySelectionSymbol() {
193
                if (geometrySelectionSymbol == null){
194
                        geometrySelectionSymbol =
195
                                        mapContextManager.getSymbolManager()
196
                        .createSymbol(Geometry.TYPES.GEOMETRY, Color.RED);
197
                }
198
                return geometrySelectionSymbol;
199
        }
200

    
201
        /* (non-Javadoc)
202
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#getHandlerSymbol()
203
         */
204
        public ISymbol getHandlerSymbol() {
205
                if (handlerSymbol == null){
206
                        handlerSymbol =
207
                                        mapContextManager.getSymbolManager().createSymbol(
208
                                        Geometry.TYPES.GEOMETRY, Color.ORANGE);
209
                }
210
                return handlerSymbol;
211
        }
212

    
213
        /* (non-Javadoc)
214
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#getSelectionSymbol()
215
         */
216
        public ISymbol getSelectionSymbol() {
217
                if (selectionSymbol == null){
218
                        selectionSymbol =
219
                                        mapContextManager.getSymbolManager().createSymbol(
220
                                        Geometry.TYPES.GEOMETRY, new Color(255, 0, 0, 100));
221
                }
222
                return selectionSymbol;
223
        }
224

    
225
        /*
226
         * (non-Javadoc)
227
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#setAxisReferenceSymbol(org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol)
228
         */
229
        public void setAxisReferenceSymbol(ISymbol axisReferencesSymbol) {
230
                this.axisReferencesSymbol = axisReferencesSymbol;
231
        }
232

    
233
        /*
234
         * (non-Javadoc)
235
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#setGeometrySelectionSymbol(org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol)
236
         */
237
        public void setGeometrySelectionSymbol(ISymbol geometrySelectionSymbol) {
238
                this.geometrySelectionSymbol = geometrySelectionSymbol;
239
        }
240

    
241
        /*
242
         * (non-Javadoc)
243
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#setHandlerSymbol(org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol)
244
         */
245
        public void setHandlerSymbol(ISymbol handlerSymbol) {
246
                this.handlerSymbol = handlerSymbol;
247
        }
248

    
249
        /*
250
         * (non-Javadoc)
251
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#setSelectionSymbol(org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol)
252
         */
253
        public void setSelectionSymbol(ISymbol selectionSymbol) {
254
                this.selectionSymbol = selectionSymbol;
255
        }
256

    
257
        /* (non-Javadoc)
258
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#addSnapper(org.gvsig.fmap.mapcontrol.tools.snapping.snappers.ISnapper)
259
         */
260
        public void registerSnapper(String name, Class snapperClass) {
261
                if (!ISnapper.class.isAssignableFrom(snapperClass)) {
262
                        throw new IllegalArgumentException(snapperClass.getName()
263
                                        + " must implement the ISnapper interface");
264
                }
265

    
266
                ExtensionPoint extensionPoint = extensionPoints.add(SNAPPING_EXTENSION_POINT, "");
267
                Extension extension = extensionPoint.append(name, "", snapperClass);
268

    
269
                ISnapper snapper;
270
                try {
271
                        snapper = (ISnapper)extension.create();
272
                        snappers.add(snapper);
273
            String nameClass=snapper.getClass().getName();
274
                nameClass=nameClass.substring(nameClass.lastIndexOf('.'));
275
                boolean select = prefSnappers.getBoolean("snapper_activated" + nameClass, false);
276
                int priority = prefs.getInt("snapper_priority" + nameClass,3);
277
                snapper.setPriority(priority);
278
                if (select){
279
                          snapper.setEnabled(select);
280
                }
281

    
282
                } catch (Exception e) {
283
                        logger.error("It is not possible to create the snapper");
284
                }
285
        }
286

    
287
        /* (non-Javadoc)
288
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#getSnapperAt(int)
289
         */
290
        public ISnapper getSnapperAt(int index) {
291
                return snappers.get(index);
292
        }
293

    
294
        /* (non-Javadoc)
295
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#getSnapperCount()
296
         */
297
        public int getSnapperCount() {
298
                return snappers.size();
299
        }
300

    
301
        /* (non-Javadoc)
302
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#disableSnapping()
303
         */
304
        public void disableSnapping() {
305
                snappers.clear();
306
        }
307

    
308
        /* (non-Javadoc)
309
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#enableSnapping()
310
         */
311
        public void enableSnapping() {
312
                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
313
                ExtensionPoint ep = extensionPoints.get(SNAPPING_EXTENSION_POINT);
314
                Iterator iterator = ep.iterator();
315

    
316
                while (iterator.hasNext()) {
317
                        try {
318
                                Extension obj= (Extension)iterator.next();
319
                                ISnapper snapper = (ISnapper) ep.create(obj.getName());
320
                                snappers.add(snapper);
321
                        } catch (Exception e) {
322
                                logger.error("Creating a snapper", e);
323
                        }
324
                }
325

    
326
                for (int n = 0; n < getSnapperCount(); n++) {
327
                        ISnapper snp = getSnapperAt(n);
328
                        String nameClass = snp.getClass().getName();
329
                        nameClass = nameClass.substring(nameClass.lastIndexOf('.'));
330
                        boolean select = prefs.getBoolean("snapper_activated" + nameClass, false);
331
                        if (select) {
332
                                snp.setEnabled(select);
333
                        }
334
                        int priority = prefs.getInt("snapper_priority" + nameClass, 3);
335
                        snp.setPriority(priority);
336
                }
337

    
338
        }
339

    
340
        /* (non-Javadoc)
341
         * @see org.gvsig.fmap.mapcontrol.MapControlManager#getEditionPreferences()
342
         */
343
        public Preferences getEditionPreferences() {
344
                return prefs;
345
        }
346

    
347
        public MapControl createJMapControlPanel(MapContext mapContext) throws MapControlCreationException {
348
                MapControl mapControl = new MapControl(mapContext);
349
                mapControl.setMapControlDrawer(this.createDefaultMapControlDrawer());
350
                for( MapControlCreationListener listener : this.mapControlCreationListeners ) {
351
                    if( listener!=null ) {
352
                        mapControl = listener.mapControlCreated(mapControl);
353
                    }
354
                }
355
                return mapControl;
356
        }
357

    
358
        public void addMapControlCreationListener(MapControlCreationListener listener) {
359
            this.mapControlCreationListeners.add(listener);
360
        }
361

    
362
    public LayersDynObjectSetComponent createLayersDynObjectSetComponent(
363
        Map<String, DynObjectSet> layerName2InfoByPoint) {
364
        return createLayersDynObjectSetComponent(layerName2InfoByPoint, false);
365
    }
366

    
367
    public LayersDynObjectSetComponent createLayersDynObjectSetComponent(
368
        Map<String, DynObjectSet> layerName2InfoByPoint, boolean writable) {
369
        return new DefaultLayersDynObjectSetComponent(layerName2InfoByPoint,
370
            writable);
371
    }
372
    
373
    public TreeModel createLayersTreeModel(MapContext mapContext) {
374
        return new LayersTreeModel(mapContext.getLayers());
375
    }
376
    
377
    public TreeModel createLayersTreeModel(FLayers layers) {
378
        return new LayersTreeModel(layers);
379
    }
380
    
381
    public TreeModel createCompoundLayersTreeModel() {
382
        return new CompoundLayersTreeModel();
383
    }
384

    
385
    @Override
386
    public double perimeter(Geometry geom, IProjection proj, int distanceUnits) {
387
        AreaAndPerimeterCalculator calculator = new AreaAndPerimeterCalculator();
388
        return calculator.perimeter(geom, proj, distanceUnits);
389
    }
390

    
391
    @Override
392
    public double area(Geometry geom, IProjection proj, int areaUnits) {
393
        AreaAndPerimeterCalculator calculator = new AreaAndPerimeterCalculator();
394
        return calculator.area(geom, proj, areaUnits);
395
    }
396

    
397
    @Override
398
    public EnvelopePickerControllerImpl createEnvelopePickerController(
399
            MapControl mapControl, 
400
            JTextField txtUpperLeftX, 
401
            JTextField txtUpperLeftY, 
402
            JTextField txtLowerRightX, 
403
            JTextField txtLowerRightY, 
404
            JButton btnMapControlEnvelope, 
405
            JToggleButton btnCapture
406
        ) {
407
        EnvelopePickerControllerImpl controller = new EnvelopePickerControllerImpl(mapControl, txtUpperLeftX, 
408
                txtUpperLeftY, txtLowerRightX, txtLowerRightY,
409
                btnMapControlEnvelope, btnCapture
410
        );
411
        return controller;
412
    }
413

    
414
    @Override
415
    public EnvelopePickerControllerImpl createEnvelopePickerController(
416
            MapControl mapControl, 
417
            JTextField txtEnvelope, 
418
            JButton btnMapControlEnvelope, 
419
            JToggleButton btnCapture
420
        ) {
421
        EnvelopePickerControllerImpl controller = new EnvelopePickerControllerImpl(
422
                mapControl, 
423
                txtEnvelope, 
424
                btnMapControlEnvelope, 
425
                btnCapture
426
        );
427
        return controller;
428
    }
429
    
430
    @Override
431
    public ScalePickerControllerImpl createScalePickerController(
432
            MapControl mapControl, 
433
            JComboBox cboScale, 
434
            JButton btnMapControlScale, 
435
            JToggleButton btnCapture
436
        ) {
437
        ScalePickerControllerImpl controller = new ScalePickerControllerImpl(
438
                mapControl, 
439
                cboScale, 
440
                btnMapControlScale, 
441
                btnCapture
442
        );
443
        return controller;
444
    }
445
    
446
    
447
}