Statistics
| Revision:

svn-gvsig-desktop / trunk / applications / appgvSIG / src / com / iver / cit / gvsig / gui / View.java @ 5037

History | View | Annotate | Download (17.4 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package com.iver.cit.gvsig.gui;
42

    
43
import java.awt.BorderLayout;
44
import java.awt.Color;
45
import java.awt.Dimension;
46
import java.awt.image.BufferedImage;
47
import java.beans.PropertyChangeEvent;
48
import java.beans.PropertyChangeListener;
49
import java.util.HashMap;
50
import java.util.Iterator;
51

    
52
import javax.swing.FocusManager;
53
import javax.swing.JPanel;
54
import javax.swing.JSplitPane;
55

    
56
import org.cresques.cts.IProjection;
57

    
58
import com.iver.andami.PluginServices;
59
import com.iver.andami.messages.NotificationManager;
60
import com.iver.andami.ui.mdiManager.MDIManager;
61
import com.iver.andami.ui.mdiManager.SingletonView;
62
import com.iver.andami.ui.mdiManager.ViewInfo;
63
import com.iver.andami.ui.mdiManager.ViewListener;
64
import com.iver.andami.ui.mdiManager.ViewTransform;
65
import com.iver.cit.gvsig.fmap.ColorEvent;
66
import com.iver.cit.gvsig.fmap.ExtentEvent;
67
import com.iver.cit.gvsig.fmap.FMap;
68
import com.iver.cit.gvsig.fmap.MapControl;
69
import com.iver.cit.gvsig.fmap.ViewPortListener;
70
import com.iver.cit.gvsig.fmap.core.v02.FConstant;
71
import com.iver.cit.gvsig.fmap.layers.FLayer;
72
import com.iver.cit.gvsig.fmap.layers.FLayers;
73
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
74
import com.iver.cit.gvsig.fmap.tools.ZoomOutRightButtonListener;
75
import com.iver.cit.gvsig.fmap.tools.Behavior.Behavior;
76
import com.iver.cit.gvsig.fmap.tools.Behavior.MouseMovementBehavior;
77
import com.iver.cit.gvsig.fmap.tools.Behavior.MoveBehavior;
78
import com.iver.cit.gvsig.fmap.tools.Behavior.PointBehavior;
79
import com.iver.cit.gvsig.fmap.tools.Behavior.PolygonBehavior;
80
import com.iver.cit.gvsig.fmap.tools.Behavior.PolylineBehavior;
81
import com.iver.cit.gvsig.fmap.tools.Behavior.RectangleBehavior;
82
import com.iver.cit.gvsig.gui.Panels.MapOverViewPalette;
83
import com.iver.cit.gvsig.gui.toc.TOC;
84
import com.iver.cit.gvsig.gui.toolListeners.AreaListener;
85
import com.iver.cit.gvsig.gui.toolListeners.InfoListener;
86
import com.iver.cit.gvsig.gui.toolListeners.LinkListener;
87
import com.iver.cit.gvsig.gui.toolListeners.MeasureListener;
88
import com.iver.cit.gvsig.gui.toolListeners.PanListener;
89
import com.iver.cit.gvsig.gui.toolListeners.PointSelectListener;
90
import com.iver.cit.gvsig.gui.toolListeners.RectangleSelectListener;
91
import com.iver.cit.gvsig.gui.toolListeners.SelectImageListener;
92
import com.iver.cit.gvsig.gui.toolListeners.StatusBarListener;
93
import com.iver.cit.gvsig.gui.toolListeners.ZoomInListener;
94
import com.iver.cit.gvsig.gui.toolListeners.ZoomOutListener;
95
import com.iver.cit.gvsig.gui.toolListeners.ZoomPixelCursorListener;
96
import com.iver.cit.gvsig.project.ProjectView;
97
import com.iver.utiles.console.JConsole;
98
import com.iver.utiles.console.ResponseListener;
99
import com.iver.utiles.exceptionHandling.ExceptionListener;
100

    
101

    
102
/**
103
 * DOCUMENT ME!
104
 *
105
 * @author vcn
106
 */
107
public class View extends JPanel implements com.iver.andami.ui.mdiManager.View,
108
    SingletonView,ViewListener, IView, ViewTransform{
109

    
110
    /** DOCUMENT ME! */
111
    private MapControl m_MapControl;
112
    private MapOverview m_MapLoc;
113
    
114
    // store the properties of the window
115
    private ViewInfo m_viewInfo = null;
116

    
117

    
118
    /** DOCUMENT ME! */
119
    private TOC m_TOC;
120
    private ProjectView modelo;
121
    private ViewExceptionListener mapControlExceptionListener = new ViewExceptionListener();
122
        private JConsole console;
123
        private ResponseAdapter consoleResponseAdapter = new ResponseAdapter();
124
        private boolean isPalette=false;
125
        private MapOverViewPalette movp;
126
        /**
127
     * Creates a new View object.
128
     */
129
    public View() {
130
        //this.setName(Utilities.getMessage(this, "Vista")+ " : "+modelo.getName());
131
        // this.setPreferredSize(new Dimension(500, 300));
132
        initComponents();
133
        hideConsole();
134
        getConsolePanel().addResponseListener(consoleResponseAdapter);
135
    }
136

    
137
    /**
138
     * DOCUMENT ME!
139
     *
140
     * @return DOCUMENT ME!
141
     */
142
    public ProjectView getModel() {
143
        return modelo;
144
    }
145

    
146
    /**
147
     * DOCUMENT ME!
148
     *
149
     * @param model DOCUMENT ME!
150
     */
151
    public void setModel(ProjectView model) {
152
        this.modelo = model;
153
        //Se registra como listener de cambios en FMap
154
        FMap fmap = modelo.getMapContext();
155

    
156
        FLayers layers=fmap.getLayers();
157
                for (int i=0;i<layers.getLayersCount();i++){
158
                        if (layers.getLayer(i).isEditing() && layers.getLayer(i) instanceof FLyrVect){
159
                                this.showConsole();
160
                        }
161
                }
162
                model.setAndamiView(this);
163

    
164
                //Se configura el mapControl
165
        m_MapControl.setMapContext(fmap);
166
        m_TOC.setMapContext(fmap);
167
        m_MapControl.setBackground(new Color(255, 255, 255));
168
        if (modelo.getMapOverViewContext()!=null){
169
                m_MapLoc.setModel(modelo.getMapOverViewContext());
170
        }
171
        model.addPropertyChangeListener(new PropertyChangeListener() {
172
                        public void propertyChange(PropertyChangeEvent evt) {
173
                                if (evt.getPropertyName().equals("name")){
174
                                        PluginServices.getMDIManager().getViewInfo(View.this).setTitle("Vista: " + (String)evt.getNewValue());
175
                                }
176
                        }
177
                });
178
        if (m_MapControl.getViewPort() != null){
179
                m_MapControl.getViewPort().addViewPortListener(new ViewPortListener() {
180
                                public void extentChanged(ExtentEvent e) {
181
                                        if (PluginServices.getMainFrame() != null){
182
                                                PluginServices.getMainFrame().getStatusBar().setMessage("6", "1:"+m_MapControl.getMapContext().getScaleView());
183
                                                PluginServices.getMainFrame().getStatusBar().setMessage("7", getMapControl().getViewPort().getProjection().getAbrev());
184
                                        }
185
                                }
186

    
187
                                public void backColorChanged(ColorEvent e) {
188
                                }
189
                        });
190
              }
191
    }
192
    public JConsole getConsolePanel(){
193
            if (console==null){
194
                    console=new JConsole();
195
                    // Para distinguir cu?ndo se est? escribiendo sobre la consola y cu?ndo no.
196
                    console.setJTextName("CADConsole");
197
            }
198
            return console;
199
    }
200

    
201

    
202
    public void addConsoleListener(String prefix, ResponseListener listener) {
203
                consoleResponseAdapter.putSpaceListener(prefix, listener);
204

    
205
        }
206

    
207
        public void removeConsoleListener(ResponseListener listener) {
208
                consoleResponseAdapter.deleteListener(listener);
209

    
210
        }
211

    
212
        public void focusConsole(String text) {
213
                getConsolePanel().addResponseText(text);
214
                // TODO: HACE ESTO CON EL KEYBOARDFOCUSMANAGER
215
                // KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
216
                FocusManager fm=FocusManager.getCurrentManager();
217
                fm.focusNextComponent(getConsolePanel());
218

    
219
        }
220

    
221
        public void hideConsole() {
222
                removeAll();
223
                //JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
224
                JSplitPane tempMainSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
225
                tempMainSplit.setPreferredSize(new Dimension(500, 300));
226
                if (!isPalette()){
227
                        JSplitPane tempSplitToc = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
228
                        tempSplitToc.setTopComponent((TOC) m_TOC);
229
                        tempSplitToc.setBottomComponent(m_MapLoc);
230
                        tempSplitToc.setResizeWeight(0.7);
231
                        tempMainSplit.setLeftComponent(tempSplitToc);
232
                }else{
233
                        tempMainSplit.setLeftComponent(m_TOC);
234
                }
235
                m_TOC.setVisible(true);
236
                tempMainSplit.setRightComponent(m_MapControl);
237
                //split.setBottomComponent(getConsolePanel());
238
                //split.setTopComponent(tempMainSplit);
239
                // split.setResizeWeight(0.9);
240
                this.setLayout(new BorderLayout());
241
                this.add(tempMainSplit, BorderLayout.CENTER);
242

    
243
        }
244

    
245
        public void showConsole() {
246
                removeAll();
247
                JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
248
                JSplitPane tempMainSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
249
                tempMainSplit.setPreferredSize(new Dimension(500, 300));
250
                if (!isPalette()){
251
                        JSplitPane tempSplitToc = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
252
                        tempSplitToc.setTopComponent((TOC) m_TOC);
253
                        tempSplitToc.setBottomComponent(m_MapLoc);
254
                        tempSplitToc.setResizeWeight(0.7);
255
                        tempMainSplit.setLeftComponent(tempSplitToc);
256
                }else{
257
                        tempMainSplit.setLeftComponent(m_TOC);
258
                }
259
                m_TOC.setVisible(true);
260
                tempMainSplit.setRightComponent(m_MapControl);
261
                split.setBottomComponent(getConsolePanel());
262
                split.setTopComponent(tempMainSplit);
263
                split.setResizeWeight(0.9);
264
                this.setLayout(new BorderLayout());
265
                this.add(split, BorderLayout.CENTER);
266

    
267
        }
268
        private class ResponseAdapter implements ResponseListener{
269

    
270
                private HashMap spaceListener = new HashMap();
271

    
272
                public void putSpaceListener(String namespace, ResponseListener listener){
273
                        spaceListener.put(namespace, listener);
274
                }
275

    
276
                /**
277
                 * @see com.iver.utiles.console.ResponseListener#acceptResponse(java.lang.String)
278
                 */
279
                public void acceptResponse(String response) {
280
                        boolean nameSpace = false;
281
                        int n = -1;
282
                        if (response != null){
283
                                if ((n = response.indexOf(':')) != -1){
284
                                        nameSpace = true;
285
                                }
286
                        }
287

    
288
                        if (nameSpace){
289
                                ResponseListener listener = (ResponseListener) spaceListener.get(response.substring(0, n));
290
                                if (listener != null)
291
                                listener.acceptResponse(response.substring(n+1));
292
                        }else{
293
                                Iterator i = spaceListener.values().iterator();
294
                                while (i.hasNext()) {
295
                                        ResponseListener listener = (ResponseListener) i.next();
296
                                        listener.acceptResponse(response);
297
                                }
298
                        }
299
                }
300

    
301
                /**
302
                 * @param listener
303
                 */
304
                public void deleteListener(ResponseListener listener) {
305
                        Iterator i = spaceListener.keySet().iterator();
306
                        while (i.hasNext()) {
307
                                String namespace = (String) i.next();
308
                                ResponseListener l = (ResponseListener) spaceListener.get(namespace);
309
                                if (l == listener){
310
                                        spaceListener.remove(namespace);
311
                                }
312
                        }
313
                }
314

    
315
        }
316

    
317

    
318

    
319

    
320
    /**
321
         * DOCUMENT ME!
322
         */
323
    private void initComponents() { // GEN-BEGIN:initComponents
324
        m_MapControl = new MapControl(); // Default is paintEnabled = false.
325
                                                                                        // Remember to activate it
326
        m_MapControl.addExceptionListener(mapControlExceptionListener);
327
        // modelo.setMapContext(m_MapControl.getMapContext());
328

    
329
        // m_MapControl.setAcceptEvents(true); Lo comento porque ya se hace en el setModel
330
        m_TOC = new TOC();
331

    
332

    
333
        // Ponemos el localizador
334
        m_MapLoc = new MapOverview(m_MapControl);
335
        m_MapLoc.setPreferredSize(new Dimension(150, 200));
336
        hideConsole();
337

    
338

    
339

    
340

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

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

    
347
        ZoomOutListener zol = new ZoomOutListener(m_MapControl);
348
        m_MapControl.addMapTool("zoomOut", new Behavior[]{new PointBehavior(zol), new MouseMovementBehavior(sbl)});
349

    
350
        // pan
351

    
352
        PanListener pl = new PanListener(m_MapControl);
353
        m_MapControl.addMapTool("pan", new Behavior[]{new MoveBehavior(pl), new MouseMovementBehavior(sbl)});
354

    
355
        // Medir
356

    
357
        MeasureListener mli = new MeasureListener(m_MapControl);
358
        m_MapControl.addMapTool("medicion", new Behavior[]{new PolylineBehavior(mli), new MouseMovementBehavior(sbl)});
359

    
360
        // Area
361

    
362
        AreaListener ali = new AreaListener(m_MapControl);
363
        m_MapControl.addMapTool("area", new Behavior[]{new PolygonBehavior(ali), new MouseMovementBehavior(sbl)});
364

    
365
        //Seleccion por punto
366
        PointSelectListener psl = new PointSelectListener(m_MapControl);
367
        m_MapControl.addMapTool("pointSelection", new Behavior[]{new PointBehavior(psl), new MouseMovementBehavior(sbl)});
368

    
369
        //Info por punto
370
        InfoListener il = new InfoListener(m_MapControl);
371
        m_MapControl.addMapTool("info", new Behavior[]{new PointBehavior(il), new MouseMovementBehavior(sbl)});
372

    
373
//      Link por punto
374
        LinkListener ll = new LinkListener(m_MapControl);
375
        m_MapControl.addMapTool("link", new Behavior[]{new PointBehavior(ll), new MouseMovementBehavior(sbl)});
376

    
377
        //Selecci?n por rect?ngulo
378
        RectangleSelectListener rsl = new RectangleSelectListener(m_MapControl);
379
        m_MapControl.addMapTool("rectSelection", new Behavior[]{new RectangleBehavior(rsl), new MouseMovementBehavior(sbl)});
380

    
381
        // Zoom por rect?ngulo
382
        ZoomOutRightButtonListener zoil = new ZoomOutRightButtonListener(m_MapControl);
383
        ZoomInListener zil = new ZoomInListener(m_MapControl);
384
        m_MapControl.addMapTool("zoomIn", new Behavior[]{new RectangleBehavior(zil),
385
                                        new PointBehavior(zoil), new MouseMovementBehavior(sbl)});
386

    
387
        SelectImageListener sil = new SelectImageListener(m_MapControl);
388
        m_MapControl.addMapTool("selectImage", new Behavior[]{
389
                                new PointBehavior(sil), new MouseMovementBehavior(sbl)});
390

    
391
        ZoomPixelCursorListener zp = new ZoomPixelCursorListener(m_MapControl);
392
        m_MapControl.addMapTool("zoom_pixel_cursor", new Behavior[]{new PointBehavior(zp), new MouseMovementBehavior(sbl)});
393

    
394
        m_MapControl.setTool("zoomIn"); // Por defecto
395
        // m_MapControl.setPaintEnabled(true);
396
    }
397

    
398
    /**
399
     * DOCUMENT ME!
400
     */
401
   /*public void openPropertiesWindow() {
402
    }
403
*/
404
    /**
405
     * DOCUMENT ME!
406
     */
407
  /*  public void openQueryWindow() {
408
    }
409
*/
410
    /**
411
     * DOCUMENT ME!
412
     *
413
     * @return DOCUMENT ME!
414
     */
415
    public MapOverview getMapOverview() {
416
        return m_MapLoc;
417
    }
418

    
419
    /**
420
     * DOCUMENT ME!
421
     *
422
     * @return DOCUMENT ME!
423
     */
424
    public MapControl getMapControl() {
425
        return m_MapControl;
426
    }
427

    
428
    /**
429
     * DOCUMENT ME!
430
     *
431
     * @return DOCUMENT ME!
432
     */
433
    public TOC getTOC() {
434
        return m_TOC;
435
    }
436

    
437
    /**
438
     * DOCUMENT ME!
439
     */
440
    public void repaintMap() {
441
        m_MapControl.drawMap(false);
442
    }
443

    
444
    /* (non-Javadoc)
445
     * @see com.iver.mdiApp.ui.MDIManager.SingletonView#getModel()
446
     */
447
    public Object getViewModel() {
448
        return modelo;
449
    }
450

    
451
    /**
452
     * This method is used to get <strong>an initial</strong> ViewInfo object
453
     * for this View. It is not intended to retrieve the ViewInfo object in a
454
     * later time. <strong>Use PluginServices.getMDIManager().getViewInfo(view)
455
     * to retrieve the ViewInfo object at any time after the creation of the
456
     * object.
457
     * 
458
     * @see com.iver.mdiApp.ui.MDIManager.View#getViewInfo()
459
     */
460
    public ViewInfo getViewInfo() {
461
            if (m_viewInfo == null)
462
            {
463
                    m_viewInfo = new ViewInfo(ViewInfo.ICONIFIABLE | ViewInfo.RESIZABLE |
464
                        ViewInfo.MAXIMIZABLE);
465

    
466
                        m_viewInfo.setWidth(500);
467
                        m_viewInfo.setHeight(300);
468
                        m_viewInfo.setTitle(PluginServices.getText(this, "Vista") + " : " +
469
                modelo.getName());
470
            }
471
                   return m_viewInfo;
472
    }
473
        
474

    
475
    /**
476
     * @see com.iver.mdiApp.ui.MDIManager.View#viewActivated()
477
     */
478
    public void viewActivated() {
479
            PluginServices.getMainFrame().getStatusBar().setMessage("1",
480
                            FConstant.NAMES[getMapControl().getMapContext().getViewPort().getDistanceUnits()]);
481
            PluginServices.getMainFrame().getStatusBar().setMessage("6", "1:"+m_MapControl.getMapContext().getScaleView());
482
                PluginServices.getMainFrame().getStatusBar().setMessage("7", getMapControl().getViewPort().getProjection().getAbrev());
483
    }
484

    
485
        /**
486
         * @return
487
         */
488
        public BufferedImage getImage() {
489
                return m_MapControl.getImage();
490
        }
491

    
492
        public void setProjection(IProjection proj)
493
        {
494
                getMapControl().setProjection(proj);
495
        }
496
        public IProjection getProjection()
497
        {
498
                return getMapControl().getProjection();
499
        }
500

    
501
        public class ViewExceptionListener implements ExceptionListener {
502

    
503
                /**
504
                 * @see com.iver.cit.gvsig.fmap.ExceptionListener#exceptionThrown(java.lang.Throwable)
505
                 */
506
                public void exceptionThrown(Throwable t) {
507
                        NotificationManager.addError(t.getMessage(), t);
508
                }
509

    
510
        }
511

    
512
        /**
513
         * @see com.iver.andami.ui.mdiManager.ViewListener#viewClosed()
514
         */
515
        public void viewClosed() {
516
                if (movp!=null)
517
                        PluginServices.getMDIManager().closeView(movp);
518
                ///PluginServices.getMainFrame().getStatusBar().setMessage("1","");
519
        }
520

    
521
        public void toPalette() {
522
                isPalette=true;
523
                m_MapLoc.setPreferredSize(new Dimension(200,150));
524
                m_MapLoc.setSize(new Dimension(200,150));
525
                movp=new MapOverViewPalette(m_MapLoc);
526
                PluginServices.getMDIManager().addView(movp);
527
                FLayer[] layers=getModel().getMapContext().getLayers().getActives();
528
                if (layers.length>0 && layers[0] instanceof FLyrVect){
529
                        if (((FLyrVect)layers[0]).isEditing()){
530
                                showConsole();
531
                                return;
532
                        }
533
                }
534
                hideConsole();
535

    
536
        }
537

    
538
        public void restore() {
539
                isPalette=false;
540
                PluginServices.getMDIManager().closeView(movp);
541
                FLayer[] layers=getModel().getMapContext().getLayers().getActives();
542
                if (layers.length>0 && layers[0] instanceof FLyrVect){
543
                        if (((FLyrVect)layers[0]).isEditing()){
544
                                showConsole();
545
                                return;
546
                        }
547
                }
548
                hideConsole();
549
        }
550

    
551
        public boolean isPalette() {
552
                return isPalette;
553
        }
554
}