Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.app / org.gvsig.app.mainplugin / src / main / java / org / gvsig / app / project / documents / view / gui / DefaultViewPanel.java @ 41973

History | View | Annotate | Download (21.9 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 modify it under
7
 * the terms of the GNU General Public License as published by the Free Software
8
 * Foundation; either version 3 of the License, or (at your option) any later
9
 * version.
10
 *
11
 * This program is distributed in the hope that it will be useful, but WITHOUT
12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14
 * details.
15
 *
16
 * You should have received a copy of the GNU General Public License along with
17
 * this program; if not, write to the Free Software Foundation, Inc., 51
18
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us at info AT
21
 * gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.app.project.documents.view.gui;
24

    
25
import java.awt.BorderLayout;
26
import java.awt.Color;
27
import java.awt.Dimension;
28
import java.beans.PropertyChangeEvent;
29
import java.beans.PropertyChangeListener;
30
import java.util.HashMap;
31
import java.util.Iterator;
32

    
33
import javax.swing.JSplitPane;
34
import javax.swing.SwingUtilities;
35

    
36
import org.cresques.cts.IProjection;
37

    
38
import org.gvsig.andami.PluginServices;
39
import org.gvsig.andami.messages.NotificationManager;
40
import org.gvsig.andami.ui.mdiFrame.NewStatusBar;
41
import org.gvsig.andami.ui.mdiManager.WindowInfo;
42
import org.gvsig.app.project.DefaultProject;
43
import org.gvsig.app.project.documents.Document;
44
import org.gvsig.app.project.documents.view.MapOverview;
45
import org.gvsig.app.project.documents.view.ViewDocument;
46
import org.gvsig.app.project.documents.view.toc.gui.TOC;
47
import org.gvsig.app.project.documents.view.toolListeners.AreaListener;
48
import org.gvsig.app.project.documents.view.toolListeners.InfoListener;
49
import org.gvsig.app.project.documents.view.toolListeners.MeasureListener;
50
import org.gvsig.app.project.documents.view.toolListeners.PanListener;
51
import org.gvsig.app.project.documents.view.toolListeners.PointSelectListener;
52
import org.gvsig.app.project.documents.view.toolListeners.PolygonSelectListener;
53
import org.gvsig.app.project.documents.view.toolListeners.RectangleSelectListener;
54
import org.gvsig.app.project.documents.view.toolListeners.StatusBarListener;
55
import org.gvsig.app.project.documents.view.toolListeners.ZoomInListener;
56
import org.gvsig.app.project.documents.view.toolListeners.ZoomOutListener;
57
import org.gvsig.fmap.dal.feature.FeatureStoreNotification;
58
import org.gvsig.fmap.mapcontext.MapContext;
59
import org.gvsig.fmap.mapcontext.events.ColorEvent;
60
import org.gvsig.fmap.mapcontext.events.ExtentEvent;
61
import org.gvsig.fmap.mapcontext.events.ProjectionEvent;
62
import org.gvsig.fmap.mapcontext.events.listeners.ViewPortListener;
63
import org.gvsig.fmap.mapcontext.layers.FLayer;
64
import org.gvsig.fmap.mapcontext.layers.FLayers;
65
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
66
import org.gvsig.fmap.mapcontrol.MapControlCreationException;
67
import org.gvsig.fmap.mapcontrol.MapControlLocator;
68
import org.gvsig.fmap.mapcontrol.MapControlManager;
69
import org.gvsig.fmap.mapcontrol.tools.Behavior.Behavior;
70
import org.gvsig.fmap.mapcontrol.tools.Behavior.MouseMovementBehavior;
71
import org.gvsig.fmap.mapcontrol.tools.Behavior.MouseWheelBehavior;
72
import org.gvsig.fmap.mapcontrol.tools.Behavior.MoveBehavior;
73
import org.gvsig.fmap.mapcontrol.tools.Behavior.PointBehavior;
74
import org.gvsig.fmap.mapcontrol.tools.Behavior.PolygonBehavior;
75
import org.gvsig.fmap.mapcontrol.tools.Behavior.PolylineBehavior;
76
import org.gvsig.fmap.mapcontrol.tools.Behavior.RectangleBehavior;
77
import org.gvsig.tools.observer.Observable;
78
import org.gvsig.tools.observer.Observer;
79
import org.gvsig.utils.console.JConsole;
80
import org.gvsig.utils.console.JDockPanel;
81
import org.gvsig.utils.console.ResponseListener;
82
import org.gvsig.utils.console.jedit.JEditTextArea;
83

    
84
/**
85
 * <p>
86
 * <b>Class View</b>. This class represents the gvSIG specific internal window
87
 * where the maps are displayed and where the events coming from the user are
88
 * captured.
89
 * </p>
90
 * <p>
91
 * It is composed by three main visual areas:
92
 * </p>
93
 * <ol>
94
 * <li>
95
 * <b>Map control</b>: the map area located in the right area of the window. It
96
 * takes up the biggest part of the window.</li>
97
 * <li>
98
 * <b>Table of contents (TOC)</b>: is a list of layers displayed in the view.
99
 * The TOC is located on the left-top corner of the View and is the place where
100
 * the user can modify the order, the legends, the visibility and other
101
 * properties of the layers.</li>
102
 * <li>
103
 * <b>Map overview</b>: is a small MapControl located in the left-bottom corner
104
 * of the View where the user can put some layers which summarizes the view. It
105
 * is used to make the navigation easier and faster.</li>
106
 * </ol>
107
 *
108
 * @author 2005- Vicente Caballero
109
 * @author 2009- Joaquin del Cerro
110
 *
111
 */
112
public class DefaultViewPanel extends AbstractViewPanel implements Observer {
113

    
114
    /**
115
     *
116
     */
117
    private static final long serialVersionUID = -4044661458841786519L;
118

    
119
    private JConsole console;
120
    private JDockPanel dockConsole = null;
121
    protected ResponseAdapter consoleResponseAdapter = new ResponseAdapter();
122
    protected boolean isShowConsole = false;
123
    private ViewPortListener viewPortListener;
124

    
125
    private static MapControlManager mapControlManager = MapControlLocator
126
            .getMapControlManager();
127

    
128
    /**
129
     * Creates a new View object. Before being used, the object must be
130
     * initialized.
131
     *
132
     * @see initialize()
133
     */
134
    public DefaultViewPanel() {
135
        super();
136
        this.setName("View");
137
        // TODO Remove this when the system lo load libraries is finished
138
        if (mapControlManager == null) {
139
            mapControlManager = MapControlLocator.getMapControlManager();
140
        }
141
    }
142

    
143
    public DefaultViewPanel(Document document) {
144
        this();
145
        this.initialize(((ViewDocument) document).getMapContext());
146
        this.setDocument(document);
147
    }
148

    
149
    /**
150
     * Create the internal componentes and populate the window with them. If the
151
     * layout properties were set using the
152
     * <code>setWindowData(WindowData)</code> method, the window will be
153
     * populated according to this properties.
154
     */
155
    protected void initialize(MapContext mapContext) {
156
        super.initialize();
157
        initComponents(mapContext);
158
        hideConsole();
159
        getConsolePanel().addResponseListener(consoleResponseAdapter);
160
    }
161

    
162
    public void setDocument(Document document) {
163
        setModel((ViewDocument) document);
164
    }
165

    
166
    public Document getDocument() {
167
        return this.modelo;
168
    }
169

    
170
    public void setModel(ViewDocument model) {
171
        this.modelo = model;
172
        // Se registra como listener de cambios en FMap
173
        MapContext fmap = modelo.getMapContext();
174

    
175
        FLayers layers = fmap.getLayers();
176
        for (int i = 0; i < layers.getLayersCount(); i++) {
177
            if (layers.getLayer(i).isEditing()
178
                    && layers.getLayer(i) instanceof FLyrVect) {
179
                this.showConsole();
180
            }
181
        }
182

    
183
        // Se configura el mapControl
184
        m_TOC.setMapContext(fmap);
185
        m_MapControl.getMapContext().getLayers().addLegendListener(m_TOC);
186

    
187
        m_MapControl.setBackground(new Color(255, 255, 255));
188
        if (modelo.getMapOverViewContext() != null) {
189
            m_MapLoc.setModel(modelo.getMapOverViewContext());
190
        }
191
        model.addPropertyChangeListener(new PropertyChangeListener() {
192
            public void propertyChange(PropertyChangeEvent evt) {
193
                if (evt.getPropertyName().equals("name")) {
194
                    PluginServices.getMDIManager()
195
                            .getWindowInfo(DefaultViewPanel.this)
196
                            .setTitle(
197
                                    PluginServices.getText(this, "Vista") + ": "
198
                                    + (String) evt.getNewValue());
199
                }
200
            }
201
        });
202
        if (m_MapControl.getViewPort() != null) {
203
            viewPortListener = new ViewPortListener() {
204
                public void extentChanged(ExtentEvent e) {
205
                    if (PluginServices.getMainFrame() != null) {
206
                        PluginServices
207
                                .getMainFrame()
208
                                .getStatusBar()
209
                                .setControlValue(
210
                                        "view-change-scale",
211
                                        String.valueOf(m_MapControl
212
                                                .getMapContext().getScaleView()));
213
                        PluginServices
214
                                .getMainFrame()
215
                                .getStatusBar()
216
                                .setMessage(
217
                                        "projection",
218
                                        getMapControl().getViewPort()
219
                                        .getProjection().getAbrev());
220
                    }
221
                }
222

    
223
                public void backColorChanged(ColorEvent e) {
224
                    // Do nothing
225
                }
226

    
227
                public void projectionChanged(ProjectionEvent e) {
228
                    m_MapLoc.setProjection(e.getNewProjection());
229
                }
230
            };
231
            m_MapControl.getViewPort().addViewPortListener(viewPortListener);
232
        }
233
    }
234

    
235
    public JConsole getConsolePanel() {
236
        if (console == null) {
237
            console = new JConsole(true);
238
            // Para distinguir cuando se est? escribiendo sobre la consola y
239
            // cuando no.
240
            console.setJTextName("CADConsole");
241
        }
242
        return console;
243
    }
244

    
245
    private JDockPanel getDockConsole() {
246
        if (dockConsole == null) {
247
            dockConsole = new JDockPanel(getConsolePanel());
248
        }
249
        return dockConsole;
250
    }
251

    
252
    public void addConsoleListener(String prefix, ResponseListener listener) {
253
        consoleResponseAdapter.putSpaceListener(prefix, listener);
254

    
255
    }
256

    
257
    public void removeConsoleListener(ResponseListener listener) {
258
        consoleResponseAdapter.deleteListener(listener);
259

    
260
    }
261

    
262
    public void focusConsole(String text) {
263
        getConsolePanel().addResponseText(text);
264

    
265
        JEditTextArea jeta = getConsolePanel().getTxt();
266
        jeta.requestFocusInWindow();
267
        jeta.setCaretPosition(jeta.getText().length());
268

    
269
    }
270

    
271
    public void hideConsole() {
272
        isShowConsole = false;
273
        getDockConsole().setVisible(false);
274

    
275
    }
276

    
277
    public void showConsole() {
278
        if (isShowConsole || disableConsole) {
279
            return;
280
        }
281
        isShowConsole = true;
282
        getMapControl().remove(getDockConsole());
283
        getMapControl().setLayout(new BorderLayout());
284
        getMapControl().add(getDockConsole(), BorderLayout.SOUTH);
285
        getDockConsole().setVisible(true);
286

    
287
    }
288

    
289
    static class ResponseAdapter implements ResponseListener {
290

    
291
        private HashMap<String, ResponseListener> spaceListener
292
                = new HashMap<String, ResponseListener>();
293

    
294
        public void putSpaceListener(String namespace, ResponseListener listener) {
295
            spaceListener.put(namespace, listener);
296
        }
297

    
298
        public void acceptResponse(String response) {
299
            boolean nameSpace = false;
300
            int n = -1;
301
            if (response != null) {
302
                if ((n = response.indexOf(':')) != -1) {
303
                    nameSpace = true;
304
                }
305
            }
306

    
307
            if (nameSpace) {
308
                ResponseListener listener
309
                        = spaceListener.get(response.substring(0, n));
310
                if (listener != null) {
311
                    listener.acceptResponse(response.substring(n + 1));
312
                }
313
            } else {
314
                Iterator<ResponseListener> i
315
                        = spaceListener.values().iterator();
316
                while (i.hasNext()) {
317
                    ResponseListener listener = i.next();
318
                    listener.acceptResponse(response);
319
                }
320
            }
321
        }
322

    
323
        /**
324
         * @param listener
325
         */
326
        public void deleteListener(ResponseListener listener) {
327
            Iterator<String> i = spaceListener.keySet().iterator();
328
            while (i.hasNext()) {
329
                String namespace = i.next();
330
                ResponseListener l = spaceListener.get(namespace);
331
                if (l == listener) {
332
                    spaceListener.remove(namespace);
333
                }
334
            }
335
        }
336

    
337
    }
338

    
339
    protected void initComponents(MapContext mapContext) { // GEN-BEGIN:initComponents
340
        // Remember to activate it
341
        try {
342
            m_MapControl = mapControlManager.createJMapControlPanel(mapContext);
343
            m_MapControl.setMapControlDrawer(mapControlManager
344
                    .createDefaultMapControlDrawer());
345
        } catch (MapControlCreationException e) {
346
            NotificationManager.addError(e);
347
        }
348

    
349
        m_MapControl.addExceptionListener(mapControlExceptionListener);
350
        m_TOC = new TOC();
351

    
352
        // Ponemos el localizador
353
        m_MapLoc = new MapOverview(m_MapControl);
354
        try {
355
            m_MapLoc.setMapControlDrawer(mapControlManager
356
                    .createDefaultMapControlDrawer());
357
        } catch (MapControlCreationException e) {
358
            NotificationManager.addError(e);
359
        }
360
        removeAll();
361
        tempMainSplit = new ViewSplitPane(JSplitPane.HORIZONTAL_SPLIT);
362

    
363
        if (windowLayout == null) {
364
            m_MapLoc.setPreferredSize(new Dimension(150, 200));
365
            tempMainSplit.setPreferredSize(new Dimension(500, 300));
366
        }
367

    
368
        if (!isPalette()) {
369
            tempSplitToc = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
370
            tempSplitToc.setTopComponent(m_TOC);
371
            tempSplitToc.setBottomComponent(m_MapLoc);
372
            tempSplitToc.setResizeWeight(0.7);
373
            tempMainSplit.setLeftComponent(tempSplitToc);
374
        } else {
375
            tempMainSplit.setLeftComponent(m_TOC);
376
        }
377
        m_TOC.setVisible(true);
378
        tempMainSplit.setRightComponent(m_MapControl);
379
        this.setLayout(new BorderLayout());
380
        this.add(tempMainSplit, BorderLayout.CENTER);
381

    
382
        if (windowLayout != null) {
383
            try {
384
                tempMainSplit.setDividerLocation(Integer.valueOf(
385
                        windowLayout.get("MainDivider.Location")).intValue());
386
                if (windowLayout.get("TOCDivider.Location") != null) {
387
                    tempSplitToc.setDividerLocation(Integer.valueOf(
388
                            windowLayout.get("TOCDivider.Location")).intValue());
389
                }
390
            } catch (NumberFormatException ex) {
391
                PluginServices.getLogger().error(
392
                        "Error restoring View properties");
393
            }
394
        }
395

    
396
        // Zoom out (pinchas y el mapa se centra y te muestra m?s).
397
        // No es dibujando un rect?ngulo, es solo pinchando.
398
        ZoomOutListener zoomOutListener = new ZoomOutListener(m_MapControl);
399
        m_MapControl.addBehavior("zoomOut", new PointBehavior(zoomOutListener));
400

    
401
        // Zoom por rect?ngulo
402
        ZoomInListener zoomInListener = new ZoomInListener(m_MapControl);
403
        m_MapControl.addBehavior("zoomIn", new Behavior[]{
404
            new RectangleBehavior(zoomInListener), 
405
            new PointBehavior(zoomOutListener, Behavior.BUTTON_RIGHT)});
406

    
407
        // pan
408
        PanListener panListener = new PanListener(m_MapControl);
409
        m_MapControl.addBehavior("pan", new MoveBehavior(panListener,Behavior.BUTTON_LEFT));
410

    
411
        // Medir
412
        MeasureListener mli = new MeasureListener(m_MapControl);
413
        m_MapControl.addBehavior("medicion", new PolylineBehavior(mli));
414

    
415
        // Area
416
        AreaListener ali = new AreaListener(m_MapControl);
417
        m_MapControl.addBehavior("area", new PolygonBehavior(ali));
418

    
419
        // Info por punto
420
        InfoListener il = new InfoListener(m_MapControl);
421
        m_MapControl.addBehavior("info", new PointBehavior(il));
422

    
423
        // Seleccion por punto
424
        PointSelectListener psl = new PointSelectListener(m_MapControl);
425
        m_MapControl.addBehavior("pointSelection", new PointBehavior(psl));
426

    
427
        // Selecci?n por rect?ngulo
428
        RectangleSelectListener rsl = new RectangleSelectListener(m_MapControl);
429
        m_MapControl.addBehavior("rectSelection", new RectangleBehavior(rsl));
430

    
431
        // Selecci?n por pol?gono
432
        PolygonSelectListener poligSel = new PolygonSelectListener(m_MapControl);
433
        m_MapControl.addBehavior("polSelection", new PolygonBehavior(poligSel));
434
        
435
        m_MapControl.setTool("zoomIn");
436

    
437
        // Listener de eventos de movimiento que pone las coordenadas del rat?n
438
        // en la barra de estado
439
        StatusBarListener statusBarListener = new StatusBarListener(m_MapControl);
440
        
441
        m_MapControl.addCombinedBehavior(new MouseMovementBehavior(statusBarListener));
442
        m_MapControl.addCombinedBehavior(new MouseWheelBehavior());
443
        m_MapControl.addCombinedBehavior(new MoveBehavior(panListener, Behavior.BUTTON_MIDDLE));
444
    }
445

    
446
    public void windowActivated() {
447
        super.windowActivated();
448

    
449
        NewStatusBar statusbar = PluginServices.getMainFrame().getStatusBar();
450
        MapContext mapContext = this.getMapControl().getMapContext();
451

    
452
        statusbar.setMessage("units",
453
                PluginServices.getText(this, mapContext.getDistanceName()));
454
        statusbar.setControlValue("view-change-scale",
455
                String.valueOf(mapContext.getScaleView()));
456
        IProjection proj = getMapControl().getViewPort().getProjection();
457
        if (proj != null) {
458
            statusbar.setMessage("projection", proj.getAbrev());
459
        } else {
460
            statusbar.setMessage("projection", "");
461
        }
462
    }
463

    
464
    public void windowClosed() {
465
        super.windowClosed();
466
        if (viewPortListener != null) {
467
            getMapControl().getViewPort().removeViewPortListener(
468
                    viewPortListener);
469
        }
470
        if (getMapOverview() != null) {
471
            getMapOverview().getViewPort().removeViewPortListener(
472
                    getMapOverview());
473
        }
474

    
475
    }
476

    
477
    public void toPalette() {
478
        isPalette = true;
479
        m_MapLoc.setPreferredSize(new Dimension(200, 150));
480
        m_MapLoc.setSize(new Dimension(200, 150));
481
        movp = new MapOverViewPalette(m_MapLoc, this);
482
        PluginServices.getMDIManager().addWindow(movp);
483
        FLayer[] layers
484
                = getViewDocument().getMapContext().getLayers().getActives();
485
        if (layers.length > 0 && layers[0] instanceof FLyrVect) {
486
            if (((FLyrVect) layers[0]).isEditing()) {
487
                showConsole();
488
                return;
489
            }
490
        }
491
        hideConsole();
492

    
493
    }
494

    
495
    public void restore() {
496
        isPalette = false;
497
        PluginServices.getMDIManager().closeWindow(movp);
498
        FLayer[] layers
499
                = getViewDocument().getMapContext().getLayers().getActives();
500
        if (layers.length > 0 && layers[0] instanceof FLyrVect) {
501
            if (((FLyrVect) layers[0]).isEditing()) {
502
                showConsole();
503
                return;
504
            }
505
        }
506
        hideConsole();
507
        JSplitPane tempSplitToc = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
508
        tempSplitToc.setTopComponent(m_TOC);
509
        tempSplitToc.setBottomComponent(m_MapLoc);
510
        tempSplitToc.setResizeWeight(0.7);
511
        tempMainSplit.setLeftComponent(tempSplitToc);
512
    }
513

    
514
    /**
515
     * Sets the default map overview background color that will be used in
516
     * subsequent projects.
517
     *
518
     * @param color
519
     * @deprecated use instead
520
     * Project.getPreferences().setDefaultMapoverViewBackColor
521
     */
522
    public static void setDefaultMapOverViewBackColor(Color color) {
523
        DefaultProject.getPreferences().setDefaultOverviewBackColor(color);
524
    }
525

    
526
    /**
527
     * Returns the current default map overview background color defined which
528
     * is the color defined when the user does not define any other one
529
     *
530
     * @return java.awt.Color
531
     * @deprecated use instead
532
     * Project.getPreferences().setDefaultMapoverViewBackColor
533
     */
534
    public static Color getDefaultMapOverViewBackColor() {
535
        return DefaultProject.getPreferences().getDefaultOverviewBackColor();
536
    }
537

    
538
    /**
539
     * Returns the current default view background color defined which is the
540
     * color defined when the user does not define any other one
541
     *
542
     * @return java.awt.Color
543
     * @deprecated use instead Project.getPreferences().getDefaultViewBackColor
544
     */
545
    public static Color getDefaultBackColor() {
546
        return DefaultProject.getPreferences().getDefaultViewBackColor();
547
    }
548

    
549
    /**
550
     * @deprecated use instead Project.getPreferences().setDefaultViewBackColor
551
     */
552
    public static void setDefaultBackColor(Color color) {
553
        DefaultProject.getPreferences().setDefaultViewBackColor(color);
554
    }
555

    
556
    public Object getWindowProfile() {
557
        return WindowInfo.EDITOR_PROFILE;
558
    }
559

    
560
    /* (non-Javadoc)
561
     * @see org.gvsig.tools.observer.Observer#update(org.gvsig.tools.observer.Observable, java.lang.Object)
562
     */
563
    public void update(final Observable observable, final Object notification) {
564

    
565
        if (notification instanceof FeatureStoreNotification) {
566
            FeatureStoreNotification event
567
                    = (FeatureStoreNotification) notification;
568
            if (event.getType() == FeatureStoreNotification.AFTER_CANCELEDITING
569
                    || event.getType() == FeatureStoreNotification.AFTER_FINISHEDITING) {
570

    
571
                if (!SwingUtilities.isEventDispatchThread()) {
572
                    SwingUtilities.invokeLater(new Runnable() {
573
                        public void run() {
574
                            update(observable, notification);
575
                        }
576
                    });
577
                    return;
578
                }
579
                getMapControl().setTool("zoomIn");
580
                hideConsole();
581
                repaintMap();
582
            }
583
        }
584
    }
585

    
586
    private static boolean disableConsole = false;
587

    
588
    public static void setDisableConsole(boolean disable) {
589
        disableConsole = disable;
590
    }
591

    
592
}