c9940bb06b8534b67969b534381ebd8428a0a25c
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / editor / EditorEventListener.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Pedro Arthur dos S. Souza
4  * Copyright (C) 2012 - Caio Lucas dos S. Souza
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11  *
12  */
13
14 package org.scilab.modules.gui.editor;
15
16 import java.awt.event.KeyEvent;
17 import java.awt.event.KeyListener;
18 import java.awt.event.MouseEvent;
19 import java.awt.event.MouseListener;
20 import java.awt.event.MouseMotionListener;
21 import java.awt.Component;
22
23 import org.scilab.modules.gui.datatip.DatatipCreate;
24 import org.scilab.modules.gui.datatip.DatatipDelete;
25 import org.scilab.modules.gui.datatip.DatatipMove;
26 import org.scilab.modules.gui.datatip.DatatipDrag;
27 import org.scilab.modules.gui.datatip.DatatipOrientation;
28 import org.scilab.modules.gui.datatip.DatatipManagerMode;
29 import org.scilab.modules.gui.datatip.DatatipManager;
30
31 import org.scilab.modules.gui.editor.Editor;
32 import org.scilab.modules.gui.editor.EditorManager;
33 import org.scilab.modules.gui.editor.EntityPicker;
34 import org.scilab.modules.gui.events.GlobalEventWatcher;
35
36 import org.scilab.modules.gui.ged.Inspector;
37 import org.scilab.modules.gui.ged.SwapObject;
38
39 import org.scilab.modules.gui.plotbrowser.PlotBrowser;
40
41
42 /**
43  * Event listener for the figure editor.
44  *
45  *
46  * @author Caio Souza <caioc2bolado@gmail.com>
47  * @author Pedro Souza <bygrandao@gmail.com>
48  *
49  * @since 2012-06-01
50  */
51
52 public class EditorEventListener implements KeyListener, MouseListener, MouseMotionListener {
53
54     Integer windowUid;
55
56     Integer picked;
57     EntityPicker ep;
58
59     DatatipManagerMode datatipManagerMode;
60     Integer lastDatatip = null;
61     Integer[] lastClick = new Integer[2];
62     boolean changeOrientation = false;
63
64     Editor editor;
65     boolean isInRotation = false;
66     boolean isLeftButtonPressed = false;
67     boolean enabled = false;
68
69     public EditorEventListener(Integer uid) {
70         windowUid = uid;
71         editor = EditorManager.newEditor(uid);
72         ep = new EntityPicker();
73         datatipManagerMode = DatatipManager.newDatatipManagerMode(uid);
74     }
75
76     public void setEnable(boolean enabled) {
77         this.enabled = enabled;
78     }
79
80     public boolean isEnable() {
81         return enabled;
82     }
83
84     public boolean isDatatipEnable() {
85         return datatipManagerMode.isEnabled();
86     }
87
88     public boolean canProcess() {
89         return enabled && !GlobalEventWatcher.isActivated() && !datatipManagerMode.isInteractiveZoom();
90     }
91
92     public void onExit() {
93         EditorManager.deleteEditor(editor.getFigureUid());
94         DatatipManager.deleteDatatipManager(windowUid);
95     }
96
97     public void keyPressed(KeyEvent arg0) {
98         if (enabled && !GlobalEventWatcher.isActivated()) {
99             editor.onKeyPressed(arg0);
100             if (datatipManagerMode.isEnabled()) {
101                 if (datatipManagerMode.getSelectedTip() != null) {
102                     switch (arg0.getKeyCode()) {
103                         case KeyEvent.VK_RIGHT:
104                             DatatipMove.moveRight(datatipManagerMode.getSelectedTip());
105                             break;
106                         case KeyEvent.VK_LEFT:
107                             DatatipMove.moveLeft(datatipManagerMode.getSelectedTip());
108                             break;
109                         case KeyEvent.VK_DELETE:
110                         case KeyEvent.VK_BACK_SPACE:
111                             DatatipDelete.deleteDatatip(datatipManagerMode.getSelectedTip());
112                             break;
113                     }
114                 }
115             }
116         }
117     }
118
119     public void keyReleased(KeyEvent arg0) {
120     }
121
122     public void keyTyped(KeyEvent arg0) {
123     }
124
125     /**
126      * @param arg0 MouseEvent
127      */
128     public void mouseClicked(MouseEvent arg0) {
129     }
130
131     public void mouseEntered(MouseEvent arg0) {
132     }
133
134     public void mouseExited(MouseEvent arg0) {
135     }
136
137     /**
138      * On left mouse press: pass event to editor,
139      * if datatip manager mode is enabled try select/ create a datatip
140      * @param arg0 MouseEvent
141      */
142     public void mousePressed(MouseEvent arg0) {
143         if (canProcess() && arg0.getButton() == 1) {
144             isLeftButtonPressed = true;
145             if (!datatipManagerMode.isEnabled()) {
146                 editor.onLeftMouseDown(arg0);
147
148                 // Part responsible for the exchange of properties of the GED.
149                 //If the GED is open, so the code is executed.
150                 if (Inspector.isInspectorOpened()) {
151                     editor.onClickGED();
152                 }
153                 if (PlotBrowser.isPlotBrowserOpened()) {
154                     PlotBrowser.getPlotBrowser(windowUid);
155                 }
156             } else {
157                 if (!datatipManagerMode.pickAndHighlight(arg0.getX(), arg0.getY())) {
158                     picked = ep.pick(windowUid, arg0.getX(), arg0.getY());
159                     if (picked != null) {
160                         lastClick[0] = arg0.getX();
161                         lastClick[1] = arg0.getY();
162                         lastDatatip = DatatipCreate.createDatatip(windowUid, arg0.getX(), arg0.getY());
163                         changeOrientation = true;
164                     }
165                 } else {
166                     // we are in datatip mode and we clicked on a datatip
167                     datatipManagerMode.enableTranslation(false);
168                 }
169             }
170         }
171     }
172
173     /**
174      * On right mouse release: pass event to editor to make
175      * the popup menu visible if datatip's manager mode is off,
176      * else try delete a datatip.
177      * @param arg0 MouseEvent
178      */
179     public void mouseReleased(MouseEvent arg0) {
180         if (canProcess()) {
181             if (!datatipManagerMode.isEnabled()) {
182                 if (arg0.getButton() == 3) {
183                     if (!isInRotation) {
184                         editor.onRightMouseClick(arg0);
185                     }
186                 } else if (arg0.getButton() == 1) {
187                     editor.onLeftMouseRelease(arg0);
188                 }
189             } else {
190                 if (arg0.getButton() == 3 && !isInRotation) {
191                     if (!datatipManagerMode.pickAndDelete(arg0.getX(), arg0.getY())) {
192                         datatipManagerMode.onRightMouseClick(arg0);
193                     }
194                 }
195                 datatipManagerMode.enableTranslation(true);
196             }
197             isInRotation = false;
198             isLeftButtonPressed = false;
199             changeOrientation = false;
200             editor.setUpdateDrag(true);
201         }
202     }
203
204     /**
205      * On left mouse dragged: pass event to editor if
206      * datatip maneger mode is disabled else
207      * drag/ change datatip orientation
208      */
209     public void mouseDragged(MouseEvent arg0) {
210         if (canProcess()) {
211
212             if (!datatipManagerMode.isEnabled()) {
213
214                 if (isLeftButtonPressed) {
215                     editor.onMouseDragged(arg0);
216
217                 } else {
218                     isInRotation = true;
219                 }
220             } else {
221                 if (changeOrientation) {
222                     Integer[] curClick = {arg0.getX(), arg0.getY()};
223                     DatatipOrientation.setOrientation(lastDatatip, lastClick, curClick);
224                 } else if (datatipManagerMode.getSelectedTip() != null && isLeftButtonPressed) {
225                     DatatipDrag.dragDatatip(datatipManagerMode.getSelectedTip(), arg0.getX(), arg0.getY());
226                 }
227             }
228             editor.setUpdateDrag(false);
229         }
230     }
231
232     public void mouseMoved(MouseEvent arg0) {
233     }
234 }
235