Better treatment of error states and cancellability in wsclient.
[jalview.git] / src / jalview / gui / WebserviceInfo.java
1 package jalview.gui;\r
2 \r
3 import java.awt.*;\r
4 import java.awt.event.*;\r
5 import javax.swing.*;\r
6 import jalview.jbgui.GWebserviceInfo;\r
7 \r
8 public class WebserviceInfo extends GWebserviceInfo\r
9 {\r
10 \r
11   public static final int STATE_QUEUING = 0;\r
12   public static final int STATE_RUNNING = 1;\r
13   public static final int STATE_STOPPED_OK = 2;\r
14   public static final int STATE_CANCELLED_OK = 3;\r
15   public static final int STATE_STOPPED_ERROR = 4;\r
16   int currentStatus = STATE_QUEUING;\r
17   Image image;\r
18   int angle = 0;\r
19 \r
20   String title="";\r
21   jalview.ws.WSClientI thisService;\r
22   boolean serviceIsCancellable;\r
23   public jalview.ws.WSClientI getthisService() {\r
24     return thisService;\r
25   }\r
26   public void setthisService(jalview.ws.WSClientI newservice) {\r
27     thisService = newservice;\r
28     serviceIsCancellable = newservice.isCancellable();\r
29   }\r
30 \r
31   public WebserviceInfo(String title, String info)\r
32   {\r
33     init(title, info, 520, 500);\r
34   }\r
35 \r
36   public WebserviceInfo(String title, String info, int width, int height)\r
37   {\r
38     init(title, info, width, height);\r
39   }\r
40 \r
41   void init(String title, String info, int width, int height)\r
42   {\r
43     JInternalFrame frame = new JInternalFrame();\r
44     frame.setContentPane(this);\r
45     Desktop.addInternalFrame(frame, title, width, height);\r
46 \r
47     this.title = title;\r
48     setInfoText(info);\r
49     java.net.URL url = getClass().getResource("/images/logo.gif");\r
50     image = java.awt.Toolkit.getDefaultToolkit().createImage(url);\r
51     MediaTracker mt = new MediaTracker(this);\r
52     mt.addImage(image, 0);\r
53     try\r
54     {\r
55       mt.waitForID(0);\r
56     }\r
57     catch (Exception ex)\r
58     {}\r
59 \r
60 \r
61     AnimatedPanel ap = new AnimatedPanel();\r
62     titlePanel.add(ap, BorderLayout.CENTER);\r
63     Thread thread = new Thread(ap);\r
64     thread.start();\r
65   }\r
66 \r
67   public void setStatus(int status)\r
68   {\r
69     currentStatus = status;\r
70   }\r
71 \r
72   public String getInfoText()\r
73   {   return infoText.getText();  }\r
74 \r
75   public void setInfoText(String text)\r
76   {   infoText.setText(text);     }\r
77 \r
78   public void appendInfoText(String text)\r
79   {  infoText.append(text);  }\r
80 \r
81   public String getProgressText()\r
82   {   return progressText.getText();  }\r
83 \r
84   public void setProgressText(String text)\r
85   {   progressText.setText(text);   }\r
86 \r
87   public void appendProgressText(String text)\r
88   {   progressText.append(text);  }\r
89 \r
90   protected void cancel_actionPerformed(ActionEvent e)\r
91   {\r
92     if (!serviceIsCancellable)\r
93       JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
94                                             "This job cannot be cancelled." ,\r
95                                             "Cancel job"\r
96                                             ,JOptionPane.WARNING_MESSAGE);\r
97     else\r
98       thisService.cancelJob();\r
99   }\r
100 \r
101 \r
102   class AnimatedPanel extends JPanel implements Runnable\r
103   {\r
104     long startTime=0;\r
105     public void run()\r
106     {\r
107       startTime = System.currentTimeMillis();\r
108       while(currentStatus<STATE_STOPPED_OK)\r
109       try\r
110       {\r
111         Thread.sleep(50);\r
112 \r
113         int units =  (int)((System.currentTimeMillis()-startTime)/10f);\r
114         angle += units;\r
115         angle %= 360;\r
116         startTime = System.currentTimeMillis();\r
117         repaint();\r
118 \r
119       }\r
120       catch (Exception ex)\r
121       {}\r
122       angle = 0;\r
123       cancel.setEnabled(false);\r
124 \r
125     }\r
126 \r
127    synchronized public void  paintComponent(Graphics g1)\r
128     {\r
129       Graphics2D g = (Graphics2D) g1;\r
130       g.setColor(Color.white);\r
131       g.fillRect(0, 0, getWidth(), getHeight());\r
132       if (image != null)\r
133       {\r
134         g.rotate(Math.toRadians(angle), 28, 28);\r
135         g.drawImage(image, 10, 10, this);\r
136         g.rotate( -Math.toRadians(angle), 28, 28);\r
137       }\r
138       g.setFont(new Font("Arial", Font.BOLD, 12));\r
139       g.setColor(Color.black);\r
140       switch(currentStatus)\r
141       {\r
142         case STATE_QUEUING:\r
143           g.drawString(title.concat(" - queuing"), 60, 30);\r
144           break;\r
145         case STATE_RUNNING:\r
146           g.drawString(title.concat(" - running"), 60, 30);\r
147           break;\r
148         case STATE_STOPPED_OK:\r
149           g.drawString(title.concat(" - complete"), 60, 30);\r
150           break;\r
151 \r
152         case STATE_CANCELLED_OK:\r
153           g.drawString(title.concat(" - job cancelled!"), 60, 30);\r
154           break;\r
155 \r
156         case STATE_STOPPED_ERROR:\r
157           g.drawString(title.concat(" - error!"), 60, 30);\r
158           break;\r
159       }\r
160 \r
161     }\r
162   }\r
163 }\r