Further structure accessing feature
[jalview.git] / src / jalview / gui / PopupMenu.java
old mode 100755 (executable)
new mode 100644 (file)
index 9a0def1..8197688
@@ -21,6 +21,7 @@ import java.util.*;
 
 import java.awt.*;
 import java.awt.event.*;
+
 import javax.swing.*;
 
 import MCview.*;
@@ -37,7 +38,7 @@ import jalview.util.UrlLink;
  * DOCUMENT ME!
  * 
  * @author $author$
- * @version $Revision$
+ * @version $Revision: 1.118 $
  */
 public class PopupMenu extends JPopupMenu
 {
@@ -68,6 +69,10 @@ public class PopupMenu extends JPopupMenu
   protected JRadioButtonMenuItem PIDColour = new JRadioButtonMenuItem();
 
   protected JRadioButtonMenuItem BLOSUM62Colour = new JRadioButtonMenuItem();
+  
+  protected JRadioButtonMenuItem purinePyrimidineColour = new JRadioButtonMenuItem();
+  
+  //protected JRadioButtonMenuItem covariationColour = new JRadioButtonMenuItem();
 
   JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem();
 
@@ -182,6 +187,8 @@ public class PopupMenu extends JPopupMenu
     colours.add(userDefinedColour);
     colours.add(PIDColour);
     colours.add(BLOSUM62Colour);
+    colours.add(purinePyrimidineColour);
+    //colours.add(covariationColour);
 
     for (int i = 0; i < jalview.io.FormatAdapter.WRITEABLE_FORMATS.length; i++)
     {
@@ -228,33 +235,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);
 
@@ -268,10 +253,40 @@ public class PopupMenu extends JPopupMenu
         }
       }
       else
