root / branches / v2_0_0_prep / extensions / extRasterTools-SE / src / org / gvsig / rastertools / vectorizacion / clip / ClipListener.java @ 31496
History | View | Annotate | Download (11.7 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.rastertools.vectorizacion.clip; |
20 |
|
21 |
import java.awt.Component; |
22 |
import java.awt.event.ActionEvent; |
23 |
import java.awt.event.ActionListener; |
24 |
import java.awt.geom.AffineTransform; |
25 |
import java.awt.geom.NoninvertibleTransformException; |
26 |
import java.awt.geom.Point2D; |
27 |
import java.util.ArrayList; |
28 |
|
29 |
import javax.swing.JOptionPane; |
30 |
import javax.swing.event.TableModelEvent; |
31 |
import javax.swing.event.TableModelListener; |
32 |
|
33 |
import org.gvsig.andami.PluginServices; |
34 |
import org.gvsig.andami.ui.mdiManager.IWindow; |
35 |
import org.gvsig.app.project.documents.view.gui.AbstractViewPanel; |
36 |
import org.gvsig.app.project.documents.view.gui.DefaultViewPanel; |
37 |
import org.gvsig.app.project.documents.view.toolListeners.StatusBarListener; |
38 |
import org.gvsig.fmap.mapcontrol.MapControl; |
39 |
import org.gvsig.fmap.mapcontrol.tools.Behavior.Behavior; |
40 |
import org.gvsig.fmap.mapcontrol.tools.Behavior.MouseMovementBehavior; |
41 |
import org.gvsig.fmap.mapcontrol.tools.Behavior.RectangleBehavior; |
42 |
import org.gvsig.fmap.raster.layers.FLyrRasterSE; |
43 |
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel; |
44 |
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent; |
45 |
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelListener; |
46 |
import org.gvsig.gui.beans.table.TableContainer; |
47 |
import org.gvsig.gui.beans.table.exceptions.NotInitializeException; |
48 |
import org.gvsig.raster.IProcessActions; |
49 |
import org.gvsig.raster.datastruct.Extent; |
50 |
import org.gvsig.raster.grid.GridException; |
51 |
import org.gvsig.raster.grid.filter.FilterTypeException; |
52 |
import org.gvsig.raster.grid.roi.ROI; |
53 |
import org.gvsig.raster.util.RasterToolsUtil; |
54 |
import org.gvsig.rastertools.roi.ui.ROIManagerDialog; |
55 |
import org.gvsig.rastertools.vectorizacion.clip.ui.ClipPanel; |
56 |
|
57 |
|
58 |
/**
|
59 |
* Clase para la gesti?n de eventos de los componentes gr?ficos del panel de preproceso
|
60 |
* de vectorizaci?n.
|
61 |
*
|
62 |
* 12/06/2008
|
63 |
* @author Nacho Brodin nachobrodin@gmail.com
|
64 |
*/
|
65 |
public class ClipListener implements ActionListener, TableModelListener, ButtonsPanelListener, IProcessActions { |
66 |
private FLyrRasterSE lyr = null; |
67 |
private ClipData data = null; |
68 |
private ClipPanel panel = null; |
69 |
private ClipProcess process = null; |
70 |
|
71 |
|
72 |
/**
|
73 |
* Constructor. Asigna los listeners a los componentes
|
74 |
* @param prepPanel
|
75 |
*/
|
76 |
public ClipListener(FLyrRasterSE lyr, ClipPanel prepPanel, ClipData data) {
|
77 |
this.lyr = lyr;
|
78 |
setDataView(prepPanel); |
79 |
setData(data); |
80 |
} |
81 |
|
82 |
/**
|
83 |
* Acciones de inicializaci?n del componente
|
84 |
*/
|
85 |
private void initActions() { |
86 |
assignFullExtent(); |
87 |
loadROIs(); |
88 |
} |
89 |
|
90 |
/**
|
91 |
* Asigna la vista de datos. En este caso es el panel de preprocesado de la vectorizaci?n
|
92 |
* @param prepPanel
|
93 |
*/
|
94 |
private void setDataView(ClipPanel prepPanel) { |
95 |
this.panel = prepPanel;
|
96 |
process = new ClipProcess(this); |
97 |
process.setSourceLayer(lyr); |
98 |
|
99 |
panel.getSelectionAreaPanel().getROI().addActionListener(this);
|
100 |
panel.getSelectionAreaPanel().getButtonBarContainer().getButton(0).addActionListener(this); |
101 |
panel.getSelectionAreaPanel().getButtonBarContainer().getButton(1).addActionListener(this); |
102 |
panel.getSelectionAreaPanel().getROISelector().addActionListener(this);
|
103 |
panel.getSelectionAreaPanel().getAreaSelector().addActionListener(this);
|
104 |
panel.getSelectionAreaPanel().getVectorizeAllBBox().addActionListener(this);
|
105 |
panel.getSelectionAreaPanel().getVectorizeOnlyInside().addActionListener(this);
|
106 |
panel.getSelectionAreaPanel().getTableContainer().getModel().addTableModelListener(this);
|
107 |
panel.getComboOutputScale().addActionListener(this);
|
108 |
} |
109 |
|
110 |
/**
|
111 |
* Asigna el modelo de datos de los interfaces
|
112 |
* @param coorData
|
113 |
* @param grayConvData
|
114 |
*/
|
115 |
public void setData(ClipData coorData) { |
116 |
this.data = coorData;
|
117 |
initActions(); |
118 |
} |
119 |
|
120 |
/*
|
121 |
* (non-Javadoc)
|
122 |
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
|
123 |
*/
|
124 |
public void actionPerformed(ActionEvent e) { |
125 |
if(!panel.isEnableValueChangedEvent())
|
126 |
return;
|
127 |
//Seleccionar extent completo
|
128 |
if(e.getSource() == panel.getSelectionAreaPanel().getButtonBarContainer().getButton(0)) { |
129 |
assignFullExtent(); |
130 |
} |
131 |
|
132 |
//Seleccionar ?rea desde la vista
|
133 |
if(e.getSource() == panel.getSelectionAreaPanel().getButtonBarContainer().getButton(1)) { |
134 |
selectToolButton(); |
135 |
} |
136 |
|
137 |
//Cuadro de seleccionar ROIS
|
138 |
if(e.getSource() == panel.getSelectionAreaPanel().getROI()) {
|
139 |
ROIManagerDialog roiManagerDialog = new ROIManagerDialog(500,250); |
140 |
|
141 |
try {
|
142 |
roiManagerDialog.setLayer(lyr); |
143 |
roiManagerDialog.getROIsManagerPanel().addButtonPressedListener(this);
|
144 |
} catch (GridException ex) {
|
145 |
} |
146 |
RasterToolsUtil.addWindow(roiManagerDialog); |
147 |
} |
148 |
|
149 |
if (e.getSource().equals(panel.getSelectionAreaPanel().getROISelector()) ||
|
150 |
e.getSource().equals(panel.getSelectionAreaPanel().getAreaSelector()) || |
151 |
e.getSource().equals(panel.getSelectionAreaPanel().getVectorizeAllBBox()) || |
152 |
e.getSource().equals(panel.getSelectionAreaPanel().getVectorizeOnlyInside())){ |
153 |
addROIs(); |
154 |
} |
155 |
|
156 |
//Cambio de escala
|
157 |
if(e.getSource() == panel.getComboOutputScale()) {
|
158 |
data.setScaleSelected(panel.getComboOutputScale().getSelectedIndex()); |
159 |
} |
160 |
|
161 |
} |
162 |
|
163 |
/**
|
164 |
* Asigna la capa fuente para el proceso
|
165 |
* @param lyr
|
166 |
*/
|
167 |
public void setProcessSource(FLyrRasterSE lyr) { |
168 |
if(process != null) |
169 |
process.setSourceLayer(lyr); |
170 |
} |
171 |
|
172 |
/**
|
173 |
* Asigna el interfaz para que el proceso ejectute las acciones de finalizaci?n
|
174 |
* al acabar.
|
175 |
* @param endActions
|
176 |
*/
|
177 |
public void setProcessActions(IProcessActions endActions) { |
178 |
if(process != null) |
179 |
process.setProcessActions(endActions); |
180 |
} |
181 |
|
182 |
/**
|
183 |
* Acciones realizadas cuando se acepta la operaci?n
|
184 |
*/
|
185 |
public void apply() { |
186 |
try {
|
187 |
process.clip(data); |
188 |
} catch (FilterTypeException e) {
|
189 |
RasterToolsUtil.messageBoxError("error_cutting", null, e); |
190 |
} |
191 |
} |
192 |
|
193 |
/**
|
194 |
* Gesti?n de los eventos de los botones de la ventana de selecci?n de ROIs
|
195 |
*/
|
196 |
public void actionButtonPressed(ButtonsPanelEvent e) { |
197 |
//Al pulsar Aceptar o Aplicar se ejecuta el aceptar del panel
|
198 |
if (e.getButton() == ButtonsPanel.BUTTON_APPLY || e.getButton() == ButtonsPanel.BUTTON_ACCEPT) {
|
199 |
loadROIs(); |
200 |
} |
201 |
} |
202 |
|
203 |
/**
|
204 |
* Asigna el extent completo a los cuadros de texto donde se introducen las coordenadas
|
205 |
* reales y p?xel.
|
206 |
*/
|
207 |
private void assignFullExtent() { |
208 |
Point2D ulPx = new Point2D.Double(0, 0); |
209 |
Point2D lrPx = new Point2D.Double(lyr.getPxWidth(), lyr.getPxHeight()); |
210 |
|
211 |
//Convertimos a coordenadas reales
|
212 |
Point2D ulWc = new Point2D.Double(); |
213 |
Point2D lrWc = new Point2D.Double(); |
214 |
lyr.getAffineTransform().transform(ulPx, ulWc); |
215 |
lyr.getAffineTransform().transform(lrPx, lrWc); |
216 |
|
217 |
data.setCoorRealFromDouble(ulWc.getX(), ulWc.getY(), lrWc.getX(), lrWc.getY()); |
218 |
data.setCoorPixelFromDouble(ulPx.getX(), ulPx.getY(), lrPx.getX() - 1, lrPx.getY() - 1); |
219 |
} |
220 |
|
221 |
/**
|
222 |
* Acciones que se realizan para seleccionar la tool CutRaster
|
223 |
*/
|
224 |
public void selectToolButton() { |
225 |
// seleccionamos la vista de gvSIG
|
226 |
IWindow[] list = PluginServices.getMDIManager().getAllWindows();
|
227 |
AbstractViewPanel view = null;
|
228 |
for (int i = 0; i < list.length; i++) { |
229 |
if(list[i] instanceof DefaultViewPanel) |
230 |
view = (AbstractViewPanel)list[i]; |
231 |
} |
232 |
if (view == null) |
233 |
return;
|
234 |
|
235 |
MapControl m_MapControl = view.getMapControl(); |
236 |
|
237 |
// Listener de eventos de movimiento que pone las coordenadas del rat?n en
|
238 |
// la barra de estado
|
239 |
StatusBarListener sbl = new StatusBarListener(m_MapControl);
|
240 |
|
241 |
// Cortar Raster
|
242 |
ClipMouseViewListener clippingMouseViewListener = new ClipMouseViewListener(m_MapControl, data, lyr);
|
243 |
m_MapControl.addBehavior("cutRaster", new Behavior[] { |
244 |
new RectangleBehavior(clippingMouseViewListener), new MouseMovementBehavior(sbl) |
245 |
} |
246 |
); |
247 |
|
248 |
m_MapControl.setTool("cutRaster");
|
249 |
} |
250 |
|
251 |
/**
|
252 |
* Carga las ROIS de la capa sobre la tabla
|
253 |
* @param layer
|
254 |
*/
|
255 |
public void loadROIs() { |
256 |
if (lyr == null) |
257 |
return;
|
258 |
TableContainer table = panel.getSelectionAreaPanel().getTableContainer(); |
259 |
try {
|
260 |
table.removeAllRows(); |
261 |
} catch (NotInitializeException e1) {
|
262 |
return;
|
263 |
} |
264 |
ArrayList roisArray = lyr.getRois();
|
265 |
if (roisArray != null) { |
266 |
for (int i = 0; i < roisArray.size(); i++) { |
267 |
ROI roi = (ROI) roisArray.get(i); |
268 |
|
269 |
Object row[] = {"", "", ""}; |
270 |
|
271 |
boolean active = false; |
272 |
|
273 |
row[0] = new Boolean(active); |
274 |
row[1] = roi.getName();
|
275 |
row[2] = new Integer(i); |
276 |
try {
|
277 |
table.addRow(row); |
278 |
} catch (NotInitializeException e) {
|
279 |
} |
280 |
} |
281 |
} |
282 |
} |
283 |
|
284 |
/**
|
285 |
* Obtiene la lista de ROIs seleccionadas
|
286 |
* @return ArrayList con la lista de ROIs
|
287 |
*/
|
288 |
private ArrayList getSelectedROIs() { |
289 |
if (lyr == null) |
290 |
return null; |
291 |
|
292 |
ArrayList roisArray = lyr.getRois();
|
293 |
ArrayList selected = new ArrayList(); |
294 |
TableContainer table = panel.getSelectionAreaPanel().getTableContainer(); |
295 |
if (roisArray != null) { |
296 |
for (int i = 0; i < roisArray.size(); i++) { |
297 |
try {
|
298 |
if (((Boolean) table.getModel().getValueAt(i, 0)).booleanValue()) { |
299 |
selected.add(roisArray.get(i)); |
300 |
} |
301 |
} catch (ArrayIndexOutOfBoundsException e) { |
302 |
//Entra aqu? si se han a?adido ROIs con el cuadro abierto. Pasamos de hacer nada
|
303 |
} |
304 |
} |
305 |
} |
306 |
return selected;
|
307 |
} |
308 |
|
309 |
/**
|
310 |
* Asigna el extent completo a los cuadros de texto donde se introducen las coordenadas
|
311 |
* reales y p?xel.
|
312 |
*/
|
313 |
private void assignROISExtent() { |
314 |
ArrayList roiList = getSelectedROIs();
|
315 |
Extent ext = null;
|
316 |
if(roiList != null && roiList.size() > 0) { |
317 |
ext = ROI.getROIsMaximunExtent(roiList); |
318 |
} else
|
319 |
assignFullExtent(); |
320 |
|
321 |
if(ext == null) |
322 |
return;
|
323 |
|
324 |
AffineTransform at = lyr.getAffineTransform();
|
325 |
Point2D ulWc = new Point2D.Double(ext.minX(), ext.maxY()); |
326 |
Point2D lrWc = new Point2D.Double(ext.maxX(), ext.minY()); |
327 |
|
328 |
ulWc = lyr.adjustWorldRequest(ulWc); |
329 |
lrWc = lyr.adjustWorldRequest(lrWc); |
330 |
|
331 |
Point2D ulPx = new Point2D.Double(); |
332 |
Point2D lrPx = new Point2D.Double(); |
333 |
|
334 |
try {
|
335 |
at.inverseTransform(ulWc, ulPx); |
336 |
at.inverseTransform(lrWc, lrPx); |
337 |
} catch (NoninvertibleTransformException e) { |
338 |
JOptionPane.showMessageDialog((Component) PluginServices.getMainFrame(), PluginServices.getText(this, "coordenadas_erroneas")); |
339 |
return;
|
340 |
} |
341 |
|
342 |
data.setCoorRealFromDouble(ulWc.getX(), ulWc.getY(), lrWc.getX(), lrWc.getY()); |
343 |
data.setCoorPixelFromDouble(ulPx.getX(), ulPx.getY(), lrPx.getX() - 1, lrPx.getY() - 1); |
344 |
} |
345 |
|
346 |
|
347 |
/**
|
348 |
* A?ade o elimina el par?metro selectedrois en funci?n del estado de los
|
349 |
* controles del panel
|
350 |
*/
|
351 |
private void addROIs(){ |
352 |
if (panel.getSelectionAreaPanel().getAreaSelector().isSelected()){
|
353 |
data.setSelectedROIs(null);
|
354 |
}else{
|
355 |
if(panel.getSelectionAreaPanel().getVectorizeOnlyInside().isSelected()){
|
356 |
data.setSelectedROIs(getSelectedROIs()); |
357 |
} else {
|
358 |
data.setSelectedROIs(null);
|
359 |
} |
360 |
} |
361 |
} |
362 |
|
363 |
|
364 |
|
365 |
/**
|
366 |
* Gesti?n de eventos producidos en la tabla con la lista de ROIs
|
367 |
* @param e
|
368 |
*/
|
369 |
public void tableChanged(TableModelEvent e) { |
370 |
assignROISExtent(); |
371 |
addROIs(); |
372 |
} |
373 |
|
374 |
/*
|
375 |
* (non-Javadoc)
|
376 |
* @see org.gvsig.raster.IProcessActions#interrupted()
|
377 |
*/
|
378 |
public void interrupted() { |
379 |
} |
380 |
|
381 |
public void end(Object param) { |
382 |
} |
383 |
|
384 |
} |