import java.awt.BorderLayout;
import java.awt.Component;
+import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
* Progress bars in progress, keyed by any arbitrary long value
*/
Map<Long, JPanel> progressBars;
+
+ Map<Long, String> progressBarMessages;
/*
* Optional handlers for the progress bars
}
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<>();
+ this.progressBarMessages = new Hashtable<>();
}
* 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);
- }
- removeRow(progressPanel);
- }
- else
- {
- /*
- * No progress bar for this id - add one now
- */
- progressPanel = new JPanel(new BorderLayout(10, 5));
+ JPanel progressPanel = progressBars.get(id);
+ if (progressPanel != null)
+ {
+ /*
+ * 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(id))
+ {
+ progressBarHandlers.remove(id);
+ }
+ removeRow(progressPanel);
+ }
+ else
+ {
+ /*
+ * No progress bar for this id - add one now
+ */
+ progressPanel = new JPanel(new BorderLayout(10, 5));
- JProgressBar progressBar = new JProgressBar();
- progressBar.setIndeterminate(true);
+ JProgressBar progressBar = new JProgressBar();
+ progressBar.setIndeterminate(true);
+
+ progressPanel.add(new JLabel(message==null ? "" : message), BorderLayout.WEST);
+ progressPanel.add(progressBar, BorderLayout.CENTER);
- progressPanel.add(new JLabel(message), BorderLayout.WEST);
- progressPanel.add(progressBar, BorderLayout.CENTER);
+ addRow(progressPanel);
- addRow(progressPanel);
+ progressBars.put(id, progressPanel);
+ progressBarMessages.put(id, message == null ? "" : message);
+ }
- progressBars.put(longId, progressPanel);
- }
+ refreshLayout();
+ }
+ });
- refreshLayout();
}
/**
public void registerHandler(final long id,
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(
- "call setProgressBar before registering the progress bar's handler.");
- return;
+ @Override
+ public void run()
+ {
+ final JPanel progressPanel = progressBars.get(id);
+ if (progressPanel == null)
+ {
+ jalview.bin.Console.errPrintln(
+ "call setProgressBar before registering the progress bar's handler.");
+ 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);
+
+ updateCancelHandler(progressPanel, handler);
+ }
+ });
+ }
+ protected void updateCancelHandler(Container progressPanel, IProgressIndicatorHandler handler)
+ {
+ for (Component j:progressPanel.getComponents())
+ {
+ if (j instanceof JButton)
+ {
+ j.setEnabled(handler.canCancel());
+ }
}
+ refreshLayout();
+ }
- /*
- * Nothing useful to do if not a Cancel handler
- */
- if (!handler.canCancel())
+ /*
+ *
+ */
+ @Override
+ public JProgressBar getProgressBar(long id)
+ {
+ Container progBar = progressBars.get(id);
+ if (progBar == null || progBar.getComponentCount() == 0)
+ {
+ return null;
+ }
+ for (Component component : progBar.getComponents())
+ {
+ if (component.getClass().equals(JProgressBar.class))
+ {
+ return (JProgressBar) component;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String getMessage(long id)
+ {
+ return progressBarMessages.get(id);
+ }
+
+ /**
+ * change the text shown alongside a progress bar
+ * @param id
+ * @param message
+ */
+ @Override
+ public void setProgressBarMessage(long id,String message)
+ {
+ Container progBar = progressBars.get(id);
+ if (progBar == null || progBar.getComponentCount() == 0)
{
return;
}
-
- progressBarHandlers.put(longId, handler);
- JButton cancel = new JButton(MessageManager.getString("action.cancel"));
- final IProgressIndicator us = this;
- cancel.addActionListener(new ActionListener()
+ for (Component component : progBar.getComponents())
{
-
- @Override
- public void actionPerformed(ActionEvent e)
+ if (component.getClass().equals(JLabel.class))
{
- handler.cancelActivity(id);
- us.setProgressBar(MessageManager
- .formatMessage("label.cancelled_params", new Object[]
- { ((JLabel) progressPanel.getComponent(0)).getText() }),
- id);
+ ((JLabel) component).setText(message);
+ IProgressIndicatorHandler handler = progressBarHandlers.get(id);
+ if (handler!=null) {
+ // show/hide cancel on message change
+ updateCancelHandler(progBar, handler);
+ } else {
+ refreshLayout();
+ }
}
- });
- progressPanel.add(cancel, BorderLayout.EAST);
- refreshLayout();
+ }
}
}