1 package fr.orsay.lri.varna.applications.templateEditor;
4 import java.awt.event.MouseEvent;
5 import java.awt.event.MouseListener;
6 import java.awt.event.MouseMotionListener;
7 import java.awt.event.MouseWheelEvent;
8 import java.awt.event.MouseWheelListener;
9 import java.awt.geom.Point2D;
13 public class MouseControler implements MouseListener, MouseMotionListener, MouseWheelListener {
15 private int _granularity = 8;
16 private final int HYSTERESIS_DISTANCE = 10;
18 GraphicalTemplateElement _elem;
19 TemplateEditorPanelUI _ui;
20 private GraphicalTemplateElement.RelativePosition _currentMode = Helix.RelativePosition.RP_OUTER;
21 private boolean movingView = false;
22 private Point2D.Double _clickedPos = new Point2D.Double();
23 private Point _clickedPosScreen = new Point();
25 public MouseControler(TemplatePanel sp, TemplateEditorPanelUI ui)
32 public void mouseWheelMoved(MouseWheelEvent e) {
33 if (e.getWheelRotation() == -1) {
43 public void mouseClicked(MouseEvent arg0) {
46 public void mouseEntered(MouseEvent arg0) {
47 // TODO Auto-generated method stub
51 public void mouseExited(MouseEvent arg0) {
52 // TODO Auto-generated method stub
59 * Get mouse position in logical coordinates, ie. those used in the template XML file.
60 * It differs from the screen coordinates relative to panel because of the scaling factor.
62 public Point2D.Double getLogicalMouseCoords(MouseEvent event) {
63 return new Point2D.Double(event.getX()/_sp.getScaleFactor(), event.getY()/_sp.getScaleFactor());
66 public void mousePressed(MouseEvent arg0) {
68 _clickedPos = new Point2D.Double(arg0.getX(), arg0.getY());
69 _clickedPosScreen.x = arg0.getXOnScreen();
70 _clickedPosScreen.y = arg0.getYOnScreen();
73 if (arg0.getButton() == MouseEvent.BUTTON2) {
78 Point2D.Double logicalMousePos = getLogicalMouseCoords(arg0);
79 GraphicalTemplateElement elem = _sp.getElementAt(logicalMousePos.getX(), logicalMousePos.getY());
84 if (arg0.getButton()==MouseEvent.BUTTON1
85 && _ui.getSelectedTool() == TemplateEditorPanelUI.Tool.CREATE_HELIX)
87 _currentMode = Helix.RelativePosition.RP_EDIT_START;
89 else if ((arg0.getButton()==MouseEvent.BUTTON1
90 && _ui.getSelectedTool() == TemplateEditorPanelUI.Tool.CREATE_UNPAIRED))
92 // Create a new unpaired region
93 UnpairedRegion n = new UnpairedRegion(logicalMousePos.getX(),logicalMousePos.getY(),_sp.getTemplate());
94 n.setDominantColor(_sp.nextBackgroundColor());
99 _currentMode = GraphicalTemplateElement.RelativePosition.RP_EDIT_START;
102 else if (arg0.getButton()==MouseEvent.BUTTON1)
104 _currentMode = elem.getRelativePosition(logicalMousePos.getX(), logicalMousePos.getY());
105 _sp.setSelected(elem);
107 switch (_currentMode)
111 case RP_EDIT_TANGENT_5:
112 case RP_EDIT_TANGENT_3:
116 case RP_INNER_GENERAL:
117 _currentMode = Helix.RelativePosition.RP_INNER_MOVE;
119 case RP_CONNECT_END3:
120 case RP_CONNECT_END5:
121 case RP_CONNECT_START5:
122 case RP_CONNECT_START3:
124 Couple<GraphicalTemplateElement,GraphicalTemplateElement.RelativePosition> al = _sp.getPartner(elem, _currentMode);
125 boolean isConnected = (al!=null);
128 Connection c = _sp.getConnection(elem, _currentMode);
129 _ui.removeConnectionUI(c);
130 GraphicalTemplateElement p1 = c._h1;
131 GraphicalTemplateElement p2 = c._h2;
132 boolean p1IsHelix = (p1 instanceof Helix);
133 boolean p1IsUnpaired = (p1 instanceof UnpairedRegion);
134 boolean p2IsHelix = (p2 instanceof Helix);
135 boolean p2IsUnpaired = (p2 instanceof UnpairedRegion);
136 boolean p1StillAttached = (p1 == elem);
138 if ((p1IsUnpaired && p2IsHelix))
140 p1StillAttached = false;
145 _currentMode = c._edge2;
147 else if (!p1StillAttached)
150 _currentMode = c._edge1;
154 if (_elem instanceof Helix)
156 _sp.setPointerPos(new Point2D.Double(logicalMousePos.getX(),logicalMousePos.getY()));
157 _sp.setSelectedEdge(_currentMode);
159 _sp.setSelected(_elem);
171 public void mouseReleased(MouseEvent arg0) {
173 Point2D.Double logicalMousePos = getLogicalMouseCoords(arg0);
176 switch (_currentMode)
181 if (_elem instanceof Helix)
183 Helix h = (Helix) _elem;
184 if (h.getPos().distance(h.getExtent())<10.0)
186 _ui.removeElementUI(_elem);
194 case RP_CONNECT_END3:
195 case RP_CONNECT_END5:
196 case RP_CONNECT_START5:
197 case RP_CONNECT_START3:
199 GraphicalTemplateElement t = _sp.getElementAt(logicalMousePos.getX(), logicalMousePos.getY(),_elem);
202 GraphicalTemplateElement.RelativePosition edge = t.getClosestEdge(logicalMousePos.getX(), logicalMousePos.getY());
203 _ui.addConnectionUI(_elem,_currentMode,t,edge);
205 _sp.setSelectedEdge(Helix.RelativePosition.RP_OUTER);
212 _sp.setSelectedEdge(Helix.RelativePosition.RP_OUTER);
213 _currentMode = Helix.RelativePosition.RP_OUTER;
218 private Point2D.Double projectPoint(double x, double y, Point2D.Double ref)
220 Point2D.Double result = new Point2D.Double();
223 double tmp = Double.MIN_VALUE;
224 for (int i=0;i<this._granularity;i++)
226 double angle = 2.0*Math.PI*((double)i/(double)_granularity);
227 double dx = Math.cos(angle);
228 double dy = Math.sin(angle);
229 double norm = nx*dx+ny*dy;
230 //System.out.println(""+angle+" "+norm);
234 result.x = ref.x+dx*norm;
235 result.y = ref.y+dy*norm;
241 public void mouseDragged(MouseEvent arg0)
244 Point trans = new Point(
245 arg0.getXOnScreen() - _clickedPosScreen.x,
246 arg0.getYOnScreen() - _clickedPosScreen.y);
247 _sp.translateView(trans);
248 _clickedPosScreen.x = arg0.getXOnScreen();
249 _clickedPosScreen.y = arg0.getYOnScreen();
251 Point2D.Double logicalMousePos = getLogicalMouseCoords(arg0);
254 switch (_currentMode)
258 if (_clickedPos.distance(arg0.getX(),arg0.getY())>HYSTERESIS_DISTANCE)
260 System.out.println("Creating Helix...");
261 Helix h1 = new Helix(logicalMousePos.getX(),logicalMousePos.getY(),_sp.getTemplate(),_sp.getRNAComponents());
262 h1.setDominantColor(_sp.nextBackgroundColor());
263 _ui.addElementUI(h1);
275 if (_elem instanceof Helix)
277 Helix h = (Helix) _elem;
278 switch (_currentMode)
282 Point2D.Double d = projectPoint(logicalMousePos.getX(),logicalMousePos.getY(),h.getPos());
283 _ui.setHelixExtentUI(h, d.x,d.y);
288 Point2D.Double d = projectPoint( logicalMousePos.getX(),logicalMousePos.getY(),h.getExtent());
289 _ui.setHelixPosUI(h, d.x,d.y);
293 _ui.moveHelixUI(h, logicalMousePos.getX(),logicalMousePos.getY());
295 case RP_CONNECT_END3:
296 case RP_CONNECT_END5:
297 case RP_CONNECT_START5:
298 case RP_CONNECT_START3:
299 _sp.setPointerPos(new Point2D.Double(logicalMousePos.getX(),logicalMousePos.getY()));
304 else if (_elem instanceof UnpairedRegion)
306 UnpairedRegion ur = (UnpairedRegion) _elem;
307 Point2D.Double p = new Point2D.Double(logicalMousePos.getX(),logicalMousePos.getY());
308 switch (_currentMode)
310 case RP_EDIT_TANGENT_5:
312 _ui.setEdge5TangentUI(ur,logicalMousePos.getX(),logicalMousePos.getY());
316 case RP_EDIT_TANGENT_3:
318 _ui.setEdge3TangentUI(ur,logicalMousePos.getX(),logicalMousePos.getY());
324 _ui.moveUnpairedUI(ur,logicalMousePos.getX(),logicalMousePos.getY());
328 case RP_CONNECT_START5:
329 _ui.setEdge5UI(ur,logicalMousePos.getX(),logicalMousePos.getY());
331 case RP_CONNECT_END3:
332 _ui.setEdge3UI(ur,logicalMousePos.getX(),logicalMousePos.getY());
341 public void mouseMoved(MouseEvent arg0) {
342 // TODO Auto-generated method stub