Statistics
| Revision:

root / branches / v2_0_0_prep / extensions / extGeoreferencing / src / org / gvsig / georeferencing / view / ViewDialog.java @ 27098

History | View | Annotate | Download (9.98 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2007 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
package org.gvsig.georeferencing.view;
20

    
21
import java.awt.BorderLayout;
22
import java.awt.geom.Point2D;
23
import java.awt.image.BufferedImage;
24

    
25
import org.gvsig.fmap.geom.primitive.Envelope;
26
import org.gvsig.fmap.geom.util.UtilFunctions;
27
import org.gvsig.georeferencing.ui.zoom.IExtensionRequest;
28
import org.gvsig.georeferencing.ui.zoom.IGraphicLayer;
29
import org.gvsig.georeferencing.ui.zoom.ViewControl;
30
import org.gvsig.georeferencing.ui.zoom.ViewListener;
31
import org.gvsig.georeferencing.ui.zoom.layers.ZoomCursorGraphicLayer;
32
import org.gvsig.georeferencing.ui.zoom.tools.ToolListener;
33
import org.gvsig.raster.util.RasterToolsUtil;
34

    
35
import com.iver.andami.PluginServices;
36
import com.iver.andami.ui.mdiManager.IWindow;
37
import com.iver.andami.ui.mdiManager.WindowInfo;
38

    
39
/**
40
 * Panel que contiene el panel con la vista a georreferenciar
41
 *
42
 * 22/12/2007
43
 * @author Nacho Brodin (nachobrodin@gmail.com)
44
 */
45
public class ViewDialog extends BaseZoomView implements IWindow {
46
        private static final long         serialVersionUID = 1L;
47
        private ZoomCursorGraphicLayer    zoomCursorGraphic = null;
48
        private ToolListener              zoomCursorGraphicListener = null;
49
        private int                       w = 640;
50
        private int                       h = 100;
51
        private int                       posX = 0;
52
        private int                       posY = 0;
53

    
54
        /**
55
         * Constructor.
56
         * Crea la composici?n de controles de zoom.
57
         * @param posX Posici?n en X
58
         * @param posY Posici?n en Y
59
         * @param w Tama?o en pixeles de ancho
60
         * @param h Tama?o en pixeles de alto
61
         */
62
        public ViewDialog(int posX, int posY, int w, int h, ToolListener zoomCursorGraphicListener) {
63
                setPosition(posX, posY);
64
                setWindowsSize(w, h);
65
                this.zoomCursorGraphicListener = zoomCursorGraphicListener;
66
                init();
67
        }
68

    
69
        /**
70
         * Asigna el listener de eventos de la vista
71
         * @param listener
72
         */
73
        public void setViewListener(ViewListener listener) {
74
                getControl().setViewListener(listener);
75
        }
76

    
77
        /**
78
         * Asigna la posici?n de la ventana
79
         * @param posX Posici?n en X
80
         * @param posY Posici?n en Y
81
         */
82
        public void setPosition(int posX, int posY) {
83
                this.posX = posX;
84
                this.posY = posY;
85
        }
86

    
87
        /**
88
         * Asigna el tama?o de la ventana
89
         * @param w Tama?o en pixeles de ancho
90
         * @param h Tama?o en pixeles de alto
91
         */
92
        public void setWindowsSize(int w, int h) {
93
                this.w = w;
94
                this.h = h;
95
        }
96

    
97
        /**
98
         * Asigna el valor para el flag minxMaxyUL. Este flag informa de que la esquina
99
         * superior izquierda corresponde con el valor de m?nimo X y m?ximo Y. En caso
100
         * de ser false esta esquina ser?a de m?nimo X y m?nimo Y.
101
         * @param v
102
         */
103
        public void setMinxMaxyUL(boolean v) {
104
                getCanvas().setMinxMaxyUL(v);
105
        }
106

    
107
        /**
108
         * Asigna un nuevo centro de visualizaci?n. Vuelve a realizar la petici?n
109
         * @param center
110
         */
111
        public void setCenter(Point2D center) {
112
                //TODO: Calcular las coordenadas del cursor gr?fico
113
                getControl().setCenter(center);
114
        }
115

    
116
        /**
117
         * Inicializaci?n de los componentes gr?ficos
118
         */
119
        private void init() {
120
                setLayout(new BorderLayout());
121
                add(getControl(), BorderLayout.CENTER);
122
                getZoomCursorGraphicLayer();
123
        }
124

    
125
        /**
126
         * Asigna los par?metros de dibujado para el raster
127
         * @param img Buffer con un ?rea de datos
128
         * @param ext Rectangle2D del ?rea de datos dada
129
         * @param pixelSize Tama?o de pixel
130
         * @param center Punto del ?rea de datos donde se quiere centrar el dibujado del buffer
131
         */
132
        public void setDrawParams(BufferedImage img, Envelope ext, double pixelSize, Point2D center) {
133
                getControl().setDrawParams(img, ext, pixelSize, center) ;
134
        }
135

    
136
        /**
137
         * Obtiene el panel de control de zoom de coordenadas pixel
138
         * @return
139
         */
140
        public ViewControl getControl() {
141
                if(zoomPixelControl == null) {
142
                        zoomPixelControl = new ViewControl(ViewControl.RIGHT_CONTROL);
143
                }
144
                return zoomPixelControl;
145
        }
146

    
147
        /**
148
         * Registra un objeto IExtensionRequest para que no se aplique un escalado sobre
149
         * el buffer pasado por par?metro. Alternativamente a la aplicaci?n de este escalado
150
         * se ejecutar? el m?todo request del interfaz para que el cliente pueda pasar un
151
         * nuevo buffer con escala 1:1 y con la extensi?n correspondiente al zoom.
152
         * @param er
153
         */
154
        public void setExtensionRequest(IExtensionRequest er) {
155
                zoomPixelControl.setExtensionRequest(er);
156
        }
157

    
158
        /*
159
         * (non-Javadoc)
160
         * @see org.gvsig.rastertools.georeferencing.view.BaseZoomView#addGraphicLayer(org.gvsig.rastertools.georeferencing.ui.zoom.IGraphicLayer)
161
         */
162
        public void addGraphicLayer(IGraphicLayer graphicLayer) {
163
                getControl().setGraphicLayer(graphicLayer);
164
        }
165

    
166
        /**
167
         * Obtiene el la capa gr?fica con la ventana de zoom
168
         * @return
169
         */
170
        public ZoomCursorGraphicLayer getZoomCursorGraphicLayer() {
171
                if(zoomCursorGraphic == null) {
172
                        zoomCursorGraphic = new ZoomCursorGraphicLayer(w / 2, h / 2, 12, 6, zoomCursorGraphicListener);
173
                        zoomCursorGraphic.setCanvas(getControl().getCanvas());
174
                        getControl().setGraphicLayer(zoomCursorGraphic);
175
                }
176
                return zoomCursorGraphic;
177
        }
178

    
179
        /**
180
         * Asigna la posici?n del cursor en el canvas
181
         * @param x Posici?n en X
182
         * @param y Posici?n en Y
183
         */
184
        public void setCursorPosition(int x, int y) {
185
                getZoomCursorGraphicLayer().setCursorPosition(x, y);
186
        }
187

    
188
        /**
189
         * Asigna el tama?o del cursor en pixeles del canvas
190
         * @param w Ancho
191
         * @param h Alto
192
         */
193
        public void setCursorSize(int w, int h) {
194
                getZoomCursorGraphicLayer().setCursorSize(w, h);
195
        }
196

    
197
        /**
198
         * Activa o desactiva el mostrado de informaci?n
199
         * @param showInfo
200
         */
201
        public void setShowInfo(boolean show) {
202
                zoomPixelControl.getCanvas().setShowInfo(show);
203
        }
204

    
205
        /**
206
         * Obtiene las coordenadas de la ventana de zoom. Las coordenadas son devueltas
207
         * en referencia a las coordenadas del mundo.
208
         * @return
209
         */
210
        public Envelope getCursorWorldCoordinates() {
211
                Envelope r = getZoomCursorGraphicLayer().getCursorViewCoordinates();
212
                Point2D p1 = zoomPixelControl.getCanvas().viewCoordsToWorld(new Point2D.Double(r.getMinimum(0), r.getMinimum(1)));
213
                Point2D p2 = zoomPixelControl.getCanvas().viewCoordsToWorld(new Point2D.Double(r.getMinimum(0) + r.getLength(0), r.getMinimum(1) + r.getLength(1)));
214
                return UtilFunctions.createEnvelope(Math.min(p1.getX(), p2.getX()),
215
                                                                                Math.max(p1.getY(), p2.getY()),
216
                                                                                Math.min(p1.getX(), p2.getX()) + Math.abs(p2.getX() - p1.getX()),
217
                                                                                Math.max(p1.getY(), p2.getY()) + Math.abs(p2.getY() - p1.getY()));
218
        }
219

    
220
        /**
221
         * Obtiene las coordenadas de la ventana de zoom. Las coordenadas son devueltas
222
         * en referencia a las coordenadas del mundo. Esta llamada ajusta el tama?o de la ventana a la
223
         * proporci?n pasada por par?metro. Es decir, si pasamos una proporci?n en la que el ancho es 3 veces
224
         * mayor que el alto se ajustar? el zoom a esta proporci?n ya que presupone que la ventana de
225
         * destino del zoom va a tener esas proporciones.
226
         * @return
227
         */
228
        public Envelope getCursorAdjustedWorldCoordinates(int wWindow, int hWindow) {
229
                Envelope r = getZoomCursorGraphicLayer().getCursorViewCoordinates();
230
                double x = r.getMinimum(0), y = r.getMinimum(1), w = r.getLength(0), h = r.getLength(1);
231

    
232
                try {
233
                        if(wWindow < hWindow) { //Si la de destino es m?s alta que ancha
234
                                if((r.getLength(0) / r.getLength(1)) >= (wWindow / hWindow)) {
235
                                        h = (hWindow * r.getLength(0)) / wWindow;
236
                                        y = r.getCenter(1) - (h / 2);
237
                                } else {
238
                                        w = (wWindow * r.getLength(1)) / hWindow;
239
                                        x = r.getCenter(0) - (w / 2);
240
                                }
241
                        } else { //Si la de destino es m?s ancha que alta
242
                                if((r.getLength(0) / r.getLength(1)) <= (wWindow / hWindow)) {
243
                                        w = (wWindow * r.getLength(1)) / hWindow;
244
                                        x = r.getCenter(0) - (w / 2);
245
                                } else {
246
                                        h = (hWindow * r.getLength(0)) / wWindow;
247
                                        y = r.getCenter(1) - (h / 2);
248
                                }
249
                        }
250
                }catch(ArithmeticException ex) {
251
                        RasterToolsUtil.debug("Redimensi?n de las ventanas. La altura de estas es menor que cero", this, ex);
252
                        return r;
253
                }
254
                if(zoomPixelControl.getCanvas().getMinxMaxyUL()) {
255
                        r = UtilFunctions.createEnvelope(x, y + h, x + w, y + h + h);
256
                } else {
257
                        r = UtilFunctions.createEnvelope(x, y - h, x + w, y);
258
                }
259
                Point2D p1 = zoomPixelControl.getCanvas().viewCoordsToWorld(new Point2D.Double(r.getMinimum(0), r.getMinimum(1)));
260
                Point2D p2 = zoomPixelControl.getCanvas().viewCoordsToWorld(new Point2D.Double(r.getMinimum(0) + r.getLength(0), r.getMinimum(1) + r.getLength(1)));
261
                return UtilFunctions.createEnvelope(Math.min(p1.getX(), p2.getX()),
262
                                                                                Math.max(p1.getY(), p2.getY()),
263
                                                                                Math.min(p1.getX(), p2.getX()) + Math.abs(p2.getX() - p1.getX()),
264
                                                                                Math.max(p1.getY(), p2.getY()) + Math.abs(p2.getY() - p1.getY()));
265
        }
266

    
267
        /**
268
         * Obtiene el extent del canvas en coordenadas del mundo real
269
         * @return Envelope
270
         */
271
        public Envelope getViewEnvelope() {
272
                return zoomPixelControl.getCanvas().getEnvelope();
273
        }
274

    
275
        /*
276
         * (non-Javadoc)
277
         * @see com.iver.andami.ui.mdiManager.IWindow#getWindowInfo()
278
         */
279
        public WindowInfo getWindowInfo() {
280
                WindowInfo m_viewinfo = new WindowInfo(WindowInfo.MODELESSDIALOG | WindowInfo.RESIZABLE | WindowInfo.MAXIMIZABLE);
281
                //if (getClippingPanel().getFLayer() != null)
282
                        //m_viewinfo.setAdditionalInfo(getClippingPanel().getFLayer().getName());
283
                m_viewinfo.setTitle(PluginServices.getText(this, "view_panel"));
284
                m_viewinfo.setX(posX);
285
                m_viewinfo.setY(posY);
286
                m_viewinfo.setHeight(h);
287
                m_viewinfo.setWidth(w);
288
                return m_viewinfo;
289
        }
290

    
291
        public Object getWindowProfile(){
292
                return WindowInfo.TOOL_PROFILE;
293
        }
294
}
295