menu item and constructor to open a bunch of structures associated
authorjprocter <jprocter@compbio.dundee.ac.uk>
Sat, 9 Jul 2011 11:15:28 +0000 (12:15 +0100)
committerjprocter <jprocter@compbio.dundee.ac.uk>
Sat, 9 Jul 2011 11:15:28 +0000 (12:15 +0100)
with the current selection and align them in new Jmol window (JAL-860)

src/jalview/gui/AppJmol.java
src/jalview/gui/PopupMenu.java

index c292af3..a269860 100644 (file)
@@ -26,6 +26,7 @@ import java.awt.event.*;
 import java.io.*;
 
 import jalview.jbgui.GStructureViewer;
+import jalview.api.AlignmentViewPanel;
 import jalview.api.SequenceStructureBinding;
 import jalview.bin.Cache;
 import jalview.datamodel.*;
@@ -227,6 +228,13 @@ public class AppJmol extends GStructureViewer implements Runnable,
   }
   IProgressIndicator progressBar = null;
 
+  /**
+   * add a single PDB structure to a new or existing Jmol view
+   * @param pdbentry
+   * @param seq
+   * @param chains
+   * @param ap
+   */
   public AppJmol(PDBEntry pdbentry, SequenceI[] seq, String[] chains,
           AlignmentPanel ap)
   {
@@ -306,27 +314,41 @@ public class AppJmol extends GStructureViewer implements Runnable,
       }
     }
     // /////////////////////////////////
-
-    jmb = new AppJmolBinding(this, ap.getStructureSelectionManager(), new PDBEntry[]
-    { pdbentry }, new SequenceI[][]
-    { seq }, null, null);
+    openNewJmol(ap, new PDBEntry[] { pdbentry }, new SequenceI[][] { seq });
+  }
+  private void openNewJmol(AlignmentPanel ap, PDBEntry[] pdbentrys, SequenceI[][] seqs) {
+    boolean promptUser=pdbentrys.length==1;
+    progressBar = ap.alignFrame;
+    jmb = new AppJmolBinding(this, ap.getStructureSelectionManager(), pdbentrys, seqs, null, null);
     addAlignmentPanel(ap);
     useAlignmentPanelForColourbyseq(ap);
+    if (pdbentrys.length>1)
+    {
+      alignAddedStructures=true;
+      useAlignmentPanelForSuperposition(ap);
+    }
     jmb.setColourBySequence(true);
     setSize(400, 400); // probably should be a configurable/dynamic default here
     initMenus();
-
-    if (pdbentry.getFile() != null)
-    {
-      initJmol("load \"" + pdbentry.getFile() + "\"");
-    }
-    else
+    worker=null;
+    String filelist="";
+//    for (PDBEntry pe: pdbentrys)
+//    {
+//      if (pe.getFile()==null)
+      {
+        addingStructures = false;
+        worker = new Thread(this);
+        worker.start();
+//        break;
+      }
+//      filelist+=" \""+pe.getFile()+"\"";
+              
+/*    }
+    if (worker==null)
     {
-      addingStructures = false;
-      worker = new Thread(this);
-      worker.start();
+      initJmol("load"+(pdbentrys.length>1 ? " APPEND" : "") + filelist);
     }
-
+*/
     this.addInternalFrameListener(new InternalFrameAdapter()
     {
       public void internalFrameClosing(InternalFrameEvent internalFrameEvent)
@@ -338,6 +360,17 @@ public class AppJmol extends GStructureViewer implements Runnable,
   }
 
   /**
+   * create a new Jmol containing several structures superimposed using the given alignPanel.
+   * @param ap
+   * @param pe
+   * @param seqs
+   */
+  public AppJmol(AlignmentPanel ap, PDBEntry[] pe, SequenceI[][] seqs)
+  {
+    openNewJmol(ap, pe, seqs);
+  }
+
+  /**
    * list of sequenceSet ids associated with the view
    */
   ArrayList<String> _aps = new ArrayList();
@@ -747,6 +780,7 @@ public class AppJmol extends GStructureViewer implements Runnable,
               "Couldn't load file", JOptionPane.ERROR_MESSAGE);
 
     }
