JAL-1183 JAL-343 - use dialog queue for JABA warning dialog box and use html table...
[jalview.git] / src / jalview / gui / Desktop.java
index d6ab3ae..294beac 100644 (file)
@@ -59,11 +59,15 @@ import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.StringTokenizer;
 import java.util.Vector;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Semaphore;
 
 import javax.swing.DefaultDesktopManager;
 import javax.swing.DesktopManager;
@@ -79,6 +83,7 @@ import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JPopupMenu;
 import javax.swing.JProgressBar;
+import javax.swing.JTextArea;
 import javax.swing.SwingUtilities;
 import javax.swing.event.HyperlinkEvent;
 import javax.swing.event.MenuEvent;
@@ -326,19 +331,6 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     showConsole(showjconsole);
 
     showNews.setVisible(false);
-    final Desktop me = this;
-    // Thread off the news reader, in case there are connection problems.
-    new Thread( new Runnable() {
-      @Override
-      public void run()
-      {
-        Cache.log.debug("Starting news thread.");
-
-        jvnews = new BlogReader(me);
-        showNews.setVisible(true);
-        Cache.log.debug("Completed news thread.");
-      }
-    }).start();
     
     this.addWindowListener(new WindowAdapter()
     {
@@ -421,6 +413,22 @@ public class Desktop extends jalview.jbgui.GDesktop implements
             });
   }
 
+  public void checkForNews()
+  {
+    final Desktop me = this;
+    // Thread off the news reader, in case there are connection problems.
+    addDialogThread(new Runnable() {
+      @Override
+      public void run()
+      {
+        Cache.log.debug("Starting news thread.");
+
+        jvnews = new BlogReader(me);
+        showNews.setVisible(true);
+        Cache.log.debug("Completed news thread.");
+      }
+    });
+  }
   protected void showNews_actionPerformed(ActionEvent e)
   {
     showNews(showNews.isSelected());
@@ -1038,6 +1046,10 @@ public class Desktop extends jalview.jbgui.GDesktop implements
       storeLastKnownDimensions("JALVIEW_RSS_WINDOW_", jvnews.getBounds());
       
     }
+    if (dialogExecutor!=null)
+    {
+      dialogExecutor.shutdownNow();
+    }
       
     System.exit(0);
   }
@@ -2485,28 +2497,58 @@ public class Desktop extends jalview.jbgui.GDesktop implements
       {
         if (Cache.getDefault("SHOW_WSDISCOVERY_ERRORS", true))
         {
-        if (serviceChangedDialog == null)
-        {
-          // only run if we aren't already displaying one of these.
-          javax.swing.SwingUtilities
-                  .invokeLater(serviceChangedDialog = new Runnable()
+          if (serviceChangedDialog == null)
+          {
+            // only run if we aren't already displaying one of these.
+            addDialogThread(serviceChangedDialog = new Runnable()
+            {
+              public void run()
+              {
+
+                /*
+                JalviewDialog jd =new JalviewDialog() {
+                  @Override
+                  protected void cancelPressed()
                   {
-                    public void run()
-                    {
-
-                      JOptionPane
-                              .showInternalMessageDialog(
-                                      Desktop.desktop,
-                                      ermsg
-                                                + "It may be that you have invalid JABA URLs\nin your web service preferences.\n\nGo to the Web services tab of the\nTools->Preferences dialog box to change them.\n",
-                                      "Preferences Problem",
-                                      JOptionPane.WARNING_MESSAGE);
-                      serviceChangedDialog = null;
-
-                    }
-                  });
+                    // TODO Auto-generated method stub
+                    
+                  }@Override
+                  protected void okPressed()
+                  {
+                    // TODO Auto-generated method stub
+                    
+                  }@Override
+                  protected void raiseClosed()
+                  {
+                    // TODO Auto-generated method stub
+                    
+                  }
+                };
+                jd.initDialogFrame(new JLabel("<html><table width=\"450\"><tr><td>"
+                                        + ermsg
+                                        + "<br/>It may be that you have invalid JABA URLs in your web service preferences,"
+                                        + " or mis-configured HTTP proxy settings.<br/>"
+                                        + "Check the <em>Connections</em> and <em>Web services</em> tab of the"
+                                        + " Tools->Preferences dialog box to change them.</td></tr></table></html>"), true, true, "Web Service Configuration Problem", 450, 400);
+                
+                jd.waitForInput();
+                */
+                JOptionPane.showConfirmDialog(
+                        Desktop.desktop, 
+                        new JLabel("<html><table width=\"450\"><tr><td>"
+                                + ermsg+"</td></tr></table>"
+                                + "<p>It may be that you have invalid JABA URLs<br/>in your web service preferences,"
+                                + " or mis-configured HTTP proxy settings.</p>"
+                                + "<p>Check the <em>Connections</em> and <em>Web services</em> tab<br/>of the"
+                                + " Tools->Preferences dialog box to change them.</p></html>"), "Web Service Configuration Problem",
+                                JOptionPane.DEFAULT_OPTION,
+                        JOptionPane.ERROR_MESSAGE);
+                serviceChangedDialog = null;
+
+              }
+            });
+          }
         }
-      }
         else
         {
           Cache.log
@@ -2604,6 +2646,51 @@ public class Desktop extends jalview.jbgui.GDesktop implements
 
     }    
   }
+  /**
+   * single thread that handles display of dialogs to user.
+   */
+  ExecutorService dialogExecutor=Executors.newSingleThreadExecutor();
+  /**
+   * flag indicating if dialogExecutor should try to acquire a permit
+   */
+  private volatile boolean dialogPause=true;
+  /**
+   * pause the queue 
+   */
+  private java.util.concurrent.Semaphore block=new Semaphore(0);
+  
+  /**
+   * add another dialog thread to the queue
+   * @param prompter
+   */
+  public void addDialogThread(final Runnable prompter)
+  {
+    dialogExecutor.submit(new Runnable()
+    {
+      public void run()
+      {
+        if (dialogPause) {
+          try { block.acquire(); } catch (InterruptedException x){};
+        }
+        if (instance==null)
+        {
+          return;
+        }
+        try
+        {
+          SwingUtilities.invokeAndWait(prompter);
+        } catch (Exception q)
+        {
+          Cache.log.warn("Unexpected Exception in dialog thread.", q);
+        }
+      }
+    });
+  }
 
-
+  public void startDialogQueue()
+  {
+    // set the flag so we don't pause waiting for another permit and semaphore the current task to begin
+    dialogPause=false;
+    block.release();
+  }
 }