JAL-3619 fix up warning message and minimal patch to make sure failed-to-launch viewe...
[jalview.git] / src / jalview / gui / PymolViewer.java
index 98582b2..3b6ea99 100644 (file)
@@ -1,18 +1,24 @@
 package jalview.gui;
 
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import javax.swing.JInternalFrame;
+import javax.swing.JMenuItem;
 import javax.swing.event.InternalFrameAdapter;
 import javax.swing.event.InternalFrameEvent;
 
 import jalview.api.AlignmentViewPanel;
 import jalview.api.FeatureRenderer;
-import jalview.bin.Cache;
+import jalview.bin.Console;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
+import jalview.datamodel.StructureViewerModel;
+import jalview.datamodel.StructureViewerModel.StructureData;
 import jalview.gui.StructureViewer.ViewerType;
 import jalview.io.DataSourceType;
 import jalview.io.StructureFile;
@@ -68,22 +74,36 @@ public class PymolViewer extends StructureViewerBase
    * @param colourBySequence
    * @param newViewId
    */
-  public PymolViewer(String sessionFile, AlignmentPanel alignPanel,
-          PDBEntry[] pdbArray, SequenceI[][] seqsArray,
-          boolean colourByPymol, boolean colourBySequence, String newViewId)
+  public PymolViewer(StructureViewerModel viewerModel,
+          AlignmentPanel alignPanel, String sessionFile, String vid)
   {
     // TODO convert to base/factory class method
     this();
-    setViewId(newViewId);
+    setViewId(vid);
     this.pymolSessionFile = sessionFile;
+    Map<File, StructureData> pdbData = viewerModel.getFileData();
+    PDBEntry[] pdbArray = new PDBEntry[pdbData.size()];
+    SequenceI[][] seqsArray = new SequenceI[pdbData.size()][];
+    int i = 0;
+    for (StructureData data : pdbData.values())
+    {
+      PDBEntry pdbentry = new PDBEntry(data.getPdbId(), null,
+              PDBEntry.Type.PDB, data.getFilePath());
+      pdbArray[i] = pdbentry;
+      List<SequenceI> sequencesForPdb = data.getSeqList();
+      seqsArray[i] = sequencesForPdb
+              .toArray(new SequenceI[sequencesForPdb.size()]);
+      i++;
+    }
+
     openNewPymol(alignPanel, pdbArray, seqsArray);
-    if (colourByPymol)
+    if (viewerModel.isColourByViewer())
     {
       binding.setColourBySequence(false);
       seqColour.setSelected(false);
       viewerColour.setSelected(true);
     }
-    else if (colourBySequence)
+    else if (viewerModel.isColourWithAlignPanel())
     {
       binding.setColourBySequence(true);
       seqColour.setSelected(true);
@@ -190,7 +210,9 @@ public class PymolViewer extends StructureViewerBase
           initPymol();
         } catch (Exception ex)
         {
-          Cache.log.error("Couldn't open PyMOL viewer!", ex);
+          Console.error("Couldn't open PyMOL viewer!", ex);
+          // if we couldn't open Pymol, no point continuing
+          return;
         }
       }
       int num = -1;
@@ -229,12 +251,12 @@ public class PymolViewer extends StructureViewerBase
             binding.stashFoundChains(pdb, pe.getFile());
           } catch (Exception ex)
           {
-            Cache.log.error(
+            Console.error(
                     "Couldn't open " + pe.getFile() + " in Chimera viewer!",
                     ex);
           } finally
           {
-            // Cache.log.debug("File locations are " + files);
+            // Cache.debug("File locations are " + files);
           }
         }
       }
@@ -294,6 +316,7 @@ public class PymolViewer extends StructureViewerBase
                       getViewerName()),
               MessageManager.getString("label.error_loading_file"),
               JvOptionPane.ERROR_MESSAGE);
+      binding.closeViewer(true);
       this.dispose();
       return;
     }
@@ -303,7 +326,8 @@ public class PymolViewer extends StructureViewerBase
       boolean opened = binding.openSession(pymolSessionFile);
       if (!opened)
       {
-        System.err.println("An error occurred opening PyMOL session file "
+        Console.error(
+                "An error occurred opening PyMOL session file "
                 + pymolSessionFile);
       }
     }
@@ -327,5 +351,42 @@ public class PymolViewer extends StructureViewerBase
   {
     return "PyMOL";
   }
+  JMenuItem writeFeatures = null;
+  @Override
+  protected void initMenus()
+  {
+    super.initMenus();
+
+    savemenu.setVisible(false); // not yet implemented
+    viewMenu.add(fitToWindow);
+
+    writeFeatures = new JMenuItem(
+            MessageManager.getString("label.create_viewer_attributes"));
+    writeFeatures.setToolTipText(MessageManager
+            .getString("label.create_viewer_attributes_tip"));
+    writeFeatures.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        sendFeaturesToPymol();
+      }
+    });
+    viewerActionMenu.add(writeFeatures);
+  }
+  
+  @Override
+  protected void buildActionMenu()
+  {
+    super.buildActionMenu();
+    viewerActionMenu.add(writeFeatures);
+  }
+
+  protected void sendFeaturesToPymol()
+  {
+    int count = binding.sendFeaturesToViewer(getAlignmentPanel());
+    statusBar.setText(
+            MessageManager.formatMessage("label.attributes_set", count, getViewerName())); 
+  }
 
 }