Statistics
| Revision:

root / trunk / applications / appgvSIG / src / com / iver / cit / gvsig / gui / layout / fframes / FFrameView.java @ 1094

History | View | Annotate | Download (16 KB)

1
/*
2
 * Created on 20-feb-2004
3
 *
4
 */
5
package com.iver.cit.gvsig.gui.layout.fframes;
6

    
7
import com.iver.andami.PluginServices;
8
import com.iver.andami.messages.NotificationManager;
9

    
10
import com.iver.cit.gvsig.ProjectExtension;
11
import com.iver.cit.gvsig.fmap.ColorEvent;
12
import com.iver.cit.gvsig.fmap.ExtentEvent;
13
import com.iver.cit.gvsig.fmap.FMap;
14
import com.iver.cit.gvsig.fmap.ViewPort;
15
import com.iver.cit.gvsig.fmap.ViewPortListener;
16
import com.iver.cit.gvsig.fmap.layers.XMLException;
17
import com.iver.cit.gvsig.gui.layout.FLayoutUtilities;
18
import com.iver.cit.gvsig.gui.layout.Layout;
19
import com.iver.cit.gvsig.project.castor.Project;
20
import com.iver.cit.gvsig.project.castor.ProjectView;
21

    
22
import com.iver.utiles.XMLEntity;
23

    
24
import org.apache.log4j.Logger;
25

    
26
import java.awt.Dimension;
27
import java.awt.Graphics2D;
28
import java.awt.Rectangle;
29
import java.awt.geom.AffineTransform;
30
import java.awt.geom.Point2D;
31
import java.awt.geom.Rectangle2D;
32
import java.awt.image.BufferedImage;
33

    
34
import java.util.ArrayList;
35

    
36

    
37
/**
38
 * FFrame para introducir una vista en el Layout.
39
 *
40
 * @author Vicente Caballero Navarro
41
 */
