JAL-1588 restoring saved Chimera session(s)
[jalview.git] / src / jalview / gui / ChimeraViewFrame.java
index 4e313b5..8ebd231 100644 (file)
@@ -27,7 +27,6 @@ import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
 import jalview.ext.rbvi.chimera.JalviewChimeraBinding;
-import jalview.gui.Jalview2XML.ViewerData;
 import jalview.io.AppletFormatAdapter;
 import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
@@ -99,9 +98,11 @@ public class ChimeraViewFrame extends StructureViewerBase
   private Thread worker = null;
 
   /*
-   * Path to Chimera session file - set in saveSession()
+   * Path to Chimera session file. This is set when an open Jalview/Chimera
+   * session is saved, or on restore from a Jalview project (if it holds the
+   * filename of any saved Chimera sessions).
    */
-  private String chimeraSessionFile = "";
+  private String chimeraSessionFile = null;
 
   /**
    * Initialise menu options.
@@ -311,12 +312,11 @@ public class ChimeraViewFrame extends StructureViewerBase
     jmb.setColourBySequence(true);
     setSize(400, 400); // probably should be a configurable/dynamic default here
     initMenus();
-    worker = null;
-    {
-      addingStructures = false;
-      worker = new Thread(this);
-      worker.start();
-    }
+
+    addingStructures = false;
+    worker = new Thread(this);
+    worker.start();
+
     this.addInternalFrameListener(new InternalFrameAdapter()
     {
       public void internalFrameClosing(InternalFrameEvent internalFrameEvent)
@@ -343,20 +343,37 @@ public class ChimeraViewFrame extends StructureViewerBase
   }
 
   /**
-   * Create a new viewer from saved session state data.
+   * Create a new viewer from saved session state data including Chimera session
+   * file.
+   * 
+   * @param chimeraSession
    * 
-   * @param viewerData
-   * @param af
+   * @param alignPanel
+   * @param pdbArray
+   * @param seqsArray
+   * @param colourByChimera
+   * @param colourBySequence
    */
-  public ChimeraViewFrame(ViewerData viewerData, AlignFrame af)
+  public ChimeraViewFrame(String chimeraSession, AlignmentPanel alignPanel,
+          PDBEntry[] pdbArray,
+          SequenceI[][] seqsArray, boolean colourByChimera,
+          boolean colourBySequence)
   {
     super();
-    String chimeraSessionFile = viewerData.stateData;
-    openNewChimera(af.alignPanel, new PDBEntry[]
-    {}, new SequenceI[][]
-    {});
-    initChimera("open " + chimeraSessionFile);
-    // TODO restore mappings
+    this.chimeraSessionFile = chimeraSession;
+    openNewChimera(alignPanel, pdbArray, seqsArray);
+    if (colourByChimera)
+    {
+      jmb.setColourBySequence(false);
+      seqColour.setSelected(false);
+      viewerColour.setSelected(true);
+    }
+    else if (colourBySequence)
+    {
+      jmb.setColourBySequence(true);
+      seqColour.setSelected(true);
+      viewerColour.setSelected(false);
+    }
   }
 
   /**
@@ -433,18 +450,31 @@ public class ChimeraViewFrame extends StructureViewerBase
     return result;
   }
 
-  void initChimera(String command)
+  /**
+   * Launch Chimera. If we have a chimera session file name, send Chimera the
+   * command to open its saved session file.
+   */
+  void initChimera()
   {
     jmb.setFinishedInit(false);
-    // TODO: consider waiting until the structure/view is fully loaded before
-    // displaying
     jalview.gui.Desktop.addInternalFrame(this, jmb.getViewerTitle("Chimera", true),
             getBounds().width, getBounds().height);
-    if (command == null)
+
+    /*
+     * Pass an empty 'command' to launch Chimera
+     */
+    jmb.evalStateCommand("", false);
+
+    if (this.chimeraSessionFile != null)
     {
-      command = "";
+      boolean opened = jmb.openSession(chimeraSessionFile);
+      if (!opened)
+      {
+        System.err
+                .println("An error occurred opening Chimera session file "
+                        + chimeraSessionFile);
+      }
     }
-    jmb.evalStateCommand(command, false);
     jmb.setFinishedInit(true);
   }
 
@@ -625,7 +655,7 @@ public class ChimeraViewFrame extends StructureViewerBase
       {
         try
         {
-          initChimera("");
+          initChimera();
         } catch (Exception ex)
         {
           Cache.log.error("Couldn't open Chimera viewer!", ex);
@@ -986,7 +1016,7 @@ public class ChimeraViewFrame extends StructureViewerBase
       repaint();
       return;
     }
-    setChainMenuItems(jmb.chainNames);
+    setChainMenuItems(jmb.getChainNames());
 
     this.setTitle(jmb.getViewerTitle("Chimera", true));
     if (jmb.getPdbFile().length > 1 && jmb.getSequence().length > 1)