(JAL-957) change splash screen and about to HTML text, and author list now stored...
[jalview.git] / src / jalview / gui / Desktop.java
index 9797694..01a7e69 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
- * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
+ * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
  * 
  * This file is part of Jalview.
  * 
 package jalview.gui;
 
 import jalview.bin.Cache;
-import jalview.io.*;
+import jalview.io.FileLoader;
+import jalview.io.FormatAdapter;
+import jalview.io.IdentifyFile;
+import jalview.io.JalviewFileChooser;
+import jalview.io.JalviewFileView;
 import jalview.ws.params.ParamManager;
 
-import java.awt.*;
-import java.awt.datatransfer.*;
-import java.awt.dnd.*;
-import java.awt.event.*;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.GridLayout;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.ClipboardOwner;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.dnd.DnDConstants;
+import java.awt.dnd.DropTargetDragEvent;
+import java.awt.dnd.DropTargetDropEvent;
+import java.awt.dnd.DropTargetEvent;
+import java.awt.dnd.DropTargetListener;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyVetoException;
 import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
-import java.io.InputStream;
 import java.lang.reflect.Constructor;
 import java.net.URL;
-import java.net.URLConnection;
-import java.nio.channels.ReadableByteChannel;
-import java.util.*;
-
-import javax.swing.*;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
+import javax.swing.DefaultDesktopManager;
+import javax.swing.DesktopManager;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JDesktopPane;
+import javax.swing.JFrame;
+import javax.swing.JInternalFrame;
+import javax.swing.JLabel;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JProgressBar;
+import javax.swing.SwingUtilities;
 import javax.swing.event.MenuEvent;
 import javax.swing.event.MenuListener;
 
@@ -57,6 +97,11 @@ public class Desktop extends jalview.jbgui.GDesktop implements
   private JalviewChangeSupport changeSupport = new JalviewChangeSupport();
 
   /**
+   * news reader - null if it was never started.
+   */
+  private BlogReader jvnews=null;
+
+  /**
    * @param listener
    * @see jalview.gui.JalviewChangeSupport#addJalviewPropertyChangeListener(java.beans.PropertyChangeListener)
    */
@@ -267,6 +312,21 @@ 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()
     {
       public void windowClosing(WindowEvent evt)
@@ -285,7 +345,24 @@ public class Desktop extends jalview.jbgui.GDesktop implements
         }
       }
     });
-
+    this.addFocusListener(new FocusListener()
+    {
+      
+      @Override
+      public void focusLost(FocusEvent e)
+      {
+        // TODO Auto-generated method stub
+        
+      }
+      
+      @Override
+      public void focusGained(FocusEvent e)
+      {
+        Cache.log.debug("Relaying windows after focus gain");
+        // make sure that we sort windows properly after we gain focus
+        instance.relayerWindows();
+      }
+    });
     this.setDropTarget(new java.awt.dnd.DropTarget(desktop, this));
     // Spawn a thread that shows the splashscreen
     SwingUtilities.invokeLater(new Runnable()
@@ -328,6 +405,32 @@ public class Desktop extends jalview.jbgui.GDesktop implements
             });
   }
 
