1 package paolomind.multitalk.toolwrapper;
2
3 import java.awt.event.KeyEvent;
4 import java.awt.event.MouseEvent;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.util.Properties;
8
9 import org.python.core.PyInstance;
10 import org.python.core.PyJavaInstance;
11 import org.python.core.PyString;
12 import org.python.util.PythonInterpreter;
13
14 import paolomind.multitalk.netmessage.IMessage;
15 import paolomind.multitalk.netmessage.MessageException;
16 import paolomind.multitalk.netmessage.Sender;
17 import paolomind.multitalk.plugin.ToolInterface;
18
19 /**
20 * Classe di involucro per i tool scritti in python.
21 * @author paolo
22 *
23 */
24 /**
25 * @author paolo
26 *
27 */
28 public class PythonToolWrapper implements ToolInterface, Sender {
29
30 /** */
31 private PythonInterpreter engine;
32 /** */
33 private PyInstance ptool;
34
35 /** */
36 private Sender sender;
37
38 /**
39 * costruisce il wrapper leggendo da un inputstream
40 * e facendo interpretare lo script da un interprete.<br/>
41 * Lo script deve definire una classe Tool basandosi sul seguente template:
42 * <pre>class Tool:
43
44 name="Pencil"
45
46 def __init__(self):
47 pass
48
49 def selected(self):
50 pass
51
52 def mouseDown(self,evt):
53 self.sel=1
54 self.x0 = evt.getX()
55 self.y0 = evt.getY()
56
57 def mouseDrag(self,evt):
58 pass
59
60 def mouseUp(self,evt):
61 pass
62
63 def mouseMove(self,evt):
64 pass
65
66 def mouseClick(self,evt):
67 pass
68
69 def mouseIn(self,evt):
70 pass
71
72 def mouseOut(self,evt):
73 pass
74
75 def keyDown(self,evt):
76 pass
77
78 def keyUp(self,evt):
79 pass
80
81 def keyType(self,evt):
82 pass
83
84 def receive(self,m):
85 pass
86 </pre>
87 L'attributo name definisce un nome univoco per il tool ed è necessario.<br/>
88 Tutti i metodi sono necessario.
89 * @param in lo stream da cui leggere
90 * @param python l'interprete python
91 * @throws IOException rilancia l'eccezione in caso di errori di I/O
92 */
93 public PythonToolWrapper(final InputStream in, final PythonInterpreter python)
94 throws IOException {
95 this.engine = python;
96 engine.execfile(in);
97 ptool = (PyInstance) python.eval("Tool()");
98 ptool.__setattr__("sender", new PyJavaInstance((Sender) this));
99 }
100
101 /**
102 * Proprietà del tool.
103 * @return Informazioni sul tool
104 * @see paolomind.multitalk.plugin.ToolInterface#getPropertes()
105 */
106 public final Properties getPropertes() {
107 return null;
108 }
109
110 /**
111 * invocato quando il tool viene selezionato.
112 * @see paolomind.multitalk.plugin.ToolInterface#select()
113 */
114 public final void select() {
115 ptool.invoke("selected");
116 }
117
118 /**
119 * restituisce il proprio id.
120 * @return l'identificativo dell'ogetto
121 * @see paolomind.commons.NamedObject#getSelfId()
122 */
123 public final String getSelfId() {
124 return ptool.__findattr__("name").toString();
125 }
126
127 /**
128 * setta l'id.
129 * @param name l'id con cui sarà identificato l'oggetto
130 * @see paolomind.commons.NamedObject#setSelfId(java.lang.String)
131 */
132 public final void setSelfId(final String name) {
133 ptool.__setattr__("name", new PyString(name));
134 }
135
136 /**
137 * ricezione di un messaggio.
138 *
139 * @param m
140 * il messaggio da ricevere
141 * @throws MessageException
142 * rilancia l'accezione in caso di errori nel messaggio
143 *
144 * @see paolomind.multitalk.netmessage.Receiver#receive(paolomind.multitalk.netmessage.IMessage)
145 */
146 public final void receive(final IMessage m) throws MessageException {
147 ptool.invoke("receive", new PyJavaInstance(m));
148 }
149
150 /**
151 * @param e evento del mouse
152 * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
153 */
154 public final void mouseClicked(final MouseEvent e) {
155 ptool.invoke("mouseClick", new PyJavaInstance(e));
156 }
157
158 /**
159 * @param e evento del mouse
160 * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
161 */
162 public final void mouseEntered(final MouseEvent e) {
163 ptool.invoke("mouseIn", new PyJavaInstance(e));
164 }
165
166 /**
167 * @param e evento del mouse
168 * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
169 */
170 public final void mouseExited(final MouseEvent e) {
171 ptool.invoke("mouseOut", new PyJavaInstance(e));
172 }
173
174 /**
175 * @param e evento del mouse
176 * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
177 */
178 public final void mousePressed(final MouseEvent e) {
179 ptool.invoke("mouseDown", new PyJavaInstance(e));
180 }
181
182 /**
183 * @param e evento del mouse
184 * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
185 */
186 public final void mouseReleased(final MouseEvent e) {
187 ptool.invoke("mouseUp", new PyJavaInstance(e));
188 }
189
190 /**
191 * @param e evento del mouse
192 * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
193 */
194 public final void mouseDragged(final MouseEvent e) {
195 ptool.invoke("mouseDrag", new PyJavaInstance(e));
196 }
197
198 /**
199 * @param e evento del mouse
200 * @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
201 */
202 public final void mouseMoved(final MouseEvent e) {
203 ptool.invoke("mouseMove", new PyJavaInstance(e));
204 }
205
206 /**
207 * @param e evento della tastiera
208 * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
209 */
210 public final void keyPressed(final KeyEvent e) {
211 ptool.invoke("keyDown", new PyJavaInstance(e));
212 }
213
214 /**
215 * @param e evento della tastiera
216 * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
217 */
218 public final void keyReleased(final KeyEvent e) {
219 ptool.invoke("keyUp", new PyJavaInstance(e));
220 }
221
222 /**
223 * @param e evento della tastiera
224 * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
225 */
226 public final void keyTyped(final KeyEvent e) {
227 ptool.invoke("keyType", new PyJavaInstance(e));
228 }
229
230 /**
231 * @param m messaggio da inviare
232 * @see paolomind.multitalk.netmessage.Sender#send(paolomind.multitalk.netmessage.IMessage)
233 */
234 public final void send(final IMessage m) {
235 m.addInfo(this.getSelfId());
236 sender.send(m);
237 }
238
239 /**
240 * restituisce il sender a cui il tool invia i messaggi.
241 * @return il sender a cui il tool invia i messaggi
242 */
243 public final Sender getSender() {
244 return sender;
245 }
246
247 /**
248 * setta il sender a cui il tool invia i messaggi.
249 * @param psender il sender a cui il tool invia i messaggi
250 */
251 public final void setSender(final Sender psender) {
252 this.sender = psender;
253 }
254
255 }