Statistics
| Revision:

root / branches / v2_0_0_prep / applications / appgvSIG / src / org / gvsig / app / project / documents / view / gui / DefaultViewPanel.java @ 31496

History | View | Annotate | Download (18.8 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
*
3
* Copyright (C) 2007-2009 Infrastructures and Transports Department
4
* of the Valencian Gobernment (CIT)
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 2
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
*/
22

    
23
/*
24
* AUTHORS (In addition to CIT):
25
* 2004-2009 IVER TI
26
*   
27
*/
28
package org.gvsig.app.project.documents.view.gui;
29

    
30
import java.awt.BorderLayout;
31
import java.awt.Color;
32
import java.awt.Dimension;
33
import java.beans.PropertyChangeEvent;
34
import java.beans.PropertyChangeListener;
35
import java.util.HashMap;
36
import java.util.Iterator;
37

    
38
import javax.swing.JSplitPane;
39

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

    
87

    
88

    
89
/**
90
 * <p>
91
 * <b>Class View</b>. This class represents the gvSIG specific internal window where the maps are
92
 * displayed and where the events coming from the user are captured.
93
 * </p>
94
 * <p>
95
 * It is composed by three main visual areas:
96
 * </p>
97
 * <ol>
98
 *          <li>
99
 *     <b>Map control</b>: the map area located in the right area of the window. It takes up
100
 *     the biggest part of the window.
101
 *   </li>
102
 *          <li>
103
 *     <b>Table of contents (TOC)</b>: is a list of layers displayed in the view. The TOC is
104
 *     located on the left-top corner of the View and is the place where the user can modify
105
 *     the order, the legends, the visibility and other properties of the layers.
106
 *   </li>
107
 *          <li>
108
 *     <b>Map overview</b>: is a small MapControl located in the left-bottom corner of the
109
 *     View where the user can put some layers which summarizes the view. It is used to make
110
 *     the navigation easier and faster.
111
 *   </li>
112
 * </ol>
113
 *
114
 * @author 2005-         Vicente Caballero
115
 * @author 2009-         Joaquin del Cerro
116
 * 
117
 */
118
public class DefaultViewPanel extends AbstractViewPanel {
119
        /**
120
         * 
121
         */
122
        private static final long serialVersionUID = -4044661458841786519L;
123
        
124
    private JConsole console;
125
        private JDockPanel dockConsole = null;
126
        protected ResponseAdapter consoleResponseAdapter = new ResponseAdapter();
127
        protected boolean isShowConsole=false;
128
        private ViewPortListener viewPortListener;
129
        private static MapControlManager mapControlManager = MapControlLocator.getMapControlManager();
130

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

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

    
160
    public void setDocument(Document document) {
161
            setModel((ViewDocument) document);
162
    }
163
    
164
    public Document getDocument() {
165
            return this.modelo;
166
    }
167
    
168
    public void setModel(ViewDocument model) {
169
        this.modelo = model;
170
        //Se registra como listener de cambios en FMap
171
        MapContext fmap = modelo.getMapContext();
172
        
173
        FLayers layers=fmap.getLayers();
174
                for (int i=0;i<layers.getLayersCount();i++){
175
                        if (layers.getLayer(i).isEditing() && layers.getLayer(i) instanceof FLyrVect){
176
                                this.showConsole();
177
                        }
178
                }
179

    
180
                //Se configura el mapControl
181
        m_MapControl.setMapContext(fmap);
182
        m_TOC.setMapContext(fmap);
183
        m_MapControl.getMapContext().getLayers().addLegendListener(m_TOC);
184

    
185
        m_MapControl.setBackground(new Color(255, 255, 255));
186
        if (modelo.getMapOverViewContext()!=null){
187
                m_MapLoc.setModel(modelo.getMapOverViewContext());
188
        }
189
        model.addPropertyChangeListener(new PropertyChangeListener() {
190
                        public void propertyChange(PropertyChangeEvent evt) {
191
                                if (evt.getPropertyName().equals("name")){
192
                                        PluginServices.getMDIManager().getWindowInfo(DefaultViewPanel.this).setTitle("Vista: " + (String)evt.getNewValue());
193
                                }
194
                        }
195
                });
196
        if (m_MapControl.getViewPort() != null){
197
                viewPortListener=new ViewPortListener() {
198
                                public void extentChanged(ExtentEvent e) {
199
                                        if (PluginServices.getMainFrame() != null){
200
                                                PluginServices.getMainFrame().getStatusBar().setControlValue("scale",String.valueOf(m_MapControl.getMapContext().getScaleView()));
201
                                                PluginServices.getMainFrame().getStatusBar().setMessage("projection", getMapControl().getViewPort().getProjection().getAbrev());
202
                                        }
203
                                }
204

    
205
                                public void backColorChanged(ColorEvent e) {
206
                                        // Do nothing
207
                                }
208

    
209
                                public void projectionChanged(ProjectionEvent e) {
210
                                        m_MapLoc.setProjection(e.getNewProjection());
211
                                }
212
                };
213
                m_MapControl.getViewPort().addViewPortListener(viewPortListener);
214
              }
215
    }
216

    
217
    public JConsole getConsolePanel(){
218
            if (console==null){
219
                    console=new JConsole();
220
                    // Para distinguir cuando se est? escribiendo sobre la consola y cuando no.
221
                    console.setJTextName("CADConsole");
222
            }
223
            return console;
224
    }
225

    
226
    private JDockPanel getDockConsole()
227
    {
228
            if (dockConsole == null)
229
            {
230
                    dockConsole = new JDockPanel(getConsolePanel());
231
            }
232
            return dockConsole;
233
    }
234

    
235

    
236
    public void addConsoleListener(String prefix, ResponseListener listener) {
237
                consoleResponseAdapter.putSpaceListener(prefix, listener);
238

    
239
        }
240

    
241
        public void removeConsoleListener(ResponseListener listener) {
242
                consoleResponseAdapter.deleteListener(listener);
243

    
244
        }
245

    
246
        public void focusConsole(String text) {
247
                getConsolePanel().addResponseText(text);
248

    
249
                JEditTextArea jeta=getConsolePanel().getTxt();
250
                jeta.requestFocusInWindow();
251
                jeta.setCaretPosition(jeta.getText().length());
252

    
253
        }
254

    
255

    
256
        public void hideConsole() {
257
                isShowConsole=false;
258
                getDockConsole().setVisible(false);
259

    
260
        }
261

    
262
        public void showConsole() {
263
                if (isShowConsole) {
264
                        return;
265
                }
266
                isShowConsole=true;
267
                getMapControl().remove(getDockConsole());
268
                getMapControl().setLayout(new BorderLayout());
269
                getMapControl().add(getDockConsole(), BorderLayout.SOUTH);
270
                getDockConsole().setVisible(true);
271

    
272
        }
273

    
274
        static class ResponseAdapter implements ResponseListener{
275

    
276
                private HashMap<String,ResponseListener> spaceListener = new HashMap<String,ResponseListener>();
277

    
278
                public void putSpaceListener(String namespace, ResponseListener listener){
279
                        spaceListener.put(namespace, listener);
280
                }
281

    
282
                @SuppressWarnings("null")
283
                public void acceptResponse(String response) {
284
                        boolean nameSpace = false;
285
                        int n = -1;
286
                        if (response != null){
287
                                if ((n = response.indexOf(':')) != -1){
288
                                        nameSpace = true;
289
                                }
290
                        }
291

    
292
                        if (nameSpace){
293
                                ResponseListener listener = spaceListener.get(response.substring(0, n));
294
                                if (listener != null) {
295
                                        listener.acceptResponse(response.substring(n+1));
296
                                }
297
                        }else{
298
                                Iterator<ResponseListener> i = spaceListener.values().iterator();
299
                                while (i.hasNext()) {
300
                                        ResponseListener listener = i.next();
301
                                        listener.acceptResponse(response);
302
                                }
303
                        }
304
                }
305

    
306
                /**
307
                 * @param listener
308
                 */
309
                public void deleteListener(ResponseListener listener) {
310
                        Iterator<String> i = spaceListener.keySet().iterator();
311
                        while (i.hasNext()) {
312
                                String namespace = i.next();
313
                                ResponseListener l = spaceListener.get(namespace);
314
                                if (l == listener){
315
                                        spaceListener.remove(namespace);
316
                                }
317
                        }
318
                }
319

    
320
        }
321

    
322

    
323

    
324

    
325
    protected void initComponents() { // GEN-BEGIN:initComponents
326
        m_MapControl = new MapControl(); // Default is paintEnabled = false.
327
                                                                                        // Remember to activate it
328
        try {
329
                        m_MapControl.setMapControlDrawer(mapControlManager.createDefaultMapControlDrawer());
330
                } catch (MapControlCreationException e) {
331
                        NotificationManager.addError(e);
332
                }
333
        
334
        m_MapControl.addExceptionListener(mapControlExceptionListener);
335
        m_TOC = new TOC();
336

    
337
        // Ponemos el localizador
338
        m_MapLoc = new MapOverview(m_MapControl);
339
        try {
340
                m_MapLoc.setMapControlDrawer(mapControlManager.createDefaultMapControlDrawer());
341
                } catch (MapControlCreationException e) {
342
                        NotificationManager.addError(e);
343
                }
344
                removeAll();
345
                tempMainSplit = new ViewSplitPane(JSplitPane.HORIZONTAL_SPLIT);
346

    
347
            if (windowLayout==null) {
348
                    m_MapLoc.setPreferredSize(new Dimension(150, 200));
349
                    tempMainSplit.setPreferredSize(new Dimension(500, 300));
350
            }
351

    
352
                if (!isPalette()){
353
                        tempSplitToc = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
354
                        tempSplitToc.setTopComponent(m_TOC);
355
                        tempSplitToc.setBottomComponent(m_MapLoc);
356
                        tempSplitToc.setResizeWeight(0.7);
357
                        tempMainSplit.setLeftComponent(tempSplitToc);
358
                }else{
359
                        tempMainSplit.setLeftComponent(m_TOC);
360
                }
361
                m_TOC.setVisible(true);
362
                tempMainSplit.setRightComponent(m_MapControl);
363
                //split.setBottomComponent(getConsolePanel());
364
                //split.setTopComponent(tempMainSplit);
365
                // split.setResizeWeight(0.9);
366
                this.setLayout(new BorderLayout());
367
                this.add(tempMainSplit, BorderLayout.CENTER);
368

    
369

    
370
                if (windowLayout!=null) {
371
                        try {
372
                                tempMainSplit.setDividerLocation(Integer.valueOf(windowLayout.get("MainDivider.Location")).intValue());
373
                                if (windowLayout.get("TOCDivider.Location")!=null) {
374
                                        tempSplitToc.setDividerLocation(Integer.valueOf(windowLayout.get("TOCDivider.Location")).intValue());
375
                                }
376
                        }
377
                        catch (NumberFormatException ex) {
378
                                PluginServices.getLogger().error("Error restoring View properties");
379
                        }
380
                }
381

    
382
        //Listener de eventos de movimiento que pone las coordenadas del rat?n en la barra de estado
383
        StatusBarListener sbl = new StatusBarListener(m_MapControl);
384

    
385
        // Zoom out (pinchas y el mapa se centra y te muestra m?s).
386
        // No es dibujando un rect?ngulo, es solo pinchando.
387

    
388
        ZoomOutListener zol = new ZoomOutListener(m_MapControl);
389
        m_MapControl.addBehavior("zoomOut", new Behavior[]{new PointBehavior(zol), new MouseMovementBehavior(sbl)});
390

    
391
        // pan
392

    
393
        PanListener pl = new PanListener(m_MapControl);
394
        m_MapControl.addBehavior("pan", new Behavior[]{new MoveBehavior(pl), new MouseMovementBehavior(sbl)});
395

    
396
        // Medir
397

    
398
        MeasureListener mli = new MeasureListener(m_MapControl);
399
        m_MapControl.addBehavior("medicion", new Behavior[]{new PolylineBehavior(mli), new MouseMovementBehavior(sbl)});
400

    
401
        // Area
402

    
403
        AreaListener ali = new AreaListener(m_MapControl);
404
        m_MapControl.addBehavior("area", new Behavior[]{new PolygonBehavior(ali), new MouseMovementBehavior(sbl)});
405

    
406
        //Seleccion por punto
407
        PointSelectListener psl = new PointSelectListener(m_MapControl);
408
        m_MapControl.addBehavior("pointSelection", new Behavior[]{new PointBehavior(psl), new MouseMovementBehavior(sbl)});
409

    
410
        //Info por punto
411
        InfoListener il = new InfoListener(m_MapControl);
412
        m_MapControl.addBehavior("info", new Behavior[]{new PointBehavior(il), new MouseMovementBehavior(sbl)});
413

    
414
//      Link por punto
415
        LinkListener ll = new LinkListener(m_MapControl);
416
        m_MapControl.addBehavior("link", new Behavior[]{new PointBehavior(ll), new MouseMovementBehavior(sbl)});
417

    
418
        //Selecci?n por rect?ngulo
419
        RectangleSelectListener rsl = new RectangleSelectListener(m_MapControl);
420
        m_MapControl.addBehavior("rectSelection", new Behavior[]{new RectangleBehavior(rsl), new MouseMovementBehavior(sbl)});
421

    
422
        //Selecci?n por pol?gono
423
        PolygonSelectListener poligSel = new PolygonSelectListener(m_MapControl);
424
        m_MapControl.addBehavior("polSelection", new Behavior[]{new PolygonBehavior(poligSel), new MouseMovementBehavior(sbl)});
425

    
426
        // Zoom por rect?ngulo
427
        ZoomOutRightButtonListener zoil = new ZoomOutRightButtonListener(m_MapControl);
428
        ZoomInListener zil = new ZoomInListener(m_MapControl);
429
        m_MapControl.addBehavior("zoomIn", new Behavior[]{new RectangleBehavior(zil),
430
                                        new PointBehavior(zoil), new MouseMovementBehavior(sbl)});
431

    
432
        SelectImageListener sil = new SelectImageListener(m_MapControl);
433
        m_MapControl.addBehavior("selectImage", new Behavior[]{
434
                                new PointBehavior(sil), new MouseMovementBehavior(sbl)});
435

    
436
        //ZoomPixelCursorListener zp = new ZoomPixelCursorListener(m_MapControl);
437
        //m_MapControl.addMapTool("zoom_pixel_cursor", new Behavior[]{new PointBehavior(zp), new MouseMovementBehavior(sbl)});
438

    
439
        m_MapControl.setTool("zoomIn"); // Por defecto
440
        // m_MapControl.setPaintEnabled(true);
441
    }
442

    
443
    public void windowActivated() {
444
            NewStatusBar statusbar = PluginServices.getMainFrame().getStatusBar();
445
            MapContext mapContext = this.getMapControl().getMapContext();
446
            
447
            statusbar.setMessage("units", PluginServices.getText(this, mapContext.getDistanceName()));
448
            statusbar.setControlValue("scale",String.valueOf(  mapContext.getScaleView()   ));
449
            statusbar.setMessage("projection", getMapControl().getViewPort().getProjection().getAbrev());
450
    }
451

    
452
    public void windowClosed() {
453
                super.windowClosed();
454
                if (viewPortListener!=null) {
455
                        getMapControl().getViewPort().removeViewPortListener(viewPortListener);
456
                }
457
                if (getMapOverview()!=null) {
458
                        getMapOverview().getViewPort().removeViewPortListener(getMapOverview());
459
                }
460

    
461
        }
462
        public void toPalette() {
463
                isPalette=true;
464
                m_MapLoc.setPreferredSize(new Dimension(200,150));
465
                m_MapLoc.setSize(new Dimension(200,150));
466
                movp=new MapOverViewPalette(m_MapLoc,this);
467
                PluginServices.getMDIManager().addWindow(movp);
468
                FLayer[] layers=getModel().getMapContext().getLayers().getActives();
469
                if (layers.length>0 && layers[0] instanceof FLyrVect){
470
                        if (((FLyrVect)layers[0]).isEditing()){
471
                                showConsole();
472
                                return;
473
                        }
474
                }
475
                hideConsole();
476

    
477
        }
478

    
479
        public void restore() {
480
                isPalette=false;
481
                PluginServices.getMDIManager().closeWindow(movp);
482
                FLayer[] layers=getModel().getMapContext().getLayers().getActives();
483
                if (layers.length>0 && layers[0] instanceof FLyrVect){
484
                        if (((FLyrVect)layers[0]).isEditing()){
485
                                showConsole();
486
                                return;
487
                        }
488
                }
489
                hideConsole();
490
                JSplitPane tempSplitToc = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
491
                tempSplitToc.setTopComponent(m_TOC);
492
                tempSplitToc.setBottomComponent(m_MapLoc);
493
                tempSplitToc.setResizeWeight(0.7);
494
                tempMainSplit.setLeftComponent(tempSplitToc);
495
        }
496

    
497
        /**
498
         * Sets the default map overview background color that will be used in subsequent
499
         * projects.
500
         *
501
         * @param color
502
         * @deprecated use instead Project.getPreferences().setDefaultMapoverViewBackColor
503
         */
504
        public static void setDefaultMapOverViewBackColor(Color color) {
505
                DefaultProject.getPreferences().setDefaultOverviewBackColor(color);
506
        }
507

    
508
        /**
509
         * Returns the current default map overview background color defined which
510
         * is the color defined when the user does not define any other one
511
         *
512
         * @return java.awt.Color
513
         * @deprecated use instead Project.getPreferences().setDefaultMapoverViewBackColor
514
         */
515
        public static Color getDefaultMapOverViewBackColor() {
516
                return DefaultProject.getPreferences().getDefaultOverviewBackColor();
517
        }
518

    
519
        /**
520
         * Returns the current default view background color defined which is the
521
         * color defined when the user does not define any other one
522
         * @return java.awt.Color
523
         * @deprecated use instead Project.getPreferences().getDefaultViewBackColor
524
         */
525
        public static Color getDefaultBackColor() {
526
                return DefaultProject.getPreferences().getDefaultViewBackColor();
527
        }
528

    
529
        /**
530
         * @deprecated use instead Project.getPreferences().setDefaultViewBackColor
531
         */
532
        public static void setDefaultBackColor(Color color) {
533
                DefaultProject.getPreferences().setDefaultViewBackColor(color);
534
        }
535

    
536
        public Object getWindowProfile() {
537
                return WindowInfo.EDITOR_PROFILE;
538
        }
539

    
540
}