acd4406edc3ff8de8e7b21b60872a26c97303700
[scilab.git] / scilab / modules / renderer / src / java / org / scilab / modules / renderer / JoGLView / interaction / FigureInteraction.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009-2010 - DIGITEO - Pierre Lando
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  */
11
12 package org.scilab.modules.renderer.JoGLView.interaction;
13
14 import org.scilab.modules.graphic_objects.axes.Axes;
15 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
16 import org.scilab.modules.graphic_objects.graphicObject.GraphicObject;
17 import org.scilab.modules.renderer.JoGLView.DrawerVisitor;
18
19 import java.awt.Dimension;
20 import java.awt.Point;
21
22 /**
23  * @author Pierre Lando
24  */
25 public abstract class FigureInteraction {
26
27     /** parent figure drawer */
28     private DrawerVisitor drawerVisitor;
29
30     /** Enable status */
31     private boolean isEnable;
32
33     /**
34      * Default constructor.
35      * @param drawerVisitor parent figure drawer.
36      */
37     public FigureInteraction(DrawerVisitor drawerVisitor) {
38         this.drawerVisitor = drawerVisitor;
39         isEnable = false;
40     }
41
42     /**
43      * Drawer visitor getter.
44      * @return the parent figure drawer.
45      */
46     protected DrawerVisitor getDrawerVisitor() {
47         return drawerVisitor;
48     }
49
50     /**
51      * Compute the underlying {@link org.scilab.modules.graphic_objects.axes.Axes} for the given point in figure coordinates.
52      * @param point given point in figure coordinates.
53      * @return the underlying {@link org.scilab.modules.graphic_objects.axes.Axes} for the given point in figure coordinates.
54      */
55     protected Axes getUnderlyingAxes(Point point) {
56         Axes underlyingAxes = null;
57         Integer[] size = drawerVisitor.getFigure().getAxesSize();
58         double x = point.getX() / size[0];
59         double y = point.getY() / size[1];
60         for (Integer childId : drawerVisitor.getFigure().getChildren()) {
61             GraphicObject child = GraphicController.getController().getObjectFromId(childId);
62             if (child instanceof Axes) {
63                 if (child.getVisible()) {
64                     Double[] axesBounds = ((Axes) child).getAxesBounds();  // x y w h
65                     if ((x >= axesBounds[0]) && (x <= axesBounds[0] + axesBounds[2]) && (y >= axesBounds[1]) && (y <= axesBounds[1] + axesBounds[3])) {
66                         underlyingAxes = (Axes) child;
67                         return underlyingAxes;
68                     }
69                 }
70             }
71         }
72         return underlyingAxes;
73     }
74
75     /**
76      * Enable status getter.
77      * @return the enable status.
78      */
79     public boolean isEnable() {
80         return isEnable;
81     }
82
83     /**
84      * Enable status setter.
85      * @param isEnable the new enable status setter.
86      */
87     public void setEnable(boolean isEnable) {
88         if (this.isEnable != isEnable) {
89             this.isEnable = isEnable;
90             changeEnable(isEnable);
91         }
92     }
93
94     /**
95      * Called when the enable status have changed.
96      * @param isEnable the new enable status.
97      */
98     protected abstract void changeEnable(boolean isEnable);
99
100     /**
101      * Tight given bounds to axes data bounds.
102      * @param axes the given axes.
103      * @param zoomBounds the zoomBounds.
104      * @return true if actually there is a zoom.
105      */
106     protected boolean tightZoomBounds(Axes axes, Double[] zoomBounds) {
107         boolean zoomed = false;
108         Double[] dataBounds = new Double[] { -1., 1., -1., 1., -1., 1.};
109         for (int i : new int[] {0, 2, 4}) {
110             if (zoomBounds[i] < dataBounds[i]) {
111                 zoomBounds[i] = dataBounds[i];
112             } else {
113                 zoomed = true;
114             }
115         }
116
117         for (int i : new int[] {1, 3, 5}) {
118             if (zoomBounds[i] > dataBounds[i]) {
119                 zoomBounds[i] = dataBounds[i];
120             } else {
121                 zoomed = true;
122             }
123         }
124
125         return zoomed;
126     }
127
128     /**
129      * bound the given point to canvas.
130      * @param point the given point.
131      * @return a point bounded in the canvas.
132      */
133     protected Point bound(Point point) {
134         Dimension dimension = getDrawerVisitor().getCanvas().getDimension();
135         return new Point(
136                    Math.max(1, Math.min(point.x, dimension.width)),
137                    Math.max(1, Math.min(point.y, dimension.height))
138                );
139     }
140 }