Merge branch 'JAL-3878_ws-overhaul-3' into mmw/Release_2_12_ws_merge
[jalview.git] / src / jalview / gui / ProgressBar.java
index ea341e3..7c98398 100644 (file)
@@ -83,14 +83,14 @@ public class ProgressBar implements IProgressIndicator
       throw new NullPointerException();
     }
     if (!GridLayout.class
-            .isAssignableFrom(container.getLayout().getClass()))
+        .isAssignableFrom(container.getLayout().getClass()))
     {
       throw new IllegalArgumentException("Container must have GridLayout");
     }
     this.statusPanel = container;
     this.statusBar = statusBar;
-    this.progressBars = new Hashtable<Long, JPanel>();
-    this.progressBarHandlers = new Hashtable<Long, IProgressIndicatorHandler>();
+    this.progressBars = new Hashtable<>();
+    this.progressBarHandlers = new Hashtable<>();
 
   }
 
@@ -119,46 +119,88 @@ public class ProgressBar implements IProgressIndicator
    * execution.
    */
   @Override
-  public void setProgressBar(String message, long id)
+  public void setProgressBar(final String message, final long id)
   {
-    Long longId = Long.valueOf(id);
-
-    JPanel progressPanel = progressBars.get(longId);
-    if (progressPanel != null)
+    SwingUtilities.invokeLater(new Runnable()
     {
-      /*
-       * Progress bar is displayed for this id - remove it now, and any handler
-       */
-      progressBars.remove(id);
-      if (message != null && statusBar != null)
-      {
-        statusBar.setText(message);
-      }
-      if (progressBarHandlers.containsKey(longId))
+      @Override
+      public void run()
       {
-        progressBarHandlers.remove(longId);
+        if (progressBars.containsKey(id))
+        {
+          /*
+           * Progress bar is displayed for this id - remove it now, and any handler
+           */
+          removeProgressBar(id);
+          if (message != null && statusBar != null)
+          {
+            statusBar.setText(message);
+          }
+        }
+        else
+        {
+          /*
+           * No progress bar for this id - add one now
+           */
+          addProgressBar(id, message);
+        }
       }
-      removeRow(progressPanel);
-    }
-    else
-    {
-      /*
-       * No progress bar for this id - add one now
-       */
-      progressPanel = new JPanel(new BorderLayout(10, 5));
+    });
+
+  }
 
+  /**
+   * Add a progress bar for the given id if it doesn't exist displaying the
+   * provided message. Subsequent calls do nothing.
+   * 
+   * @param id
+   *          progress bar identifier
+   * @param message
+   *          displayed message
+   */
+  @Override
+  public void addProgressBar(final long id, final String message)
+  {
+    if (progressBars.containsKey(id))
+      return;
+    JPanel progressPanel = new JPanel(new BorderLayout(10, 5));
+    progressBars.put(id, progressPanel);
+    Runnable r = () -> {
       JProgressBar progressBar = new JProgressBar();
       progressBar.setIndeterminate(true);
-
       progressPanel.add(new JLabel(message), BorderLayout.WEST);
       progressPanel.add(progressBar, BorderLayout.CENTER);
-
       addRow(progressPanel);
+      refreshLayout();
+    };
+    if (SwingUtilities.isEventDispatchThread())
+      r.run();
+    else
+      SwingUtilities.invokeLater(r);
+  }
 
-      progressBars.put(longId, progressPanel);
-    }
-
-    refreshLayout();
+  /**
+   * Remove a progress bar for the given id if it exists. Subsequent calls do
+   * nothing.
+   * 
+   * @param id
+   *          id of the progress bar to be removed
+   */
+  @Override
+  public void removeProgressBar(final long id)
+  {
+    JPanel progressPanel = progressBars.remove(id);
+    if (progressPanel == null)
+      return;
+    progressBarHandlers.remove(id);
+    Runnable r = () -> {
+      removeRow(progressPanel);
+      refreshLayout();
+    };
+    if (SwingUtilities.isEventDispatchThread())
+      r.run();
+    else
+      SwingUtilities.invokeLater(r);
   }
 
   /**
@@ -213,43 +255,52 @@ public class ProgressBar implements IProgressIndicator
    */
   @Override
   public void registerHandler(final long id,
-          final IProgressIndicatorHandler handler)
+      final IProgressIndicatorHandler handler)
   {
-    Long longId = Long.valueOf(id);
-    final JPanel progressPanel = progressBars.get(longId);
-    if (progressPanel == null)
+    final IProgressIndicator us = this;
+
+    SwingUtilities.invokeLater(new Runnable()
     {
-      System.err.println(
+      @Override
+      public void run()
+      {
+        final JPanel progressPanel = progressBars.get(id);
+        if (progressPanel == null)
+        {
+          System.err.println(
               "call setProgressBar before registering the progress bar's handler.");
-      return;
-    }
+          return;
+        }
 
-    /*
-     * Nothing useful to do if not a Cancel handler
-     */
-    if (!handler.canCancel())
-    {
-      return;
-    }
+        /*
+         * Nothing useful to do if not a Cancel handler
+         */
+        if (!handler.canCancel())
+        {
+          return;
+        }
 
-    progressBarHandlers.put(longId, handler);
-    JButton cancel = new JButton(MessageManager.getString("action.cancel"));
-    final IProgressIndicator us = this;
-    cancel.addActionListener(new ActionListener()
-    {
+        progressBarHandlers.put(id, handler);
+        JButton cancel = new JButton(
+            MessageManager.getString("action.cancel"));
+        cancel.addActionListener(new ActionListener()
+        {
 
-      @Override
-      public void actionPerformed(ActionEvent e)
-      {
-        handler.cancelActivity(id);
-        us.setProgressBar(MessageManager
+          @Override
+          public void actionPerformed(ActionEvent e)
+          {
+            handler.cancelActivity(id);
+            us.setProgressBar(MessageManager
                 .formatMessage("label.cancelled_params", new Object[]
                 { ((JLabel) progressPanel.getComponent(0)).getText() }),
                 id);
+          }
+        });
+        progressPanel.add(cancel, BorderLayout.EAST);
+        refreshLayout();
+
       }
     });
-    progressPanel.add(cancel, BorderLayout.EAST);
-    refreshLayout();
   }
 
 }