returns to zero degrees when stopped
[jalview.git] / src / jalview / gui / WebserviceInfo.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.gui;\r
20 \r
21 import jalview.jbgui.*;\r
22 \r
23 import java.awt.*;\r
24 import java.awt.event.*;\r
25 import java.awt.image.*;\r
26 \r
27 import javax.swing.*;\r
28 \r
29 \r
30 /**\r
31  * Base class for web service client thread and gui\r
32  *\r
33  * @author $author$\r
34  * @version $Revision$\r
35  */\r
36 public class WebserviceInfo extends GWebserviceInfo\r
37 {\r
38     /** Job is Queued */\r
39     public static final int STATE_QUEUING = 0;\r
40 \r
41     /** Job is Running */\r
42     public static final int STATE_RUNNING = 1;\r
43 \r
44     /** Job has finished with no errors */\r
45     public static final int STATE_STOPPED_OK = 2;\r
46 \r
47     /** Job has been cancelled with no errors */\r
48     public static final int STATE_CANCELLED_OK = 3;\r
49 \r
50     /** job has stopped because of some error */\r
51     public static final int STATE_STOPPED_ERROR = 4;\r
52 \r
53     /** job has failed because of some unavoidable service interruption */\r
54     public static final int STATE_STOPPED_SERVERERROR = 5;\r
55     int currentStatus = STATE_QUEUING;\r
56     Image image;\r
57     int angle = 0;\r
58     String title = "";\r
59     jalview.ws.WSClientI thisService;\r
60     boolean serviceIsCancellable;\r
61 \r
62     /**\r
63      * Creates a new WebserviceInfo object.\r
64      *\r
65      * @param title short name and job type\r
66      * @param info reference or other human readable description\r
67      */\r
68     public WebserviceInfo(String title, String info)\r
69     {\r
70         init(title, info, 520, 500);\r
71     }\r
72 \r
73     /**\r
74      * Creates a new WebserviceInfo object.\r
75      *\r
76      * @param title DOCUMENT ME!\r
77      * @param info DOCUMENT ME!\r
78      * @param width DOCUMENT ME!\r
79      * @param height DOCUMENT ME!\r
80      */\r
81     public WebserviceInfo(String title, String info, int width, int height)\r
82     {\r
83         init(title, info, width, height);\r
84     }\r
85 \r
86     /**\r
87      * DOCUMENT ME!\r
88      *\r
89      * @return DOCUMENT ME!\r
90      */\r
91     public jalview.ws.WSClientI getthisService()\r
92     {\r
93         return thisService;\r
94     }\r
95 \r
96     /**\r
97      * DOCUMENT ME!\r
98      *\r
99      * @param newservice DOCUMENT ME!\r
100      */\r
101     public void setthisService(jalview.ws.WSClientI newservice)\r
102     {\r
103         thisService = newservice;\r
104         serviceIsCancellable = newservice.isCancellable();\r
105     }\r
106 \r
107     /**\r
108      * DOCUMENT ME!\r
109      *\r
110      * @param title DOCUMENT ME!\r
111      * @param info DOCUMENT ME!\r
112      * @param width DOCUMENT ME!\r
113      * @param height DOCUMENT ME!\r
114      */\r
115     void init(String title, String info, int width, int height)\r
116     {\r
117         JInternalFrame frame = new JInternalFrame();\r
118         frame.setContentPane(this);\r
119         Desktop.addInternalFrame(frame, title, width, height);\r
120 \r
121         this.title = title;\r
122         setInfoText(info);\r
123 \r
124         java.net.URL url = getClass().getResource("/images/logo.gif");\r
125         image = java.awt.Toolkit.getDefaultToolkit().createImage(url);\r
126 \r
127         MediaTracker mt = new MediaTracker(this);\r
128         mt.addImage(image, 0);\r
129 \r
130         try\r
131         {\r
132             mt.waitForID(0);\r
133         }\r
134         catch (Exception ex)\r
135         {\r
136         }\r
137 \r
138         AnimatedPanel ap = new AnimatedPanel();\r
139         titlePanel.add(ap, BorderLayout.CENTER);\r
140 \r
141         Thread thread = new Thread(ap);\r
142         thread.start();\r
143     }\r
144 \r
145     /**\r
146      * DOCUMENT ME!\r
147      *\r
148      * @param status integer status from state constants\r
149      */\r
150     public void setStatus(int status)\r
151     {\r
152         currentStatus = status;\r
153     }\r
154 \r
155     /**\r
156      * DOCUMENT ME!\r
157      *\r
158      * @return DOCUMENT ME!\r
159      */\r
160     public String getInfoText()\r
161     {\r
162         return infoText.getText();\r
163     }\r
164 \r
165     /**\r
166      * DOCUMENT ME!\r
167      *\r
168      * @param text DOCUMENT ME!\r
169      */\r
170     public void setInfoText(String text)\r
171     {\r
172         infoText.setText(text);\r
173     }\r
174 \r
175     /**\r
176      * DOCUMENT ME!\r
177      *\r
178      * @param text DOCUMENT ME!\r
179      */\r
180     public void appendInfoText(String text)\r
181     {\r
182         infoText.append(text);\r
183     }\r
184 \r
185     /**\r
186      * DOCUMENT ME!\r
187      *\r
188      * @return DOCUMENT ME!\r
189      */\r
190     public String getProgressText()\r
191     {\r
192         return progressText.getText();\r
193     }\r
194 \r
195     /**\r
196      * DOCUMENT ME!\r
197      *\r
198      * @param text DOCUMENT ME!\r
199      */\r
200     public void setProgressText(String text)\r
201     {\r
202         progressText.setText(text);\r
203     }\r
204 \r
205     /**\r
206      * DOCUMENT ME!\r
207      *\r
208      * @param text DOCUMENT ME!\r
209      */\r
210     public void appendProgressText(String text)\r
211     {\r
212         progressText.append(text);\r
213     }\r
214 \r
215     /**\r
216      * Gui action for cancelling the current job, if possible.\r
217      *\r
218      * @param e DOCUMENT ME!\r
219      */\r
220     protected void cancel_actionPerformed(ActionEvent e)\r
221     {\r
222         if (!serviceIsCancellable)\r
223         {\r
224             JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
225                 "This job cannot be cancelled.\nJust close the window.", "Cancel job",\r
226                 JOptionPane.WARNING_MESSAGE);\r
227         }\r
228         else\r
229         {\r
230             thisService.cancelJob();\r
231         }\r
232     }\r
233 \r
234     class AnimatedPanel extends JPanel implements Runnable\r
235     {\r
236         long startTime = 0;\r
237         BufferedImage offscreen;\r
238 \r
239         public void run()\r
240         {\r
241             startTime = System.currentTimeMillis();\r
242             Graphics2D g = null;\r
243 \r
244             while (currentStatus < STATE_STOPPED_OK)\r
245             {\r
246                 try\r
247                 {\r
248                     Thread.sleep(50);\r
249 \r
250                     int units = (int) ( (System.currentTimeMillis() - startTime) /\r
251                                        10f);\r
252                     angle += units;\r
253                     angle %= 360;\r
254                     startTime = System.currentTimeMillis();\r
255 \r
256                     if (offscreen == null || offscreen.getWidth(this) != getWidth()\r
257                         || offscreen.getHeight(this) != getHeight())\r
258                     {\r
259                       offscreen = new BufferedImage(getWidth(), getHeight(),\r
260                                                     BufferedImage.TYPE_INT_ARGB);\r
261                       g = (Graphics2D) offscreen.getGraphics();\r
262                     }\r
263 \r
264                     g.setColor(Color.white);\r
265                     g.fillRect(0, 0, getWidth(), getHeight());\r
266 \r
267                     g.setFont(new Font("Arial", Font.BOLD, 12));\r
268                     g.setColor(Color.black);\r
269 \r
270                     switch (currentStatus)\r
271                     {\r
272                       case STATE_QUEUING:\r
273                         g.drawString(title.concat(" - queuing"), 60, 30);\r
274 \r
275                         break;\r
276 \r
277                       case STATE_RUNNING:\r
278                         g.drawString(title.concat(" - running"), 60, 30);\r
279 \r
280                         break;\r
281 \r
282                       case STATE_STOPPED_OK:\r
283                         g.drawString(title.concat(" - complete"), 60, 30);\r
284 \r
285                         break;\r
286 \r
287                       case STATE_CANCELLED_OK:\r
288                         g.drawString(title.concat(" - job cancelled!"), 60, 30);\r
289 \r
290                         break;\r
291 \r
292                       case STATE_STOPPED_ERROR:\r
293                         g.drawString(title.concat(" - job error!"), 60, 30);\r
294 \r
295                         break;\r
296 \r
297                       case STATE_STOPPED_SERVERERROR:\r
298                         g.drawString(title.concat(" - Server Error! (try later)"),\r
299                                      60,\r
300                                      30);\r
301 \r
302                         break;\r
303                     }\r
304 \r
305 \r
306                     if (currentStatus >= STATE_STOPPED_OK)\r
307                       angle = 0;\r
308 \r
309                     if (image != null)\r
310                     {\r
311                       g.rotate(Math.toRadians(angle), 28, 28);\r
312                       g.drawImage(image, 10, 10, this);\r
313                       g.rotate( -Math.toRadians(angle), 28, 28);\r
314                     }\r
315 \r
316 \r
317                     repaint();\r
318                 }\r
319                 catch (Exception ex)\r
320                 {\r
321                 }\r
322             }\r
323 \r
324             cancel.setEnabled(false);\r
325         }\r
326 \r
327         public void paintComponent(Graphics g1)\r
328         {\r
329             g1.drawImage(offscreen, 0,0,this);\r
330         }\r
331     }\r
332 }\r