-      {
-        structureMenu.remove(viewStructureMenu);
+      {          
+        //JAN structureMenu.remove(viewStructureMenu);
         // structureMenu.remove(colStructureMenu);
       }
+      
+      //if(seq.getAnnotation()[0].annotations[0].secondaryStructure == 'S'){
+      //TODO: Something to check if it's an RNA
+         //like: if(seq.getAnnotation()[0].annotations[0].secondaryStructure == 'S')
+         final SequenceI seqI = seq.getDatasetSequence();
+         AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();
+       
+
+         //for(int i=0; i<aa.length;i++){
+         final String rnastruc=aa[0].getRNAStruc();
+                 if(aa[0]._rnasecstr != null){
+                         System.out.println("Is RNA: "+aa[0].getRNAStruc()+" "+aa.length);
+                         
+                 }             
+         
+         menuItem = new JMenuItem();
+         menuItem.setText("RNA structure");
+      menuItem.addActionListener(new java.awt.event.ActionListener()
+      {
+        public void actionPerformed(ActionEvent e)
+        {
+               System.out.println("Call Varna "+seqI.getSequenceAsString()+" "+seqI.getName());
+               new AppVarna(seqI.getSequenceAsString(),rnastruc,seqI.getName());
+               
+        }
+      });        
+      viewStructureMenu.add(menuItem);
+         
+      //}
+     
 
       menuItem = new JMenuItem("Hide Sequences");
       menuItem.addActionListener(new java.awt.event.ActionListener()
@@ -341,7 +356,8 @@ public class PopupMenu extends JPopupMenu
 
     if (sg != null)
     {
-      groupName.setText(sg.getName());
+      groupName.setText("Name: "+sg.getName());
+      groupName.setText("Edit name and description of current group.");
 
       if (sg.cs instanceof ZappoColourScheme)
       {
@@ -387,6 +403,14 @@ public class PopupMenu extends JPopupMenu
       {
         clustalColour.setSelected(true);
       }
+      else if (sg.cs instanceof PurinePyrimidineColourScheme)
+      {
+       purinePyrimidineColour.setSelected(true);
+      }
+     /* else if (sg.cs instanceof CovariationColourScheme)
+      {
+       covariationColour.setSelected(true);
+      }*/
       else
       {
         noColourmenuItem.setSelected(true);
@@ -405,6 +429,34 @@ 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.setToolTipText("Open a new Jmol view with all structures associated with the current selection and superimpose them using the alignment.");
+        gpdbview.addActionListener(new ActionListener()
+        {
+          
+          @Override
+          public void actionPerformed(ActionEvent e)
+          {
+            new AppJmol(ap, pe, ap.av.collateForPDB(pe));
+          }
+        });
+      }
     }
     else
     {
@@ -452,9 +504,9 @@ public class PopupMenu extends JPopupMenu
         {
 
           // collect matching db-refs
-          DBRefEntry[] dbr = jalview.util.DBRefUtils.selectRefs(seq
-                  .getDBRef(), new String[]
-          { urlLink.getTarget() });
+          DBRefEntry[] dbr = jalview.util.DBRefUtils.selectRefs(
+                  seq.getDBRef(), new String[]
+                  { urlLink.getTarget() });
           // collect id string too
           String id = seq.getName();
           String descr = seq.getDescription();
@@ -658,8 +710,8 @@ public class PopupMenu extends JPopupMenu
       Object[] urlset = null;
       try
       {
-        urlset = urlLink.makeUrlStubs(ids, seqstr, "FromJalview"
-                + System.currentTimeMillis(), false);
+        urlset = urlLink.makeUrlStubs(ids, seqstr,
+                "FromJalview" + System.currentTimeMillis(), false);
       } catch (UrlStringTooLongException e)
       {
       }
@@ -987,6 +1039,8 @@ public class PopupMenu extends JPopupMenu
     colourMenu.add(turnColour);
     colourMenu.add(buriedColour);
     colourMenu.add(nucleotideMenuItem);
+    colourMenu.add(purinePyrimidineColour);
+    //colourMenu.add(covariationColour);
     colourMenu.add(userDefinedColour);
 
     if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
@@ -1138,6 +1192,23 @@ public class PopupMenu extends JPopupMenu
         BLOSUM62Colour_actionPerformed();
       }
     });
+    purinePyrimidineColour.setText("Purine/Pyrimidine");
+    purinePyrimidineColour.addActionListener(new java.awt.event.ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+         purinePyrimidineColour_actionPerformed();
+      }
+    });
+   /* 
+    covariationColour.addActionListener(new java.awt.event.ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+         covariationColour_actionPerformed();
+      }
+    });*/
+    
     conservationMenuItem.setText("Conservation");
     conservationMenuItem
             .addActionListener(new java.awt.event.ActionListener()
@@ -1175,9 +1246,9 @@ public class PopupMenu extends JPopupMenu
   protected void clustalColour_actionPerformed()
   {
     SequenceGroup sg = getGroup();
-    sg.cs = new ClustalxColourScheme(sg
-            .getSequences(ap.av.hiddenRepSequences), ap.av.alignment
-            .getWidth());
+    sg.cs = new ClustalxColourScheme(
+            sg.getSequences(ap.av.hiddenRepSequences),
+            ap.av.alignment.getWidth());
     refresh();
   }
 
@@ -1276,7 +1347,19 @@ public class PopupMenu extends JPopupMenu
     getGroup().cs = new NucleotideColourScheme();
     refresh();
   }
