Statistics
| Revision:

svn-document-layout / trunk / org.gvsig.app.document.layout.app / org.gvsig.app.document.layout.app.mainplugin / src / main / java / org / gvsig / app / project / documents / layout / fframes / FFrameOverView.java @ 70

History | View | Annotate | Download (15.5 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (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
package org.gvsig.app.project.documents.layout.fframes;
23

    
24
import java.awt.Color;
25
import java.awt.Dimension;
26
import java.awt.Graphics;
27
import java.awt.Graphics2D;
28
import java.awt.Image;
29
import java.awt.geom.AffineTransform;
30
import java.awt.geom.Line2D;
31
import java.awt.geom.Rectangle2D;
32
import java.awt.image.BufferedImage;
33

    
34
import javax.swing.JOptionPane;
35

    
36
import org.slf4j.Logger;
37
import org.slf4j.LoggerFactory;
38

    
39
import org.gvsig.andami.PluginServices;
40
import org.gvsig.andami.messages.NotificationManager;
41
import org.gvsig.app.ApplicationLocator;
42
import org.gvsig.app.project.documents.view.ViewDocument;
43
import org.gvsig.compat.print.PrintAttributes;
44
import org.gvsig.fmap.dal.exception.ReadException;
45
import org.gvsig.fmap.geom.primitive.Envelope;
46
import org.gvsig.fmap.mapcontext.MapContext;
47
import org.gvsig.fmap.mapcontext.ViewPort;
48
import org.gvsig.tools.ToolsLocator;
49
import org.gvsig.tools.dynobject.DynStruct;
50
import org.gvsig.tools.persistence.PersistenceManager;
51
import org.gvsig.tools.persistence.PersistentState;
52
import org.gvsig.tools.persistence.exception.PersistenceException;
53

    
54
/**
55
 * FFrame para introducir el localizador de una vista en el Layout.
56
 * 
57
 * @author Vicente Caballero Navarro
58
 */
59
public class FFrameOverView extends FFrameView implements IFFrameViewDependence {
60

    
61
    private static final Logger logger = LoggerFactory
62
        .getLogger(FFrameOverView.class);
63
    
64
    public static final String PERSISTENCE_DEFINITION_NAME = "FFrameOverView";
65

    
66
    private static final String FFRAMEVIEWDEPENDENCE_FIELD =
67
        "fframeViewDependence";
68

    
69
    private MapContext assoc_map;
70
    private Envelope extent;
71
    private FFrameView fframeViewDependence;
72

    
73
    /**
74
     * DOCUMENT ME!
75
     * 
76
     * @param g
77
     *            DOCUMENT ME!
78
     * @param at
79
     *            DOCUMENT ME!
80
     * @param rv
81
     *            DOCUMENT ME!
82
     * @param imgBase
83
     *            DOCUMENT ME!
84
     */
85
    public void draw(Graphics2D g, AffineTransform at, Rectangle2D rv,
86
        BufferedImage imgBase) {
87
        try {
88
            if (getMapContext() != null
89
                && getMapContext().getFullEnvelope() != null) {
90
                getMapContext().getViewPort().setEnvelope(
91
                    getMapContext().getFullEnvelope());
92
            }
93
        } catch (ReadException e) {
94
            ApplicationLocator.getManager().message(
95
                e.getMessage(), JOptionPane.ERROR_MESSAGE);
96
            logger.info("Error while setting full extent.", e);
97
        }
98
        refresh();
99
        super.draw(g, at, rv, imgBase);
100
        
101
        drawAreaOfInterestBox(g, at, null);
102
    }
103

    
104
    
105
    protected void drawAreaOfInterestBox(
106
        Graphics2D g,
107
        AffineTransform at,
108
        PrintAttributes printAttributes) {
109
        
110
        if ((assoc_map != null)
111
            && (assoc_map.getViewPort().getEnvelope() != null)
112
            && (getMapContext().getViewPort().getEnvelope() != null)) {
113

    
114
            Rectangle2D r = getBoundingBox(at);
115
            ViewPort vp = getMapContext().getViewPort();
116
            ViewPort vpOrig = assoc_map.getViewPort();
117

    
118
            if (extent == null) {
119
                extent = vpOrig.getAdjustedEnvelope();
120
            }
121
            vp.refreshExtent();
122
            
123
            Image ov_img = new BufferedImage(
124
                vp.getImageWidth(),
125
                vp.getImageHeight(),
126
                BufferedImage.TYPE_INT_ARGB);
127
            Graphics ov_img_gra = ov_img.getGraphics();
128
            
129
            /*
130
             * Fill with transparent color
131
             */
132
            ov_img_gra.setColor(new Color(0, 0, 0, 0));
133
            ov_img_gra.fillRect(0, 0,
134
                vp.getImageWidth(), vp.getImageHeight());
135
            
136
            
137
            Rectangle2D aux =
138
                new Rectangle2D.Double(extent.getMinimum(0),
139
                    extent.getMinimum(1), extent.getLength(0),
140
                    extent.getLength(1));
141
            Rectangle2D extentPixels = vp.fromMapRectangle(aux);
142

    
143
            /*
144
             * Area of interest in pixels, inside ov_img image
145
             */
146
            extentPixels.setFrame(
147
                extentPixels.getMinX(), extentPixels.getMinY(),
148
                extentPixels.getWidth(), extentPixels.getHeight());
149

    
150
            /*
151
             * Fill (gray) and perimeter (red)
152
             */
153
            ov_img_gra.setColor(new Color(100, 100, 100, 100));
154
            ov_img_gra.fillRect((int) extentPixels.getMinX(),
155
                (int) extentPixels.getMinY(),
156
                (int) extentPixels.getWidth(),
157
                (int) extentPixels.getHeight());
158
            ov_img_gra.setColor(Color.red);
159
            ov_img_gra.drawRect((int) extentPixels.getMinX(),
160
                (int) extentPixels.getMinY(),
161
                (int) extentPixels.getWidth(),
162
                (int) extentPixels.getHeight());
163
            
164
            int aoi_top = (int) extentPixels.getMinY();
165
            int aoi_bottom = (int) extentPixels.getMaxY();
166
            int aoi_left = (int) extentPixels.getMinX();
167
            int aoi_right = (int) extentPixels.getMaxX();
168
            /*
169
             * Draw vertical, horizontal lines
170
             */
171
            ov_img_gra.setColor(Color.darkGray);
172
            int cx = (int) extentPixels.getCenterX(); 
173
            int cy = (int) extentPixels.getCenterY();
174
            int maxx = vp.getImageWidth();
175
            int maxy = vp.getImageHeight();
176
            
177
            // vertical
178
            ov_img_gra.drawLine(cx, 0, cx, aoi_top);
179
            ov_img_gra.drawLine(cx, aoi_bottom, cx, maxy);
180
            // horiz
181
            ov_img_gra.drawLine(0, cy, aoi_left, cy);
182
            ov_img_gra.drawLine(aoi_right, cy, maxx, cy);
183
            
184
            /*
185
             * Semi-transparent image is ready
186
             */
187

    
188
            /*
189
             * Save clip area
190
             */
191
            Rectangle2D clip = g.getClipBounds();
192
            g.setClip((int) r.getX(), (int) r.getY(), (int) r.getWidth(),
193
                (int) r.getHeight());
194

    
195
            /*
196
             * Paste resized image (with transparency)
197
             */
198
            ov_img = ov_img.getScaledInstance(
199
                (int) r.getWidth(),
200
                (int) r.getHeight(), Image.SCALE_SMOOTH);
201
            g.drawImage(ov_img, (int) r.getX(), (int) r.getY(), null);
202
            ov_img_gra.dispose();
203
            
204
            /*
205
             * Restore clip area
206
             */
207
            g.setClip((int) clip.getX(), (int) clip.getY(),
208
                (int) clip.getWidth(), (int) clip.getHeight());
209
            extent = null;
210
            // System.err.println("Dibujando FFrameOverView ...");
211
        }
212
    }
213

    
214

    
215
    
216
    protected void print(Graphics2D g, AffineTransform at, PrintAttributes printAttributes) {
217
        
218
        try {
219
            if (getMapContext() != null
220
                && getMapContext().getFullEnvelope() != null) {
221
                getMapContext().getViewPort().setEnvelope(
222
                    getMapContext().getFullEnvelope());
223
            }
224
        } catch (ReadException e) {
225
            ApplicationLocator.getManager().message(
226
                e.getMessage(), JOptionPane.ERROR_MESSAGE);
227
            logger.info("Error while setting full extent.", e);
228
        }
229
        refresh();
230
        
231
        super.print(g, at, printAttributes);
232
        
233
        drawAreaOfInterestBox(g, at, printAttributes);
234
    }
235

    
236
    /**
237
     * Inserta el ProjectView de donde obtener las propiedades de la vista a
238
     * mostrar.
239
     * 
240
     * @param v
241
     *            Modelo de la vista.
242
     */
243
    public void setView(ViewDocument v) {
244
        viewDocument = v;
245

    
246
        ViewPort vp = null;
247

    
248
        if (getMapContext() != null) {
249
            vp = getMapContext().getViewPort();
250
        } else {
251
            try {
252
                vp = (ViewPort) v.getMapContext().getViewPort().clone();
253
            } catch (CloneNotSupportedException e) {
254
                NotificationManager.addError("Excepci?n :", e);
255
            }
256
        }
257

    
258
        vp.setImageSize(new Dimension((int) getBoundingBox(null).width,
259
            (int) getBoundingBox(null).height));
260
        if (fframeViewDependence == null)
261
            return;
262
        assoc_map = fframeViewDependence.getMapContext();
263

    
264
        if (fframeViewDependence.getLinked()) {
265
            try {
266
                mapContext =
267
                    fframeViewDependence
268
                        .getView()
269
                        .getMapOverViewContext()
270
                        .createNewFMap(
271
                            (ViewPort) fframeViewDependence.getView()
272
                                .getMapOverViewContext().getViewPort().clone());
273
            } catch (CloneNotSupportedException e) {
274
                NotificationManager.addError("Excepci?n :", e);
275
            }
276
            mapContext.getViewPort().setImageSize(
277
                new Dimension((int) getBoundingBox(null).width,
278
                    (int) getBoundingBox(null).height));
279
            fframeViewDependence.getMapContext().getViewPort()
280
                .addViewPortListener(this);
281
            v.getMapContext().getViewPort().addViewPortListener(this);
282
            fframeViewDependence.getView().getMapOverViewContext()
283
                .addLayerListener(this);
284
        } else
285
            if (!fframeViewDependence.getLinked()) {
286
                mapContext =
287
                    fframeViewDependence.getView().getMapOverViewContext()
288
                        .cloneFMap();
289
                try {
290
                    mapContext.setViewPort((ViewPort) fframeViewDependence
291
                        .getView().getMapOverViewContext().getViewPort()
292
                        .clone());
293
                } catch (CloneNotSupportedException e) {
294
                    NotificationManager.addError("Excepci?n :", e);
295
                }
296
                mapContext.getViewPort().setImageSize(
297
                    new Dimension((int) getBoundingBox(null).width,
298
                        (int) getBoundingBox(null).height));
299
                fframeViewDependence.getMapContext().getViewPort()
300
                    .addViewPortListener(this);
301
                v.getMapContext().getViewPort().addViewPortListener(this);
302
                fframeViewDependence.getView().getMapOverViewContext()
303
                    .addLayerListener(this);
304
            }
305
    }
306

    
307
    /**
308
     * @see org.gvsig.app.project.documents.layout.fframes.IFFrame#getNameFFrame()
309
     */
310
    public String getNameFFrame() {
311
        return PluginServices.getText(this, "Localizador") + num;
312
    }
313

    
314
    public String getName() {
315
        return PERSISTENCE_DEFINITION_NAME;
316
    }
317

    
318
    public IFFrame clone() throws CloneNotSupportedException {
319
        FFrameOverView frame = (FFrameOverView) super.clone();
320
        frame.setSelected(this.getSelected() != IFFrame.NOSELECT);
321
        cloneActions(frame);
322
        return frame;
323
    }
324

    
325
    public void setFFrameDependence(IFFrame f) {
326
        fframeViewDependence = (FFrameView) f;
327
    }
328

    
329
    public IFFrame[] getFFrameDependence() {
330
        return new IFFrame[] { fframeViewDependence };
331
    }
332

    
333
    public void refreshDependence(IFFrame fant, IFFrame fnew) {
334
        if ((fframeViewDependence != null) && fframeViewDependence.equals(fant)) {
335
            fframeViewDependence = (FFrameView) fnew;
336
            assoc_map = fframeViewDependence.getMapContext();
337

    
338
            if (fframeViewDependence.getLinked()) {
339
                try {
340
                    mapContext =
341
                        fframeViewDependence
342
                            .getView()
343
                            .getMapOverViewContext()
344
                            .createNewFMap(
345
                                (ViewPort) fframeViewDependence.getView()
346
                                    .getMapOverViewContext().getViewPort()
347
                                    .clone());
348
                } catch (CloneNotSupportedException e) {
349
                    NotificationManager.addError("Excepci?n :", e);
350
                }
351
                mapContext.getViewPort().setImageSize(
352
                    new Dimension((int) getBoundingBox(null).width,
353
                        (int) getBoundingBox(null).height));
354
                fframeViewDependence.getMapContext().getViewPort()
355
                    .addViewPortListener(this);
356
                getView().getMapContext().getViewPort()
357
                    .addViewPortListener(this);
358
                fframeViewDependence.getView().getMapOverViewContext()
359
                    .addLayerListener(this);
360
            } else
361
                if (!fframeViewDependence.getLinked()) {
362
                    mapContext =
363
                        fframeViewDependence.getView().getMapOverViewContext()
364
                            .cloneFMap(); // (v.getMapContext().getViewPort().cloneViewPort());
365
                    try {
366
                        mapContext.setViewPort((ViewPort) fframeViewDependence
367
                            .getView().getMapOverViewContext().getViewPort()
368
                            .clone());
369
                    } catch (CloneNotSupportedException e) {
370
                        NotificationManager.addError("Excepci?n :", e);
371
                    }
372
                    mapContext.getViewPort().setImageSize(
373
                        new Dimension((int) getBoundingBox(null).width,
374
                            (int) getBoundingBox(null).height));
375
                    fframeViewDependence.getMapContext().getViewPort()
376
                        .addViewPortListener(this);
377
                    getView().getMapContext().getViewPort()
378
                        .addViewPortListener(this);
379
                    fframeViewDependence.getView().getMapOverViewContext()
380
                        .addLayerListener(this);
381
                }
382
        }
383

    
384
    }
385

    
386
    public static void registerPersistent() {
387
        PersistenceManager manager = ToolsLocator.getPersistenceManager();
388
        if (manager.getDefinition(PERSISTENCE_DEFINITION_NAME) == null) {
389
            DynStruct definition =
390
                manager.addDefinition(FFrameOverView.class,
391
                    PERSISTENCE_DEFINITION_NAME,
392
                    "FFrameOverView persistence definition", null, null);
393

    
394
            definition.extend(manager
395
                .getDefinition(FFrameView.PERSISTENCE_DEFINITION_NAME));
396

    
397
            definition.addDynFieldObject(FFRAMEVIEWDEPENDENCE_FIELD)
398
                .setClassOfValue(FFrameView.class);
399
        }
400
    }
401

    
402
    @Override
403
    public void loadFromState(PersistentState state)
404
        throws PersistenceException {
405
        super.loadFromState(state);
406
        fframeViewDependence =
407
            (FFrameView) state.get(FFRAMEVIEWDEPENDENCE_FIELD);
408
        
409
        /*
410
         * force refreshment of other fields
411
         */
412
        this.setView(viewDocument);
413
    }
414

    
415
    @Override
416
    public void saveToState(PersistentState state) throws PersistenceException {
417
        super.saveToState(state);
418
        state.set(FFRAMEVIEWDEPENDENCE_FIELD, fframeViewDependence);
419
    }
420
}