enact on a boolean configuration option, prompting the user if the option has not...
authorjprocter <Jim Procter>
Tue, 13 Oct 2009 13:53:11 +0000 (13:53 +0000)
committerjprocter <Jim Procter>
Tue, 13 Oct 2009 13:53:11 +0000 (13:53 +0000)
src/jalview/gui/PromptUserConfig.java [new file with mode: 0644]

diff --git a/src/jalview/gui/PromptUserConfig.java b/src/jalview/gui/PromptUserConfig.java
new file mode 100644 (file)
index 0000000..de8a3d8
--- /dev/null
@@ -0,0 +1,206 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
+ * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * 
+ * This program 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 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+package jalview.gui;
+
+import jalview.bin.Cache;
+
+import java.awt.Component;
+import java.io.*;
+import java.net.*;
+
+import javax.swing.*;
+
+public class PromptUserConfig implements Runnable
+{
+  /**
+   * Given a boolean Cache option:
+   * 
+   * 1. Prompt the user with the given text if the option is unset, and
+   * set the option accordingly (yes/no==true/false). 
+   * 
+   * 2. Execute the given Runnables according to the state of the config option.
+   * 
+   */
+  /**
+   * boolean property to set
+   */
+  String property=null;
+  /**
+   * can the user cancel rather than set the property ?
+   */
+  boolean allowCancel = false;
+  /**
+   * title of prompt dialog
+   */
+  String dialogTitle;
+  /**
+   * text in dialog
+   */
+  String dialogText;
+  /**
+   * runnables for all cases.
+   */
+  Runnable iftrue=null,iffalse=null,ifundef=null;
+  private Component component;
+  /**
+   * if set, remove the property if the user says no rather than setting it to false.
+   */
+  private boolean removeifunset;
+  
+  /**
+   * @return the removeifunset
+   */
+  public boolean isRemoveifunset()
+  {
+    return removeifunset;
+  }
+  /**
+   * @param removeifunset the removeifunset to set
+   */
+  public void setRemoveifunset(boolean removeifunset)
+  {
+    this.removeifunset = removeifunset;
+  }
+  /**
+   * @param desktop - where the dialog box will be shown
+   * @param property - boolean property in jalview.bin.Cache
+   * @param dialogTitle - title of prompt box
+   * @param dialogText - text of box
+   * @param iftrue - executed if property is true
+   * @param iffalse - executed if property is false
+   * @param ifundef - executed if property was not set after prompting.
+   * @param allowCancel - allow the user to cancel rather than set the property
+   */
+  public PromptUserConfig(Component desktop, String property, String dialogTitle,
+          String dialogText, Runnable iftrue, Runnable iffalse,
+          Runnable ifundef, boolean allowCancel)
+  {
+    super();
+    this.component = desktop;
+    this.property = property;
+    this.dialogTitle = dialogTitle;
+    this.dialogText = dialogText;
+    this.iftrue = iftrue;
+    this.iffalse = iffalse;
+    this.ifundef = ifundef;
+    this.allowCancel = allowCancel;
+  }
+  public void run()
+  {
+    if (property==null) 
+    {
+      return;
+    }
+    // First - check to see if wee have an old questionnaire/response id pair.
+      String lastq = jalview.bin.Cache.getProperty(property);
+      
+      if (lastq == null)
+      {
+        raiseDialog();
+        Cache.log.debug("Got user response.");
+      }
+      lastq = jalview.bin.Cache.getProperty(property);
+      String extype = "";
+      Exception e = null;
+      if (lastq==null) {
+        // execute the ifundef
+        try
+        {
+          if (ifundef!=null)
+          {
+            ifundef.run();
+          }
+        } catch (Exception ex)
+        {
+          e = ex;
+          extype = "undefined";
+        }
+      } else if (Boolean.valueOf(lastq).booleanValue()) {
+        // execute the iftrue
+        try
+        {
+          if (iftrue!=null)
+          {
+            iftrue.run();
+          }
+        } catch (Exception ex)
+        {
+          e = ex;
+          extype = "if true";
+        }
+      } else {
+        try
+        {
+          if (iffalse!=null)
+          {
+            iffalse.run();
+          }
+        } catch (Exception ex)
+        {
+          e = ex;
+          extype = "if false";
+        }
+      }
+      // report any exceptions
+      if (e!=null) {
+        Cache.log.warn("Unexpected exception when executing the "+extype+" runnable for property "+property,e);
+      }
+  }
+  /**
+   * raise the property dialog
+   */
+  private void raiseDialog() {
+    if (jalview.bin.Cache.log.isDebugEnabled())
+    {
+      jalview.bin.Cache.log.debug("Prompting user for "+dialogTitle+" for Cache property "+property);
+    }
+    try {
+      int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop, // component,
+                dialogText,
+                dialogTitle,  (allowCancel) ? JOptionPane.YES_NO_CANCEL_OPTION : 
+                  JOptionPane.YES_NO_OPTION,
+                JOptionPane.QUESTION_MESSAGE); 
+      jalview.bin.Cache.log.debug("Got response : "+reply);
+      if (reply == JOptionPane.YES_OPTION)
+      {
+        jalview.bin.Cache.setProperty(property, "true");
+      } else
+        if (reply == JOptionPane.NO_OPTION) {
+          if (removeifunset)
+          {
+            jalview.bin.Cache.removeProperty(property);
+          } else {
+            jalview.bin.Cache.setProperty(property, "false");
+          }
+        } else
+        {
+          jalview.bin.Cache.log.debug("User cancelled setting " + property);
+          return;
+        }
+      // verify the property is set for debugging
+      if (jalview.bin.Cache.log.isDebugEnabled())
+      {
+        jalview.bin.Cache.log.debug("User set property to "+jalview.bin.Cache.getProperty(property));
+      }
+    } catch (Exception e)
+    {
+      jalview.bin.Cache.log.warn("Unexpected exception when prompting user for yes/no setting for property "+property, e);
+    }
+  }
+}