From: jprocter Date: Mon, 15 Dec 2008 10:32:52 +0000 (+0000) Subject: new callback handler allowing threads that request a progress bar to be cancelled... X-Git-Tag: Release_2_5~377 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=6a7ed84443875e35d61de7f57c4aa6898c68775a;p=jalview.git new callback handler allowing threads that request a progress bar to be cancelled (this is untested!) --- diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 8f1aa46..d5ddf7d 100755 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -615,7 +615,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, updateEditMenuBar(); } - Hashtable progressBars; + Hashtable progressBars, progressBarHandlers; /* * (non-Javadoc) @@ -627,6 +627,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (progressBars == null) { progressBars = new Hashtable(); + progressBarHandlers = new Hashtable(); } JPanel progressPanel; @@ -641,7 +642,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { statusBar.setText(message); } - + if (progressBarHandlers.contains(new Long(id))) + { + progressBarHandlers.remove(new Long(id)); + } layout.setRows(layout.getRows() - 1); } else @@ -663,7 +667,29 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, setMenusForViewport(); validate(); } + 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("Cancel"); + final IProgressIndicator us=this; + cancel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + handler.cancelActivity(id); + us.setProgressBar("Cancelled "+((JLabel)progressPanel.getComponent(0)).getText(), id); + } + }); + progressPanel.add(cancel, BorderLayout.EAST); + } + } /** * * @return true if any progress bars are still active diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index a0b93fb..be84f43 100755 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -1523,7 +1523,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements /** * Progress bars managed by the IProgressIndicator method. */ - private Hashtable progressBars; + private Hashtable progressBars, progressBarHandlers; /* * (non-Javadoc) @@ -1535,12 +1535,17 @@ public class Desktop extends jalview.jbgui.GDesktop implements if (progressBars == null) { progressBars = new Hashtable(); + progressBarHandlers = new Hashtable(); } if (progressBars.get(new Long(id)) != null) { JProgressBar progressPanel = (JProgressBar) progressBars .remove(new Long(id)); + if (progressBarHandlers.contains(new Long(id))) + { + progressBarHandlers.remove(new Long(id)); + } removeProgressPanel(progressPanel); } else @@ -1548,7 +1553,32 @@ public class Desktop extends jalview.jbgui.GDesktop implements progressBars.put(new Long(id), addProgressPanel(message)); } } + /* (non-Javadoc) + * @see jalview.gui.IProgressIndicator#registerHandler(long, jalview.gui.IProgressIndicatorHandler) + */ + 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("Cancel"); + final IProgressIndicator us=this; + cancel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + handler.cancelActivity(id); + us.setProgressBar("Cancelled "+((JLabel)progressPanel.getComponent(0)).getText(), id); + } + }); + progressPanel.add(cancel, BorderLayout.EAST); + } + } /** * This will return the first AlignFrame viewing AlignViewport av. It will * break if there are more than one AlignFrames viewing a particular av. This diff --git a/src/jalview/gui/IProgressIndicator.java b/src/jalview/gui/IProgressIndicator.java index 43f3cec..0345107 100644 --- a/src/jalview/gui/IProgressIndicator.java +++ b/src/jalview/gui/IProgressIndicator.java @@ -37,5 +37,12 @@ public interface IProgressIndicator * unique handle for this indicator */ public abstract void setProgressBar(String message, long id); + /** + * register a handler for the progress bar identified by id + * @param id + * @param handler + */ + public abstract void registerHandler(long id, IProgressIndicatorHandler handler); + } diff --git a/src/jalview/gui/IProgressIndicatorHandler.java b/src/jalview/gui/IProgressIndicatorHandler.java new file mode 100644 index 0000000..f8012d3 --- /dev/null +++ b/src/jalview/gui/IProgressIndicatorHandler.java @@ -0,0 +1,16 @@ +package jalview.gui; + +public interface IProgressIndicatorHandler +{ + /** + * + * @return true if a cancel button can be shown + */ + public boolean canCancel(); + /** + * Callback to cancel activity if the cancel button is pressed. + * @param id + * @return true if activity was cancelled + */ + public boolean cancelActivity(long id); +}