JAL-3048 DialogRunnerI reduced to minimal implementation
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Tue, 18 Dec 2018 17:11:33 +0000 (17:11 +0000)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Tue, 18 Dec 2018 17:11:33 +0000 (17:11 +0000)
22 files changed:
src/jalview/gui/AlignExportOptions.java
src/jalview/gui/AlignFrame.java
src/jalview/gui/AlignViewport.java
src/jalview/gui/AnnotationLabels.java
src/jalview/gui/Desktop.java
src/jalview/gui/EditNameDialog.java
src/jalview/gui/FeatureEditor.java
src/jalview/gui/FeatureSettings.java
src/jalview/gui/ImageExporter.java
src/jalview/gui/JvOptionPane.java
src/jalview/gui/LineartOptions.java
src/jalview/gui/PopupMenu.java
src/jalview/gui/TextColourChooser.java
src/jalview/gui/UserDefinedColours.java
src/jalview/io/HtmlSvgOutput.java
src/jalview/io/JalviewFileChooser.java
src/jalview/util/dialogrunner/DialogRunner.java [deleted file]
src/jalview/util/dialogrunner/DialogRunnerI.java
src/jalview/util/dialogrunner/RunResponse.java [deleted file]
test/jalview/util/dialogrunner/DialogRunnerTest.java
test/jalview/util/dialogrunner/RunResponseTest.java [deleted file]
utils/test/JalviewJSTest.java

index db78bee..70601c9 100644 (file)
@@ -24,7 +24,6 @@ import jalview.api.AlignExportSettingsI;
 import jalview.api.AlignViewportI;
 import jalview.io.FileFormatI;
 import jalview.util.MessageManager;
-import jalview.util.dialogrunner.RunResponse;
 
 import java.awt.BorderLayout;
 import java.awt.FlowLayout;
@@ -120,9 +119,9 @@ public class AlignExportOptions extends JPanel
    * 
    * @param action
    */
-  public void setResponseAction(Object response, RunResponse action)
+  public void setResponseAction(Object response, Runnable action)
   {
-    dialog.addResponse(response, action);
+    dialog.setResponseHandler(response, action);
   }
 
   /**
index a1d97e7..7183f7f 100644 (file)
@@ -89,7 +89,6 @@ import jalview.schemes.ResidueColourScheme;
 import jalview.schemes.TCoffeeColourScheme;
 import jalview.util.ImageMaker.TYPE;
 import jalview.util.MessageManager;
-import jalview.util.dialogrunner.RunResponse;
 import jalview.viewmodel.AlignmentViewport;
 import jalview.viewmodel.ViewportRanges;
 import jalview.ws.DBRefFetcher;
@@ -1246,7 +1245,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     }
 
     AlignExportSettingsI options = new AlignExportSettingsAdapter(false);
-    RunResponse cancelAction = new RunResponse(JvOptionPane.CANCEL_OPTION)
+    Runnable cancelAction = new Runnable()
     {
       @Override
       public void run()
@@ -1254,7 +1253,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         lastSaveSuccessful = false;
       }
     };
-    RunResponse outputAction = new RunResponse(JvOptionPane.OK_OPTION)
+    Runnable outputAction = new Runnable()
     {
       @Override
       public void run()
@@ -1322,7 +1321,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     FileFormatI fileFormat = FileFormats.getInstance()
             .forName(fileFormatName);
     AlignExportSettingsI options = new AlignExportSettingsAdapter(false);
-    RunResponse outputAction = new RunResponse(JvOptionPane.OK_OPTION)
+    Runnable outputAction = new Runnable()
     {
       @Override
       public void run()
@@ -1472,7 +1471,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
             MessageManager.getString("label.load_jalview_annotations"));
     chooser.setToolTipText(
             MessageManager.getString("label.load_jalview_annotations"));
-    chooser.addResponse(0, new RunResponse(JalviewFileChooser.APPROVE_OPTION)
+    chooser.setResponseHandler(0, new Runnable()
     {
       @Override
       public void run()
@@ -3964,7 +3963,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     chooser.setToolTipText(
             MessageManager.getString("label.load_tree_file"));
 
-    chooser.addResponse(0,new RunResponse(JalviewFileChooser.APPROVE_OPTION)
+    chooser.setResponseHandler(0,new Runnable()
     {
       @Override
       public void run()
@@ -5695,7 +5694,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     chooser.setDialogTitle(MessageManager.getString("label.load_vcf_file"));
     chooser.setToolTipText(MessageManager.getString("label.load_vcf_file"));
     final AlignFrame us = this;
-    chooser.addResponse(0, new RunResponse(JalviewFileChooser.APPROVE_OPTION)
+    chooser.setResponseHandler(0, new Runnable()
     {
       @Override
       public void run()
index 7b8c6c9..62a3698 100644 (file)
@@ -48,7 +48,6 @@ import jalview.structure.SelectionSource;
 import jalview.structure.StructureSelectionManager;
 import jalview.structure.VamsasSource;
 import jalview.util.MessageManager;
-import jalview.util.dialogrunner.RunResponse;
 import jalview.viewmodel.AlignmentViewport;
 import jalview.ws.params.AutoCalcSetting;
 
@@ -771,21 +770,21 @@ public class AlignViewport extends AlignmentViewport
      * in reverse order)
      */
     JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.desktop)
