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 @ 1752

History | View | Annotate | Download (9.32 KB)

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