choose a particular vamsas session, load, or create a new session and export the...
[jalview.git] / src / jalview / gui / Desktop.java
index 7927df9..10d2d43 100755 (executable)
@@ -27,6 +27,8 @@ import java.lang.reflect.Constructor;
 import java.util.*;
 
 import javax.swing.*;
+import javax.swing.event.MenuEvent;
+import javax.swing.event.MenuListener;
 
 /**
  * DOCUMENT ME!
@@ -131,8 +133,34 @@ public class Desktop
   {
     if (jalview.bin.Cache.vamsasJarsPresent())
     {
+      setupVamsasDisconnectedGui();
       VamsasMenu.setVisible(true);
-      vamsasLoad.setVisible(true);
+      final Desktop us = this;
+      VamsasMenu.addMenuListener(new MenuListener() {
+        // this listener remembers when the menu was first selected, and
+        // doesn't rebuild the session list until it has been cleared and
+        // reselected again.
+        boolean refresh=true;
+        public void menuCanceled(MenuEvent e)
+        {
+          refresh=true;
+        }
+
+        public void menuDeselected(MenuEvent e)
+        {
+          refresh = true;
+        }
+
+        public void menuSelected(MenuEvent e)
+        {
+          if (refresh)
+          {
+            us.buildVamsasStMenu();
+            refresh=false;
+          }
+        }
+      });
+      vamsasStart.setVisible(true);
     }
   }
 
@@ -914,7 +942,39 @@ public class Desktop
   }
 
   jalview.gui.VamsasApplication v_client = null;
-  public void vamsasLoad_actionPerformed(ActionEvent e)
+  public void vamsasImport_actionPerformed(ActionEvent e)
+  {
+    if (v_client==null)
+    {
+      // Load and try to start a session.
+      JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
+          getProperty("LAST_DIRECTORY"));
+
+      chooser.setFileView(new JalviewFileView());
+      chooser.setDialogTitle("Open a saved VAMSAS session");
+      chooser.setToolTipText("select a vamsas session to be opened as a new vamsas session.");
+
+      int value = chooser.showOpenDialog(this);
+
+      if (value == JalviewFileChooser.APPROVE_OPTION)
+      {
+        try {
+          v_client = new jalview.gui.VamsasApplication(this,
+                                                chooser.getSelectedFile());
+        } catch (Exception ex)
+        {
+          jalview.bin.Cache.log.error("New vamsas session from existing session file failed:",ex);
+          return;
+        }
+        setupVamsasConnectedGui();
+        v_client.initial_update(); // TODO: thread ?
+      }
+    }else {
+      jalview.bin.Cache.log.error("Implementation error - load session from a running session is not supported.");
+    }
+  }
+
+  public void vamsasStart_actionPerformed(ActionEvent e)
   {
     if (v_client == null)
     {
@@ -937,28 +997,94 @@ public class Desktop
                                                 *
                                                 */
       v_client = new VamsasApplication(this);
-      vamsasLoad.setText("Session Update");
-      vamsasStop.setVisible(true);
-      v_client.initial_update();
+      setupVamsasConnectedGui();
+      v_client.initial_update(); // TODO: thread ?
     }
     else
     {
       // store current data in session.
-      v_client.push_update();
+      v_client.push_update(); // TODO: thread
     }
   }
 
+  protected void setupVamsasConnectedGui()
+  {
+    vamsasStart.setText("Session Update");
+    vamsasSave.setVisible(true);
+    vamsasStop.setVisible(true);
+    vamsasImport.setVisible(true);
+  }
+  protected void setupVamsasDisconnectedGui()
+  {
+    vamsasSave.setVisible(false);
+    vamsasStop.setVisible(false);
+    vamsasImport.setVisible(true);
+    vamsasStart.setText("New Vamsas Session...");
+  }
+
   public void vamsasStop_actionPerformed(ActionEvent e)
   {
     if (v_client != null)
     {
       v_client.end_session();
       v_client = null;
-      this.vamsasStop.setVisible(false);
-      this.vamsasLoad.setText("Start Vamsas Session...");
+      setupVamsasDisconnectedGui();
     }
   }
+  protected void buildVamsasStMenu()
+  {
+    if (v_client == null)
+    {
+      String[] sess = null;
+      try
+      {
+        sess = VamsasApplication.getSessionList();
+      } catch (Exception e)
+      {
+        jalview.bin.Cache.log.warn(
+                "Problem getting current sessions list.", e);
+        sess = null;
+      }
+      if (sess != null)
+      {
+        jalview.bin.Cache.log.debug("Got current sessions list: "
+                + sess.length + " entries.");
+        VamsasStMenu.removeAll();
+        for (int i = 0; i < sess.length; i++)
+        {
+          JMenuItem sessit = new JMenuItem();
+          sessit.setText(sess[i]);
+          sessit.setToolTipText("Connect to session " + sess[i]);
+          final Desktop dsktp = this;
+          final String mysesid = sess[i];
+          sessit.addActionListener(new ActionListener()
+          {
 
+            public void actionPerformed(ActionEvent e)
+            {
+              if (dsktp.v_client == null)
+              {
+                dsktp.v_client = new VamsasApplication(dsktp, mysesid);
+                dsktp.setupVamsasConnectedGui();
+                dsktp.v_client.initial_update();
+              }
+            };
+          });
+          VamsasStMenu.add(sessit);
+        }
+        VamsasStMenu.setVisible(true);
+      }
+      else
+      {
+        jalview.bin.Cache.log.debug("No current vamsas sessions.");
+        VamsasStMenu.removeAll();
+        VamsasStMenu.setVisible(false);
+      }
+    } else {
+      // Not interested in the content. Just hide ourselves.
+      VamsasStMenu.setVisible(false);
+    }
+  }
   public void vamsasSave_actionPerformed(ActionEvent e)
   {
     if (v_client != null)
@@ -1016,9 +1142,9 @@ public class Desktop
   {
     jalview.bin.Cache.log.debug("Setting gui for Vamsas update " +
                                 (b ? "in progress" : "finished"));
-    vamsasLoad.setVisible(!b);
+    vamsasStart.setVisible(!b);
     vamsasStop.setVisible(!b);
-
+    vamsasSave.setVisible(!b);
   }
 
   public JInternalFrame[] getAllFrames()