new callback handler allowing threads that request a progress bar to be cancelled...
authorjprocter <Jim Procter>
Mon, 15 Dec 2008 10:32:52 +0000 (10:32 +0000)
committerjprocter <Jim Procter>
Mon, 15 Dec 2008 10:32:52 +0000 (10:32 +0000)
src/jalview/gui/AlignFrame.java
src/jalview/gui/Desktop.java
src/jalview/gui/IProgressIndicator.java
src/jalview/gui/IProgressIndicatorHandler.java [new file with mode: 0644]

index 8f1aa46..d5ddf7d 100755 (executable)
@@ -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
index a0b93fb..be84f43 100755 (executable)
@@ -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
index 43f3cec..0345107 100644 (file)
@@ -37,5 +37,12 @@ public interface IProgressIndicator
    *                unique handle for this indicator\r
    */\r
   public abstract void setProgressBar(String message, long id);\r
+  /**\r
+   * register a handler for the progress bar identified by id\r
+   * @param id\r
+   * @param handler\r
+   */\r
+  public abstract void registerHandler(long id, IProgressIndicatorHandler handler);\r
+  \r
 \r
 }\r
diff --git a/src/jalview/gui/IProgressIndicatorHandler.java b/src/jalview/gui/IProgressIndicatorHandler.java
new file mode 100644 (file)
index 0000000..f8012d3
--- /dev/null
@@ -0,0 +1,16 @@
+package jalview.gui;\r
+\r
+public interface IProgressIndicatorHandler\r
+{\r
+  /**\r
+   * \r
+   * @return true if a cancel button can be shown \r
+   */\r
+  public boolean canCancel();\r
+  /**\r
+   * Callback to cancel activity if the cancel button is pressed.\r
+   * @param id\r
+   * @return true if activity was cancelled\r
+   */\r
+  public boolean cancelActivity(long id);\r
+}\r