-
+  
+  protected void purinePyrimidineColour_actionPerformed()
+  {
+    getGroup().cs = new PurinePyrimidineColourScheme();
+    refresh();
+  }
+  /*
+  protected void covariationColour_actionPerformed()
+  {
+    getGroup().cs = new CovariationColourScheme(sequence.getAnnotation()[0]);
+    refresh();
+  }
+*/
   /**
    * DOCUMENT ME!
    * 
@@ -1293,9 +1376,9 @@ public class PopupMenu extends JPopupMenu
 
     if (abovePIDColour.isSelected())
     {
-      sg.cs.setConsensus(AAFrequency.calculate(sg
-              .getSequences(ap.av.hiddenRepSequences), sg.getStartRes(), sg
-              .getEndRes() + 1));
+      sg.cs.setConsensus(AAFrequency.calculate(
+              sg.getSequences(ap.av.hiddenRepSequences), sg.getStartRes(),
+              sg.getEndRes() + 1));
 
       int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs, getGroup()
               .getName());
@@ -1347,9 +1430,9 @@ public class PopupMenu extends JPopupMenu
   {
     SequenceGroup sg = getGroup();
     sg.cs = new PIDColourScheme();
-    sg.cs.setConsensus(AAFrequency.calculate(sg
-            .getSequences(ap.av.hiddenRepSequences), sg.getStartRes(), sg
-            .getEndRes() + 1));
+    sg.cs.setConsensus(AAFrequency.calculate(
+            sg.getSequences(ap.av.hiddenRepSequences), sg.getStartRes(),
+            sg.getEndRes() + 1));
     refresh();
   }
 
@@ -1365,9 +1448,9 @@ public class PopupMenu extends JPopupMenu
 
     sg.cs = new Blosum62ColourScheme();
 
-    sg.cs.setConsensus(AAFrequency.calculate(sg
-            .getSequences(ap.av.hiddenRepSequences), sg.getStartRes(), sg
-            .getEndRes() + 1));
+    sg.cs.setConsensus(AAFrequency.calculate(
+            sg.getSequences(ap.av.hiddenRepSequences), sg.getStartRes(),
+            sg.getEndRes() + 1));
 
     refresh();
   }
@@ -1401,9 +1484,9 @@ public class PopupMenu extends JPopupMenu
     if (conservationMenuItem.isSelected())
     {
       Conservation c = new Conservation("Group",
-              ResidueProperties.propHash, 3, sg
-                      .getSequences(ap.av.hiddenRepSequences), sg
-                      .getStartRes(), sg.getEndRes() + 1);
+              ResidueProperties.propHash, 3,
+              sg.getSequences(ap.av.hiddenRepSequences), sg.getStartRes(),
+              sg.getEndRes() + 1);
 
       c.calculate();
       c.verdict(false, ap.av.ConsPercGaps);
@@ -1430,8 +1513,8 @@ public class PopupMenu extends JPopupMenu
       return;
     }
 
-    AnnotationColourGradient acg = new AnnotationColourGradient(sequence
-            .getAnnotation()[0], null,
+    AnnotationColourGradient acg = new AnnotationColourGradient(
+            sequence.getAnnotation()[0], null,
             AnnotationColourGradient.NO_THRESHOLD);
 
     acg.predefinedColours = true;
@@ -1450,9 +1533,10 @@ public class PopupMenu extends JPopupMenu
   {
 
     SequenceGroup sg = getGroup();
-    EditNameDialog dialog = new EditNameDialog(sg.getName(), sg
-            .getDescription(), "       Group Name ", "Group Description ",
-            "Edit Group Name/Description", ap.alignFrame);
+    EditNameDialog dialog = new EditNameDialog(sg.getName(),
+            sg.getDescription(), "       Group Name ",
+            "Group Description ", "Edit Group Name/Description",
+            ap.alignFrame);
 
     if (!dialog.accept)
     {
@@ -1489,9 +1573,10 @@ public class PopupMenu extends JPopupMenu
    */
   void sequenceName_actionPerformed()
   {
-    EditNameDialog dialog = new EditNameDialog(sequence.getName(), sequence
-            .getDescription(), "       Sequence Name ",
-            "Sequence Description ", "Edit Sequence Name/Description", ap.alignFrame);
+    EditNameDialog dialog = new EditNameDialog(sequence.getName(),
+            sequence.getDescription(), "       Sequence Name ",
+            "Sequence Description ", "Edit Sequence Name/Description",
+            ap.alignFrame);
 
     if (!dialog.accept)
     {
@@ -1681,8 +1766,8 @@ public class PopupMenu extends JPopupMenu
         caseChange = ChangeCaseCommand.TO_LOWER;
       }
 
-      ChangeCaseCommand caseCommand = new ChangeCaseCommand(description, sg
-              .getSequencesAsArray(ap.av.hiddenRepSequences), startEnd,
+      ChangeCaseCommand caseCommand = new ChangeCaseCommand(description,
+              sg.getSequencesAsArray(ap.av.hiddenRepSequences), startEnd,
               caseChange);
 
       ap.alignFrame.addHistoryItem(caseCommand);
@@ -1697,8 +1782,8 @@ public class PopupMenu extends JPopupMenu
   {
     CutAndPasteTransfer cap = new CutAndPasteTransfer();
     cap.setForInput(null);
-    Desktop.addInternalFrame(cap, "Alignment output - "
-            + e.getActionCommand(), 600, 500);
+    Desktop.addInternalFrame(cap,
+            "Alignment output - " + e.getActionCommand(), 600, 500);
 
     String[] omitHidden = null;
 
@@ -1710,7 +1795,8 @@ public class PopupMenu extends JPopupMenu
     omitHidden = ap.av.getViewAsString(true);
     Alignment oal = new Alignment(ap.av.getSequenceSelection());
     AlignmentAnnotation[] nala = ap.av.alignment.getAlignmentAnnotation();
-    if (nala!=null) {
+    if (nala != null)
+    {
       for (int i = 0; i < nala.length; i++)
       {
         AlignmentAnnotation na = nala[i];
@@ -1727,47 +1813,16 @@ public class PopupMenu extends JPopupMenu
     jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(
             jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
     chooser.setFileView(new jalview.io.JalviewFileView());
-    chooser.setDialogTitle("Select a PDB file");
-    chooser.setToolTipText("Load a PDB file");
+    chooser.setDialogTitle("Select a PDB file for "+sequence.getDisplayId(false));
+    chooser.setToolTipText("Load a PDB file and associate it with sequence '"+sequence.getDisplayId(false)+"'");
 
     int value = chooser.showOpenDialog(null);
 
     if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)
     {
-      PDBEntry entry = new PDBEntry();
       String choice = chooser.getSelectedFile().getPath();
       jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
-      try
-      {
-        MCview.PDBfile pdbfile = new MCview.PDBfile(choice,
-                jalview.io.AppletFormatAdapter.FILE);
-
-        if (pdbfile.id == null)
-        {
-          String reply = JOptionPane
-                  .showInternalInputDialog(
-                          Desktop.desktop,
-                          "Couldn't find a PDB id in the file supplied."
-                                  + "Please enter an Id to identify this structure.",
-                          "No PDB Id in File", JOptionPane.QUESTION_MESSAGE);
-          if (reply == null)
-          {
-            return;
-          }
-
-          entry.setId(reply);
-        }
-        else
-        {
-          entry.setId(pdbfile.id);
-        }
-      } catch (java.io.IOException ex)
-      {
-        ex.printStackTrace();
-      }
-
-      entry.setFile(choice);
-      sequence.getDatasetSequence().addPDBId(entry);
+      new AssociatePdbFileWithSeq().associatePdbWithSeq(choice, jalview.io.AppletFormatAdapter.FILE, sequence, true);
     }
 
   }
@@ -1853,8 +1908,7 @@ public class PopupMenu extends JPopupMenu
 
   public void colourByStructure(String pdbid)
   {
-    Annotation[] anots = jalview.structure.StructureSelectionManager
-            .getStructureSelectionManager().colourSequenceFromStructure(
+    Annotation[] anots = ap.av.getStructureSelectionManager().colourSequenceFromStructure(
                     sequence, pdbid);
 
     AlignmentAnnotation an = new AlignmentAnnotation("Structure",
@@ -1880,17 +1934,18 @@ public class PopupMenu extends JPopupMenu
       if (sequence == null)
         sequence = (Sequence) sg.getSequenceAt(0);
 
-      EditNameDialog dialog = new EditNameDialog(sequence
-              .getSequenceAsString(sg.getStartRes(), sg.getEndRes() + 1),
-              null, "Edit Sequence ", null, "Edit Sequence", ap.alignFrame);
+      EditNameDialog dialog = new EditNameDialog(
+              sequence.getSequenceAsString(sg.getStartRes(),
+                      sg.getEndRes() + 1), null, "Edit Sequence ", null,
+              "Edit Sequence", ap.alignFrame);
 
       if (dialog.accept)
       {
         EditCommand editCommand = new EditCommand("Edit Sequences",
                 EditCommand.REPLACE, dialog.getName().replace(' ',
-                        ap.av.getGapCharacter()), sg
-                        .getSequencesAsArray(ap.av.hiddenRepSequences), sg
-                        .getStartRes(), sg.getEndRes() + 1, ap.av.alignment);
+                        ap.av.getGapCharacter()),
+                sg.getSequencesAsArray(ap.av.hiddenRepSequences),
+                sg.getStartRes(), sg.getEndRes() + 1, ap.av.alignment);
 
         ap.alignFrame.addHistoryItem(editCommand);