Statistics
| Revision:

gvsig-raster / org.gvsig.raster / trunk / org.gvsig.raster / org.gvsig.raster.fmap / src / main / java / org / gvsig / raster / fmap / tool / behavior / TransformedRectangleBehavior.java @ 2443

History | View | Annotate | Download (8.55 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.fmap.tool.behavior;
23

    
24
import java.awt.BasicStroke;
25
import java.awt.Color;
26
import java.awt.Image;
27
import java.awt.Point;
28
import java.awt.Rectangle;
29
import java.awt.RenderingHints;
30
import java.awt.event.MouseEvent;
31
import java.awt.geom.AffineTransform;
32
import java.awt.geom.NoninvertibleTransformException;
33
import java.awt.geom.Point2D;
34
import java.awt.geom.Rectangle2D;
35
import java.awt.image.BufferedImage;
36

    
37
import org.gvsig.fmap.IconThemeHelper;
38
import org.gvsig.fmap.geom.GeometryLocator;
39
import org.gvsig.fmap.geom.GeometryManager;
40
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
41
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
42
import org.gvsig.fmap.geom.primitive.Envelope;
43
import org.gvsig.fmap.mapcontext.ViewPort;
44
import org.gvsig.fmap.mapcontrol.MapControlDrawer;
45
import org.gvsig.fmap.mapcontrol.tools.BehaviorException;
46
import org.gvsig.fmap.mapcontrol.tools.Behavior.Behavior;
47
import org.gvsig.fmap.mapcontrol.tools.Events.EnvelopeEvent;
48
import org.gvsig.fmap.mapcontrol.tools.Listeners.RectangleListener;
49
import org.gvsig.fmap.mapcontrol.tools.Listeners.ToolListener;
50
import org.slf4j.Logger;
51
import org.slf4j.LoggerFactory;
52

    
53

    
54
/**
55
 * Comportamiento de una selecci?n por rectangulo con una transformaci?n
56
 * aplicada. El resultado visual es la selecci?n como un rectangulo com?n con
57
 * el rectangulo transformado superpuesto.
58
 *
59
 * @author Nacho Brodin (nachobrodin@gmail.com)
60
 *
61
 */
62
@SuppressWarnings("deprecation")
63
public class TransformedRectangleBehavior extends Behavior {
64
        private static final GeometryManager        geomManager                 = GeometryLocator.getGeometryManager();
65
        private static final Logger                         logger                          = LoggerFactory.getLogger(GeometryManager.class);
66
        /**
67
         * First point of the rectangle area, that represents a corner.
68
         */
69
        private Point2D                                     m_FirstPoint     = null;
70

    
71
        /**
72
         * Second point of the rectangle area, that represents the opposite corner of the first,
73
         *  along the diagonal.
74
         */
75
        private Point2D                                      m_LastPoint     = null;
76

    
77
        /**
78
         * Tool listener used to work with the <code>MapControl</code> object.
79
         *
80
         * @see #getListener()
81
         * @see #setListener(ToolListener)
82
         */
83
        private RectangleListener                           listener        = null;
84
        private AffineTransform                              at              = null;
85
        private BasicStroke                                  stroke          = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, new float[]{5.0f}, 0.0f);
86

    
87
        /**
88
         * <p>Creates a new behavior for selecting rectangle areas.</p>
89
         *
90
         * @param zili listener used to permit this object to work with the associated <code>MapControl</code>
91
         */
92
        public TransformedRectangleBehavior(RectangleListener zili) {
93
                listener = zili;
94
        }
95

    
96
        /**
97
         * Asigna la matriz de transformaci?n para el cuadro externo.
98
         * @param at AffineTransform
99
         */
100
        public void setAffineTransform(AffineTransform at) {
101
                this.at = at;
102
        }
103

    
104
        /* (non-Javadoc)
105
         * @see com.iver.cit.gvsig.fmap.tools.Behavior.IBehavior#getImageCursor()
106
         */
107
        public Image getImageCursor(){
108
                return IconThemeHelper.getImage("rectangle-select-cursor");
109
        }
110
        
111
        /*
112
         * (non-Javadoc)
113
         * @see com.iver.cit.gvsig.fmap.tools.Behavior.Behavior#paintComponent(java.awt.Graphics)
114
         */
115
        public void paintComponent(MapControlDrawer mapControlDrawer) {
116
                BufferedImage img = getMapControl().getImage();
117
                RenderingHints hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
118
                hints.add(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
119
                mapControlDrawer.setRenderingHints(hints);
120
                mapControlDrawer.drawImage(img, 0, 0);
121
                mapControlDrawer.setColor(Color.black);
122
                //g.setXORMode(Color.white);
123

    
124
                // Borramos el anterior
125
                Rectangle r = new Rectangle();
126

    
127
                // Dibujamos el actual
128
                if ((m_FirstPoint != null) && (m_LastPoint != null)) {
129
                        r.setFrameFromDiagonal(m_FirstPoint, m_LastPoint);
130
                        mapControlDrawer.drawRect(r.x, r.y, r.width, r.height);
131
                }
132

    
133
                //Dibujamos el cuadro exterior
134
                if(at != null) {
135
                        Point2D.Double ul = new Point2D.Double(r.x, r.y);
136
                        Point2D.Double ur = new Point2D.Double(r.x + r.width, r.y);
137
                        Point2D.Double ll = new Point2D.Double(r.x, r.y + r.height);
138
                        Point2D.Double lr = new Point2D.Double(r.x + r.width, r.y + r.height);
139

    
140
                        Point2D center = new Point2D.Double((r.width) / 2.0, (r.height) / 2.0);
141
                        AffineTransform T1 = new AffineTransform(1D, 0, 0, 1, -center.getX(), -center.getY());
142
                        AffineTransform R1 = new AffineTransform(1D, at.getShearY() / at.getScaleY(), at.getShearX() / at.getScaleX(), 1, 0, 0);
143
                        AffineTransform T2 = new AffineTransform(1D, 0, 0, 1, center.getX(), center.getY());
144
                        T2.concatenate(R1);
145
                        T2.concatenate(T1);
146

    
147
                        try {
148
                                T2.inverseTransform(ul, ul);
149
                                T2.inverseTransform(ll, ll);
150
                                T2.inverseTransform(ur, ur);
151
                                T2.inverseTransform(lr, lr);
152

    
153
                                Point2D.Double ptMin = new Point2D.Double(        Math.min(Math.min(ul.getX(), ur.getX()), Math.min(ll.getX(), lr.getX())),
154
                                                                                                                        Math.min(Math.min(ul.getY(), ur.getY()), Math.min(ll.getY(), lr.getY())));
155
                                Point2D.Double ptMax = new Point2D.Double(        Math.max(Math.max(ul.getX(), ur.getX()), Math.max(ll.getX(), lr.getX())),
156
                                                                                                                        Math.max(Math.max(ul.getY(), ur.getY()), Math.max(ll.getY(), lr.getY())));
157
                                double w = ptMax.getX() - ptMin.getX();
158
                                double h = ptMax.getY() - ptMin.getY();
159

    
160
                                mapControlDrawer.setStroke(stroke);
161
                                mapControlDrawer.transform(T2);
162
                                mapControlDrawer.drawRect((int)ptMin.getX(), (int)ptMin.getY(), (int)w, (int)h);
163
                                mapControlDrawer.transform(at.createInverse());
164
                        } catch (NoninvertibleTransformException e) {
165
                                return;
166
                        }
167
                }
168
                //g.setPaintMode();
169
        }
170

    
171
        /*
172
         * (non-Javadoc)
173
         * @see com.iver.cit.gvsig.fmap.tools.Behavior.Behavior#mousePressed(java.awt.event.MouseEvent)
174
         */
175
        public void mousePressed(MouseEvent e) {
176
                if (e.getButton() == MouseEvent.BUTTON1) {
177
                        m_FirstPoint = e.getPoint();
178
                        getMapControl().repaint();
179
                }
180
                if (listener.cancelDrawing()) {
181
                        getMapControl().cancelDrawing();
182
                        getMapControl().repaint();
183
                }
184
        }
185

    
186
        /*
187
         * (non-Javadoc)
188
         * @see com.iver.cit.gvsig.fmap.tools.Behavior.Behavior#mouseReleased(java.awt.event.MouseEvent)
189
         */
190
        public void mouseReleased(MouseEvent e) throws BehaviorException {
191
            if (m_FirstPoint == null) return;
192
                Point2D p1;
193
                Point2D p2;
194
                Point pScreen = e.getPoint();
195

    
196
                ViewPort vp = getMapControl().getMapContext().getViewPort();
197

    
198
                p1 = vp.toMapPoint(m_FirstPoint);
199
                p2 = vp.toMapPoint(pScreen);
200

    
201
                if (e.getButton() == MouseEvent.BUTTON1) {
202
                        //        Fijamos el nuevo extent
203
                        double minX = Math.min(p1.getX(), p2.getX());
204
                        double minY = Math.min(p1.getY(), p2.getY());
205
                        double maxX = Math.max(p1.getX(), p2.getX());
206
                        double maxY = Math.max(p1.getY(), p2.getY());
207
                        Envelope env = null;
208
                        try {
209
                                env = geomManager.createEnvelope(minX, minY, maxX, maxY, SUBTYPES.GEOM2D);
210
                        } catch (CreateEnvelopeException e1) {
211
                                logger.error("Error creating the envelope", e);
212
                        }
213

    
214
                        Rectangle2D rectPixel = new Rectangle();
215
                        rectPixel.setFrameFromDiagonal(m_FirstPoint, pScreen);
216

    
217
                        EnvelopeEvent event = new EnvelopeEvent(env, e, rectPixel);
218
                        listener.rectangle(event);
219
                }
220

    
221
                m_FirstPoint = null;
222
                m_LastPoint = null;
223
        }
224

    
225
        /*
226
         * (non-Javadoc)
227
         * @see com.iver.cit.gvsig.fmap.tools.Behavior.Behavior#mouseDragged(java.awt.event.MouseEvent)
228
         */
229
        public void mouseDragged(MouseEvent e) {
230
                m_LastPoint = e.getPoint();
231
                getMapControl().repaint();
232
        }
233

    
234
        /**
235
         * <p>Sets a tool listener to work with the <code>MapControl</code> using this behavior.</p>
236
         *
237
         * @param listener a <code>RectangleListener</code> object for this behavior
238
         */
239
        public void setListener(ToolListener listener) {
240
                this.listener = (RectangleListener) listener;
241
        }
242

    
243
        /*
244
         * (non-Javadoc)
245
         * @see com.iver.cit.gvsig.fmap.tools.Behavior.Behavior#getListener()
246
         */
247
        public ToolListener getListener() {
248
                return listener;
249
        }
250
}