JAL-3333 Sorry couldn't resist adding a bit of weighting to the rotation
[jalview.git] / src / jalview / gui / WebserviceInfo.java
index 985c624..0a46600 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
- * Copyright (C) 2014 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
  */
 package jalview.gui;
 
-import java.util.*;
+import jalview.jbgui.GWebserviceInfo;
+import jalview.util.MessageManager;
+import jalview.ws.WSClientI;
 
-import java.awt.*;
-import java.awt.event.*;
-import java.awt.image.*;
-import javax.swing.*;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.GridLayout;
+import java.awt.Image;
+import java.awt.MediaTracker;
+import java.awt.RenderingHints;
+import java.awt.event.ActionEvent;
+import java.awt.image.BufferedImage;
+import java.util.Vector;
+
+import javax.swing.JComponent;
+import javax.swing.JEditorPane;
+import javax.swing.JInternalFrame;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JTextArea;
 import javax.swing.event.HyperlinkEvent;
 import javax.swing.event.HyperlinkListener;
 import javax.swing.text.html.HTMLEditorKit;
 import javax.swing.text.html.StyleSheet;
 
-import jalview.jbgui.*;
-import jalview.util.MessageManager;
-import jalview.ws.WSClientI;
-
 /**
  * Base class for web service client thread and gui TODO: create StAX parser to
  * extract html body content reliably when preparing html formatted job statuses
@@ -42,8 +56,8 @@ import jalview.ws.WSClientI;
  * @author $author$
  * @version $Revision$
  */
-public class WebserviceInfo extends GWebserviceInfo implements
-        HyperlinkListener, IProgressIndicator
+public class WebserviceInfo extends GWebserviceInfo
+        implements HyperlinkListener, IProgressIndicator
 {
 
   /** Job is Queued */
@@ -78,6 +92,15 @@ public class WebserviceInfo extends GWebserviceInfo implements
 
   JInternalFrame frame;
 
+  private IProgressIndicator progressBar;
+
+  @Override
+  public void setVisible(boolean aFlag)
+  {
+    super.setVisible(aFlag);
+    frame.setVisible(aFlag);
+  };
+
   JTabbedPane subjobs = null;
 
   java.util.Vector jobPanes = null;
@@ -210,10 +233,13 @@ public class WebserviceInfo extends GWebserviceInfo implements
    *          short name and job type
    * @param info
    *          reference or other human readable description
+   * @param makeVisible
+   *          true to display the webservices window immediatly (otherwise need
+   *          to call setVisible(true))
    */
-  public WebserviceInfo(String title, String info)
+  public WebserviceInfo(String title, String info, boolean makeVisible)
   {
-    init(title, info, 520, 500);
+    init(title, info, 520, 500, makeVisible);
   }
 
   /**
@@ -228,9 +254,10 @@ public class WebserviceInfo extends GWebserviceInfo implements
    * @param height
    *          DOCUMENT ME!
    */
-  public WebserviceInfo(String title, String info, int width, int height)
+  public WebserviceInfo(String title, String info, int width, int height,
+          boolean makeVisible)
   {
-    init(title, info, width, height);
+    init(title, info, width, height, makeVisible);
   }
 
   /**
@@ -288,18 +315,21 @@ public class WebserviceInfo extends GWebserviceInfo implements
    * @param height
    *          DOCUMENT ME!
    */
-  void init(String title, String info, int width, int height)
+  void init(String title, String info, int width, int height,
+          boolean makeVisible)
   {
     frame = new JInternalFrame();
     frame.setContentPane(this);
-    Desktop.addInternalFrame(frame, title, width, height);
+    Desktop.addInternalFrame(frame, title, makeVisible, width, height);
     frame.setClosable(false);
 
+    progressBar = new ProgressBar(statusPanel, statusBar);
+
     this.title = title;
     setInfoText(info);
 
-    java.net.URL url = getClass().getResource(
-            "/images/Jalview_Logo_small.png");
+    java.net.URL url = getClass()
+            .getResource("/images/Jalview_Logo_small_with_border.png");
     image = java.awt.Toolkit.getDefaultToolkit().createImage(url);
 
     MediaTracker mt = new MediaTracker(this);
@@ -313,24 +343,29 @@ public class WebserviceInfo extends GWebserviceInfo implements
     }
 
     AnimatedPanel ap = new AnimatedPanel();
-    titlePanel.add(ap, BorderLayout.CENTER);
+    ap.setPreferredSize(new Dimension(60, 60));
+    titlePanel.add(ap, BorderLayout.WEST);
+    titlePanel.add(titleText, BorderLayout.CENTER);
+    setStatus(currentStatus);
 
     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.isCancellable())