+    long lastnotify = jmb.getLoadNotifiesHandled();
     if (files.length() > 0)
     {
       if (!addingStructures)
@@ -772,7 +806,8 @@ public class AppJmol extends GStructureViewer implements Runnable,
         cmd.append("\nloadingJalviewdata=null");
         final String command = cmd.toString();
         cmd = null;
-        long lastnotify = jmb.getLoadNotifiesHandled();
+        lastnotify = jmb.getLoadNotifiesHandled();
+        
         try
         {
           jmb.evalStateCommand(command);
@@ -786,37 +821,40 @@ public class AppJmol extends GStructureViewer implements Runnable,
         {
           Cache.log.error("Couldn't add files to Jmol viewer!", ex);
         }
-        // need to wait around until script has finished
-        while (lastnotify >= jmb.getLoadNotifiesHandled())
-          ;
+      }
+    
+      // need to wait around until script has finished
+      while (addingStructures ? lastnotify >= jmb.getLoadNotifiesHandled()
+              : (jmb.isFinishedInit() && jmb.getPdbFile().length!=jmb.pdbentry.length))
+      {
+        try
         {
-          try
-          {
-            Thread.sleep(35);
-          } catch (Exception e)
-          {
-          }
-        }
-        // refresh the sequence colours for the new structure(s)
-        for (AlignmentPanel ap : _colourwith)
+          Cache.log.debug("Waiting around for jmb notify.");
+          Thread.sleep(35);
+        } catch (Exception e)
         {
-          jmb.updateColours(ap);
         }
-        // do superposition if asked to
-        if (alignAddedStructures)
+      }
+      // refresh the sequence colours for the new structure(s)
+      for (AlignmentPanel ap : _colourwith)
+      {
+        jmb.updateColours(ap);
+      }
+      // do superposition if asked to
+      if (alignAddedStructures)
+      {
+        javax.swing.SwingUtilities.invokeLater(new Runnable()
         {
-          javax.swing.SwingUtilities.invokeLater(new Runnable()
+          public void run()
           {
-            public void run()
-            {
-              alignStructs_withAllAlignPanels();
-              // jmb.superposeStructures(ap.av.getAlignment(), -1, null);
-            }
-          });
-          alignAddedStructures = false;
-        }
-        addingStructures = false;
+            alignStructs_withAllAlignPanels();
+            // jmb.superposeStructures(ap.av.getAlignment(), -1, null);
+          }
+        });
+        alignAddedStructures = false;
       }
+      addingStructures = false;
+
     }
     _started = false;
     worker = null;
index d44ecdf..30feec2 100644 (file)
@@ -21,6 +21,7 @@ import java.util.*;
 
 import java.awt.*;
 import java.awt.event.*;
+
 import javax.swing.*;
 
 import MCview.*;
@@ -228,33 +229,11 @@ public class PopupMenu extends JPopupMenu
           {
             public void actionPerformed(ActionEvent e)
             {
-              Vector seqs = new Vector();
-              for (int i = 0; i < ap.av.alignment.getHeight(); i++)
-              {
-                Vector pdbs = ap.av.alignment.getSequenceAt(i)
-                        .getDatasetSequence().getPDBId();
-                if (pdbs == null)
-                  continue;
-
-                for (int p = 0; p < pdbs.size(); p++)
-                {
-                  PDBEntry p1 = (PDBEntry) pdbs.elementAt(p);
-                  if (p1.getId().equals(pdb.getId()))
-                  {
-                    if (!seqs.contains(ap.av.alignment.getSequenceAt(i)))
-                      seqs.addElement(ap.av.alignment.getSequenceAt(i));
-
-                    continue;
-                  }
-                }
-              }
-
-              SequenceI[] seqs2 = new SequenceI[seqs.size()];
-              seqs.toArray(seqs2);
-
-              new AppJmol(pdb, seqs2, null, ap);
+               // TODO re JAL-860: optionally open dialog or provide a menu entry allowing user to open just one structure per sequence
+              new AppJmol(pdb, ap.av.collateForPDB(new PDBEntry[] { pdb })[0], null, ap);
               // new PDBViewer(pdb, seqs2, null, ap, AppletFormatAdapter.FILE);
             }
+
           });
           viewStructureMenu.add(menuItem);
 
@@ -406,6 +385,33 @@ public class PopupMenu extends JPopupMenu
       {
         buildGroupURLMenu(sg, groupLinks);
       }
+      // Add a 'show all structures' for the current selection
+      Hashtable<String, PDBEntry> pdbe=new Hashtable<String,PDBEntry>();
+      for (SequenceI sq: ap.av.getSequenceSelection())
+      {
+        Vector<PDBEntry> pes = (Vector<PDBEntry>) sq.getDatasetSequence().getPDBId();
+        if (pes!=null) {
+          for (PDBEntry pe: pes)
+          {
+            pdbe.put(pe.getId(),  pe);
+          }
+        }
+      }
+      if (pdbe.size()>0)
+      {
+        final PDBEntry[] pe = pdbe.values().toArray(new PDBEntry[pdbe.size()]);
+        final JMenuItem gpdbview;
+        structureMenu.add(gpdbview=new JMenuItem("View "+pdbe.size()+" structures."));
+        gpdbview.addActionListener(new ActionListener()
+        {
+          
+          @Override
+          public void actionPerformed(ActionEvent e)
+          {
+            new AppJmol(ap, pe, ap.av.collateForPDB(pe));
+          }
+        });
+      }
     }
     else
     {