-            .addResponse(0, new RunResponse(0)
+            .setResponseHandler(0, new Runnable()
             {
               @Override
               public void run()
               {
                   addDataToAlignment(al);
               }
-            }).addResponse(1, new RunResponse(1)
+            }).setResponseHandler(1, new Runnable()
             {
               @Override
               public void run()
               {
                 us.openLinkedAlignmentAs(al, title, true);
               }
-            }).addResponse(2, new RunResponse(2)
+            }).setResponseHandler(2, new Runnable()
             {
               @Override
               public void run()
index 294b8db..6ea4c57 100755 (executable)
@@ -34,7 +34,6 @@ import jalview.io.FormatAdapter;
 import jalview.util.Comparison;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
-import jalview.util.dialogrunner.RunResponse;
 
 import java.awt.Color;
 import java.awt.Cursor;
@@ -292,7 +291,7 @@ public class AnnotationLabels extends JPanel
             annotation.description, name, description);
 
     dialog.showDialog(ap.alignFrame, title,
-            new RunResponse(JvOptionPane.OK_OPTION)
+            new Runnable()
             {
               @Override
               public void run()
index 1e258b8..a927741 100644 (file)
@@ -46,7 +46,6 @@ import jalview.util.ImageMaker.TYPE;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
 import jalview.util.UrlConstants;
-import jalview.util.dialogrunner.RunResponse;
 import jalview.viewmodel.AlignmentViewport;
 import jalview.ws.params.ParamManager;
 import jalview.ws.utils.UrlDownloadClient;
@@ -89,7 +88,6 @@ import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.ListIterator;
-import java.util.StringTokenizer;
 import java.util.Vector;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -1125,7 +1123,7 @@ public class Desktop extends jalview.jbgui.GDesktop
             MessageManager.getString("label.open_local_file"));
     chooser.setToolTipText(MessageManager.getString("action.open"));
 
-    chooser.addResponse(0, new RunResponse(JalviewFileChooser.APPROVE_OPTION)
+    chooser.setResponseHandler(0, new Runnable()
     {
       @Override
       public void run()
@@ -1206,7 +1204,7 @@ public class Desktop extends jalview.jbgui.GDesktop
 
     Object[] options = new Object[] { MessageManager.getString("action.ok"),
         MessageManager.getString("action.cancel") };
-    RunResponse action = new RunResponse(JvOptionPane.OK_OPTION) {
+    Runnable action = new Runnable() {
       @Override
       public void run()
       {
@@ -1262,7 +1260,7 @@ public class Desktop extends jalview.jbgui.GDesktop
       }};
     String dialogOption = MessageManager
             .getString("label.input_alignment_from_url");
-    JvOptionPane.newOptionDialog(desktop).addResponse(0, action)
+    JvOptionPane.newOptionDialog(desktop).setResponseHandler(0, action)
             .showInternalDialog(panel, dialogOption,
                     JvOptionPane.YES_NO_CANCEL_OPTION,
                     JvOptionPane.PLAIN_MESSAGE, null, options,
@@ -1745,7 +1743,7 @@ public class Desktop extends jalview.jbgui.GDesktop
             "Jalview Project");
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle(MessageManager.getString("label.restore_state"));
-    chooser.addResponse(0, new RunResponse(JalviewFileChooser.APPROVE_OPTION)
+    chooser.setResponseHandler(0, new Runnable()
     {
       @Override
       public void run()
index c976545..8aaebc8 100644 (file)
@@ -21,7 +21,6 @@
 package jalview.gui;
 
 import jalview.util.MessageManager;
-import jalview.util.dialogrunner.RunResponse;
 
 import java.awt.FlowLayout;
 import java.awt.Font;
@@ -112,11 +111,11 @@ public class EditNameDialog
    * @param action
    */
   public void showDialog(JComponent parent, String title,
-          RunResponse action)
+                 Runnable action)
   {
     Object[] options = new Object[] { MessageManager.getString("action.ok"),
         MessageManager.getString("action.cancel") };
-    JvOptionPane.newOptionDialog(parent).addResponse(0, action)
+    JvOptionPane.newOptionDialog(parent).setResponseHandler(0, action)
             .showInternalDialog(panel, title,
                     JvOptionPane.YES_NO_CANCEL_OPTION,
                     JvOptionPane.PLAIN_MESSAGE, null, options,
index b829ec7..d547c58 100644 (file)
@@ -10,7 +10,6 @@ import jalview.io.FeaturesFile;
 import jalview.schemes.FeatureColour;
 import jalview.util.ColorUtils;
 import jalview.util.MessageManager;
-import jalview.util.dialogrunner.RunResponse;
 
 import java.awt.BorderLayout;
 import java.awt.Color;
@@ -406,18 +405,18 @@ public class FeatureEditor
    */
   public void showDialog()
   {
-    RunResponse okAction = forCreate ? getCreateAction() : getAmendAction();
-    RunResponse cancelAction = getCancelAction();
+         Runnable okAction = forCreate ? getCreateAction() : getAmendAction();
+         Runnable cancelAction = getCancelAction();
 
     /*
      * set dialog action handlers for OK (create/Amend) and Cancel options
      * also for Delete if applicable (when amending features)
      */
     JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.desktop)
-            .addResponse(0, okAction).addResponse(2, cancelAction);
+            .setResponseHandler(0, okAction).setResponseHandler(2, cancelAction);
     if (!forCreate)
     {
-      dialog.addResponse(1, getDeleteAction());
+      dialog.setResponseHandler(1, getDeleteAction());
     }
 
     String title = null;
@@ -453,9 +452,9 @@ public class FeatureEditor
    * 
    * @return
    */
-  protected RunResponse getCancelAction()
+  protected Runnable getCancelAction()
   {
-    RunResponse okAction = new RunResponse(JvOptionPane.CANCEL_OPTION)
+       Runnable okAction = new Runnable()
     {
       @Override
       public void run()
@@ -477,9 +476,9 @@ public class FeatureEditor
    * 
    * @return
    */
-  protected RunResponse getCreateAction()
+  protected Runnable getCreateAction()
   {
-    RunResponse okAction = new RunResponse(JvOptionPane.OK_OPTION)
+       Runnable okAction = new Runnable()
     {
       boolean useLastDefaults = features.get(0).getType() == null;
 
@@ -535,9 +534,9 @@ public class FeatureEditor
    * 
    * @return
    */
-  protected RunResponse getDeleteAction()
+  protected Runnable getDeleteAction()
   {
-    RunResponse deleteAction = new RunResponse(JvOptionPane.NO_OPTION)
+         Runnable deleteAction = new Runnable()
     {
       public void run()
       {
@@ -637,9 +636,9 @@ public class FeatureEditor
    * 
    * @return
    */
-  protected RunResponse getAmendAction()
+  protected Runnable getAmendAction()
   {
-    RunResponse okAction = new RunResponse(JvOptionPane.OK_OPTION)
+       Runnable okAction = new Runnable()
     {
       boolean useLastDefaults = features.get(0).getType() == null;
   
index f29655b..23bdecb 100644 (file)
@@ -36,7 +36,6 @@ import jalview.io.JalviewFileView;
 import jalview.schemes.FeatureColour;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
-import jalview.util.dialogrunner.RunResponse;
 import jalview.viewmodel.seqfeatures.FeatureRendererModel.FeatureSettingsBean;
 import jalview.xml.binding.jalview.JalviewUserColours;
 import jalview.xml.binding.jalview.JalviewUserColours.Colour;
@@ -902,7 +901,7 @@ public class FeatureSettings extends JPanel
     chooser.setDialogTitle(
             MessageManager.getString("label.load_feature_colours"));
     chooser.setToolTipText(MessageManager.getString("action.load"));
-    chooser.addResponse(0, new RunResponse(JalviewFileChooser.APPROVE_OPTION)
+    chooser.setResponseHandler(0, new Runnable()
     {
          @Override
          public void run() 
index 90b212f..a43eef0 100644 (file)
@@ -7,15 +7,12 @@ import jalview.io.JalviewFileView;
 import jalview.util.ImageMaker;
 import jalview.util.ImageMaker.TYPE;
 import jalview.util.MessageManager;
-import jalview.util.dialogrunner.RunResponse;
 
 import java.awt.Component;
 import java.awt.Graphics;
 import java.io.File;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import javax.swing.JOptionPane;
-
 /**
  * A class that marshals steps in exporting a view in image graphics format
  * <ul>
@@ -138,7 +135,7 @@ public class ImageExporter
             && !Jalview.isHeadlessMode())
     {
       final File chosenFile = file;
-      RunResponse okAction = new RunResponse(JOptionPane.OK_OPTION)
+      Runnable okAction = new Runnable()
       {
         @Override
         public void run()
@@ -149,7 +146,7 @@ public class ImageExporter
       };
       LineartOptions epsOption = new LineartOptions(TYPE.EPS.getName(),
               textSelected);
-      epsOption.setResponseAction(1, new RunResponse(JOptionPane.NO_OPTION)
+      epsOption.setResponseAction(1, new Runnable()
       {
         @Override
         public void run()
index b3df2f7..2290b52 100644 (file)
 package jalview.gui;
 
 import jalview.bin.Jalview;
-import jalview.util.dialogrunner.DialogRunner;
 import jalview.util.dialogrunner.DialogRunnerI;
-import jalview.util.dialogrunner.RunResponse;
 
 import java.awt.Component;
 import java.awt.HeadlessException;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.swing.Icon;
 import javax.swing.JOptionPane;
@@ -48,7 +48,7 @@ public class JvOptionPane extends JOptionPane implements DialogRunnerI,
 
   private Component parentComponent;
 
-  private DialogRunnerI runner = new DialogRunner();
+  private Map<Object, Runnable> callbacks = new HashMap<>();
 
   /*
    * JalviewJS reports user choice in the dialog as the selected
@@ -763,7 +763,7 @@ public class JvOptionPane extends JOptionPane implements DialogRunnerI,
 
     if (!isInteractiveMode())
     {
-      runner.handleResponse(getMockResponse());
+      handleResponse(getMockResponse());
     }
     // two uses:
     //
@@ -791,7 +791,7 @@ public class JvOptionPane extends JOptionPane implements DialogRunnerI,
      */
     if (!Jalview.isJS())
     {
-      runner.handleResponse(response);
+      handleResponse(response);
     }
   }
 
@@ -801,7 +801,7 @@ public class JvOptionPane extends JOptionPane implements DialogRunnerI,
   {
     if (!isInteractiveMode())
     {
-      runner.handleResponse(getMockResponse());
+      handleResponse(getMockResponse());
     }
     
     ourOptions = Arrays.asList(options);
@@ -820,14 +820,14 @@ public class JvOptionPane extends JOptionPane implements DialogRunnerI,
     }
     if (!Jalview.isJS())
     {
-      runner.handleResponse(response);
+      handleResponse(response);
     }
   }
     
   @Override
-  public JvOptionPane addResponse(Object response, RunResponse action)
+  public JvOptionPane setResponseHandler(Object response, Runnable action)
   {
-    runner.addResponse(response, action);
+       callbacks.put(response,  action);
     return this;
   }
 
@@ -845,12 +845,29 @@ public class JvOptionPane extends JOptionPane implements DialogRunnerI,
        int ourOption = ourOptions.indexOf(newValue);
     if (ourOption >= 0)
     {
-      runner.handleResponse(ourOption);
+      handleResponse(ourOption);
     }
     else
     {
       // try our luck..
-      runner.handleResponse(newValue);
+      handleResponse(newValue);
+    }
+  }
+
+  @Override
+  public void handleResponse(Object response)
+  {
+    /*
+        * this test is for NaN in Chrome
+        */
+    if (response != null && !response.equals(response))
+    {
+      return;
+    }
+    Runnable action = callbacks.get(response);
+    if (action != null)
+    {
+      action.run();
     }
   }
 }
index ccf7edb..d55733c 100644 (file)
@@ -22,7 +22,6 @@ package jalview.gui;
 
 import jalview.bin.Cache;
 import jalview.util.MessageManager;
-import jalview.util.dialogrunner.RunResponse;
 
 import java.awt.FlowLayout;
 import java.awt.event.ActionEvent;
@@ -96,9 +95,9 @@ public class LineartOptions extends JPanel
    * 
    * @param action
    */
-  public void setResponseAction(Object response, RunResponse action)
+  public void setResponseAction(Object response, Runnable action)
   {
-    dialog.addResponse(response, action);
+    dialog.setResponseHandler(response, action);
   }
 
   /**
index 5a12a02..5f58d51 100644 (file)
@@ -53,7 +53,6 @@ import jalview.util.GroupUrlLink.UrlStringTooLongException;
 import jalview.util.MessageManager;
 import jalview.util.StringUtils;
 import jalview.util.UrlLink;
-import jalview.util.dialogrunner.RunResponse;
 
 import java.awt.BorderLayout;
 import java.awt.Color;
@@ -73,7 +72,6 @@ import java.util.TreeMap;
 import java.util.Vector;
 
 import javax.swing.JCheckBoxMenuItem;
-import javax.swing.JComponent;
 import javax.swing.JInternalFrame;
 import javax.swing.JLabel;
 import javax.swing.JMenu;
@@ -1808,7 +1806,7 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
             MessageManager.getString("label.group_description"));
     dialog.showDialog(ap.alignFrame,
             MessageManager.getString("label.edit_group_name_description"),
-            new RunResponse(JvOptionPane.OK_OPTION)
+            new Runnable()
             {
               @Override
               public void run()
@@ -1849,7 +1847,7 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
     dialog.showDialog(ap.alignFrame,
             MessageManager.getString(
                     "label.edit_sequence_name_description"),
-            new RunResponse(JvOptionPane.OK_OPTION)
+            new Runnable()
             {
               @Override
               public void run()
@@ -2130,7 +2128,7 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
               null, MessageManager.getString("label.edit_sequence"), null);
       dialog.showDialog(ap.alignFrame,
               MessageManager.getString("label.edit_sequence"),
-              new RunResponse(JvOptionPane.OK_OPTION)
+              new Runnable()
               {
                 @Override
                 public void run()
index ae9fda9..5d22abb 100644 (file)
@@ -23,7 +23,6 @@ package jalview.gui;
 import jalview.datamodel.SequenceGroup;
 import jalview.gui.JalviewColourChooser.ColourChooserListener;
 import jalview.util.MessageManager;
-import jalview.util.dialogrunner.RunResponse;
 
 import java.awt.BorderLayout;
 import java.awt.Color;
@@ -150,7 +149,7 @@ public class TextColourChooser
         MessageManager.getString("action.cancel") };
     String title = MessageManager
             .getString("label.adjust_foreground_text_colour_threshold");
-    RunResponse action = new RunResponse(JvOptionPane.NO_OPTION) // = 1 Cancel
+    Runnable action = new Runnable() // response for 1 = Cancel
     {
       @Override
       public void run()
@@ -158,7 +157,7 @@ public class TextColourChooser
         restoreInitialSettings();
       }
     };
-    JvOptionPane.newOptionDialog(alignPanel).addResponse(1, action)
+    JvOptionPane.newOptionDialog(alignPanel).setResponseHandler(1, action)
             .showInternalDialog(bigpanel, title,
                     JvOptionPane.YES_NO_CANCEL_OPTION,
                     JvOptionPane.PLAIN_MESSAGE, null, options,
index 9e928d8..04266be 100755 (executable)
@@ -32,7 +32,6 @@ import jalview.schemes.UserColourScheme;
 import jalview.util.ColorUtils;
 import jalview.util.Format;
 import jalview.util.MessageManager;
-import jalview.util.dialogrunner.RunResponse;
 import jalview.xml.binding.jalview.JalviewUserColours;
 import jalview.xml.binding.jalview.JalviewUserColours.Colour;
 import jalview.xml.binding.jalview.ObjectFactory;
@@ -645,7 +644,7 @@ public class UserDefinedColours extends GUserDefinedColours
     chooser.setDialogTitle(
             MessageManager.getString("label.load_colour_scheme"));
     chooser.setToolTipText(MessageManager.getString("action.load"));
-    chooser.addResponse(0, new RunResponse(JalviewFileChooser.APPROVE_OPTION) 
+    chooser.setResponseHandler(0, new Runnable() 
     {
          @Override
          public void run() 
index c1a9e9f..b8241c8 100644 (file)
@@ -26,7 +26,6 @@ import jalview.gui.LineartOptions;
 import jalview.gui.OOMWarning;
 import jalview.math.AlignmentDimension;
 import jalview.util.MessageManager;
-import jalview.util.dialogrunner.RunResponse;
 
 import java.awt.Graphics;
 import java.awt.print.PrinterException;
@@ -35,8 +34,6 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import javax.swing.JOptionPane;
-
 import org.jfree.graphics2d.svg.SVGGraphics2D;
 import org.jfree.graphics2d.svg.SVGHints;
 
@@ -214,7 +211,7 @@ public class HtmlSvgOutput extends HTMLOutput
       /*
        * configure the action to run on OK in the dialog
        */
-      RunResponse okAction = new RunResponse(JOptionPane.OK_OPTION)
+      Runnable okAction = new Runnable()
       {
         @Override
         public void run()
@@ -229,7 +226,7 @@ public class HtmlSvgOutput extends HTMLOutput
       if (renderStyle.equalsIgnoreCase("Prompt each time") && !isHeadless())
       {
         LineartOptions svgOption = new LineartOptions("HTML", textOption);
-        svgOption.setResponseAction(1, new RunResponse(JOptionPane.NO_OPTION)
+        svgOption.setResponseAction(1, new Runnable()
         {
           @Override
           public void run()
index 81cb510..7909d0c 100755 (executable)
 package jalview.io;
 
 import jalview.bin.Cache;
-import jalview.bin.Jalview;
 import jalview.gui.JvOptionPane;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
-import jalview.util.dialogrunner.DialogRunner;
 import jalview.util.dialogrunner.DialogRunnerI;
-import jalview.util.dialogrunner.RunResponse;
 
 import java.awt.Component;
 import java.awt.Dimension;
@@ -41,6 +38,7 @@ import java.beans.PropertyChangeListener;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.StringTokenizer;
 import java.util.Vector;
 
@@ -66,7 +64,7 @@ public class JalviewFileChooser extends JFileChooser implements DialogRunnerI,
 {
   private static final long serialVersionUID = 1L;
 
-  private DialogRunnerI runner = new DialogRunner();
+  private Map<Object, Runnable> callbacks;
   
   File selectedFile = null;
 
@@ -192,12 +190,13 @@ public class JalviewFileChooser extends JFileChooser implements DialogRunnerI,
   @Override
   public int showOpenDialog(Component parent)
   {
-   // runner.resetResponses();
     int value = super.showOpenDialog(this);
-    if (!Jalview.isJS())
-    {
-      runner.handleResponse(value);
-    }
+    
+    /*
+     * code below here is not reached in JalviewJS, instead
+     * propertyChange() is called for dialog action
+     */
+    handleResponse(value);
     return value;
   }
 
@@ -492,9 +491,27 @@ public class JalviewFileChooser extends JFileChooser implements DialogRunnerI,
   }
 
   @Override
-  public DialogRunnerI addResponse(Object response, RunResponse action)
+  public DialogRunnerI setResponseHandler(Object response, Runnable action)
+  {
+       callbacks.put(response,  action);
+       return this;
+  }
+
+  @Override
+  public void handleResponse(Object response)
   {
-    return runner.addResponse(response, action);
+    /*
+        * this test is for NaN in Chrome
+        */
+    if (response != null && !response.equals(response))
+    {
+      return;
+    }
+    Runnable action = callbacks.get(response);
+    if (action != null)
+    {
+      action.run();
+    }
   }
 
   /**
@@ -510,8 +527,11 @@ public class JalviewFileChooser extends JFileChooser implements DialogRunnerI,
     // TODO other properties need runners...
     switch (evt.getPropertyName())
     {
+    /*
+     * property name here matches that used in JFileChooser.js
+     */
     case "SelectedFile": 
-      runner.handleResponse(APPROVE_OPTION);
+      handleResponse(APPROVE_OPTION);
       break;
     }
   }
diff --git a/src/jalview/util/dialogrunner/DialogRunner.java b/src/jalview/util/dialogrunner/DialogRunner.java
deleted file mode 100644 (file)
index b6fd6a2..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * 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 <http://www.gnu.org/licenses/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-package jalview.util.dialogrunner;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * A helper class that executes registered Runnable actions corresponding to 
- * user responses in a dialog. This is to enable dialog execution in JalviewJS,
- * where everything must happen in a single thread of execution. That is, the
- * dialog has to 'know' all actions that follow a user choice, rather than
- * returning a response to allow a separate thread to decide the next action.
- * 
- * @author jprocter
- */
-public class DialogRunner implements DialogRunnerI
-{
-  private Map<Object, List<RunResponse>> callbacks = new HashMap<>();
-
-  /**
-   * Constructor
-   */
-  public DialogRunner()
-  {
-  }
-
-  @Override
-  public DialogRunnerI addResponse(Object response, RunResponse action)
-  {
-       List<RunResponse> actions = callbacks.get(response);
-    if (actions == null)
-    {
-      actions = new ArrayList<>();
-      callbacks.put(response, actions);
-    }
-    actions.add(action);
-    return this;
-  }
-  
-  /**
-   * Handles a response by running the chain of registered actions (if any).
-   * Answers the list of responses run (in order).
-   * 
-   * @param response
-   */
-  @Override
-  public List<RunResponse> handleResponse(Object response)
-  {
-       List<RunResponse> responsesRun = new ArrayList<RunResponse>();
-
-    /*
-        * this test is for NaN in Chrome
-        */
-    if (response != null && !response.equals(response))
-    {
-      return responsesRun;
-    }
-    
-       runResponse(response, responsesRun);
-    if (responsesRun.isEmpty())
-    {
-      System.err.println("Did nothing for " + response);
-    }
-    
-    return responsesRun;
-  }
-
-  /**
-   * Runs any response handlers registered for the given response. If any
-   * response provides a return value, then the handler for that value is
-   * run next recursively. Handlers are only run once.
-   * 
-   * @param response
- * @param alreadyRun 
-   */
-  private void runResponse(Object response, List<RunResponse> alreadyRun)
-  {
-       /*
-        * this test is for NaN in Chrome
-        */
-    if (response != null && !response.equals(response))
-    {
-      return;
-    }
-    
-    List<RunResponse> actions = response == null ? null : callbacks.get(response);
-
-    if (actions == null)
-    {
-      System.err.println("Doing nothing for " + response);
-      return;
-    }
-    for (RunResponse action : actions)
-    {
-      if (!alreadyRun.contains(action))
-      {
-       action.setReturnValue(null);
-        action.run();
-        alreadyRun.add(action);
-        Object returnValue = action.getReturnValue();
-               if (returnValue != null)
-        {
-                 /*
-                  * RunResponse wants to chain another action
-                  */
-          runResponse(returnValue, alreadyRun);
-        }
-        break;
-      }
-    }
-  }
-}
index cc4a836..0cb90c2 100644 (file)
  */
 package jalview.util.dialogrunner;
 
-import java.util.List;
-
 /**
- * functional pattern for blocking dialog response handling
+ * An interface for blocking dialog response handling. This is motivated by
+ * JalviewJS - when running as Javascript, there is only a single thread, and
+ * blocking dialogs have to be responsible for performing any actions required
+ * for user responses.
  * 
  * @author jprocter
  *
  */
-public interface DialogRunnerI
-{
+public interface DialogRunnerI {
 
-  DialogRunnerI addResponse(Object response, RunResponse action);
+       /**
+        * Sets the action to be performed when the dialog returns the given response.
+        * Note this also handles <code>int</code>-valued responses, which will be
+        * converted to <code>Integer</code> when this method is invoked.
+        * 
+        * @param response
+        * @param action
+        * @return
+        */
+       DialogRunnerI setResponseHandler(Object response, Runnable action);
 
-  /**
-   * Runs any registered handlers for the given response, and answers the list
-   * of responses run (if any) in order run
-   * 
-   * @param response
-   * @return
-   */
-  default List<RunResponse> handleResponse(Object response) 
-  {
-       return null;
-  }
+       /**
+        * Runs the registered handler (if any) for the given response. The default
+        * action is to do nothing. Typically an action will be need on 'OK' or other
+        * positive selection in the dialog. An action might in some cases also be
+        * needed for a 'Cancel' response.
+        * 
+        * @param response
+        * @return
+        */
+       default void handleResponse(Object response) {
+       }
 }
diff --git a/src/jalview/util/dialogrunner/RunResponse.java b/src/jalview/util/dialogrunner/RunResponse.java
deleted file mode 100644 (file)
index b97525b..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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 <http://www.gnu.org/licenses/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-package jalview.util.dialogrunner;
-
-/**
- * A Runnable that is kind of like a future, that allows a sequence of Runabbles
- * to be conditionally executed by DialogRunner
- * 
- * @author jprocter
- *
- */
-public abstract class RunResponse implements Runnable
-{
-  /**
-   * Response that triggers the Run method
-   */
-  Object trigger;
-
-  /**
-   * set by run() on exit
-   */
-  protected Object returnValue = null;
-
-  public RunResponse(Object onTrigger)
-  {
-    trigger = onTrigger;
-  }
-
-  public Object getTrigger() 
-  {
-   return trigger;
-  }
-  
-  public void reset()
-  {
-    returnValue = null;
-  }
-
-  @Override
-  public String toString()
-  {
-    return "Runner for " + trigger;
-  }
-  
-  public Object getReturnValue() 
-  {
-       return returnValue;
-  }
-  
-  public void setReturnValue(Object o) 
-  {
-       returnValue = o;
-  }
-}
index b24c599..c2d8129 100644 (file)
@@ -1,151 +1,4 @@
 package jalview.util.dialogrunner;
 
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-import org.testng.annotations.Test;
-
-import junit.extensions.PA;
-
 public class DialogRunnerTest
-{
-  public class MockDialog implements DialogRunnerI<MockDialog>
-  {
-    DialogRunnerI runner = new DialogRunner();
-
-    @Override
-    public DialogRunnerI addResponse(Object response, RunResponse action)
-    {
-      return runner.addResponse(response, action);
-    }
-
-    public List<RunResponse> doDialog(String resp)
-    {
-      return runner.handleResponse(resp);
-    }
-
-       @Override
-       public List<RunResponse> handleResponse(Object response) 
-       {
-         return null;
-       }
-  }
-
-  MockDialog dialog = new MockDialog();
-
-  @Test
-  public void testDialogRunner()
-  {
-    RunResponse ok, cancel, help, ineed;
-       final String ooh = "OOOOoooOOOOH!";
-       final String r_ok = "OK";
-       final String r_cancel = "CANCEL";
-       final String r_done = "DONE";
-       final String r_help = "HELP";
-       final String r_ddoit = "DIDNT DOIT";
-       final String r_needsb = "I NEED SOMEBODY";
-
-    ok = new RunResponse("OK")
-    {
-      @Override
-      public void run()
-      {
-        returnValue = "DONE";
-      }
-    };
-    final RunResponse befok = new RunResponse("OK")
-    {
-      @Override
-      public void run()
-      {
-         returnValue = "OK";
-      }
-    };
-
-    cancel = new RunResponse("CANCEL")
-    {
-      @Override
-      public void run()
-      {
-         returnValue = r_ddoit;
-      }
-    };
-    help = new RunResponse("HELP")
-    {
-      @Override
-      public void run()
-      {
-         returnValue = r_needsb;
-      }
-    };
-    ineed = new RunResponse(r_needsb)
-    {
-      @Override
-      public void run()
-      {
-         returnValue = ooh;
-      }
-    };
-
-    assertFalse(isRegistered(dialog.runner, ok));
-
-    dialog.addResponse("OK", ok).addResponse("CANCEL", cancel).
-        addResponse("HELP", help).addResponse(r_needsb, ineed);
-
-    assertTrue(isRegistered(dialog.runner, ok));
-
-//    Assert.assertFalse(dialog.runner.firstRunWasCalled);
-    List<RunResponse> actions = dialog.doDialog("OK");
-    // OK called, nothing else.
-  //  Assert.assertTrue(dialog.runner.firstRunWasCalled);
-    assertTrue(actions.contains(ok));//ok.wasRun);
-    assertEquals(ok.returnValue, r_done);
-    assertFalse(actions.contains(cancel));//cancel.wasRun);
-    assertEquals(actions/*dialog.runner.responses*/.size(), 2);
-
-    // do it again - check it doesn't trigger again
-    //ok.wasRun = false;
-    actions = dialog.doDialog("OK");
-    assertFalse(actions.contains(ok));
-
-    // reset - everything false/null
-//    dialog.runner.resetResponses();
-//    Assert.assertFalse(dialog.runner.firstRunWasCalled);
-//    Assert.assertFalse(ok.wasRun);
-//    Assert.assertNull(ok.returned);
-//    Assert.assertEquals(dialog.runner.responses.size(), 0);
-
-    // cancel called ..
-    actions = dialog.doDialog("HELP");
-//    Assert.assertTrue(dialog.runner.firstRunWasCalled);
-    assertFalse(actions.contains(ok));//ok.wasRun);
-    assertEquals(ineed.returnValue, ooh);
-    assertEquals(actions/*dialog.runner.responses*/.size(), 3);
-
-    // TODO: test prepend and chained execution of tasks for a response.
-//    Assert.assertFalse(dialog.runner.isRegistered(befok));
-    dialog.runner.addResponse("OK", befok); //setFirstResponse(befok);
-
-    assertTrue(isRegistered(dialog.runner, befok));
-    assertTrue(isRegistered(dialog.runner, ok));
-
-//    dialog.runner.resetResponses();
-
-    actions = dialog.doDialog("OK");
-    assertTrue(actions.contains(befok));//befok.wasRun);
-    assertTrue(actions.contains(ok)); //ok.wasRun);
-    assertEquals(actions/*dialog.runner.responses*/.size(), 3);
-  }
-
-  private boolean isRegistered(DialogRunnerI runner, RunResponse action) 
-  {
-       Map<Object, Collection<Object>> actions  = (Map<Object, Collection<Object>>) PA.getValue(runner,  "callbacks");
-       Collection<Object> registered = actions.get(action.getTrigger());
-       return registered != null && registered.contains(action);
-  }
-}
+{}
diff --git a/test/jalview/util/dialogrunner/RunResponseTest.java b/test/jalview/util/dialogrunner/RunResponseTest.java
deleted file mode 100644 (file)
index a8ae22e..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-package jalview.util.dialogrunner;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotEquals;
-import static org.testng.Assert.assertNull;
-
-import org.testng.annotations.Test;
-
-public class RunResponseTest
-{
-  @Test
-  public void testRunResponse()
-  {
-    RunResponse rr = new RunResponse("OK")
-    {
-      @Override
-      public void run()
-      {
-        returnValue = "DONE";
-      }
-    };
-    assertEquals(rr.trigger, "OK");
-    assertNotEquals(rr.trigger, "NOTOK");
-    assertNull(rr.returnValue);
-
-    assertEquals(rr.returnValue, "DONE");
-    rr.reset();
-    assertNull(rr.returnValue);
-
-    assertEquals(rr.toString(), "Runner for " + "OK");
-
-    // just test the other constructors
-    RunResponse rr12 = new RunResponse(12)
-    {
-      @Override
-      public void run()
-      {
-        returnValue = "DONE";
-      }
-    };
-    RunResponse rrpi = new RunResponse(new Double(3.142))
-    {
-      @Override
-      public void run()
-      {
-        returnValue = "DONE";
-      }
-    };
-    assertEquals(rr12.trigger, Integer.valueOf(12));
-    assertEquals(rrpi.trigger, Double.valueOf(3.142));
-}
-}
index a2026a8..4059c6a 100644 (file)
@@ -9,6 +9,7 @@ import java.awt.MediaTracker;
 import java.io.File;
 import java.text.DecimalFormat;
 import java.util.HashMap;
+import java.util.Locale;
 import java.util.Map;
 
 import javax.swing.ImageIcon;
@@ -35,9 +36,16 @@ public class JalviewJSTest extends JPanel
 {
   public static void main(String[] args)
   {
-    new JalviewJSTest().doTest2();
+    new JalviewJSTest().doTest3();
   }
 
+  void doTest3() 
+  {
+           System.out.println("Mungo".toLowerCase(Locale.getDefault()));
+           System.out.println("Mungo".toLowerCase(Locale.ENGLISH));
+    System.out.println("Mungo".toLowerCase(Locale.ROOT));
+  }
+  
   void doTest2() {
          Map<File, String> map = new HashMap<>();
          File f1 = new File("/var/folders/y/xyz");