42
public class FFrameView extends FFrame implements ViewPortListener {
43
        private static Logger logger = Logger.getLogger(FFrameView.class.getName());
44
        public static final int AUTOMATICO = 0;
45
        public static final int CONSTANTE = 1;
46
        public static final int MANUAL = 2;
47
        public static final int PRESENTACION = 0;
48
        public static final int BORRADOR = 1;
49
        private int m_Mode;
50
        private int m_typeScale = AUTOMATICO;
51
        private int m_extension = 0;
52
        private int m_quality = PRESENTACION;
53
        private int m_viewing = 0;
54
        private boolean m_bLinked = true;
55
        private ProjectView view = null;
56
        private FMap m_fmap = null;
57
        private double m_Scale = 0;
58
        private int m_mapUnits = 1; //Metros.
59
        private int num = 0;
60
        private BufferedImage m_image = null;
61
        private AffineTransform at = null;
62
        private Project project = null;
63

    
64
        /**
65
         * Creates a new FFrameView object.
66
         */
67
        public FFrameView() {
68
        }
69

    
70
        /**
71
         * Devuelve una descripci?n del FFrameView.
72
         *
73
         * @return Descripci?n.
74
         */
75
        public String toString() {
76
                if (getView() == null) {
77
                        return "FFrameView " + num + ": " + "Vacio";
78
                }
79

    
80
                return "FFrameView " + num + ": " + getView().getName();
81
        }
82

    
83
        /**
84
         * Rellena la escala de la vista que contiene el fframe.
85
         *
86
         * @param d escala de la vista.
87
         */
88
        public void setScale(double d) {
89
                m_Scale = d;
90
        }
91

    
92
        /**
93
         * Inserta el nuevo extent a la FFrameView.
94
         *
95
         * @param r Rect?ngulo a ocupar por el FFrameView.
96
         */
97
        public void setNewExtent(Rectangle2D r) {
98
                getFMap().getViewPort().setExtent(r);
99
                m_Scale = FLayoutUtilities.getScaleView(getFMap(), getBoundBox().height);
100
        }
101

    
102
        /**
103
         * Devuelve el FMap de la vista o una clonaci?n de este si se utiliza una
104
         * escala fija.
105
         *
106
         * @return FMap.
107
         */
108
        public FMap getFMap() {
109
                return m_fmap;
110
        }
111

    
112
        /**
113
         * Rellena la calidad que se quiere aplicar.
114
         *
115
         * @param q entero que representa la calidad a aplicar.
116
         */
117
        public void setQuality(int q) {
118
                m_quality = q;
119
        }
120

    
121
        /**
122
         * Devuelve un entero que representa la calidad que est? seleccionada.
123
         *
124
         * @return tipo de calidad selccionada.
125
         */
126
        public int getQuality() {
127
                return m_quality;
128
        }
129

    
130
        /**
131
         * Devuelve un entero que representa la forma en que se actualiza la vista.
132
         *
133
         * @return forma que se actualiza la vista.
134
         */
135
        public int getViewing() {
136
                return m_viewing;
137
        }
138

    
139
        /**
140
         * Rellena la forma de actualizar la vista.
141
         *
142
         * @param v entero que representa la forma de actualizar la vista.
143
         */
144
        public void setViewing(int v) {
145
                m_viewing = v;
146
        }
147

    
148
        /**
149
         * Inserta el ProjectView de donde obtener las propiedades de la vista a
150
         * mostrar.
151
         *
152
         * @param v Modelo de la vista.
153
         */
154
        public void setView(ProjectView v) {
155
                view = v;
156

    
157
                ViewPort vp = new ViewPort(v.getMapContext().getViewPort()
158
                                                                        .getProjection());
159

    
160
                if (m_bLinked) {
161
                        if (getTypeScale() == AUTOMATICO) {
162
                                m_fmap = v.getMapContext().createNewFMap(v.getMapContext()
163
                                                                                                                  .getViewPort()
164
                                                                                                                  .cloneViewPort());
165
                                v.getMapContext().getViewPort().addExtentListener(this);
166
                        } else if (getTypeScale() == CONSTANTE) {
167
                                vp.setExtent((Rectangle2D) v.getMapContext().getViewPort()
168
                                                                                        .getExtent().clone());
169
                                m_fmap = v.getMapContext().createNewFMap(vp);
170
                                v.getMapContext().getViewPort().removeExtentListener(this);
171
                        } else if (getTypeScale() == MANUAL) {
172
                                vp.setExtent(getNewExtent(getScale()));
173
                                m_fmap = v.getMapContext().createNewFMap(vp);
174
                                v.getMapContext().getViewPort().removeExtentListener(this);
175
                        }
176
                } else if (!m_bLinked) {
177
                        try {
178
                                if (getTypeScale() == AUTOMATICO) {
179
                                        m_fmap = v.getMapContext().cloneFMap(); //(v.getMapContext().getViewPort().cloneViewPort());
180
                                        m_fmap.setViewPort(v.getMapContext().getViewPort()
181
                                                                                .cloneViewPort());
182
                                        v.getMapContext().getViewPort().addExtentListener(this);
183
                                } else if (getTypeScale() == CONSTANTE) {
184
                                        vp.setExtent((Rectangle2D) v.getMapContext().getViewPort()
185
                                                                                                .getExtent().clone());
186
                                        m_fmap = v.getMapContext().cloneFMap();
187
                                        m_fmap.setViewPort(vp);
188
                                        v.getMapContext().getViewPort().removeExtentListener(this);
189
                                } else if (getTypeScale() == MANUAL) {
190
                                        vp.setExtent(getNewExtent(getScale()));
191
                                        m_fmap = v.getMapContext().cloneFMap();
192
                                        m_fmap.setViewPort(vp);
193
                                        v.getMapContext().getViewPort().removeExtentListener(this);
194
                                }
195
                        } catch (XMLException e1) {
196
                                NotificationManager.addError("Cuando se a?ade una vista al Layout",
197
                                        e1);
198
                        }
199
                }
200

    
201
                /*
202
                   m_fmap = v.getMapContext();
203
                
204
                   v.getMapContext().getViewPort();
205
                   ViewPort vp = new ViewPort();
206
                   vp.setExtent(v.getMapContext().getViewPort().getExtent());
207
                   m_fmap = m_fmap.createNewFMap(vp);
208
                   view = v;
209
                 */
210
        }
211

    
212
        /**
213
         * Devuelve el modelo de la vista.
214
         *
215
         * @return Modelo de la vista.
216
         */
217
        public ProjectView getView() {
218
                return view;
219
        }
220

    
221
        /**
222
         * Devuelve un Rect?ngulo que representa  el extent de la vista que se
223
         * requiere a partir  de una escala.
224
         *
225
         * @param scale Escala a mostrar.
226
         *
227
         * @return Rect?ngulo.
228
         */
229
        private Rectangle2D.Double getNewExtent(long scale) {
230
                double hview = getBoundBox().getHeight();
231
                double wview = getBoundBox().getWidth();
232
                double hextent = (scale * hview) / 100.0;
233
                double wextent = (scale * wview) / 100.0;
234
                double dif = hextent / m_fmap.getViewPort().getExtent().getHeight();
235
                double newx = m_fmap.getViewPort().getExtent().getCenterX() -
236
                        ((m_fmap.getViewPort().getExtent().getWidth() * dif) / 2.0);
237
                double newy = m_fmap.getViewPort().getExtent().getCenterY() -
238
                        ((m_fmap.getViewPort().getExtent().getHeight() * dif) / 2.0);
239

    
240
                return new Rectangle2D.Double(newx, newy, wextent, hextent);
241
        }
242

    
243
        /**
244
         * M?todo que dibuja sobre el graphics que se le pasa como par?metro, seg?n
245
         * la transformada afin que se debe de aplicar y el rect?ngulo que se debe
246
         * de dibujar.
247
         *
248
         * @param g Graphics2D
249
         * @param at Transformada af?n.
250
         * @param rv rect?ngulo sobre el que hacer un clip.
251
         * @param imgBase Imagen para acelerar el dibujado.
252
         *
253
         * @throws com.iver.cit.gvsig.fmap.DriverException
254
         */
255
        public void draw(Graphics2D g, AffineTransform at, Rectangle2D rv,
256
                BufferedImage imgBase) throws com.iver.cit.gvsig.fmap.DriverException {
257
                Rectangle2D.Double r = getBoundingBox(at);
258

    
259
                if (intersects(rv, r)) {
260
                        if (getFMap() == null) {
261
                                drawEmpty(g);
262
                        } else {
263
                                if (rv != null) {
264
                                        // Dibujamos en pantalla
265
                                        Rectangle rclip = g.getClipBounds();
266
                                        g.clipRect((int) r.getMinX(), (int) r.getMinY(),
267
                                                (int) r.getWidth(), (int) r.getHeight());
268

    
269
                                        if (getQuality() == PRESENTACION) {
270
                                                /*     this.getFMap().setTransparent(true);
271
                                                   this.getFMap().drawView((Graphics2D) g,
272
                                                       new Rectangle((int) (r.x), (int) (r.y),
273
                                                           (int) (r.width), (int) (r.height)),
274
                                                       (Rectangle) rv, false, imgBase);
275
                                                 */
276
                                                if (rv.intersects(r)) {
277
                                                        this.getFMap().getViewPort().setOffset(new Point2D.Double(
278
                                                                        r.x, r.y));
279
                                                        this.getFMap().getViewPort().setImageSize(new Dimension(
280
                                                                        (int) r.width, (int) r.height));
281

    
282
                                                        try {
283
                                                                this.getFMap().draw(imgBase, g);
284
                                                        } catch (com.iver.cit.gvsig.fmap.DriverException e) {
285
                                                                // TODO Auto-generated catch block
286
                                                                e.printStackTrace();
287
                                                        }
288
                                                }
289

    
290
                                                if (rclip != null) {
291
                                                        g.setClip(rclip.x, rclip.y, rclip.width,
292
                                                                rclip.height);
293
                                                }
294
                                        } else {
295
                                                drawDraft(g);
296
                                        }
297
                                } else {
298
                                        print(g, at);
299
                                }
300
                        }
301
                }
302
        }
303

    
304
        /**
305
         * @see com.iver.cit.gvsig.gui.layout.fframes.IFFrame#print(java.awt.Graphics2D,
306
         *                 java.awt.geom.AffineTransform)
307
         */
308
        public void print(Graphics2D g, AffineTransform at) {
309
                Rectangle2D.Double r = getBoundingBox(at);
310

    
311
                // Dibujamos en impresora
312
                Rectangle rclip = g.getClipBounds();
313
                g.clipRect((int) r.getMinX(), (int) r.getMinY(), (int) r.getWidth(),
314
                        (int) r.getHeight());
315
                this.getFMap().getViewPort().setOffset(new Point2D.Double(r.x, r.y));
316
                this.getFMap().getViewPort().setImageSize(new Dimension((int) r.width,
317
                                (int) r.height));
318

    
319
                try {
320
                        this.getFMap().print(g);
321
                } catch (com.iver.cit.gvsig.fmap.DriverException e) {
322
                        // TODO Auto-generated catch block
323
                        e.printStackTrace();
324
                }
325

    
326
                g.setClip(rclip.x, rclip.y, rclip.width, rclip.height);
327
        }
328

    
329
        /**
330
         * Rellena la unidad de medida en la que est? la vista.
331
         *
332
         * @param i entero que representa la unidad de medida de la vista.
333
         */
334
        public void setMapUnits(int i) {
335
                m_mapUnits = i;
336
        }
337

    
338
        /**
339
         * Obtiene la unidad de medida en la que est? la vista.
340
         *
341
         * @return Unidad de medida.
342
         */
343
        public int getMapUnits() {
344
                return m_mapUnits;
345
        }
346

    
347
        /**
348
         * Devuelve la escala seg?n el tipo de escala que se haya seleccionado al
349
         * a?adida la vista.
350
         *
351
         * @return escala.
352
         */
353
        public long getScale() {
354
                /*if (m_bLinked){
355
                   return getScaleView1(METROS);
356
                       }
357
                 */
358
                if (getTypeScale() == AUTOMATICO) {
359
                        return FLayoutUtilities.getScaleView(getFMap(), getBoundBox().height);
360
                } else if (getTypeScale() == CONSTANTE) {
361
                        return (long) m_Scale;
362
                } else if (getTypeScale() == MANUAL) {
363
                        return (long) m_Scale;
364
                }
365

    
366
                return (long) m_Scale;
367
        }
368

    
369
        /**
370
         * Seleccionar si la vista esta relacionada o no con la original.
371
         *
372
         * @param b true si est? ligada y false si no lo est?.
373
         */
374
        public void setLinked(boolean b) {
375
                m_bLinked = b;
376
        }
377

    
378
        /**
379
         * Devuelve si est? ligada o no el FFrameView con la vista.
380
         *
381
         * @return True si la vista est? ligada.
382
         */
383
        public boolean getLinked() {
384
                return m_bLinked;
385
        }
386

    
387
        /**
388
         * Devuelve la opci?n seleccionada:Rellenar marco de la vista o recorte a
389
         * la vista.
390
         *
391
         * @return entero que representa la opci?n elegida.
392
         */
393
        public int getExtension() {
394
                return m_extension;
395
        }
396

    
397
        /**
398
         * Devuelve el tipo de escala que est? seleccionada AUTOMATICO,CONSTANTE o
399
         * MANUAL.
400
         *
401
         * @return entero que representa el tipo seleccionado.
402
         */
403
        public int getTypeScale() {
404
                return m_typeScale;
405
        }
406

    
407
        /**
408
         * Rellenar si se quiere:Rellenar marco de la vista o recorte a la vista.
409
         *
410
         * @param i entero que representa la opci?n elegida.
411
         */
412
        public void setExtension(int i) {
413
                m_extension = i;
414
        }
415

    
416
        /**
417
         * Rellenar el tipo de escala que se desea.
418
         *
419
         * @param i entero que representa el tipo de escala.
420
         */
421
        public void setTypeScale(int i) {
422
                m_typeScale = i;
423
        }
424

    
425
        /**
426
         * @see com.iver.cit.gvsig.gui.layout.fframes.IFFrame#getXMLEntity()
427
         */
428
        public XMLEntity getXMLEntity() {
429
                XMLEntity xml = new XMLEntity();
430
                xml.putProperty("className",this.getClass().getName());
431
                xml.putProperty("m_name", m_name);
432
                xml.putProperty("x", getBoundBox().x);
433
                xml.putProperty("y", getBoundBox().y);
434
                xml.putProperty("w", getBoundBox().width);
435
                xml.putProperty("h", getBoundBox().height);
436
                xml.putProperty("m_Selected", m_Selected);
437
                xml.putProperty("type", Layout.RECTANGLEVIEW);
438
                xml.putProperty("m_Mode", m_Mode);
439
                xml.putProperty("m_typeScale", m_typeScale);
440
                xml.putProperty("m_extension", m_extension);
441
                xml.putProperty("m_quality", m_quality);
442
                xml.putProperty("m_viewing", m_viewing);
443
                xml.putProperty("m_bLinked", m_bLinked);
444
                xml.putProperty("m_mapUnits", m_mapUnits);
445
                xml.putProperty("m_Scale", m_Scale);
446

    
447
                xml.putProperty("extentX", getFMap().getViewPort().getExtent().getX());
448
                xml.putProperty("extentY", getFMap().getViewPort().getExtent().getY());
449
                xml.putProperty("extentW",
450
                        getFMap().getViewPort().getExtent().getWidth());
451
                xml.putProperty("extentH",
452
                        getFMap().getViewPort().getExtent().getHeight());
453
                xml.putProperty("tag", getTag());
454

    
455
                ProjectExtension pe = (ProjectExtension) PluginServices.getExtension(ProjectExtension.class);
456
                ArrayList views = pe.getProject().getViews();
457

    
458
                boolean hasIndex = false;
459

    
460
                for (int i = 0; i < views.size(); i++) {
461
                        if (view == ((ProjectView) views.get(i))) {
462
                                xml.putProperty("indice", i);
463
                                hasIndex = true;
464
                        }
465
                }
466

    
467
                if (!hasIndex) {
468
                        xml.putProperty("indice", -1);
469
                }
470

    
471
                xml.addChild(m_fmap.getXMLEntity());
472

    
473
                return xml;
474
        }
475

    
476
        /**
477
         * Inserta la imagen para repintar el FFrameView.
478
         *
479
         * @param bi Imagen para repintar.
480
         */
481
        public void setBufferedImage(BufferedImage bi) {
482
                m_image = bi;
483
        }
484

    
485
        /**
486
         * Devuelve la imagen para repintar.
487
         *
488
         * @return Imagen para repintar.
489
         */
490
        public BufferedImage getBufferedImage() {
491
                return m_image;
492
        }
493

    
494
        /**
495
         * Devuelve la MAtriz de transformaci?n utilizada por la FFrameView.
496
         *
497
         * @return MAtriz de transformaci?n.
498
         */
499
        public AffineTransform getAt() {
500
                return at;
501
        }
502

    
503
        /**
504
         * Inserta la matriz de transformaci?n.
505
         *
506
         * @param transform Matriz de transformaci?n.
507
         */
508
        public void setAt(AffineTransform transform) {
509
                at = transform;
510
        }
511

    
512
        /**
513
         * Inserta el proyecto.
514
         *
515
         * @param p Proyecto.
516
         */
517
        public void setProject(Project p) {
518
                project = p;
519
        }
520

    
521
        /**
522
         * @see com.iver.cit.gvsig.gui.layout.fframes.IFFrame#setXMLEntity(com.iver.utiles.XMLEntity,
523
         *                 com.iver.cit.gvsig.project.Project)
524
         */
525
        public void setXMLEntity(XMLEntity xml, Layout l) {
526
                if (xml.getIntProperty("m_Selected") != 0) {
527
                        this.setSelected(true);
528
                } else {
529
                        this.setSelected(false);
530
                }
531

    
532
                this.setName(xml.getStringProperty("m_name"));
533
                this.setBoundBox(new Rectangle2D.Double(xml.getDoubleProperty("x"),
534
                                xml.getDoubleProperty("y"), xml.getDoubleProperty("w"),
535
                                xml.getDoubleProperty("h")));
536

    
537
                this.m_Mode = xml.getIntProperty("m_Mode");
538
                this.m_typeScale = xml.getIntProperty("m_typeScale");
539
                this.m_extension = xml.getIntProperty("m_extension");
540
                this.m_quality = xml.getIntProperty("m_quality");
541
                this.m_viewing = xml.getIntProperty("m_viewing");
542
                this.m_bLinked = xml.getBooleanProperty("m_bLinked");
543
                this.m_mapUnits = xml.getIntProperty("m_mapUnits");
544

    
545
                ProjectExtension pe = (ProjectExtension) PluginServices.getExtension(ProjectExtension.class);
546
                this.m_Scale = xml.getDoubleProperty("m_Scale");
547

    
548
                int indice = xml.getIntProperty("indice");
549

    
550
                if (indice != -1) {
551
                        ProjectView view = (ProjectView) project.getViews().get(indice);
552
                        this.m_fmap = view.getMapContext();
553
                        this.setView((ProjectView) view);
554

    
555
                        try {
556
                                //this.m_fmap = view.getMapContext();
557

    
558
                                /*        this.getFMap().getViewPort().setExtent(new Rectangle2D.Double(
559
                                   xml.getDoubleProperty("extentX"),
560
                                   xml.getDoubleProperty("extentY"),
561
                                   xml.getDoubleProperty("extentW"),
562
                                   xml.getDoubleProperty("extentH")));
563
                                 */
564
                                if (m_bLinked) {
565
                                        this.getFMap().getViewPort().setExtent(new Rectangle2D.Double(
566
                                                        xml.getDoubleProperty("extentX"),
567
                                                        xml.getDoubleProperty("extentY"),
568
                                                        xml.getDoubleProperty("extentW"),
569
                                                        xml.getDoubleProperty("extentH")));
570
                                } else if (!m_bLinked) {
571
                                        this.m_fmap = FMap.createFromXML(xml.getChild(0));
572
                                }
573
                        } catch (XMLException e) {
574
                                NotificationManager.addError("Pasando las propiedades del XMLEntity al objeto",
575
                                        e);
576
                        }
577
                }
578
        }
579

    
580
        /**
581
         * @see com.iver.cit.gvsig.gui.layout.fframes.IFFrame#getNameFFrame()
582
         */
583
        public String getNameFFrame() {
584
                return PluginServices.getText(this, "Vista") + num;
585
        }
586

    
587
        /**
588
         * @see com.iver.cit.gvsig.fmap.ExtentListener#extentChanged(com.iver.cit.gvsig.fmap.ExtentEvent)
589
         */
590
        public void extentChanged(ExtentEvent e) {
591
                if (getTypeScale() == AUTOMATICO) {
592
                        m_fmap.getViewPort().setExtent(e.getNewExtent());
593
                }
594
        }
595

    
596
        /**
597
         * @see com.iver.cit.gvsig.fmap.ViewPortListener#backColorChanged(com.iver.cit.gvsig.fmap.ColorEvent)
598
         */
599
        public void backColorChanged(ColorEvent e) {
600
        }
601
}