X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FProgressBar.java;h=7c983985158865e0f3f145216c8a7c4c6431f29d;hb=747167089ecf8d6afc70d417f5a20352e029bd95;hp=5307f26ec07519dd319fe848fa0772710a6e94b2;hpb=6746132759f6de25a29c113c724e805d114c9c1d;p=jalview.git
diff --git a/src/jalview/gui/ProgressBar.java b/src/jalview/gui/ProgressBar.java
index 5307f26..7c98398 100644
--- a/src/jalview/gui/ProgressBar.java
+++ b/src/jalview/gui/ProgressBar.java
@@ -1,5 +1,27 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see .
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
package jalview.gui;
+import jalview.util.MessageManager;
+
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;
@@ -14,8 +36,6 @@ import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
-import jalview.util.MessageManager;
-
/**
* A class to manage multiple progress bars embedded in a JPanel.
*/
@@ -63,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();
- this.progressBarHandlers = new Hashtable();
+ this.progressBars = new Hashtable<>();
+ this.progressBarHandlers = new Hashtable<>();
}
@@ -99,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);
-
- progressBars.put(longId, progressPanel);
- }
+ refreshLayout();
+ };
+ if (SwingUtilities.isEventDispatchThread())
+ r.run();
+ else
+ SwingUtilities.invokeLater(r);
+ }
- 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);
}
/**
@@ -193,42 +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)
- {
- System.err
- .println("call setProgressBar before registering the progress bar's handler.");
- 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()
- {
+ SwingUtilities.invokeLater(new Runnable()
+ {
@Override
- public void actionPerformed(ActionEvent e)
+ public void run()
{
- handler.cancelActivity(id);
- us.setProgressBar(MessageManager.formatMessage(
- "label.cancelled_params", new Object[]
- { ((JLabel) progressPanel.getComponent(0)).getText() }), id);
+ final JPanel progressPanel = progressBars.get(id);
+ if (progressPanel == null)
+ {
+ System.err.println(
+ "call setProgressBar before registering the progress bar's handler.");
+ return;
+ }
+
+ /*
+ * Nothing useful to do if not a Cancel handler
+ */
+ if (!handler.canCancel())
+ {
+ return;
+ }
+
+ 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
+ .formatMessage("label.cancelled_params", new Object[]
+ { ((JLabel) progressPanel.getComponent(0)).getText() }),
+ id);
+ }
+ });
+ progressPanel.add(cancel, BorderLayout.EAST);
+ refreshLayout();
+
}
});
- progressPanel.add(cancel, BorderLayout.EAST);
- refreshLayout();
}
}