moved to org.biojava
[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     JInternalFrame frame;\r
62 \r
63     /**\r
64      * Creates a new WebserviceInfo object.\r
65      *\r
66      * @param title short name and job type\r
67      * @param info reference or other human readable description\r
68      */\r
69     public WebserviceInfo(String title, String info)\r
70     {\r
71         init(title, info, 520, 500);\r
72     }\r
73 \r
74     /**\r
75      * Creates a new WebserviceInfo object.\r
76      *\r
77      * @param title DOCUMENT ME!\r
78      * @param info DOCUMENT ME!\r
79      * @param width DOCUMENT ME!\r
80      * @param height DOCUMENT ME!\r
81      */\r
82     public WebserviceInfo(String title, String info, int width, int height)\r
83     {\r
84         init(title, info, width, height);\r
85     }\r
86 \r
87     /**\r
88      * DOCUMENT ME!\r
89      *\r
90      * @return DOCUMENT ME!\r
91      */\r
92     public jalview.ws.WSClientI getthisService()\r
93     {\r
94         return thisService;\r
95     }\r
96 \r
97     /**\r
98      * DOCUMENT ME!\r
99      *\r
100      * @param newservice DOCUMENT ME!\r
101      */\r
102     public void setthisService(jalview.ws.WSClientI newservice)\r
103     {\r
104         thisService = newservice;\r
105         serviceIsCancellable = newservice.isCancellable();\r
106     }\r
107 \r
108     /**\r
109      * DOCUMENT ME!\r
110      *\r
111      * @param title DOCUMENT ME!\r
112      * @param info DOCUMENT ME!\r
113      * @param width DOCUMENT ME!\r
114      * @param height DOCUMENT ME!\r
115      */\r
116     void init(String title, String info, int width, int height)\r
117     {\r
118         frame = new JInternalFrame();\r
119         frame.setContentPane(this);\r
120         Desktop.addInternalFrame(frame, title, width, height);\r
121         frame.setClosable(false);\r
122 \r
123         this.title = title;\r
124         setInfoText(info);\r
125 \r
126         java.net.URL url = getClass().getResource("/images/logo.gif");\r
127         image = java.awt.Toolkit.getDefaultToolkit().createImage(url);\r
128 \r
129         MediaTracker mt = new MediaTracker(this);\r
130         mt.addImage(image, 0);\r
131 \r
132         try\r
133         {\r
134             mt.waitForID(0);\r
135         }\r
136         catch (Exception ex)\r
137         {\r
138         }\r
139 \r
140         AnimatedPanel ap = new AnimatedPanel();\r
141         titlePanel.add(ap, BorderLayout.CENTER);\r
142 \r
143         Thread thread = new Thread(ap);\r
144         thread.start();\r
145     }\r
146 \r
147     /**\r
148      * DOCUMENT ME!\r
149      *\r
150      * @param status integer status from state constants\r
151      */\r
152     public void setStatus(int status)\r
153     {\r
154         currentStatus = status;\r
155     }\r
156 \r
157     /**\r
158      * DOCUMENT ME!\r
159      *\r
160      * @return DOCUMENT ME!\r
161      */\r
162     public String getInfoText()\r
163     {\r
164         return infoText.getText();\r
165     }\r
166 \r
167     /**\r
168      * DOCUMENT ME!\r
169      *\r
170      * @param text DOCUMENT ME!\r
171      */\r
172     public void setInfoText(String text)\r
173     {\r
174         infoText.setText(text);\r
175     }\r
176 \r
177     /**\r
178      * DOCUMENT ME!\r
179      *\r
180      * @param text DOCUMENT ME!\r
181      */\r
182     public void appendInfoText(String text)\r
183     {\r
184         infoText.append(text);\r
185     }\r
186 \r
187     /**\r
188      * DOCUMENT ME!\r
189      *\r
190      * @return DOCUMENT ME!\r
191      */\r
192     public String getProgressText()\r
193     {\r
194         return progressText.getText();\r
195     }\r
196 \r
197     /**\r
198      * DOCUMENT ME!\r
199      *\r
200      * @param text DOCUMENT ME!\r
201      */\r
202     public void setProgressText(String text)\r
203     {\r
204         progressText.setText(text);\r
205     }\r
206 \r
207     /**\r
208      * DOCUMENT ME!\r
209      *\r
210      * @param text DOCUMENT ME!\r
211      */\r
212     public void appendProgressText(String text)\r
213     {\r
214         progressText.append(text);\r
215     }\r
216 \r
217     /**\r
218      * Gui action for cancelling the current job, if possible.\r
219      *\r
220      * @param e DOCUMENT ME!\r
221      */\r
222     protected void cancel_actionPerformed(ActionEvent e)\r
223     {\r
224         if (!serviceIsCancellable)\r
225         {\r
226             JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
227                 "This job cannot be cancelled.\nJust close the window.", "Cancel job",\r
228                 JOptionPane.WARNING_MESSAGE);\r
229         }\r
230         else\r
231         {\r
232             frame.setClosable(true);\r
233             thisService.cancelJob();\r
234         }\r
235     }\r
236 \r
237     public void setResultsReady()\r
238     {\r
239       frame.setClosable(true);\r
240       buttonPanel.remove(cancel);\r
241       buttonPanel.add(showResultsNewFrame);\r
242       buttonPanel.add(mergeResults);\r
243       buttonPanel.setLayout(new GridLayout(2,1,5,5));\r
244       buttonPanel.validate();\r
245       validate();\r
246     }\r
247 \r
248 \r
249     class AnimatedPanel extends JPanel implements Runnable\r
250     {\r
251         long startTime = 0;\r
252         BufferedImage offscreen;\r
253 \r
254         public void run()\r
255         {\r
256             startTime = System.currentTimeMillis();\r
257             Graphics2D g = null;\r
258 \r
259             while (currentStatus < STATE_STOPPED_OK)\r
260             {\r
261                 try\r
262                 {\r
263                     Thread.sleep(50);\r
264 \r
265                     int units = (int) ( (System.currentTimeMillis() - startTime) /\r
266                                        10f);\r
267                     angle += units;\r
268                     angle %= 360;\r
269                     startTime = System.currentTimeMillis();\r
270 \r
271                     if (offscreen == null || offscreen.getWidth(this) != getWidth()\r
272                         || offscreen.getHeight(this) != getHeight())\r
273                     {\r
274                       offscreen = new BufferedImage(getWidth(), getHeight(),\r
275                                                     BufferedImage.TYPE_INT_ARGB);\r
276                       g = (Graphics2D) offscreen.getGraphics();\r
277                     }\r
278 \r
279                     g.setColor(Color.white);\r
280                     g.fillRect(0, 0, getWidth(), getHeight());\r
281 \r
282                     g.setFont(new Font("Arial", Font.BOLD, 12));\r
283                     g.setColor(Color.black);\r
284 \r
285                     switch (currentStatus)\r
286                     {\r
287                       case STATE_QUEUING:\r
288                         g.drawString(title.concat(" - queuing"), 60, 30);\r
289 \r
290                         break;\r
291 \r
292                       case STATE_RUNNING:\r
293                         g.drawString(title.concat(" - running"), 60, 30);\r
294 \r
295                         break;\r
296 \r
297                       case STATE_STOPPED_OK:\r
298                         g.drawString(title.concat(" - complete"), 60, 30);\r
299 \r
300                         break;\r
301 \r
302                       case STATE_CANCELLED_OK:\r
303                         g.drawString(title.concat(" - job cancelled!"), 60, 30);\r
304 \r
305                         break;\r
306 \r
307                       case STATE_STOPPED_ERROR:\r
308                         g.drawString(title.concat(" - job error!"), 60, 30);\r
309 \r
310                         break;\r
311 \r
312                       case STATE_STOPPED_SERVERERROR:\r
313                         g.drawString(title.concat(" - Server Error! (try later)"),\r
314                                      60,\r
315                                      30);\r
316 \r
317                         break;\r
318                     }\r
319 \r
320 \r
321                     if (currentStatus >= STATE_STOPPED_OK)\r
322                       angle = 0;\r
323 \r
324                     if (image != null)\r
325                     {\r
326                       g.rotate(Math.toRadians(angle), 28, 28);\r
327                       g.drawImage(image, 10, 10, this);\r
328                       g.rotate( -Math.toRadians(angle), 28, 28);\r
329                     }\r
330 \r
331 \r
332                     repaint();\r
333                 }\r
334                 catch (Exception ex)\r
335                 {\r
336                 }\r
337             }\r
338 \r
339             cancel.setEnabled(false);\r
340         }\r
341 \r
342         public void paintComponent(Graphics g1)\r
343         {\r
344             g1.drawImage(offscreen, 0,0,this);\r
345         }\r
346     }\r
347 }\r