Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / org.gvsig.raster.tools / org.gvsig.raster.tools.app / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / clip / ui / listener / ClippingMouseViewListener.java @ 1174

History | View | Annotate | Download (6.32 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.tools.app.basic.tool.clip.ui.listener;
23

    
24
import java.awt.Image;
25
import java.awt.geom.AffineTransform;
26
import java.awt.geom.NoninvertibleTransformException;
27
import java.awt.geom.Point2D;
28

    
29
import org.gvsig.andami.IconThemeHelper;
30
import org.gvsig.fmap.dal.coverage.RasterLocator;
31
import org.gvsig.fmap.mapcontrol.MapControl;
32
import org.gvsig.fmap.mapcontrol.tools.Events.EnvelopeEvent;
33
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
34
import org.gvsig.raster.fmap.layers.FLyrRaster;
35
import org.gvsig.raster.fmap.tool.SaveRasterListenerImpl;
36
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
37
import org.gvsig.raster.tools.app.basic.tool.clip.ClippingData;
38
import org.gvsig.raster.tools.app.basic.tool.clip.ui.ClippingPanel;
39
/**
40
 * <code>ClippingMouseViewListener</code> es un listener del recorte de raster.
41
 * Al seleccionar un ?rea sobre la vista debe cargar el cuadro con los datos de
42
 * coordenadas pixel, coordenadas reales, ancho y alto del raster resultante,
43
 * tama?o de celda.
44
 *
45
 * @version 19/04/2007
46
 * @author BorSanZa - Borja S?nchez Zamorano (borja.sanchez@iver.es)
47
 */
48
public class ClippingMouseViewListener extends SaveRasterListenerImpl {
49
        private final Image     isaveraster    = IconThemeHelper.getImageIcon("rect-select-cursor").getImage();
50
        private FLyrRaster      layer          = null;
51
        private ClippingPanel   clippingPanel  = null;
52
        private ClippingData    data           = null;
53
        private MapControl      mapControl     = null;
54
        private String          currentTool    = null;
55

    
56
        /**
57
         * Crea un nuevo <code>ClippingMouseViewListener</code>
58
         *
59
         * @param mapCtrl
60
         * @param cutRasterDialog
61
         */
62
        public ClippingMouseViewListener(MapControl mapControl, ClippingPanel clippingPanel, ClippingData data, FLyrRaster lyr) {
63
                super(mapControl);
64
                this.clippingPanel = clippingPanel;
65
                this.data = data;
66
                this.layer = lyr;
67
                this.mapControl = mapControl;
68
                this.currentTool = mapControl.getCurrentTool();
69
        }
70

    
71
        /**
72
         * Asigna la capa raster.
73
         * @param flyr Capa raster
74
         */
75
        public void setRasterLayer(FLyrRaster flyr) {
76
                layer = flyr;
77
        }
78

    
79
        /**
80
         * Realiza las acciones de selecci?n del ?rea de recorte por medio de un rectangulo
81
         * sobre la vista.
82
         */
83
        public void rectangle(EnvelopeEvent event) {
84
                super.rectangle(event);
85

    
86
                if(((FLyrRaster) layer).getAffineTransform() == null)
87
                        return;
88
                
89
                AffineTransform at = ((FLyrRaster) layer).getAffineTransform();
90
                //Temporalmente cargamos las coordenadas reales para luego transformarlas a pixel
91
                Point2D ulWc = new Point2D.Double(rect.getMinimum(0), rect.getMaximum(1));
92
                Point2D lrWc = new Point2D.Double(rect.getMaximum(0), rect.getMinimum(1));
93
                Point2D urWc = new Point2D.Double(rect.getMaximum(0), rect.getMaximum(1));
94
                Point2D llWc = new Point2D.Double(rect.getMinimum(0), rect.getMinimum(1));
95
                Point2D ulPx = new Point2D.Double();
96
                Point2D lrPx = new Point2D.Double();
97
                Point2D urPx = new Point2D.Double();
98
                Point2D llPx = new Point2D.Double();
99
                try {
100
                        at.inverseTransform(ulWc, ulPx);
101
                        at.inverseTransform(lrWc, lrPx);
102
                        at.inverseTransform(urWc, urPx);
103
                        at.inverseTransform(llWc, llPx);
104
                } catch (NoninvertibleTransformException e) {
105
                        RasterToolsUtil.messageBoxError(RasterToolsUtil.getText(this, "coordenadas_erroneas"), null);
106
                        return;
107
                }
108
                
109
                Point2D[] pointList = new Point2D[]{ulPx, lrPx, urPx, llPx};
110
                Point2D dim = new Point2D.Double(layer.getPxWidth(), layer.getPxHeight());
111

    
112
                //Comprobamos si la selecci?n est? completamente fuera del ?rea
113
                if(isOutside(ulPx, lrPx)) {
114
                        data.setOutOfArea();
115
                        return;
116
                }
117

    
118
                //Ajustamos los puntos al ?rea en pixeles del raster
119
                RasterLocator.getManager().getRasterUtils().adjustToPixelSize(pointList, dim);
120

    
121
                //Convertimos nuevamente a coordenadas reales despu?s de ajustar
122
                at.transform(ulPx, ulWc);
123
                at.transform(lrPx, lrWc);
124
                at.transform(llPx, llWc);
125
                at.transform(urPx, urWc);
126

    
127
                data.setCoorPixel(ulPx, lrPx, llPx, urPx); 
128
                data.setCoorReal(ulWc, lrWc, llWc, urWc);
129
                data.setAffineTransform(at);
130
                data.initSize();
131
                if(((FLyrRaster) layer).isRemote()) {
132
                        RasterToolsUtil.messageBoxInfo(RasterToolsUtil.getText(clippingPanel, "remember_select_size"), clippingPanel);
133
                }
134
                                
135
                clippingPanel.saveStatus(data);
136

    
137
                if(clippingPanel.getListener().activeButtons(ulPx, lrPx, ulWc, lrWc)) {
138
                        clippingPanel.getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(true);
139
                        clippingPanel.getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(true);
140
                } else {
141
                        clippingPanel.getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(false);
142
                        clippingPanel.getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(false);
143
                }
144
                
145
                if (currentTool != null)
146
                        mapControl.setTool(currentTool);
147
        }
148

    
149
        /**
150
         * Comprueba si la selecci?n del punto est? fuera del ?rea del raster.
151
         * @param ulPx Coordenada superior izquierda en pixeles
152
         * @param lrPx Corrdenada inferior derecha en pixeles
153
         * @return true si la selecci?n del punto est? fuera del raster y false si no lo est?
154
         */
155
        private boolean isOutside(Point2D ulPx, Point2D lrPx) {
156
                double minX = Math.min(ulPx.getX(), lrPx.getX());
157
                double minY = Math.min(ulPx.getY(), lrPx.getY());
158
                double maxX = Math.max(ulPx.getX(), lrPx.getX());
159
                double maxY = Math.max(ulPx.getY(), lrPx.getY());
160
                if(minX >= layer.getPxWidth() || minY >= layer.getPxHeight() || maxX < 0 || maxY < 0)
161
                        return true;
162
                return false;
163
        }
164
        
165
        /*
166
         * (non-Javadoc)
167
         * @see org.gvsig.fmap.mapcontrol.tools.Listeners.ToolListener#getImageCursor()
168
         */
169
        public Image getImageCursor() {
170
                return isaveraster;
171
        }
172
}