+  protected void showNews_actionPerformed(ActionEvent e)
+  {
+    showNews(showNews.isSelected());
+  }
+  void showNews(boolean visible)
+  {
+    {
+      Cache.log.debug((visible?"Showing":"Hiding")+" news.");
+      showNews.setSelected(visible);
+      if (visible && !jvnews.isVisible())
+      {
+        new Thread(new Runnable() {
+          @Override
+          public void run()
+          {
+            long instance=System.currentTimeMillis();
+            Desktop.instance.setProgressBar("Refreshing news", instance);
+            jvnews.refreshNews();
+            Desktop.instance.setProgressBar(null, instance);
+            jvnews.showNews();
+          }
+        }).start();
+      }
+    }
+  }
+
   /**
    * recover the last known dimensions for a jalview window
    * 
@@ -914,6 +1017,12 @@ public class Desktop extends jalview.jbgui.GDesktop implements
       storeLastKnownDimensions("JAVA_CONSOLE_", jconsole.getBounds());
       jconsole.stopConsole();
     }
+    if (jvnews!=null)
+    {
+      storeLastKnownDimensions("JALVIEW_RSS_WINDOW_", jvnews.getBounds());
+      
+    }
+      
     System.exit(0);
   }
 
@@ -937,30 +1046,63 @@ public class Desktop extends jalview.jbgui.GDesktop implements
    */
   public void aboutMenuItem_actionPerformed(ActionEvent e)
   {
-    StringBuffer message = new StringBuffer("Jalview version "
+    StringBuffer message = getAboutMessage(false);
+    JOptionPane.showInternalMessageDialog(Desktop.desktop,
+
+    message.toString(), "About Jalview", JOptionPane.INFORMATION_MESSAGE);
+  }
+  public StringBuffer getAboutMessage(boolean shortv)
+  {
+    StringBuffer message=new StringBuffer();
+    message.append("<html>");
+    if (shortv)
+    { 
+      message.append("<h1><strong>Jalview "
+              + jalview.bin.Cache.getProperty("VERSION") + "</strong></h1><br>");
+      message.append("<strong>Last Updated: <em>"+jalview.bin.Cache.getDefault("BUILD_DATE", "unknown")+"</em></strong>");
+      
+    } else {
+      
+    message.append("<strong>Jalview version "
             + jalview.bin.Cache.getProperty("VERSION") + "; last updated: "
             + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown"));
-
-    if (!jalview.bin.Cache.getProperty("LATEST_VERSION").equals(
-            jalview.bin.Cache.getProperty("VERSION")))
+    }
+    
+    if (jalview.bin.Cache.getDefault("LATEST_VERSION", "Checking").equals(
+            "Checking"))
     {
-      message.append("\n\n!! Jalview version "
-              + jalview.bin.Cache.getProperty("LATEST_VERSION")
-              + " is available for download from http://www.jalview.org !!\n");
-
+      message.append("<br>...Checking latest version...</br>");
     }
-    // TODO: update this text for each release or centrally store it for lite
-    // and application
-    message.append("\nAuthors:  Jim Procter, Jan Engelhardt, Lauren Lui, Andrew Waterhouse, Michele Clamp, James Cuff, Steve Searle,\n    David Martin & Geoff Barton."
-            + "\nDevelopment managed by The Barton Group, University of Dundee, Scotland, UK.\n"
-            + "\nFor help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list\n"
-            + "\nIf  you use Jalview, please cite:"
-            + "\nWaterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)"
-            + "\nJalview Version 2 - a multiple sequence alignment editor and analysis workbench"
-            + "\nBioinformatics doi: 10.1093/bioinformatics/btp033");
-    JOptionPane.showInternalMessageDialog(Desktop.desktop,
-
-    message.toString(), "About Jalview", JOptionPane.INFORMATION_MESSAGE);
+    else if (!jalview.bin.Cache.getDefault("LATEST_VERSION", "Checking")
+            .equals(jalview.bin.Cache.getProperty("VERSION")))
+    {
+      boolean red=false;
+      if (jalview.bin.Cache.getProperty("VERSION").toLowerCase()
+              .indexOf("automated build") == -1)
+      {
+        red=true;
+        // Displayed when code version and jnlp version do not match and code
+        // version is not a development build
+        message.append("<div style=\"color: #FF0000;font-style: bold;\">");
+      }
+      
+      message.append("<br>!! Jalview version "
+                      + jalview.bin.Cache.getDefault("LATEST_VERSION",
+                              "..Checking..")
+                      + " is available for download from "+jalview.bin.Cache.getDefault("www.jalview.org","http://www.jalview.org")+" !!");
+      if (red) {
+        message.append("</div>");
+      }
+    }    
+    message.append("<br>Authors:  "+jalview.bin.Cache.getDefault("AUTHORNAMES","Jim Procter, Andrew Waterhouse, Jan Engelhardt, Lauren Lui, Michele Clamp, James Cuff, Steve Searle, David Martin & Geoff Barton")
+            + "<br>Development managed by The Barton Group, University of Dundee, Scotland, UK.<br>"
+            + "<br>For help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list"
+            + "<br>If  you use Jalview, please cite:"
+            + "<br>Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)"
+            + "<br>Jalview Version 2 - a multiple sequence alignment editor and analysis workbench"
+            + "<br>Bioinformatics doi: 10.1093/bioinformatics/btp033"
+            + "</html>");
+    return message;
   }
 
   /**
@@ -1270,44 +1412,47 @@ public class Desktop extends jalview.jbgui.GDesktop implements
   }
 
   JPanel progressPanel;
-
+  ArrayList<JPanel> fileLoadingPanels=new ArrayList<JPanel>();
   public void startLoading(final String fileName)
   {
     if (fileLoadingCount == 0)
     {
-      addProgressPanel("Loading File: " + fileName + "   ");
-
+      fileLoadingPanels.add(addProgressPanel("Loading File: " + fileName + "   "));
     }
     fileLoadingCount++;
   }
 
-  private JProgressBar addProgressPanel(String string)
+  private JPanel addProgressPanel(String string)
   {
     if (progressPanel == null)
     {
-      progressPanel = new JPanel(new BorderLayout());
+      progressPanel = new JPanel(new GridLayout(1,1));
       totalProgressCount = 0;
+      instance.getContentPane().add(progressPanel, BorderLayout.SOUTH);
     }
+    JPanel thisprogress=new JPanel(new BorderLayout(10,5));
     JProgressBar progressBar = new JProgressBar();
     progressBar.setIndeterminate(true);
 
-    progressPanel.add(new JLabel(string), BorderLayout.WEST);
-
-    progressPanel.add(progressBar, BorderLayout.CENTER);
+    thisprogress.add(new JLabel(string), BorderLayout.WEST);
 
-    instance.getContentPane().add(progressPanel, BorderLayout.SOUTH);
-    totalProgressCount++;
-    validate();
-    return progressBar;
+    thisprogress.add(progressBar, BorderLayout.CENTER);
+    progressPanel.add(thisprogress);
+    ((GridLayout)progressPanel.getLayout()).setRows(((GridLayout)progressPanel.getLayout()).getRows()+1);
+    ++totalProgressCount;
+    instance.validate();
+    return thisprogress;
   }
 
   int totalProgressCount = 0;
 
-  private void removeProgressPanel(JProgressBar progbar)
+  private void removeProgressPanel(JPanel progbar)
   {
     if (progressPanel != null)
     {
       progressPanel.remove(progbar);
+      GridLayout gl = (GridLayout) progressPanel.getLayout();
+      gl.setRows(gl.getRows()-1);
       if (--totalProgressCount < 1)
       {
         this.getContentPane().remove(progressPanel);
@@ -1322,11 +1467,11 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     fileLoadingCount--;
     if (fileLoadingCount < 1)
     {
-      if (progressPanel != null)
+      for (JPanel flp : fileLoadingPanels)
       {
-        this.getContentPane().remove(progressPanel);
-        progressPanel = null;
+        removeProgressPanel(flp);
       }
+      fileLoadingPanels.clear();
       fileLoadingCount = 0;
     }
     validate();
@@ -1773,7 +1918,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
       if (value == JalviewFileChooser.APPROVE_OPTION)
       {
         java.io.File choice = chooser.getSelectedFile();
-        JProgressBar progpanel = addProgressPanel("Saving VAMSAS Document to "
+        JPanel progpanel = addProgressPanel("Saving VAMSAS Document to "
                 + choice.getName());
         jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());
         String warnmsg = null;
@@ -1807,7 +1952,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     }
   }
 
-  JProgressBar vamUpdate = null;
+  JPanel vamUpdate = null;
 
   /**
    * hide vamsas user gui bits when a vamsas document event is being handled.
@@ -1943,6 +2088,14 @@ public class Desktop extends jalview.jbgui.GDesktop implements
 
   }
 
+  /**
+   * fixes stacking order after a modal dialog to ensure windows that should be on top actually are
+   */
+  public void relayerWindows()
+  {
+    
+  }
+
   protected JMenuItem groovyShell;
 
   public void doGroovyCheck()
@@ -2079,7 +2232,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements
   /**
    * Progress bars managed by the IProgressIndicator method.
    */
-  private Hashtable progressBars, progressBarHandlers;
+  private Hashtable<Long,JPanel> progressBars;
+  private Hashtable<Long,IProgressIndicatorHandler> progressBarHandlers;
 
   /*
    * (non-Javadoc)
@@ -2090,13 +2244,13 @@ public class Desktop extends jalview.jbgui.GDesktop implements
   {
     if (progressBars == null)
     {
-      progressBars = new Hashtable();
-      progressBarHandlers = new Hashtable();
+      progressBars = new Hashtable<Long,JPanel>();
+      progressBarHandlers = new Hashtable<Long,IProgressIndicatorHandler>();
     }
 
     if (progressBars.get(new Long(id)) != null)
     {
-      JProgressBar progressPanel = (JProgressBar) progressBars
+      JPanel progressPanel = progressBars
               .remove(new Long(id));
       if (progressBarHandlers.contains(new Long(id)))
       {
@@ -2217,7 +2371,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements
       // register PCS handler for desktop.
       discoverer.addPropertyChangeListener(changeSupport);
     }
-    if (Cache.getDefault("SHOW_JWS1_SERVICES", true))
+    // JAL-940 - disabled JWS1 service configuration - always start discoverer until we phase out completely
+    if (true)
     {
       (t0 = new Thread(discoverer)).start();
     }