]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.g2d/src/org/simantics/g2d/participant/MultitouchPanZoomRotateInteractor.java
3e1f625b8fc1d8f534e9c1c008418b4f5aac20e8
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / participant / MultitouchPanZoomRotateInteractor.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management
3  * in Industry THTH ry.
4  * All rights reserved. This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License v1.0
6  * which accompanies this distribution, and is available at
7  * http://www.eclipse.org/legal/epl-v10.html
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.g2d.participant;
13
14 import java.awt.geom.AffineTransform;
15 import java.awt.geom.Point2D;
16
17 import org.simantics.g2d.canvas.Hints;
18 import org.simantics.g2d.canvas.impl.AbstractCanvasParticipant;
19 import org.simantics.g2d.canvas.impl.DependencyReflection.Dependency;
20 import org.simantics.g2d.participant.CanvasGrab.PointerInfo;
21 import org.simantics.scenegraph.g2d.events.EventHandlerReflection.EventHandler;
22 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonPressedEvent;
23 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonReleasedEvent;
24 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseExitEvent;
25 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;
26
27 /**
28  * @author Toni Kalajainen
29  */
30 public class MultitouchPanZoomRotateInteractor extends AbstractCanvasParticipant {
31
32         @Dependency TransformUtil util;
33         @Dependency CanvasGrab grab;
34     
35     // Pointer grabbing button
36     public static final int BUTTON_ID = 1;
37     
38     @EventHandler(priority = Integer.MAX_VALUE - 2000)
39     public boolean handleEvent(MouseButtonPressedEvent e) {
40         // ignore normal mouse        
41                 if (getHint(Hints.KEY_TOOL) != Hints.PANTOOL) return false;
42         if (e.mouseId==0) return false;
43         if (e.button != BUTTON_ID) return false;
44         assertDependencies();
45         //System.out.println(e.mouseId+" down");
46         Point2D controlPos = e.controlPosition;
47         Point2D canvasPos = util.controlToCanvas(controlPos, null);
48         grab.grabCanvas(e.mouseId, canvasPos); 
49         return false;
50     }
51     
52     @EventHandler(priority = Integer.MAX_VALUE - 2000)
53     public boolean handleEvent(MouseButtonReleasedEvent e) {
54         // ignore normal mouse
55                 if (getHint(Hints.KEY_TOOL) != Hints.PANTOOL) return false;
56         if (e.mouseId==0) return false;
57         if (e.button != BUTTON_ID) return false;
58         assertDependencies();
59         //System.out.println(e.mouseId+" up");
60         grab.grabInfo.remove(e.mouseId);
61         
62         return false;
63     }
64     
65     @EventHandler(priority = Integer.MAX_VALUE - 2000)
66     public boolean handleEvent(MouseExitEvent e) {
67         // ignore normal mouse
68                 if (getHint(Hints.KEY_TOOL) != Hints.PANTOOL) return false;
69         if (e.mouseId==0) return false;
70         assertDependencies();
71         //System.out.println(e.mouseId+" exit");
72         grab.grabInfo.remove(e.mouseId);        
73         return false;
74     }           
75         
76     @EventHandler(priority = Integer.MAX_VALUE - 2000)
77     public boolean handleEvent(MouseMovedEvent e) {   
78         if (e.context instanceof MouseUtil) return false;
79                 if (getHint(Hints.KEY_TOOL) != Hints.PANTOOL) return false;
80         assertDependencies();
81         PointerInfo ai = grab.grabInfo.get(e.mouseId);
82         if (ai==null) return false;
83         if (grab.grabInfo.size() == 1) {
84             PointerInfo pi = grab.grabInfo.values().iterator().next();            
85
86             Point2D pt = util.controlToCanvas(e.controlPosition, null);
87             
88             double      a1_x = pi.anchorPos.getX();
89             double      a1_y = pi.anchorPos.getY();
90             double      b1_x = pt.getX();
91             double      b1_y = pt.getY();
92                 
93             AffineTransform gat = util.getTransform();
94             gat.translate(b1_x-a1_x, b1_y-a1_y);
95             util.setTransform(gat);
96                         
97             return true; // TODO Do panning;
98         }        
99         if (grab.grabInfo.size()!=2) return false;
100         
101         double  EPSILON = 3;
102  
103         PointerInfo[] pi = grab.grabInfo.values().toArray(new PointerInfo[2]);
104         
105         for (PointerInfo p : pi)
106                 if (p.mouseId == e.mouseId)
107                         p.currentPos = util.controlToCanvas(e.controlPosition, null);
108
109         double  a1_x = pi[0].anchorPos.getX();
110         double  a1_y = pi[0].anchorPos.getY();
111         double  b1_x = pi[0].currentPos.getX();
112         double  b1_y = pi[0].currentPos.getY();
113         
114         double  a2_x = pi[1].anchorPos.getX();
115         double  a2_y = pi[1].anchorPos.getY();
116         double  b2_x = pi[1].currentPos.getX();
117         double  b2_y = pi[1].currentPos.getY();        
118
119         for (PointerInfo p : pi)
120                 if (p.mouseId != e.mouseId)
121                         p.currentPos = p.anchorPos;
122
123         double  da_x = a1_x - a2_x;
124         double  da_y = a1_y - a2_y;
125         double  da_lensq = da_x*da_x + da_y*da_y;
126         if(da_lensq < EPSILON) {
127                 System.err.println("a1 ja a2 ovat liian lähellä toisiaan");
128                 return false;
129         }
130
131         double  db_x = b1_x - b2_x;
132         double  db_y = b1_y - b2_y;
133         
134         double s_x = (db_x * da_x + db_y * da_y) / da_lensq;
135         double s_y = (-db_x * da_y + db_y * da_x) / da_lensq;
136         
137         double t_x = b1_x - s_x * a1_x + s_y * a1_y;
138         double t_y = b1_y - s_x * a1_y - s_y * a1_x;
139         
140         double mat[] = new double[] {s_x, s_y, -s_y, s_x, t_x, t_y};
141         AffineTransform at = new AffineTransform(mat);        
142                 setDirty();
143         
144         AffineTransform gat = util.getTransform();
145         gat.concatenate(at);
146         util.setTransform(gat);
147         
148         return true;
149     }
150         
151         
152 }