Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / org.gvsig.app.document.layout.app / org.gvsig.app.document.layout.app.mainplugin / src / main / java / org / gvsig / app / project / documents / layout / tools / listener / LayoutAddRectangleListener.java @ 36648

History | View | Annotate | Download (5.36 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.app.project.documents.layout.tools.listener;
23

    
24
import java.awt.Image;
25
import java.awt.geom.Point2D;
26
import java.awt.geom.Rectangle2D;
27

    
28
import org.gvsig.andami.PluginServices;
29
import org.gvsig.app.project.documents.layout.fframes.FFrameGraphics;
30
import org.gvsig.app.project.documents.layout.gui.LayoutPanel;
31
import org.gvsig.app.project.documents.layout.tools.AbstractLayoutToolListener;
32
import org.gvsig.fmap.mapcontrol.tools.BehaviorException;
33
import org.gvsig.fmap.mapcontrol.tools.Events.EnvelopeEvent;
34

    
35
/**
36
 * Implementaci?n de la interfaz LayoutRectangleListener como herramienta para
37
 * realizar una inserci?n por rect?ngulo.
38
 * 
39
 * @author Vicente Caballero Navarro
40
 */
41
public class LayoutAddRectangleListener extends AbstractLayoutToolListener
42
    implements LayoutRectangleListener {
43

    
44
    private final Image img = PluginServices.getIconTheme()
45
        .get("rect-select-cursor").getImage();
46
    protected static int TOLERANCE = 15;
47

    
48
    /**
49
     * Crea un nuevo LayoutAddRectangleListener.
50
     * 
51
     * @param l
52
     *            Layout.
53
     */
54
    public LayoutAddRectangleListener(LayoutPanel layoutPanel) {
55
        super(layoutPanel);
56
    }
57

    
58
    /**
59
     * @see org.gvsig.fmap.mapcontrol.tools.Listeners.RectangleListener#rectangle(org.gvsig.fmap.mapcontrol.tools.Events.EnvelopeEvent)
60
     */
61
    public void rectangle(EnvelopeEvent event) throws BehaviorException {
62
        FFrameGraphics fframe =
63
            (FFrameGraphics) layoutManager
64
                .createFrame(FFrameGraphics.PERSISTENCE_DEFINITION_NAME);
65

    
66
        // fframe.setLayout(layout);
67
        fframe.setGeometryAdapter(layoutPanel.getLayoutControl()
68
            .getGeometryAdapter());
69
        fframe.update(FFrameGraphics.RECTANGLE, layoutPanel.getLayoutControl()
70
            .getAT());
71
        fframe.setBoundBox(layoutPanel.getLayoutControl().getGeometryAdapter()
72
            .getBounds2D());
73
        layoutPanel.getLayoutContext().addFFrame(fframe, true, true);
74
        PluginServices.getMainFrame().enableControls();
75
        layoutPanel.getLayoutControl().refresh();
76
    }
77

    
78
    /**
79
     * @see org.gvsig.fmap.mapcontrol.tools.Listeners.ToolListener#getCursor()
80
     */
81
    public Image getImageCursor() {
82
        return img;
83
    }
84

    
85
    /**
86
     * @see org.gvsig.fmap.mapcontrol.tools.Listeners.ToolListener#cancelDrawing()
87
     */
88
    public boolean cancelDrawing() {
89
        return false;
90
    }
91

    
92
    protected Rectangle2D getRectangle(int tolerance) {
93
        Rectangle2D r = new Rectangle2D.Double();
94
        if (isCorrectSize(tolerance, layoutPanel.getLayoutControl()
95
            .getFirstPoint(), layoutPanel.getLayoutControl().getLastPoint())) {
96
            Point2D fp = layoutPanel.getLayoutControl().getFirstPoint();
97
            Point2D lp = layoutPanel.getLayoutControl().getLastPoint();
98
            if (fp.getX() < lp.getX()) {
99
                if (fp.getY() < lp.getY()) {
100
                    r.setRect(fp.getX(), fp.getY(), lp.getX() - fp.getX(),
101
                        lp.getY() - fp.getY());
102
                } else {
103
                    r.setRect(fp.getX(), lp.getY(), lp.getX() - fp.getX(),
104
                        fp.getY() - lp.getY());
105
                }
106
            } else {
107
                if (fp.getY() > lp.getY()) {
108
                    r.setRect(lp.getX(), lp.getY(), fp.getX() - lp.getX(),
109
                        fp.getY() - lp.getY());
110
                } else {
111
                    r.setRect(lp.getX(), fp.getY(), lp.getX() - fp.getX(),
112
                        lp.getY() - fp.getY());
113
                }
114
            }
115
        } else {
116
            Point2D p1 = layoutPanel.getLayoutControl().getFirstPoint();
117
            p1 =
118
                new Point2D.Double(p1.getX() + tolerance, p1.getY() + tolerance);
119
            r.setFrameFromDiagonal(layoutPanel.getLayoutControl()
120
                .getFirstPoint(), p1);
121
        }
122
        return r;
123
    }
124

    
125
    /**
126
     * Devuelve true si el rectangulo formado por los dos puntos que se pasan
127
     * como par?metro es superior a la tolerancia.
128
     * 
129
     * @param tolerance
130
     *            Tolerancia
131
     * @param p1
132
     *            Punto inicial del rect?ngulo.
133
     * @param p2
134
     *            Punto final del rect?ngulo.
135
     * 
136
     * @return True si el tama?o es correcto.
137
     */
138
    private boolean isCorrectSize(int tolerance, Point2D p1, Point2D p2) {
139
        if (Math.abs(p2.getX() - p1.getX()) < tolerance) {
140
            return false;
141
        } else
142
            if (Math.abs(p2.getY() - p1.getY()) < tolerance) {
143
                return false;
144
            }
145
        return true;
146
    }
147
}