View Javadoc

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&agrave; 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 }