Statistics
| Revision:

svn-document-layout / tags / 2059 / org.gvsig.app.document.layout.app.mainplugin / src / main / java / org / gvsig / app / project / documents / layout / fframes / FFrameOverView.java @ 46

History | View | Annotate | Download (14.1 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.Rectangle2D;
31
import java.awt.image.BufferedImage;
32

    
33
import org.gvsig.andami.PluginServices;
34
import org.gvsig.andami.messages.NotificationManager;
35
import org.gvsig.app.project.documents.view.ViewDocument;
36
import org.gvsig.fmap.dal.exception.ReadException;
37
import org.gvsig.fmap.geom.primitive.Envelope;
38
import org.gvsig.fmap.mapcontext.MapContext;
39
import org.gvsig.fmap.mapcontext.ViewPort;
40
import org.gvsig.tools.ToolsLocator;
41
import org.gvsig.tools.dynobject.DynStruct;
42
import org.gvsig.tools.persistence.PersistenceManager;
43
import org.gvsig.tools.persistence.PersistentState;
44
import org.gvsig.tools.persistence.exception.PersistenceException;
45

    
46
/**
47
 * FFrame para introducir el localizador de una vista en el Layout.
48
 * 
49
 * @author Vicente Caballero Navarro
50
 */
51
public class FFrameOverView extends FFrameView implements IFFrameViewDependence {
52

    
53
    public static final String PERSISTENCE_DEFINITION_NAME = "FFrameOverView";
54

    
55
    private static final String FFRAMEVIEWDEPENDENCE_FIELD =
56
        "fframeViewDependence";
57

    
58
    private MapContext assoc_map;
59
    private Envelope extent;
60
    private FFrameView fframeViewDependence;
61

    
62
    /**
63
     * DOCUMENT ME!
64
     * 
65
     * @param g
66
     *            DOCUMENT ME!
67
     * @param at
68
     *            DOCUMENT ME!
69
     * @param rv
70
     *            DOCUMENT ME!
71
     * @param imgBase
72
     *            DOCUMENT ME!
73
     */
74
    public void draw(Graphics2D g, AffineTransform at, Rectangle2D rv,
75
        BufferedImage imgBase) {
76
        try {
77
            if (getMapContext() != null
78
                && getMapContext().getFullEnvelope() != null) {
79
                getMapContext().getViewPort().setEnvelope(
80
                    getMapContext().getFullEnvelope());
81
            }
82
        } catch (ReadException e) {
83
            e.printStackTrace();
84
        }
85
        refresh();
86
        super.draw(g, at, rv, imgBase);
87
        Rectangle2D r = getBoundingBox(at);
88

    
89
        if ((assoc_map != null)
90
            && (assoc_map.getViewPort().getEnvelope() != null)
91
            && (getMapContext().getViewPort().getEnvelope() != null)) {
92

    
93
            ViewPort vp = getMapContext().getViewPort();
94
            ViewPort vpOrig = assoc_map.getViewPort();
95

    
96
            if (extent == null) {
97
                extent = vpOrig.getAdjustedEnvelope();
98
            }
99
            vp.refreshExtent();
100
            
101
            Image ov_img = new BufferedImage(
102
                vp.getImageWidth(),
103
                vp.getImageHeight(),
104
                BufferedImage.TYPE_INT_ARGB);
105
            Graphics ov_img_gra = ov_img.getGraphics();
106
            
107
            /*
108
             * Fill with transparent color
109
             */
110
            ov_img_gra.setColor(new Color(0, 0, 0, 0));
111
            ov_img_gra.fillRect(0, 0,
112
                vp.getImageWidth(), vp.getImageHeight());
113
            
114
            
115
            Rectangle2D aux =
116
                new Rectangle2D.Double(extent.getMinimum(0),
117
                    extent.getMinimum(1), extent.getLength(0),
118
                    extent.getLength(1));
119
            Rectangle2D extentPixels = vp.fromMapRectangle(aux);
120

    
121
            /*
122
             * Area of interest in pixels, inside ov_img image
123
             */
124
            extentPixels.setFrame(
125
                extentPixels.getMinX(), extentPixels.getMinY(),
126
                extentPixels.getWidth(), extentPixels.getHeight());
127

    
128
            /*
129
             * Fill (gray) and perimeter (red)
130
             */
131
            ov_img_gra.setColor(new Color(100, 100, 100, 100));
132
            ov_img_gra.fillRect((int) extentPixels.getMinX(),
133
                (int) extentPixels.getMinY(),
134
                (int) extentPixels.getWidth(),
135
                (int) extentPixels.getHeight());
136
            ov_img_gra.setColor(Color.red);
137
            ov_img_gra.drawRect((int) extentPixels.getMinX(),
138
                (int) extentPixels.getMinY(),
139
                (int) extentPixels.getWidth(),
140
                (int) extentPixels.getHeight());
141
            
142
            /*
143
             * Draw vertical, horizontal lines
144
             */
145
            ov_img_gra.setColor(Color.darkGray);
146
            int cx = (int) extentPixels.getCenterX(); 
147
            int cy = (int) extentPixels.getCenterY();
148
            int maxx = vp.getImageWidth();
149
            int maxy = vp.getImageHeight();
150
            ov_img_gra.drawLine(cx, 0, cx, maxy);
151
            ov_img_gra.drawLine(0, cy, maxx, cy);
152
            /*
153
             * Semi-transparent image is ready
154
             */
155

    
156
            /*
157
             * Save clip area
158
             */
159
            Rectangle2D clip = g.getClipBounds();
160
            g.setClip((int) r.getX(), (int) r.getY(), (int) r.getWidth(),
161
                (int) r.getHeight());
162

    
163
            /*
164
             * Paste resized image (with transparency)
165
             */
166
            ov_img = ov_img.getScaledInstance(
167
                (int) r.getWidth(),
168
                (int) r.getHeight(), Image.SCALE_SMOOTH);
169
            g.drawImage(ov_img, (int) r.getX(), (int) r.getY(), null);
170
            
171
            /*
172
             * Restore clip area
173
             */
174
            g.setClip((int) clip.getX(), (int) clip.getY(),
175
                (int) clip.getWidth(), (int) clip.getHeight());
176
            extent = null;
177
            // System.err.println("Dibujando FFrameOverView ...");
178
        }
179

    
180
    }
181

    
182
    /**
183
     * DOCUMENT ME!
184
     * 
185
     * @param g
186
     *            DOCUMENT ME!
187
     * @param at
188
     *            DOCUMENT ME!
189
     * @param rv
190
     *            DOCUMENT ME!
191
     * @param imgBase
192
     *            DOCUMENT ME!
193
     * 
194
     * @throws ReadDriverException
195
     */
196
    public void print(Graphics2D g, AffineTransform at) throws ReadException {
197
        draw(g, at, null, null);
198
    }
199

    
200
    /**
201
     * Inserta el ProjectView de donde obtener las propiedades de la vista a
202
     * mostrar.
203
     * 
204
     * @param v
205
     *            Modelo de la vista.
206
     */
207
    public void setView(ViewDocument v) {
208
        viewDocument = v;
209

    
210
        ViewPort vp = null;
211

    
212
        if (getMapContext() != null) {
213
            vp = getMapContext().getViewPort();
214
        } else {
215
            try {
216
                vp = (ViewPort) v.getMapContext().getViewPort().clone();
217
            } catch (CloneNotSupportedException e) {
218
                NotificationManager.addError("Excepci?n :", e);
219
            }
220
        }
221

    
222
        vp.setImageSize(new Dimension((int) getBoundingBox(null).width,
223
            (int) getBoundingBox(null).height));
224
        if (fframeViewDependence == null)
225
            return;
226
        assoc_map = fframeViewDependence.getMapContext();
227

    
228
        if (fframeViewDependence.getLinked()) {
229
            try {
230
                mapContext =
231
                    fframeViewDependence
232
                        .getView()
233
                        .getMapOverViewContext()
234
                        .createNewFMap(
235
                            (ViewPort) fframeViewDependence.getView()
236
                                .getMapOverViewContext().getViewPort().clone());
237
            } catch (CloneNotSupportedException e) {
238
                NotificationManager.addError("Excepci?n :", e);
239
            }
240
            mapContext.getViewPort().setImageSize(
241
                new Dimension((int) getBoundingBox(null).width,
242
                    (int) getBoundingBox(null).height));
243
            fframeViewDependence.getMapContext().getViewPort()
244
                .addViewPortListener(this);
245
            v.getMapContext().getViewPort().addViewPortListener(this);
246
            fframeViewDependence.getView().getMapOverViewContext()
247
                .addLayerListener(this);
248
        } else
249
            if (!fframeViewDependence.getLinked()) {
250
                mapContext =
251
                    fframeViewDependence.getView().getMapOverViewContext()
252
                        .cloneFMap();
253
                try {
254
                    mapContext.setViewPort((ViewPort) fframeViewDependence
255
                        .getView().getMapOverViewContext().getViewPort()
256
                        .clone());
257
                } catch (CloneNotSupportedException e) {
258
                    NotificationManager.addError("Excepci?n :", e);
259
                }
260
                mapContext.getViewPort().setImageSize(
261
                    new Dimension((int) getBoundingBox(null).width,
262
                        (int) getBoundingBox(null).height));
263
                fframeViewDependence.getMapContext().getViewPort()
264
                    .addViewPortListener(this);
265
                v.getMapContext().getViewPort().addViewPortListener(this);
266
                fframeViewDependence.getView().getMapOverViewContext()
267
                    .addLayerListener(this);
268
            }
269
    }
270

    
271
    /**
272
     * @see org.gvsig.app.project.documents.layout.fframes.IFFrame#getNameFFrame()
273
     */
274
    public String getNameFFrame() {
275
        return PluginServices.getText(this, "Localizador") + num;
276
    }
277

    
278
    public String getName() {
279
        return PERSISTENCE_DEFINITION_NAME;
280
    }
281

    
282
    public IFFrame clone() throws CloneNotSupportedException {
283
        FFrameOverView frame = (FFrameOverView) super.clone();
284
        frame.setSelected(this.getSelected() != IFFrame.NOSELECT);
285
        cloneActions(frame);
286
        return frame;
287
    }
288

    
289
    public void setFFrameDependence(IFFrame f) {
290
        fframeViewDependence = (FFrameView) f;
291
    }
292

    
293
    public IFFrame[] getFFrameDependence() {
294
        return new IFFrame[] { fframeViewDependence };
295
    }
296

    
297
    public void refreshDependence(IFFrame fant, IFFrame fnew) {
298
        if ((fframeViewDependence != null) && fframeViewDependence.equals(fant)) {
299
            fframeViewDependence = (FFrameView) fnew;
300
            assoc_map = fframeViewDependence.getMapContext();
301

    
302
            if (fframeViewDependence.getLinked()) {
303
                try {
304
                    mapContext =
305
                        fframeViewDependence
306
                            .getView()
307
                            .getMapOverViewContext()
308
                            .createNewFMap(
309
                                (ViewPort) fframeViewDependence.getView()
310
                                    .getMapOverViewContext().getViewPort()
311
                                    .clone());
312
                } catch (CloneNotSupportedException e) {
313
                    NotificationManager.addError("Excepci?n :", e);
314
                }
315
                mapContext.getViewPort().setImageSize(
316
                    new Dimension((int) getBoundingBox(null).width,
317
                        (int) getBoundingBox(null).height));
318
                fframeViewDependence.getMapContext().getViewPort()
319
                    .addViewPortListener(this);
320
                getView().getMapContext().getViewPort()
321
                    .addViewPortListener(this);
322
                fframeViewDependence.getView().getMapOverViewContext()
323
                    .addLayerListener(this);
324
            } else
325
                if (!fframeViewDependence.getLinked()) {
326
                    mapContext =
327
                        fframeViewDependence.getView().getMapOverViewContext()
328
                            .cloneFMap(); // (v.getMapContext().getViewPort().cloneViewPort());
329
                    try {
330
                        mapContext.setViewPort((ViewPort) fframeViewDependence
331
                            .getView().getMapOverViewContext().getViewPort()
332
                            .clone());
333
                    } catch (CloneNotSupportedException e) {
334
                        NotificationManager.addError("Excepci?n :", e);
335
                    }
336
                    mapContext.getViewPort().setImageSize(
337
                        new Dimension((int) getBoundingBox(null).width,
338
                            (int) getBoundingBox(null).height));
339
                    fframeViewDependence.getMapContext().getViewPort()
340
                        .addViewPortListener(this);
341
                    getView().getMapContext().getViewPort()
342
                        .addViewPortListener(this);
343
                    fframeViewDependence.getView().getMapOverViewContext()
344
                        .addLayerListener(this);
345
                }
346
        }
347

    
348
    }
349

    
350
    public static void registerPersistent() {
351
        PersistenceManager manager = ToolsLocator.getPersistenceManager();
352
        if (manager.getDefinition(PERSISTENCE_DEFINITION_NAME) == null) {
353
            DynStruct definition =
354
                manager.addDefinition(FFrameOverView.class,
355
                    PERSISTENCE_DEFINITION_NAME,
356
                    "FFrameOverView persistence definition", null, null);
357

    
358
            definition.extend(manager
359
                .getDefinition(FFrameView.PERSISTENCE_DEFINITION_NAME));
360

    
361
            definition.addDynFieldObject(FFRAMEVIEWDEPENDENCE_FIELD)
362
                .setClassOfValue(FFrameView.class);
363
        }
364
    }
365

    
366
    @Override
367
    public void loadFromState(PersistentState state)
368
        throws PersistenceException {
369
        super.loadFromState(state);
370
        fframeViewDependence =
371
            (FFrameView) state.get(FFRAMEVIEWDEPENDENCE_FIELD);
372
        
373
        /*
374
         * force refreshment of other fields
375
         */
376
        this.setView(viewDocument);
377
    }
378

    
379
    @Override
380
    public void saveToState(PersistentState state) throws PersistenceException {
381
        super.saveToState(state);
382
        state.set(FFRAMEVIEWDEPENDENCE_FIELD, fframeViewDependence);
383
    }
384
}