Statistics
| Revision:

gvsig-raster / org.gvsig.raster.georeferencing / trunk / org.gvsig.raster.georeferencing / org.gvsig.raster.georeferencing.swing / org.gvsig.raster.georeferencing.swing.impl / src / main / java / org / gvsig / raster / georeferencing / swing / impl / view / ViewPanelImpl.java @ 1725

History | View | Annotate | Download (9.12 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.raster.georeferencing.swing.impl.view;
23

    
24
import java.awt.BorderLayout;
25
import java.awt.event.ComponentEvent;
26
import java.awt.event.ComponentListener;
27
import java.awt.geom.Point2D;
28
import java.awt.geom.Rectangle2D;
29
import java.awt.image.BufferedImage;
30

    
31
import org.gvsig.raster.georeferencing.swing.impl.layer.ZoomCursorGraphicLayer;
32
import org.gvsig.raster.georeferencing.swing.view.IViewRequestManager;
33
import org.gvsig.raster.georeferencing.swing.view.IGraphicLayer;
34
import org.gvsig.raster.georeferencing.swing.view.ToolListener;
35
import org.gvsig.raster.georeferencing.swing.view.ViewListener;
36
import org.slf4j.LoggerFactory;
37

    
38
/**
39
 * Panel que contiene el panel con la vista a georreferenciar
40
 * 
41
 * 22/12/2007
42
 * @author Nacho Brodin (nachobrodin@gmail.com)
43
 */
44
public class ViewPanelImpl extends BaseZoomView implements ComponentListener {
45
        private static final long         serialVersionUID          = 1L;
46
        private ZoomCursorGraphicLayer    zoomCursorGraphic         = null;
47
        private ToolListener              zoomCursorGraphicListener = null;
48
        private boolean                   rightSideButtons          = true;
49
        
50
        /**
51
         * Constructor.
52
         * Crea la composici?n de controles de zoom.
53
         * @param posX Posici?n en X
54
         * @param posY Posici?n en Y
55
         * @param w Tama?o en pixeles de ancho
56
         * @param h Tama?o en pixeles de alto
57
         */
58
        public ViewPanelImpl(ToolListener zoomCursorGraphicListener, boolean rightSideButtons) {
59
                this.zoomCursorGraphicListener = zoomCursorGraphicListener;
60
                this.rightSideButtons = rightSideButtons;
61
                init();
62
        }
63
        
64
        /**
65
         * Inicializaci?n de los componentes gr?ficos
66
         */
67
        private void init() {
68
                setLayout(new BorderLayout());
69
                add(getControl(), BorderLayout.CENTER);
70
                getZoomCursorGraphicLayer();
71
        }
72
        
73
        /**
74
         * Asigna el listener de eventos de la vista
75
         * @param listener
76
         */
77
        public void setViewListener(ViewListener listener) {
78
                getControl().setViewListener(listener);
79
        }
80
        
81
        
82
        /**
83
         * Asigna el valor para el flag minxMaxyUL. Este flag informa de que la esquina 
84
         * superior izquierda corresponde con el valor de m?nimo X y m?ximo Y. En caso 
85
         * de ser false esta esquina ser?a de m?nimo X y m?nimo Y.
86
         * @param v
87
         */
88
        public void setMinxMaxyUL(boolean v) {
89
                getCanvas().setMinxMaxyUL(v);
90
        }
91
        
92
        public boolean getMinxMaxyUL() {
93
                return getCanvas().getMinxMaxyUL();
94
        }
95
        
96
        /**
97
         * Asigna un nuevo centro de visualizaci?n. Vuelve a realizar la petici?n
98
         * @param center
99
         */
100
        public void setCenter(Point2D center) {
101
                //TODO: Calcular las coordenadas del cursor gr?fico
102
                getControl().setCenter(center);
103
        }
104
        
105
        /**
106
         * Asigna los par?metros de dibujado para el raster
107
         * @param img Buffer con un ?rea de datos
108
         * @param ext Rectangle2D del ?rea de datos dada 
109
         * @param pixelSize Tama?o de pixel
110
         * @param center Punto del ?rea de datos donde se quiere centrar el dibujado del buffer
111
         */
112
        public void setDrawParams(BufferedImage img, Rectangle2D ext, double pixelSize, Point2D center) {
113
                getControl().setDrawParams(img, ext, pixelSize, center) ;
114
        }
115
        
116
        /**
117
         * Obtiene el panel de control de zoom de coordenadas pixel
118
         * @return
119
         */
120
        public ViewControl getControl() {
121
                if(zoomPixelControl == null) {
122
                        if(rightSideButtons)
123
                                zoomPixelControl = new ViewControl(ViewControl.RIGHT_CONTROL, this);
124
                        else 
125
                                zoomPixelControl = new ViewControl(ViewControl.LEFT_CONTROL, this);
126
                        zoomPixelControl.addComponentListener(this);
127
                }
128
                return zoomPixelControl;
129
        }
130
        
131
        /**
132
         * Registra un objeto IExtensionRequest para que no se aplique un escalado sobre
133
         * el buffer pasado por par?metro. Alternativamente a la aplicaci?n de este escalado
134
         * se ejecutar? el m?todo request del interfaz para que el cliente pueda pasar un 
135
         * nuevo buffer con escala 1:1 y con la extensi?n correspondiente al zoom.
136
         * @param er
137
         */
138
        public void setRequestListener(IViewRequestManager er) {
139
                zoomPixelControl.setExtensionRequest(er);
140
        }
141
        
142
        /*
143
         * (non-Javadoc)
144
         * @see org.gvsig.rastertools.georeferencing.view.BaseZoomView#addGraphicLayer(org.gvsig.rastertools.georeferencing.ui.zoom.IGraphicLayer)
145
         */
146
        public void addGraphicLayer(IGraphicLayer graphicLayer) {
147
                getControl().setGraphicLayer(graphicLayer);
148
        }
149
                
150
        /**
151
         * Obtiene el la capa gr?fica con la ventana de zoom
152
         * @return
153
         */
154
        public ZoomCursorGraphicLayer getZoomCursorGraphicLayer() {
155
                if(zoomCursorGraphic == null) {
156
                        zoomCursorGraphic = new ZoomCursorGraphicLayer(getWidth() / 2, getHeight() / 2, 12, 6, zoomCursorGraphicListener);
157
                        zoomCursorGraphic.setCanvas(getControl().getCanvas());
158
                        getControl().setGraphicLayer(zoomCursorGraphic);
159
                }
160
                return zoomCursorGraphic;
161
        }
162
        
163
        /**
164
         * Asigna la posici?n del cursor en el canvas
165
         * @param x Posici?n en X
166
         * @param y Posici?n en Y
167
         */
168
        public void setCursorPosition(int x, int y) {
169
                getZoomCursorGraphicLayer().setCursorPosition(x, y);
170
        }
171
        
172
        /**
173
         * Asigna el tama?o del cursor en pixeles del canvas
174
         * @param w Ancho
175
         * @param h Alto
176
         */
177
        public void setCursorSize(int w, int h) {
178
                getZoomCursorGraphicLayer().setCursorSize(w, h);
179
        }
180
                
181
        /**
182
         * Activa o desactiva el mostrado de informaci?n
183
         * @param showInfo
184
         */
185
        public void setShowInfo(boolean show) {
186
                zoomPixelControl.getCanvas().setShowInfo(show);
187
        }
188
                
189
        /**
190
         * Obtiene las coordenadas de la ventana de zoom. Las coordenadas son devueltas
191
         * en referencia a las coordenadas del mundo. 
192
         * @return
193
         */
194
        public Rectangle2D getCursorWorldCoordinates() {
195
                Rectangle2D r = getZoomCursorGraphicLayer().getCursorViewCoordinates();
196
                Point2D p1 = zoomPixelControl.getCanvas().viewCoordsToWorld(new Point2D.Double(r.getX(), r.getY()));
197
                Point2D p2 = zoomPixelControl.getCanvas().viewCoordsToWorld(new Point2D.Double(r.getX() + r.getWidth(), r.getY() + r.getHeight()));
198
                return new Rectangle2D.Double(        Math.min(p1.getX(), p2.getX()), 
199
                                                                                Math.max(p1.getY(), p2.getY()), 
200
                                                                                Math.abs(p2.getX() - p1.getX()), 
201
                                                                                Math.abs(p2.getY() - p1.getY()));
202
        }
203
        
204
        /**
205
         * Obtiene las coordenadas de la ventana de zoom. Las coordenadas son devueltas
206
         * en referencia a las coordenadas del mundo. Esta llamada ajusta el tama?o de la ventana a la 
207
         * proporci?n pasada por par?metro. Es decir, si pasamos una proporci?n en la que el ancho es 3 veces 
208
         * mayor que el alto se ajustar? el zoom a esta proporci?n ya que presupone que la ventana de
209
         * destino del zoom va a tener esas proporciones.
210
         * @return
211
         */
212
        public Rectangle2D getCursorAdjustedWorldCoordinates(int wWindow, int hWindow) {
213
                Rectangle2D r = getZoomCursorGraphicLayer().getCursorViewCoordinates();
214
                double x = r.getX(), y = r.getY(), w = r.getWidth(), h = r.getHeight();
215
                
216
                try {
217
                        if(wWindow < hWindow) { //Si la de destino es m?s alta que ancha
218
                                if((r.getWidth() / r.getHeight()) >= (wWindow / hWindow)) {
219
                                        h = (hWindow * r.getWidth()) / wWindow;
220
                                        y = r.getCenterY() - (h / 2);
221
                                } else {
222
                                        w = (wWindow * r.getHeight()) / hWindow;
223
                                        x = r.getCenterX() - (w / 2);
224
                                }
225
                        } else { //Si la de destino es m?s ancha que alta
226
                                if((r.getWidth() / r.getHeight()) <= (wWindow / hWindow)) {
227
                                        w = (wWindow * r.getHeight()) / hWindow;
228
                                        x = r.getCenterX() - (w / 2);
229
                                } else {
230
                                        h = (hWindow * r.getWidth()) / wWindow;
231
                                        y = r.getCenterY() - (h / 2);
232
                                }
233
                        }
234
                }catch(ArithmeticException ex) {
235
                        LoggerFactory.getLogger(ViewPanelImpl.class).debug("Redimensi?n de las ventanas. La altura de estas es menor que cero", this, ex);
236
                        return r;
237
                }
238
                if(zoomPixelControl.getCanvas().getMinxMaxyUL())
239
                        r = new Rectangle2D.Double(x, y + h, w, h);
240
                else
241
                        r = new Rectangle2D.Double(x, y - h, w, h);
242
                Point2D p1 = zoomPixelControl.getCanvas().viewCoordsToWorld(new Point2D.Double(r.getX(), r.getY()));
243
                Point2D p2 = zoomPixelControl.getCanvas().viewCoordsToWorld(new Point2D.Double(r.getX() + r.getWidth(), r.getY() + r.getHeight()));
244
                return new Rectangle2D.Double(        Math.min(p1.getX(), p2.getX()), 
245
                                                                                Math.max(p1.getY(), p2.getY()), 
246
                                                                                Math.abs(p2.getX() - p1.getX()), 
247
                                                                                Math.abs(p2.getY() - p1.getY()));
248
        }
249
        
250
        /**
251
         * Obtiene el extent del canvas en coordenadas del mundo real
252
         * @return Rectangle2D
253
         */
254
        public Rectangle2D getViewExtent() {
255
                return zoomPixelControl.getCanvas().getExtent();
256
        }
257

    
258
        public void componentHidden(ComponentEvent e) {
259
        }
260

    
261
        public void componentMoved(ComponentEvent e) {
262
        }
263

    
264
        public void componentResized(ComponentEvent e) {
265
                zoomPixelControl.reload();
266
        }
267

    
268
        public void componentShown(ComponentEvent e) {
269
        }
270

    
271
}
272