-        {
-          service.cancelJob();
-        }
-      };
-    });
+    frame.addInternalFrameListener(
+            new javax.swing.event.InternalFrameAdapter()
+            {
+              @Override
+                       public void internalFrameClosed(
+                      javax.swing.event.InternalFrameEvent evt)
+              {
+                // System.out.println("Shutting down webservice client");
+                WSClientI service = thisinfo.getthisService();
+                if (service != null && service.isCancellable())
+                {
+                  service.cancelJob();
+                }
+              };
+            });
     frame.validate();
 
   }
@@ -344,6 +379,36 @@ public class WebserviceInfo extends GWebserviceInfo implements
   public void setStatus(int status)
   {
     currentStatus = status;
+
+    String message = null;
+    switch (currentStatus)
+    {
+    case STATE_QUEUING:
+      message = MessageManager.getString("label.state_queueing");
+      break;
+
+    case STATE_RUNNING:
+      message = MessageManager.getString("label.state_running");
+      break;
+
+    case STATE_STOPPED_OK:
+      message = MessageManager.getString("label.state_completed");
+      break;
+
+    case STATE_CANCELLED_OK:
+      message = MessageManager.getString("label.state_job_cancelled");
+      break;
+
+    case STATE_STOPPED_ERROR:
+      message = MessageManager.getString("label.state_job_error");
+      break;
+
+    case STATE_STOPPED_SERVERERROR:
+      message = MessageManager.getString("label.server_error_try_later");
+      break;
+    }
+    titleText.setText(title + (message == null ? "" : " - " + message));
+    titleText.repaint();
   }
 
   /**
@@ -356,8 +421,9 @@ public class WebserviceInfo extends GWebserviceInfo implements
   {
     if (jobpane < 0 || jobpane >= jobPanes.size())
     {
-      throw new Error("setStatus called for non-existent job pane."
-              + jobpane);
+      throw new Error(MessageManager.formatMessage(
+              "error.setstatus_called_non_existent_job_pane", new String[]
+              { Integer.valueOf(jobpane).toString() }));
     }
     switch (status)
     {
@@ -484,8 +550,8 @@ public class WebserviceInfo extends GWebserviceInfo implements
     int htmlpos = leaveFirst ? -1 : lowertxt.indexOf("<body");
 
     int htmlend = leaveLast ? -1 : lowertxt.indexOf("</body");
-    int htmlpose = lowertxt.indexOf(">", htmlpos), htmlende = lowertxt
-            .indexOf(">", htmlend);
+    int htmlpose = lowertxt.indexOf(">", htmlpos),
+            htmlende = lowertxt.indexOf(">", htmlend);
     if (htmlend == -1 && htmlpos == -1)
     {
       return text;
@@ -532,8 +598,8 @@ public class WebserviceInfo extends GWebserviceInfo implements
     }
     if (text.indexOf("<meta") > -1)
     {
-      System.err.println("HTML COntent: \n" + text
-              + "<< END HTML CONTENT\n");
+      System.err
+              .println("HTML COntent: \n" + text + "<< END HTML CONTENT\n");
 
     }
     return text;
@@ -555,11 +621,12 @@ public class WebserviceInfo extends GWebserviceInfo implements
     {
       String txt = getHtmlFragment(
               ((JEditorPane) ((JScrollPane) jobPanes.get(which))
-                      .getViewport().getComponent(0)).getText(), true,
-              false);
+                      .getViewport().getComponent(0)).getText(),
+              true, false);
       ((JEditorPane) ((JScrollPane) jobPanes.get(which)).getViewport()
-              .getComponent(0)).setText(ensureHtmlTagged(txt
-              + getHtmlFragment(text, false, true)));
+              .getComponent(0))
+                      .setText(ensureHtmlTagged(
+                              txt + getHtmlFragment(text, false, true)));
     }
     else
     {
@@ -643,7 +710,8 @@ public class WebserviceInfo extends GWebserviceInfo implements
    * @param e
    *          DOCUMENT ME!
    */
