import javax.swing.*;
import jalview.jbgui.*;
+import jalview.ws.WSClientI;
/**
* Base class for web service client thread and gui
- *
+ *
* @author $author$
* @version $Revision$
*/
-public class WebserviceInfo
- extends GWebserviceInfo
+public class WebserviceInfo extends GWebserviceInfo
{
/** Job is Queued */
/** job has failed because of some unavoidable service interruption */
public static final int STATE_STOPPED_SERVERERROR = 5;
+
int currentStatus = STATE_QUEUING;
+
Image image;
+
int angle = 0;
+
String title = "";
+
jalview.ws.WSClientI thisService;
+
boolean serviceIsCancellable;
+
JInternalFrame frame;
+
JTabbedPane subjobs = null;
+
java.util.Vector jobPanes = null;
+
private boolean serviceCanMergeResults = false;
+
private boolean viewResultsImmediatly = true;
+
// tabbed or not
public synchronized int addJobPane()
{
/**
* Creates a new WebserviceInfo object.
- *
- * @param title short name and job type
- * @param info reference or other human readable description
+ *
+ * @param title
+ * short name and job type
+ * @param info
+ * reference or other human readable description
*/
public WebserviceInfo(String title, String info)
{
/**
* Creates a new WebserviceInfo object.
- *
- * @param title DOCUMENT ME!
- * @param info DOCUMENT ME!
- * @param width DOCUMENT ME!
- * @param height DOCUMENT ME!
+ *
+ * @param title
+ * DOCUMENT ME!
+ * @param info
+ * DOCUMENT ME!
+ * @param width
+ * DOCUMENT ME!
+ * @param height
+ * DOCUMENT ME!
*/
public WebserviceInfo(String title, String info, int width, int height)
{
/**
* DOCUMENT ME!
- *
+ *
* @return DOCUMENT ME!
*/
public jalview.ws.WSClientI getthisService()
}
/**
- * DOCUMENT ME!
- *
- * @param newservice DOCUMENT ME!
+ * Update state of GUI based on client capabilities (like whether the job is
+ * cancellable, whether the 'merge results' button is shown.
+ *
+ * @param newservice
+ * service client to query for capabilities
*/
public void setthisService(jalview.ws.WSClientI newservice)
{
serviceIsCancellable = newservice.isCancellable();
frame.setClosable(!serviceIsCancellable);
serviceCanMergeResults = newservice.canMergeResults();
+ rebuildButtonPanel();
+ }
+
+ private void rebuildButtonPanel()
+ {
+ if (buttonPanel != null)
+ {
+ buttonPanel.removeAll();
+ if (serviceIsCancellable)
+ {
+ buttonPanel.add(cancel);
+ frame.setClosable(false);
+ }
+ else
+ {
+ frame.setClosable(true);
+ }
+ }
}
/**
* DOCUMENT ME!
- *
- * @param title DOCUMENT ME!
- * @param info DOCUMENT ME!
- * @param width DOCUMENT ME!
- * @param height DOCUMENT ME!
+ *
+ * @param title
+ * DOCUMENT ME!
+ * @param info
+ * DOCUMENT ME!
+ * @param width
+ * DOCUMENT ME!
+ * @param height
+ * DOCUMENT ME!
*/
void init(String title, String info, int width, int height)
{
try
{
mt.waitForID(0);
- }
- catch (Exception ex)
+ } catch (Exception ex)
{
}
Thread thread = new Thread(ap);
thread.start();
+ final WebserviceInfo thisinfo = this;
+ frame
+ .addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
+ {
+ public void internalFrameClosed(
+ javax.swing.event.InternalFrameEvent evt)
+ {
+ // System.out.println("Shutting down webservice client");
+ WSClientI service = thisinfo.getthisService();
+ if (service != null)
+ {
+ service.cancelJob();
+ }
+ };
+ });
+
}
/**
* DOCUMENT ME!
- *
- * @param status integer status from state constants
+ *
+ * @param status
+ * integer status from state constants
*/
public void setStatus(int status)
{
/**
* subjob status indicator
+ *
* @param jobpane
* @param status
*/
{
if (jobpane < 0 || jobpane >= jobPanes.size())
{
- throw new Error("setStatus called for non-existent job pane." + jobpane);
+ throw new Error("setStatus called for non-existent job pane."
+ + jobpane);
}
switch (status)
{
- case STATE_QUEUING:
- setProgressName(jobpane + " - QUEUED", jobpane);
- break;
- case STATE_RUNNING:
- setProgressName(jobpane + " - RUNNING", jobpane);
- break;
- case STATE_STOPPED_OK:
- setProgressName(jobpane + " - FINISHED", jobpane);
- break;
- case STATE_CANCELLED_OK:
- setProgressName(jobpane + " - CANCELLED", jobpane);
- break;
- case STATE_STOPPED_ERROR:
- setProgressName(jobpane + " - BROKEN", jobpane);
- break;
- case STATE_STOPPED_SERVERERROR:
- setProgressName(jobpane + " - ALERT", jobpane);
- break;
- default:
- setProgressName(jobpane + " - UNKNOWN STATE", jobpane);
+ case STATE_QUEUING:
+ setProgressName(jobpane + " - QUEUED", jobpane);
+ break;
+ case STATE_RUNNING:
+ setProgressName(jobpane + " - RUNNING", jobpane);
+ break;
+ case STATE_STOPPED_OK:
+ setProgressName(jobpane + " - FINISHED", jobpane);
+ break;
+ case STATE_CANCELLED_OK:
+ setProgressName(jobpane + " - CANCELLED", jobpane);
+ break;
+ case STATE_STOPPED_ERROR:
+ setProgressName(jobpane + " - BROKEN", jobpane);
+ break;
+ case STATE_STOPPED_SERVERERROR:
+ setProgressName(jobpane + " - ALERT", jobpane);
+ break;
+ default:
+ setProgressName(jobpane + " - UNKNOWN STATE", jobpane);
}
}
/**
* DOCUMENT ME!
- *
+ *
* @return DOCUMENT ME!
*/
public String getInfoText()
/**
* DOCUMENT ME!
- *
- * @param text DOCUMENT ME!
+ *
+ * @param text
+ * DOCUMENT ME!
*/
public void setInfoText(String text)
{
/**
* DOCUMENT ME!
- *
- * @param text DOCUMENT ME!
+ *
+ * @param text
+ * DOCUMENT ME!
*/
public void appendInfoText(String text)
{
/**
* DOCUMENT ME!
- *
+ *
* @return DOCUMENT ME!
*/
public String getProgressText(int which)
{
addJobPane();
}
- return ( (JTextArea) ( (JScrollPane) jobPanes.get(which)).getViewport().
- getComponent(0)).getText();
+ return ((JTextArea) ((JScrollPane) jobPanes.get(which)).getViewport()
+ .getComponent(0)).getText();
}
/**
* DOCUMENT ME!
- *
- * @param text DOCUMENT ME!
+ *
+ * @param text
+ * DOCUMENT ME!
*/
public void setProgressText(int which, String text)
{
{
addJobPane();
}
- ( (JTextArea) ( (JScrollPane) jobPanes.get(which)).getViewport().
- getComponent(0)).setText(text);
+ ((JTextArea) ((JScrollPane) jobPanes.get(which)).getViewport()
+ .getComponent(0)).setText(text);
}
/**
* DOCUMENT ME!
- *
- * @param text DOCUMENT ME!
+ *
+ * @param text
+ * DOCUMENT ME!
*/
public void appendProgressText(int which, String text)
{
{
addJobPane();
}
- ( (JTextArea) ( (JScrollPane) jobPanes.get(which)).getViewport().
- getComponent(0)).append(text);
+ ((JTextArea) ((JScrollPane) jobPanes.get(which)).getViewport()
+ .getComponent(0)).append(text);
}
/**
/**
* get the tab title for a subjob
- * @param which int
+ *
+ * @param which
+ * int
* @return String
*/
public String getProgressName(int which)
}
else
{
- return ( (JScrollPane) jobPanes.get(which)).getViewport().getComponent(0).
- getName();
+ return ((JScrollPane) jobPanes.get(which)).getViewport()
+ .getComponent(0).getName();
}
}
/**
* set the tab title for a subjob
- * @param name String
- * @param which int
+ *
+ * @param name
+ * String
+ * @param which
+ * int
*/
public void setProgressName(String name, int which)
{
/**
* Gui action for cancelling the current job, if possible.
- *
- * @param e DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
*/
protected void cancel_actionPerformed(ActionEvent e)
{
if (!serviceIsCancellable)
{
+ // JBPNote : TODO: We should REALLY just tell the WSClientI to cancel
+ // anyhow - it has to stop threads and clean up
+ // JBPNote : TODO: Instead of a warning, we should have an optional 'Are
+ // you sure?' prompt
JOptionPane.showInternalMessageDialog(Desktop.desktop,
- "This job cannot be cancelled.\nJust close the window.",
- "Cancel job",
- JOptionPane.WARNING_MESSAGE);
+ "This job cannot be cancelled.\nJust close the window.",
+ "Cancel job", JOptionPane.WARNING_MESSAGE);
}
else
{
}
/**
- * called when job has finished but no result objects can be passed back to user
+ * called when job has finished but no result objects can be passed back to
+ * user
*/
public void setFinishedNoResults()
{
validate();
}
- class AnimatedPanel
- extends JPanel implements Runnable
+ class AnimatedPanel extends JPanel implements Runnable
{
long startTime = 0;
+
BufferedImage offscreen;
public void run()
{
Thread.sleep(50);
- int units = (int) ( (System.currentTimeMillis() - startTime) /
- 10f);
+ int units = (int) ((System.currentTimeMillis() - startTime) / 10f);
angle += units;
angle %= 360;
startTime = System.currentTimeMillis();
}
repaint();
- }
- catch (Exception ex)
+ } catch (Exception ex)
{
}
}
void drawPanel()
{
if (offscreen == null || offscreen.getWidth(this) != getWidth()
- || offscreen.getHeight(this) != getHeight())
+ || offscreen.getHeight(this) != getHeight())
{
offscreen = new BufferedImage(getWidth(), getHeight(),
- BufferedImage.TYPE_INT_ARGB);
+ BufferedImage.TYPE_INT_ARGB);
}
Graphics2D g = (Graphics2D) offscreen.getGraphics();
switch (currentStatus)
{
- case STATE_QUEUING:
- g.drawString(title.concat(" - queuing"), 60, 30);
+ case STATE_QUEUING:
+ g.drawString(title.concat(" - queuing"), 60, 30);
- break;
+ break;
- case STATE_RUNNING:
- g.drawString(title.concat(" - running"), 60, 30);
+ case STATE_RUNNING:
+ g.drawString(title.concat(" - running"), 60, 30);
- break;
+ break;
- case STATE_STOPPED_OK:
- g.drawString(title.concat(" - complete"), 60, 30);
+ case STATE_STOPPED_OK:
+ g.drawString(title.concat(" - complete"), 60, 30);
- break;
+ break;
- case STATE_CANCELLED_OK:
- g.drawString(title.concat(" - job cancelled!"), 60, 30);
+ case STATE_CANCELLED_OK:
+ g.drawString(title.concat(" - job cancelled!"), 60, 30);
- break;
+ break;
- case STATE_STOPPED_ERROR:
- g.drawString(title.concat(" - job error!"), 60, 30);
+ case STATE_STOPPED_ERROR:
+ g.drawString(title.concat(" - job error!"), 60, 30);
- break;
+ break;
- case STATE_STOPPED_SERVERERROR:
- g.drawString(title.concat(" - Server Error! (try later)"),
- 60,
- 30);
+ case STATE_STOPPED_SERVERERROR:
+ g.drawString(title.concat(" - Server Error! (try later)"), 60, 30);
- break;
+ break;
}
if (image != null)
{
g.rotate(Math.toRadians(angle), 28, 28);
g.drawImage(image, 10, 10, this);
- g.rotate( -Math.toRadians(angle), 28, 28);
+ g.rotate(-Math.toRadians(angle), 28, 28);
}
}