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 / ViewControl.java @ 1752
History | View | Annotate | Download (24.5 KB)
1 | 1479 | nbrodin | /* gvSIG. Geographic Information System of the Valencian Government
|
---|---|---|---|
2 | 1475 | nbrodin | *
|
3 | 1479 | nbrodin | * Copyright (C) 2007-2008 Infrastructures and Transports Department
|
4 | * of the Valencian Government (CIT)
|
||
5 | 1475 | 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 | 1475 | nbrodin | */
|
22 | package org.gvsig.raster.georeferencing.swing.impl.view; |
||
23 | |||
24 | import java.awt.BorderLayout; |
||
25 | import java.awt.GridBagConstraints; |
||
26 | import java.awt.GridBagLayout; |
||
27 | import java.awt.Insets; |
||
28 | import java.awt.event.ActionEvent; |
||
29 | import java.awt.event.ActionListener; |
||
30 | import java.awt.geom.Point2D; |
||
31 | import java.awt.geom.Rectangle2D; |
||
32 | import java.awt.image.BufferedImage; |
||
33 | import java.util.ArrayList; |
||
34 | import java.util.List; |
||
35 | |||
36 | import javax.swing.JButton; |
||
37 | import javax.swing.JPanel; |
||
38 | import javax.swing.JToggleButton; |
||
39 | |||
40 | import org.gvsig.andami.IconThemeHelper; |
||
41 | import org.gvsig.i18n.Messages; |
||
42 | 1728 | nbrodin | import org.gvsig.raster.georeferencing.swing.GeoreferencingSwingLibrary; |
43 | 1475 | nbrodin | import org.gvsig.raster.georeferencing.swing.exception.InvalidRequestException; |
44 | import org.gvsig.raster.georeferencing.swing.impl.GeoreferencingSwingImplLibrary; |
||
45 | import org.gvsig.raster.georeferencing.swing.impl.layer.ZoomCursorGraphicLayer; |
||
46 | import org.gvsig.raster.georeferencing.swing.impl.tool.BaseViewTool; |
||
47 | import org.gvsig.raster.georeferencing.swing.impl.tool.PanTool; |
||
48 | import org.gvsig.raster.georeferencing.swing.impl.tool.ZoomRectangleTool; |
||
49 | 1719 | nbrodin | import org.gvsig.raster.georeferencing.swing.view.GeoreferencingView; |
50 | 1712 | nbrodin | import org.gvsig.raster.georeferencing.swing.view.IViewRequestManager; |
51 | 1475 | nbrodin | import org.gvsig.raster.georeferencing.swing.view.IGraphicLayer; |
52 | import org.gvsig.raster.georeferencing.swing.view.ToolEvent; |
||
53 | import org.gvsig.raster.georeferencing.swing.view.ToolListener; |
||
54 | import org.gvsig.raster.georeferencing.swing.view.ViewEvent; |
||
55 | import org.gvsig.raster.georeferencing.swing.view.ViewListener; |
||
56 | |||
57 | /**
|
||
58 | * <P>
|
||
59 | * Control de zoom. Muestra una imagen contenida en un buffer con controles de aumento
|
||
60 | * y disminuci?n del zoom de la misma.
|
||
61 | * </P><P>
|
||
62 | * El visualizador mostrar? el buffer de datos pasado en <code>setDrawParams</code>.
|
||
63 | * En esta llamada asignamos tambi?n el Extent del ?rea de datos, tama?o de pixel y punto
|
||
64 | * del buffer que coincidir? con el centro del control de zoom. De esta forma la imagen
|
||
65 | * visualizada se centra sobre este punto. En caso de no tener informaci?n geogr?fica del
|
||
66 | * buffer de datos a visualizar el Extent coincidir? con su tama?o en p?xeles y el tama?o
|
||
67 | * de pixel ser? de 1. El punto donde queramos centrar en este caso se dar? tambi?n en
|
||
68 | * coordenadas pixel.
|
||
69 | * </P><P>
|
||
70 | * Hay dos usos posibles en este control al accionar el bot?n de zoom: el primero de ellos, en
|
||
71 | * caso de que no haya ning?n listener del control de zoom registrado. En este caso se
|
||
72 | * aplicar? un escalado sobre los datos del buffer pasado por par?metro. En el caso de que
|
||
73 | * haya un listener registrado (IExtensionBuffer) no se aplicar? un escalado sobre el buffer
|
||
74 | * sino que se aplicar? una escala de 1.0 y se ejecutar? el m?todo request del interfaz
|
||
75 | * registrado para que el cliente reciba notificaci?n del nuevo extent.
|
||
76 | * </P>
|
||
77 | * <P>
|
||
78 | * En la inicializaci?n podemos solicitar que los controles de zoom est?n a la izquierda,
|
||
79 | * a la derecha o no esten.
|
||
80 | * </p>
|
||
81 | *
|
||
82 | * 21/12/2007
|
||
83 | * @author Nacho Brodin nachobrodin@gmail.com
|
||
84 | */
|
||
85 | public class ViewControl extends JPanel implements ActionListener, ToolListener { |
||
86 | private static final long serialVersionUID = 1L; |
||
87 | //Lista de controles
|
||
88 | public static final int ZOOM_INCREASE = 0; |
||
89 | public static final int ZOOM_DECREASE = 1; |
||
90 | public static final int SELECT_ZOOM_AREA = 2; |
||
91 | public static final int FULL_VIEW = 3; |
||
92 | public static final int PREV_ZOOM = 4; |
||
93 | public static final int PAN = 5; |
||
94 | public static final int LOCATOR = 6; |
||
95 | |||
96 | public static final int RIGHT_CONTROL = 1; |
||
97 | public static final int LEFT_CONTROL = 2; |
||
98 | public static final int NOCONTROL = 0; |
||
99 | |||
100 | private final double SCALE = 0.5; |
||
101 | |||
102 | 1728 | nbrodin | private int controlsPosition; |
103 | 1475 | nbrodin | private CanvasZone canvas = null; |
104 | private JPanel buttons = null; |
||
105 | private JButton bZoomMas = null; |
||
106 | private JButton bZoomMenos = null; |
||
107 | private JToggleButton bSelectZoomArea = null; |
||
108 | private JToggleButton bMove = null; |
||
109 | private JButton bFullView = null; |
||
110 | private JButton bPrevZoom = null; |
||
111 | private JButton bCenterLocator = null; |
||
112 | private double stepScale = 2; |
||
113 | 1719 | nbrodin | private IViewRequestManager extReq = null; |
114 | 1475 | nbrodin | private ViewRecord zoomRecord = null; |
115 | private List<BaseViewTool> toolList = null; |
||
116 | private ViewListener viewListener = null; |
||
117 | private ViewEvent viewEvent = null; |
||
118 | |||
119 | /**
|
||
120 | * Constructor. Crea el panel y asigna el lado donde se crear?n los botones
|
||
121 | * @param right true para los botones a derecha y false para la izquierda
|
||
122 | */
|
||
123 | 1719 | nbrodin | public ViewControl(int control, GeoreferencingView parentView) { |
124 | 1728 | nbrodin | this.controlsPosition = control;
|
125 | 1475 | nbrodin | toolList = new ArrayList<BaseViewTool>(); |
126 | |||
127 | init(); |
||
128 | } |
||
129 | |||
130 | /**
|
||
131 | * Asigna el listener de eventos de la vista
|
||
132 | * @param listener
|
||
133 | */
|
||
134 | public void setViewListener(ViewListener listener) { |
||
135 | this.viewListener = listener;
|
||
136 | viewEvent = new ViewEvent(this); |
||
137 | getCanvas().setViewListener(viewListener); |
||
138 | } |
||
139 | |||
140 | /**
|
||
141 | * A?ade una tool a la vista de zoom
|
||
142 | * @param tool
|
||
143 | */
|
||
144 | public void addTool(BaseViewTool tool) { |
||
145 | if(!toolList.contains(tool))
|
||
146 | toolList.add(tool); |
||
147 | } |
||
148 | |||
149 | /**
|
||
150 | * A?ade una tool a la vista de zoom
|
||
151 | * @param tool
|
||
152 | */
|
||
153 | public void replaceTool(BaseViewTool tool) { |
||
154 | for (int i = 0; i < toolList.size(); i++) { |
||
155 | if(toolList.get(i).getClass().isInstance(tool)) {
|
||
156 | toolList.remove(i); |
||
157 | break;
|
||
158 | } |
||
159 | toolList.add(tool); |
||
160 | } |
||
161 | } |
||
162 | |||
163 | /**
|
||
164 | * Obtiene la tool seleccionada
|
||
165 | * @return
|
||
166 | */
|
||
167 | public BaseViewTool getToolSelected() {
|
||
168 | 1492 | nbrodin | return getCanvas().getSelectedTool();
|
169 | 1475 | nbrodin | } |
170 | |||
171 | /**
|
||
172 | * Selecciona una herramienta a partir de su clase. Si el argumento es null
|
||
173 | * elimina cualquier herramienta seleccionada.
|
||
174 | * @param tool
|
||
175 | */
|
||
176 | 1728 | nbrodin | /*public void selectTool(Class<?> tool, boolean select) {
|
177 | 1475 | nbrodin | //Si tool es null se desactivan todas y ponemos la seleccionada en el canvas a null
|
178 | if(tool == null) {
|
||
179 | for (int i = 0; i < toolList.size(); i++)
|
||
180 | ((BaseViewTool)toolList.get(i)).setActive(false);
|
||
181 | 1492 | nbrodin | getCanvas().setSelectedTool(null);
|
182 | 1475 | nbrodin | return;
|
183 | }
|
||
184 | |||
185 | //Si seleccionamos una esta se activa, se asigna al canvas y las otras se desactivan
|
||
186 | if(select) {
|
||
187 | for (int i = 0; i < toolList.size(); i++) {
|
||
188 | if(tool.isInstance(toolList.get(i))) {
|
||
189 | ((BaseViewTool)toolList.get(i)).setActive(true);
|
||
190 | 1492 | nbrodin | getCanvas().setSelectedTool((BaseViewTool)toolList.get(i));
|
191 | 1475 | nbrodin | if(viewListener != null)
|
192 | viewListener.addingTool(viewEvent);
|
||
193 | } else
|
||
194 | ((BaseViewTool)toolList.get(i)).setActive(false);
|
||
195 | }
|
||
196 | return;
|
||
197 | }
|
||
198 | //Si quitamos una esta se desactiva y si es la del canvas se quita tambi?n
|
||
199 | for (int i = 0; i < toolList.size(); i++) {
|
||
200 | if(tool.isInstance(toolList.get(i))) {
|
||
201 | ((BaseViewTool)toolList.get(i)).setActive(false);
|
||
202 | 1492 | nbrodin | if(tool.isInstance(getCanvas().getSelectedTool()))
|
203 | getCanvas().setSelectedTool(null);
|
||
204 | 1475 | nbrodin | }
|
205 | }
|
||
206 | 1728 | nbrodin | }*/
|
207 | |||
208 | public void enableTool(int tool) { |
||
209 | if(tool < 0) { |
||
210 | disableAllTools(); |
||
211 | return;
|
||
212 | } |
||
213 | |||
214 | for (int i = 0; i < toolList.size(); i++) { |
||
215 | if(toolList.get(i).getToolType() == tool) {
|
||
216 | ((BaseViewTool)toolList.get(i)).setActive(true);
|
||
217 | getCanvas().setSelectedTool((BaseViewTool)toolList.get(i)); |
||
218 | if(viewListener != null) |
||
219 | viewListener.addingTool(viewEvent); |
||
220 | } |
||
221 | } |
||
222 | return;
|
||
223 | 1475 | nbrodin | } |
224 | 1728 | nbrodin | |
225 | 1475 | nbrodin | /**
|
226 | * Selecciona una herramienta a partir de su clase deseleccionando cualquier
|
||
227 | * otra que estuviera activa. Si el argumento es null
|
||
228 | * elimina cualquier herramienta seleccionada.
|
||
229 | * @param tool
|
||
230 | */
|
||
231 | public void selectUniqueTool(Class<?> tool) { |
||
232 | if(tool == null) { |
||
233 | for (int i = 0; i < toolList.size(); i++) |
||
234 | ((BaseViewTool)toolList.get(i)).setActive(false);
|
||
235 | 1492 | nbrodin | getCanvas().setSelectedTool(null);
|
236 | 1475 | nbrodin | return;
|
237 | } |
||
238 | for (int i = 0; i < toolList.size(); i++) { |
||
239 | if(tool.isInstance(toolList.get(i))) {
|
||
240 | ((BaseViewTool)toolList.get(i)).setActive(true);
|
||
241 | 1492 | nbrodin | getCanvas().setSelectedTool((BaseViewTool)toolList.get(i)); |
242 | 1475 | nbrodin | if(viewListener != null) |
243 | viewListener.addingTool(viewEvent); |
||
244 | } else
|
||
245 | ((BaseViewTool)toolList.get(i)).setActive(false);
|
||
246 | } |
||
247 | } |
||
248 | |||
249 | /**
|
||
250 | * Registra un listener a la tool especificada por el par?metro de la llamada.
|
||
251 | * @param tool Clase de la tool a la que queremos registrar el listener
|
||
252 | * @return true si se ha registrado con ?xito y false si no se ha hecho
|
||
253 | */
|
||
254 | public boolean registerToolListener(Class<?> tool, ToolListener listener) { |
||
255 | if(tool == null) |
||
256 | return false; |
||
257 | for (int i = 0; i < toolList.size(); i++) { |
||
258 | if(tool.isInstance(toolList.get(i))) {
|
||
259 | ((BaseViewTool)toolList.get(i)).addToolListener(listener); |
||
260 | return true; |
||
261 | } |
||
262 | } |
||
263 | return false; |
||
264 | } |
||
265 | |||
266 | /**
|
||
267 | * Desactiva las herramientas temporalmente. Guarda el estado en el que estaban
|
||
268 | * para restaurarlo cuando se invoque a awake
|
||
269 | */
|
||
270 | public void sleepTools() { |
||
271 | for (int i = 0; i < toolList.size(); i++) |
||
272 | ((BaseViewTool)toolList.get(i)).sleep(); |
||
273 | } |
||
274 | |||
275 | 1728 | nbrodin | public void disableAllTools() { |
276 | for (int i = 0; i < toolList.size(); i++) { |
||
277 | ((BaseViewTool)toolList.get(i)).setActive(false);
|
||
278 | } |
||
279 | getBMove().setSelected(false);
|
||
280 | getBSelectZoomArea().setSelected(false);
|
||
281 | getCanvas().setSelectedTool(null);
|
||
282 | } |
||
283 | |||
284 | 1475 | nbrodin | /**
|
285 | 1728 | nbrodin | * Disables a tool in this view
|
286 | * @param enable
|
||
287 | */
|
||
288 | public void disableTool(int tool) { |
||
289 | for (int i = 0; i < toolList.size(); i++) { |
||
290 | if(toolList.get(i).getToolType() == tool) {
|
||
291 | ((BaseViewTool)toolList.get(i)).setActive(false);
|
||
292 | } |
||
293 | } |
||
294 | } |
||
295 | |||
296 | /**
|
||
297 | 1475 | nbrodin | * Recupera el estado de activaci?n que ten?a antes de la ?ltima invocaci?n
|
298 | * de sleep
|
||
299 | */
|
||
300 | public void awakeTools() { |
||
301 | for (int i = 0; i < toolList.size(); i++) |
||
302 | ((BaseViewTool)toolList.get(i)).awake(); |
||
303 | } |
||
304 | |||
305 | /**
|
||
306 | * Inicializaci?n de los componetes
|
||
307 | */
|
||
308 | private void init() { |
||
309 | BorderLayout layout = new BorderLayout(); |
||
310 | setLayout(layout); |
||
311 | |||
312 | 1728 | nbrodin | if(controlsPosition == LEFT_CONTROL)
|
313 | 1475 | nbrodin | add(getButtonsPanel(), BorderLayout.WEST);
|
314 | 1728 | nbrodin | if(controlsPosition == RIGHT_CONTROL)
|
315 | 1475 | nbrodin | add(getButtonsPanel(), BorderLayout.EAST);
|
316 | |||
317 | add(getCanvas(), BorderLayout.CENTER);
|
||
318 | } |
||
319 | |||
320 | /**
|
||
321 | * Oculta el bot?n indicado en el par?metro
|
||
322 | * @param b Constante definida en ZoomControl
|
||
323 | */
|
||
324 | public void hideButton(int b) { |
||
325 | switch (b) {
|
||
326 | case ZOOM_INCREASE: this.getBZoomMas().setVisible(false); |
||
327 | break;
|
||
328 | case ZOOM_DECREASE: this.getBZoomMenos().setVisible(false); |
||
329 | break;
|
||
330 | case SELECT_ZOOM_AREA: this.getBSelectZoomArea().setVisible(false); |
||
331 | break;
|
||
332 | case FULL_VIEW: this.getBFullView().setVisible(false); |
||
333 | break;
|
||
334 | case PREV_ZOOM: this.getBPrevZoom().setVisible(false); |
||
335 | break;
|
||
336 | case PAN: this.getBMove().setVisible(false); |
||
337 | break;
|
||
338 | case LOCATOR: this.getBCenterLocator().setVisible(false); |
||
339 | break;
|
||
340 | default:
|
||
341 | break;
|
||
342 | } |
||
343 | } |
||
344 | |||
345 | /**
|
||
346 | * Muestra el bot?n indicado en el par?metro
|
||
347 | * @param b Constante definida en ZoomControl
|
||
348 | */
|
||
349 | public void showButton(int b) { |
||
350 | switch (b) {
|
||
351 | case ZOOM_INCREASE: this.getBZoomMas().setVisible(true); |
||
352 | break;
|
||
353 | case ZOOM_DECREASE: this.getBZoomMenos().setVisible(true); |
||
354 | break;
|
||
355 | case SELECT_ZOOM_AREA: this.getBSelectZoomArea().setVisible(true); |
||
356 | break;
|
||
357 | case FULL_VIEW: this.getBFullView().setVisible(true); |
||
358 | break;
|
||
359 | case PREV_ZOOM: this.getBPrevZoom().setVisible(true); |
||
360 | break;
|
||
361 | case PAN: this.getBMove().setVisible(true); |
||
362 | break;
|
||
363 | case LOCATOR: this.getBCenterLocator().setVisible(true); |
||
364 | break;
|
||
365 | default:
|
||
366 | break;
|
||
367 | } |
||
368 | } |
||
369 | |||
370 | /**
|
||
371 | * Asigna una capa gr?fica
|
||
372 | * @param layer IGraphicLayer
|
||
373 | */
|
||
374 | public void setGraphicLayer(IGraphicLayer layer) { |
||
375 | 1492 | nbrodin | getCanvas().setGraphicLayer(layer); |
376 | 1475 | nbrodin | } |
377 | |||
378 | /**
|
||
379 | * Obtiene el panel de dibujado del zoom
|
||
380 | * @return Canvas Zone
|
||
381 | */
|
||
382 | public CanvasZone getCanvas() {
|
||
383 | if(canvas == null) { |
||
384 | canvas = new CanvasZone();
|
||
385 | canvas.setViewListener(viewListener); |
||
386 | canvas.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED)); |
||
387 | } |
||
388 | return canvas;
|
||
389 | } |
||
390 | |||
391 | /**
|
||
392 | * Obtiene el panel con los botones de zoom
|
||
393 | * @return
|
||
394 | */
|
||
395 | public JPanel getButtonsPanel() { |
||
396 | if(buttons == null) { |
||
397 | buttons = new JPanel(); |
||
398 | GridBagLayout l = new GridBagLayout(); |
||
399 | GridBagConstraints gbc = new GridBagConstraints(); |
||
400 | gbc.insets = new Insets(5, 0, 3, 3); |
||
401 | buttons.setLayout(l); |
||
402 | |||
403 | buttons.add(getBZoomMas(), gbc); |
||
404 | gbc.gridy = 1;
|
||
405 | buttons.add(getBZoomMenos(), gbc); |
||
406 | gbc.gridy = 2;
|
||
407 | buttons.add(getBSelectZoomArea(), gbc); |
||
408 | gbc.gridy = 3;
|
||
409 | buttons.add(getBFullView(), gbc); |
||
410 | gbc.gridy = 4;
|
||
411 | buttons.add(getBPrevZoom(), gbc); |
||
412 | gbc.gridy = 5;
|
||
413 | buttons.add(getBMove(), gbc); |
||
414 | gbc.gridy = 6;
|
||
415 | buttons.add(getBCenterLocator(), gbc); |
||
416 | } |
||
417 | return buttons;
|
||
418 | } |
||
419 | |||
420 | /**
|
||
421 | * Crea el bot?n de zoom m?s
|
||
422 | * @return JButton
|
||
423 | */
|
||
424 | public JButton getBZoomMas() { |
||
425 | if (bZoomMas == null) { |
||
426 | bZoomMas = new JButton(); |
||
427 | bZoomMas.setToolTipText(Messages.getText("zoom_mas"));
|
||
428 | bZoomMas.setPreferredSize(new java.awt.Dimension(25,25)); |
||
429 | try{
|
||
430 | bZoomMas.setIcon(IconThemeHelper.getImageIcon("increase-icon"));
|
||
431 | }catch(NullPointerException e){ |
||
432 | //Sin icono
|
||
433 | } |
||
434 | bZoomMas.addActionListener(this);
|
||
435 | } |
||
436 | return bZoomMas;
|
||
437 | } |
||
438 | |||
439 | /**
|
||
440 | * Crea el bot?n de centrar el localizador
|
||
441 | * @return JButton
|
||
442 | */
|
||
443 | public JButton getBCenterLocator() { |
||
444 | if (bCenterLocator == null) { |
||
445 | bCenterLocator = new JButton(); |
||
446 | bCenterLocator.setToolTipText(Messages.getText("center_locator"));
|
||
447 | bCenterLocator.setPreferredSize(new java.awt.Dimension(25,25)); |
||
448 | try{
|
||
449 | bCenterLocator.setIcon(IconThemeHelper.getImageIcon("centerlocator-icon"));
|
||
450 | }catch(NullPointerException e){ |
||
451 | //Sin icono
|
||
452 | } |
||
453 | bCenterLocator.addActionListener(this);
|
||
454 | } |
||
455 | return bCenterLocator;
|
||
456 | } |
||
457 | |||
458 | /**
|
||
459 | * Crea el bot?n de zoom menos
|
||
460 | * @return JButton
|
||
461 | */
|
||
462 | public JButton getBZoomMenos() { |
||
463 | if (bZoomMenos == null) { |
||
464 | bZoomMenos = new JButton(); |
||
465 | bZoomMenos.setToolTipText(Messages.getText("zoom_menos"));
|
||
466 | bZoomMenos.setPreferredSize(new java.awt.Dimension(25,25)); |
||
467 | try{
|
||
468 | bZoomMenos.setIcon(IconThemeHelper.getImageIcon("decrease-icon"));
|
||
469 | }catch(NullPointerException e){ |
||
470 | //Sin icono
|
||
471 | } |
||
472 | bZoomMenos.addActionListener(this);
|
||
473 | } |
||
474 | return bZoomMenos;
|
||
475 | } |
||
476 | |||
477 | /**
|
||
478 | * Crea el bot?n de selecci?n de zoom por ?rea
|
||
479 | * @return JButton
|
||
480 | */
|
||
481 | public JToggleButton getBSelectZoomArea() { |
||
482 | if (bSelectZoomArea == null) { |
||
483 | bSelectZoomArea = new JToggleButton(); |
||
484 | bSelectZoomArea.setToolTipText(Messages.getText("select_zoom_area"));
|
||
485 | bSelectZoomArea.setPreferredSize(new java.awt.Dimension(25,25)); |
||
486 | try{
|
||
487 | bSelectZoomArea.setIcon(IconThemeHelper.getImageIcon("selectzoomarea-icon"));
|
||
488 | }catch(NullPointerException e){ |
||
489 | //Sin icono
|
||
490 | } |
||
491 | bSelectZoomArea.addActionListener(this);
|
||
492 | } |
||
493 | return bSelectZoomArea;
|
||
494 | } |
||
495 | |||
496 | /**
|
||
497 | * Crea el bot?n de desplazamiento de imagen
|
||
498 | * @return JToggleButton
|
||
499 | */
|
||
500 | public JToggleButton getBMove() { |
||
501 | if (bMove == null) { |
||
502 | bMove = new JToggleButton(); |
||
503 | bMove.setToolTipText(Messages.getText("move_image"));
|
||
504 | bMove.setPreferredSize(new java.awt.Dimension(25,25)); |
||
505 | try{
|
||
506 | bMove.setIcon(IconThemeHelper.getImageIcon("hand-icon"));
|
||
507 | }catch(NullPointerException e){ |
||
508 | //Sin icono
|
||
509 | } |
||
510 | bMove.addActionListener(this);
|
||
511 | } |
||
512 | return bMove;
|
||
513 | } |
||
514 | |||
515 | /**
|
||
516 | * Crea el bot?n de zoom m?s
|
||
517 | * @return
|
||
518 | */
|
||
519 | public JButton getBPrevZoom() { |
||
520 | if (bPrevZoom == null) { |
||
521 | bPrevZoom = new JButton(); |
||
522 | bPrevZoom.setToolTipText(Messages.getText("prev_zoom"));
|
||
523 | bPrevZoom.setPreferredSize(new java.awt.Dimension(25,25)); |
||
524 | try{
|
||
525 | bPrevZoom.setIcon(IconThemeHelper.getImageIcon("prevzoom-icon"));
|
||
526 | }catch(NullPointerException e){ |
||
527 | //Sin icono
|
||
528 | } |
||
529 | bPrevZoom.addActionListener(this);
|
||
530 | } |
||
531 | return bPrevZoom;
|
||
532 | } |
||
533 | |||
534 | /**
|
||
535 | * Crea el bot?n de zoom completo. El zoom completo inicializa al primer zoom
|
||
536 | * que recibi? en caso de que no se est? usando un IExtensionRequest, ya que no tendr?a conocimiento
|
||
537 | * del tama?o total de capa, sino solo del buffer que tiene en ese momento. En caso de usar un
|
||
538 | * IExtensionRequest entonces se har? la petici?n correspondiente al interfaz.
|
||
539 | * @return JButton
|
||
540 | */
|
||
541 | public JButton getBFullView() { |
||
542 | if (bFullView == null) { |
||
543 | bFullView = new JButton(); |
||
544 | bFullView.setToolTipText(Messages.getText("full_view"));
|
||
545 | bFullView.setPreferredSize(new java.awt.Dimension(25,25)); |
||
546 | try{
|
||
547 | bFullView.setIcon(IconThemeHelper.getImageIcon("fullview-icon"));
|
||
548 | }catch(NullPointerException e){ |
||
549 | //Sin icono
|
||
550 | } |
||
551 | bFullView.addActionListener(this);
|
||
552 | } |
||
553 | return bFullView;
|
||
554 | } |
||
555 | |||
556 | /**
|
||
557 | * Asigna los par?metros de dibujado
|
||
558 | * @param img Buffer con un ?rea de datos
|
||
559 | * @param ext Rectangle2D del ?rea de datos dada
|
||
560 | * @param pixelSize Tama?o de pixel
|
||
561 | * @param center Punto del ?rea de datos donde se quiere centrar el dibujado del buffer
|
||
562 | */
|
||
563 | public void setDrawParams(BufferedImage img, Rectangle2D ext, double pixelSize, Point2D center) { |
||
564 | getZoomRecord().setRequest(ext); |
||
565 | 1492 | nbrodin | getCanvas().setDrawParams(img, ext, pixelSize, center) ; |
566 | 1475 | nbrodin | } |
567 | |||
568 | /**
|
||
569 | * Asigna un nuevo centro de visualizaci?n. Vuelve a realizar la petici?n
|
||
570 | * @param center
|
||
571 | */
|
||
572 | public void setCenter(Point2D center) { |
||
573 | 1492 | nbrodin | Rectangle2D ext = getCanvas().getExtent();
|
574 | 1475 | nbrodin | double diffX = center.getX() - ext.getCenterX();
|
575 | double diffY = center.getY() - ext.getCenterY();
|
||
576 | ext.setRect(ext.getX() + diffX, ext.getY() + diffY, ext.getWidth(), ext.getHeight()); |
||
577 | try {
|
||
578 | 1492 | nbrodin | getCanvas().setForceRequest(true);
|
579 | 1491 | nbrodin | if(extReq != null) |
580 | extReq.request(ext); |
||
581 | 1475 | nbrodin | } catch (InvalidRequestException e) {
|
582 | GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", this); |
||
583 | } |
||
584 | } |
||
585 | |||
586 | /**
|
||
587 | * Registra un objeto IExtensionRequest para que no se aplique un escalado sobre
|
||
588 | * el buffer pasado por par?metro. Alternativamente a la aplicaci?n de este escalado
|
||
589 | * se ejecutar? el m?todo request del interfaz para que el cliente pueda pasar un
|
||
590 | * nuevo buffer con escala 1:1 y con la extensi?n correspondiente al zoom, Es decir, se
|
||
591 | * deja en manos del cliente la aplicaci?n del zoom.
|
||
592 | * @param er
|
||
593 | */
|
||
594 | 1712 | nbrodin | public void setExtensionRequest(IViewRequestManager er) { |
595 | 1475 | nbrodin | this.extReq = er;
|
596 | } |
||
597 | |||
598 | /**
|
||
599 | * Obtiene el objeto IExtensionRequest
|
||
600 | * @param er
|
||
601 | */
|
||
602 | 1712 | nbrodin | public IViewRequestManager getExtensionRequest() {
|
603 | 1475 | nbrodin | return extReq;
|
604 | } |
||
605 | |||
606 | /**
|
||
607 | * Obtiene el historico de zooms
|
||
608 | * @return ZoomRecord
|
||
609 | */
|
||
610 | public ViewRecord getZoomRecord() {
|
||
611 | if(zoomRecord == null) { |
||
612 | zoomRecord = new ViewRecord();
|
||
613 | //zoomRecord.setRequest(new Integer(FULL_VIEW));
|
||
614 | } |
||
615 | return zoomRecord;
|
||
616 | } |
||
617 | |||
618 | /**
|
||
619 | * Eventos de los botones zoom m?s y zoom menos.
|
||
620 | */
|
||
621 | public void actionPerformed(ActionEvent e) { |
||
622 | //Centrar el localizador
|
||
623 | if(e.getSource() == bCenterLocator) {
|
||
624 | 1492 | nbrodin | List<IGraphicLayer> graphicLayers = getCanvas().getGraphicLayers();
|
625 | 1475 | nbrodin | for (int i = 0; i < graphicLayers.size(); i++) { |
626 | if(graphicLayers.get(i) instanceof ZoomCursorGraphicLayer) { |
||
627 | 1492 | nbrodin | ((ZoomCursorGraphicLayer)graphicLayers.get(i)).setCursorPosition(getCanvas().getWidth() / 2, canvas.getHeight() / 2); |
628 | 1475 | nbrodin | ((ZoomCursorGraphicLayer)graphicLayers.get(i)).resetCursorSize(); |
629 | } |
||
630 | } |
||
631 | } |
||
632 | |||
633 | if(extReq == null) { |
||
634 | if(e.getSource() == bZoomMas)
|
||
635 | 1492 | nbrodin | getCanvas().setZoom(canvas.getZoom() * stepScale); |
636 | 1475 | nbrodin | |
637 | if(e.getSource() == bZoomMenos)
|
||
638 | 1492 | nbrodin | getCanvas().setZoom(canvas.getZoom() / stepScale); |
639 | 1475 | nbrodin | |
640 | if(e.getSource() == bFullView)
|
||
641 | 1492 | nbrodin | getCanvas().setZoom(1);
|
642 | 1475 | nbrodin | |
643 | } else {
|
||
644 | double width = 0, height = 0; |
||
645 | 1492 | nbrodin | getCanvas().setZoom(1);
|
646 | 1475 | nbrodin | |
647 | //Zoom Todo
|
||
648 | if(e.getSource() == bFullView) {
|
||
649 | try {
|
||
650 | extReq.fullExtent(); |
||
651 | } catch (InvalidRequestException e1) {
|
||
652 | GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", this); |
||
653 | } |
||
654 | return;
|
||
655 | } |
||
656 | |||
657 | //Zoom Anterior
|
||
658 | if(e.getSource() == bPrevZoom) {
|
||
659 | Object request = getZoomRecord().getRequest();
|
||
660 | if(request != null) { |
||
661 | if(request instanceof Rectangle2D) { |
||
662 | try {
|
||
663 | extReq.request((Rectangle2D)request);
|
||
664 | } catch (InvalidRequestException e1) {
|
||
665 | GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", this); |
||
666 | } |
||
667 | } |
||
668 | if(request instanceof Integer && ((Integer)request).intValue() == FULL_VIEW) { |
||
669 | try {
|
||
670 | extReq.fullExtent(); |
||
671 | } catch (InvalidRequestException e1) {
|
||
672 | GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", this); |
||
673 | } |
||
674 | } |
||
675 | getZoomRecord().getRequest(); //El que hemos metido al hacer zoom previo no sirve por lo que hay que sacarlo
|
||
676 | } |
||
677 | return;
|
||
678 | } |
||
679 | |||
680 | 1492 | nbrodin | width = getCanvas().getCanvasExtent().getWidth(); |
681 | height = getCanvas().getCanvasExtent().getHeight(); |
||
682 | 1475 | nbrodin | |
683 | //Desplazamiento
|
||
684 | if(e.getSource() == bMove) {
|
||
685 | 1728 | nbrodin | if(getBMove().isSelected()) {
|
686 | for (int i = 0; i < toolList.size(); i++) |
||
687 | ((BaseViewTool)toolList.get(i)).setActive(false);
|
||
688 | getBSelectZoomArea().setSelected(false);
|
||
689 | enableTool(GeoreferencingSwingLibrary.PAN_TOOL); |
||
690 | } else
|
||
691 | disableTool(GeoreferencingSwingLibrary.PAN_TOOL); |
||
692 | 1475 | nbrodin | } |
693 | |||
694 | //Zoom por selecci?n de ?rea
|
||
695 | if(e.getSource() == bSelectZoomArea) {
|
||
696 | 1728 | nbrodin | if(getBSelectZoomArea().isSelected()) {
|
697 | for (int i = 0; i < toolList.size(); i++) |
||
698 | ((BaseViewTool)toolList.get(i)).setActive(false);
|
||
699 | getBMove().setSelected(false);
|
||
700 | enableTool(GeoreferencingSwingLibrary.ZOOM_RECTANGLE_TOOL); |
||
701 | } else
|
||
702 | disableTool(GeoreferencingSwingLibrary.ZOOM_RECTANGLE_TOOL); |
||
703 | 1475 | nbrodin | } |
704 | |||
705 | //Zoom m?s
|
||
706 | if(e.getSource() == bZoomMas) {
|
||
707 | 1492 | nbrodin | width = getCanvas().getCanvasExtent().getWidth() * SCALE; |
708 | height = getCanvas().getCanvasExtent().getHeight() * SCALE; |
||
709 | 1475 | nbrodin | } |
710 | |||
711 | //Zoom menos
|
||
712 | if(e.getSource() == bZoomMenos) {
|
||
713 | 1492 | nbrodin | width = getCanvas().getCanvasExtent().getWidth() / SCALE; |
714 | height = getCanvas().getCanvasExtent().getHeight() / SCALE; |
||
715 | 1475 | nbrodin | } |
716 | //C?digo com?n a bZoomMas y bZoomMenos
|
||
717 | 1492 | nbrodin | double x = getCanvas().getCenter().getX() - (width / 2); |
718 | double y = getCanvas().getCenter().getY() - (height / 2); |
||
719 | 1475 | nbrodin | Rectangle2D request = new Rectangle2D.Double(x, y, width, height); |
720 | try {
|
||
721 | extReq.request(request); |
||
722 | } catch (InvalidRequestException e1) {
|
||
723 | GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", this); |
||
724 | } |
||
725 | } |
||
726 | } |
||
727 | |||
728 | /**
|
||
729 | * Recarga la vista con los par?metros de tama?o y
|
||
730 | * extensi?n actuales
|
||
731 | */
|
||
732 | public void reload() { |
||
733 | 1492 | nbrodin | double width = getCanvas().getCanvasExtent().getWidth();
|
734 | double height = getCanvas().getCanvasExtent().getHeight();
|
||
735 | double x = getCanvas().getCenter().getX() - (width / 2); |
||
736 | double y = getCanvas().getCenter().getY() - (height / 2); |
||
737 | 1475 | nbrodin | Rectangle2D request = new Rectangle2D.Double(x, y, width, height); |
738 | try {
|
||
739 | 1492 | nbrodin | getCanvas().setForceRequest(true);
|
740 | 1491 | nbrodin | if(extReq != null) |
741 | extReq.request(request); |
||
742 | 1475 | nbrodin | } catch (InvalidRequestException e1) {
|
743 | GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", this); |
||
744 | } |
||
745 | } |
||
746 | |||
747 | /**
|
||
748 | * Obtiene el ancho del canvas
|
||
749 | * @return
|
||
750 | */
|
||
751 | public int getCanvasWith() { |
||
752 | 1492 | nbrodin | return getCanvas().getVisibleRect().width;
|
753 | 1475 | nbrodin | } |
754 | |||
755 | /**
|
||
756 | * Obtiene el alto del canvas
|
||
757 | * @return
|
||
758 | */
|
||
759 | public int getCanvasHeight() { |
||
760 | 1492 | nbrodin | return getCanvas().getVisibleRect().height;
|
761 | 1475 | nbrodin | } |
762 | |||
763 | /**
|
||
764 | * Evento de finalizaci?n de la tool que maneja el viewControl y de la capa con el
|
||
765 | * cursor gr?fico que controla el ?rea de la miniimagen asociada
|
||
766 | */
|
||
767 | public void endAction(ToolEvent ev) { |
||
768 | if(ev.getSource() instanceof ZoomRectangleTool || ev.getSource() instanceof PanTool) { |
||
769 | 1734 | nbrodin | if(getCanvas().getSelectedTool().getResult() instanceof Rectangle2D) { |
770 | Rectangle2D extent = (Rectangle2D)getCanvas().getSelectedTool().getResult(); |
||
771 | try {
|
||
772 | if(extReq != null) |
||
773 | extReq.request(extent); |
||
774 | } catch (InvalidRequestException e1) {
|
||
775 | GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", this); |
||
776 | } |
||
777 | 1475 | nbrodin | } |
778 | } |
||
779 | } |
||
780 | |||
781 | /*
|
||
782 | * (non-Javadoc)
|
||
783 | * @see org.gvsig.rastertools.georeferencing.ui.zoom.tools.ToolListener#activeTool(org.gvsig.rastertools.georeferencing.ui.zoom.tools.ToolEvent)
|
||
784 | */
|
||
785 | public void onTool(ToolEvent ev) {} |
||
786 | |||
787 | /*
|
||
788 | * (non-Javadoc)
|
||
789 | * @see org.gvsig.rastertools.georeferencing.ui.zoom.tools.ToolListener#offTool(org.gvsig.rastertools.georeferencing.ui.zoom.tools.ToolEvent)
|
||
790 | */
|
||
791 | public void offTool(ToolEvent ev) {} |
||
792 | |||
793 | } |