-  protected void cancel_actionPerformed(ActionEvent e)
+  @Override
+protected void cancel_actionPerformed(ActionEvent e)
   {
     if (!serviceIsCancellable)
     {
@@ -651,8 +719,10 @@ public class WebserviceInfo extends GWebserviceInfo implements
       // anyhow - it has to stop threads and clean up
       // JBPNote : TODO: Instead of a warning, we should have an optional 'Are
       // you sure?' prompt
-      warnUser("This job cannot be cancelled.\nJust close the window.",
-              "Cancel job");
+      warnUser(
+              MessageManager.getString(
+                      "warn.job_cannot_be_cancelled_close_window"),
+              MessageManager.getString("action.cancel_job"));
     }
     else
     {
@@ -672,10 +742,11 @@ public class WebserviceInfo extends GWebserviceInfo implements
   {
     javax.swing.SwingUtilities.invokeLater(new Runnable()
     {
-      public void run()
+      @Override
+       public void run()
       {
-        JOptionPane.showInternalMessageDialog(Desktop.desktop, message,
-                title, JOptionPane.WARNING_MESSAGE);
+        JvOptionPane.showInternalMessageDialog(Desktop.desktop, message,
+                title, JvOptionPane.WARNING_MESSAGE);
 
       }
     });
@@ -721,23 +792,38 @@ public class WebserviceInfo extends GWebserviceInfo implements
 
     BufferedImage offscreen;
 
+    @Override
     public void run()
     {
       startTime = System.currentTimeMillis();
 
+      float invSpeed = 30f;
       while (currentStatus < STATE_STOPPED_OK)
       {
+        if (currentStatus == STATE_QUEUING)
+        {
+          invSpeed = 25f;
+        }
+        else if (currentStatus == STATE_RUNNING)
+        {
+          invSpeed = 10f;
+        }
         try
         {
           Thread.sleep(50);
 
-          int units = (int) ((System.currentTimeMillis() - startTime) / 10f);
-          angle += units;
+          int units = (int) ((System.currentTimeMillis() - startTime)
+                  / invSpeed);
+          double factor = 0.5
+                  + 1.5 * (0.5
+                          - (0.5 * Math.sin(Math.toRadians(angle + 45))));
+          angle += units * factor;
           angle %= 360;
           startTime = System.currentTimeMillis();
 
           if (currentStatus >= STATE_STOPPED_OK)
           {
+            park();
             angle = 0;
           }
 
@@ -750,66 +836,66 @@ public class WebserviceInfo extends GWebserviceInfo implements
       cancel.setEnabled(false);
     }
 
+    public void park()
+    {
+      startTime = System.currentTimeMillis();
+
+      while (angle < 360)
+      {
+        try
+        {
+          Thread.sleep(25);
+
+          int units = (int) ((System.currentTimeMillis() - startTime)
+                  / 5f);
+          angle += units;
+          startTime = System.currentTimeMillis();
+
+          if (angle >= 360)
+          {
+            angle = 360;
+          }
+
+          repaint();
+        } catch (Exception ex)
+        {
+        }
+      }
+
+    }
+
     void drawPanel()
     {
       if (offscreen == null || offscreen.getWidth(this) != getWidth()
               || offscreen.getHeight(this) != getHeight())
       {
         offscreen = new BufferedImage(getWidth(), getHeight(),
-                BufferedImage.TYPE_INT_ARGB);
+                BufferedImage.TYPE_INT_RGB);
       }
 
       Graphics2D g = (Graphics2D) offscreen.getGraphics();
 
+      g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+              RenderingHints.VALUE_ANTIALIAS_ON);
+      g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+              RenderingHints.VALUE_INTERPOLATION_BICUBIC);
+      g.setRenderingHint(RenderingHints.KEY_RENDERING,
+              RenderingHints.VALUE_RENDER_QUALITY);
+
       g.setColor(Color.white);
       g.fillRect(0, 0, getWidth(), getHeight());
 
-      g.setFont(new Font("Arial", Font.BOLD, 12));
-      g.setColor(Color.black);
-
-      switch (currentStatus)
-      {
-      case STATE_QUEUING:
-        g.drawString(title.concat(" - ").concat(MessageManager.getString("label.state_queueing")), 60, 30);
-
-        break;
-
-      case STATE_RUNNING:
-        g.drawString(title.concat(" - ").concat(MessageManager.getString("label.state_running")), 60, 30);
-
-        break;
-
-      case STATE_STOPPED_OK:
-        g.drawString(title.concat(" - ").concat(MessageManager.getString("label.state_completed")), 60, 30);
-
-        break;
-
-      case STATE_CANCELLED_OK:
-        g.drawString(title.concat(" - ").concat(MessageManager.getString("label.state_job_cancelled")), 60, 30);
-
-        break;
-
-      case STATE_STOPPED_ERROR:
-        g.drawString(title.concat(" - ").concat(MessageManager.getString("label.state_job_error")), 60, 30);
-
-        break;
-
-      case STATE_STOPPED_SERVERERROR:
-        g.drawString(title.concat(" - ").concat(MessageManager.getString("label.server_error_try_later")), 60, 30);
-
-        break;
-      }
-
       if (image != null)
       {
         int x = image.getWidth(this) / 2, y = image.getHeight(this) / 2;
-        g.rotate(Math.toRadians(angle), 10 + x, 10 + y);
-        g.drawImage(image, 10, 10, this);
-        g.rotate(-Math.toRadians(angle), 10 + x, 10 + y);
+        g.rotate(Math.toRadians(angle), x, y);
+        g.drawImage(image, 0, 0, this);
+        g.rotate(-Math.toRadians(angle), x, y);
       }
     }
 
-    public void paintComponent(Graphics g1)
+    @Override
+       public void paintComponent(Graphics g1)
     {
       drawPanel();
 
@@ -824,15 +910,12 @@ public class WebserviceInfo extends GWebserviceInfo implements
     renderAsHtml = b;
   }
 
-  public void hyperlinkUpdate(HyperlinkEvent e)
+  @Override
+public void hyperlinkUpdate(HyperlinkEvent e)
   {
     Desktop.hyperlinkUpdate(e);
   }
 
-  // methods for implementing IProgressIndicator
-  // need to refactor to a reusable stub class
-  Hashtable progressBars, progressBarHandlers;
-
   /*
    * (non-Javadoc)
    * 
@@ -841,81 +924,14 @@ public class WebserviceInfo extends GWebserviceInfo implements
   @Override
   public void setProgressBar(String message, long id)
   {
-    if (progressBars == null)
-    {
-      progressBars = new Hashtable();
-      progressBarHandlers = new Hashtable();
-    }
-
-    JPanel progressPanel;
-    Long lId = new Long(id);
-    GridLayout layout = (GridLayout) statusPanel.getLayout();
-    if (progressBars.get(lId) != null)
-    {
-      progressPanel = (JPanel) progressBars.get(new Long(id));
-      statusPanel.remove(progressPanel);
-      progressBars.remove(lId);
-      progressPanel = null;
-      if (message != null)
-      {
-        statusBar.setText(message);
-      }
-      if (progressBarHandlers.contains(lId))
-      {
-        progressBarHandlers.remove(lId);
-      }
-      layout.setRows(layout.getRows() - 1);
-    }
-    else
-    {
-      progressPanel = new JPanel(new BorderLayout(10, 5));
-
-      JProgressBar progressBar = new JProgressBar();
-      progressBar.setIndeterminate(true);
-
-      progressPanel.add(new JLabel(message), BorderLayout.WEST);
-      progressPanel.add(progressBar, BorderLayout.CENTER);
-
-      layout.setRows(layout.getRows() + 1);
-      statusPanel.add(progressPanel);
-
-      progressBars.put(lId, progressPanel);
-    }
-    // update GUI
-    // setMenusForViewport();
-    validate();
+    progressBar.setProgressBar(message, id);
   }
 
   @Override
   public void registerHandler(final long id,
           final IProgressIndicatorHandler handler)
   {
-    if (progressBarHandlers == null || !progressBars.contains(new Long(id)))
-    {
-      throw new Error(
-              "call setProgressBar before registering the progress bar's handler.");
-    }
-    progressBarHandlers.put(new Long(id), handler);
-    final JPanel progressPanel = (JPanel) progressBars.get(new Long(id));
-    if (handler.canCancel())
-    {
-      JButton cancel = new JButton(MessageManager.getString("action.cancel"));
-      final IProgressIndicator us = this;
-      cancel.addActionListener(new ActionListener()
-      {
-
-        @Override
-        public void actionPerformed(ActionEvent e)
-        {
-          handler.cancelActivity(id);
-          us.setProgressBar(
-                  "Cancelled "
-                          + ((JLabel) progressPanel.getComponent(0))
-                                  .getText(), id);
-        }
-      });
-      progressPanel.add(cancel, BorderLayout.EAST);
-    }
+    progressBar.registerHandler(id, handler);
   }
 
   /**
@@ -925,10 +941,6 @@ public class WebserviceInfo extends GWebserviceInfo implements
   @Override
   public boolean operationInProgress()
   {
-    if (progressBars != null && progressBars.size() > 0)
-    {
-      return true;
-    }
-    return false;
+    return progressBar.operationInProgress();
   }
 }