JAL-2594 avoid stack trace creating feature on gapped region
[jalview.git] / src / jalview / appletgui / APopupMenu.java
index 941052d..86610a2 100644 (file)
@@ -36,13 +36,14 @@ import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.io.AppletFormatAdapter;
 import jalview.io.DataSourceType;
-import jalview.io.FileFormat;
+import jalview.io.FileFormatI;
+import jalview.io.FileFormats;
 import jalview.io.SequenceAnnotationReport;
+import jalview.renderer.ResidueShader;
+import jalview.renderer.ResidueShaderI;
 import jalview.schemes.Blosum62ColourScheme;
 import jalview.schemes.BuriedColourScheme;
 import jalview.schemes.ClustalxColourScheme;
-import jalview.schemes.CollectionColourScheme;
-import jalview.schemes.CollectionColourSchemeI;
 import jalview.schemes.HelixColourScheme;
 import jalview.schemes.HydrophobicColourScheme;
 import jalview.schemes.JalviewColourScheme;
@@ -64,6 +65,7 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -111,8 +113,14 @@ public class APopupMenu extends java.awt.PopupMenu implements
 
   protected CheckboxMenuItem abovePIDColour = new CheckboxMenuItem();
 
+  MenuItem modifyPID = new MenuItem();
+
   protected CheckboxMenuItem conservationColour = new CheckboxMenuItem();
 
+  MenuItem modifyConservation = new MenuItem();
+
+  MenuItem noColourmenuItem = new MenuItem();
+
   final AlignmentPanel ap;
 
   MenuItem unGroupMenuItem = new MenuItem();
@@ -203,7 +211,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
   Menu menu1 = new Menu();
 
   public APopupMenu(AlignmentPanel apanel, final SequenceI seq,
-          Vector<String> links)
+          List<String> links)
   {
     // /////////////////////////////////////////////////////////
     // If this is activated from the sequence panel, the user may want to
@@ -223,7 +231,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
       e.printStackTrace();
     }
 
-    for (String ff : FileFormat.getWritableFormats(true))
+    for (String ff : FileFormats.getInstance().getWritableFormats(true))
     {
       MenuItem item = new MenuItem(ff);
 
@@ -236,6 +244,24 @@ public class APopupMenu extends java.awt.PopupMenu implements
     SequenceGroup sg = ap.av.getSelectionGroup();
     if (sg != null && sg.getSize() > 0)
     {
+      if (sg.isNucleotide())
+      {
+        conservationColour.setEnabled(false);
+        clustalColour.setEnabled(false);
+        BLOSUM62Colour.setEnabled(false);
+        zappoColour.setEnabled(false);
+        taylorColour.setEnabled(false);
+        hydrophobicityColour.setEnabled(false);
+        helixColour.setEnabled(false);
+        strandColour.setEnabled(false);
+        turnColour.setEnabled(false);
+        buriedColour.setEnabled(false);
+      }
+      else
+      {
+        purinePyrimidineColour.setEnabled(false);
+        nucleotideColour.setEnabled(false);
+      }
       editGroupName.setLabel(MessageManager.formatMessage(
               "label.name_param", new Object[] { sg.getName() }));
       showText.setState(sg.getDisplayText());
@@ -255,6 +281,8 @@ public class APopupMenu extends java.awt.PopupMenu implements
         {
           abovePIDColour.setState(sg.cs.getThreshold() > 0);
           conservationColour.setState(sg.cs.conservationApplied());
+          modifyPID.setEnabled(abovePIDColour.getState());
+          modifyConservation.setEnabled(conservationColour.getState());
         }
       }
       setSelectedColour(sg.cs);
@@ -321,7 +349,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
    * 
    * @param cs
    */
-  protected void setSelectedColour(CollectionColourSchemeI cs)
+  protected void setSelectedColour(ResidueShaderI cs)
   {
     if (cs == null || cs.getColourScheme() == null)
     {
@@ -635,6 +663,14 @@ public class APopupMenu extends java.awt.PopupMenu implements
     {
       userDefinedColour_actionPerformed();
     }
+    else if (source == modifyConservation)
+    {
+      conservationMenuItem_itemStateChanged();
+    }
+    else if (source == modifyPID)
+    {
+      abovePIDColour_itemStateChanged();
+    }
     else if (source == unGroupMenuItem)
     {
       unGroupMenuItem_actionPerformed();
@@ -784,9 +820,9 @@ public class APopupMenu extends java.awt.PopupMenu implements
         return;
       }
 
-      int rsize = 0, gSize = sg.getSize();
-      SequenceI[] rseqs, seqs = new SequenceI[gSize];
-      SequenceFeature[] tfeatures, features = new SequenceFeature[gSize];
+      int gSize = sg.getSize();
+      List<SequenceI> seqs = new ArrayList<SequenceI>();
+      List<SequenceFeature> features = new ArrayList<SequenceFeature>();
 
       for (int i = 0; i < gSize; i++)
       {
@@ -794,26 +830,21 @@ public class APopupMenu extends java.awt.PopupMenu implements
         int end = sg.findEndRes(sg.getSequenceAt(i));
         if (start <= end)
         {
-          seqs[rsize] = sg.getSequenceAt(i);
-          features[rsize] = new SequenceFeature(null, null, null, start,
-                  end, "Jalview");
-          rsize++;
+          seqs.add(sg.getSequenceAt(i));
+          features.add(new SequenceFeature(null, null, null, start, end,
+                  "Jalview"));
         }
       }
-      rseqs = new SequenceI[rsize];
-      tfeatures = new SequenceFeature[rsize];
-      System.arraycopy(seqs, 0, rseqs, 0, rsize);
-      System.arraycopy(features, 0, tfeatures, 0, rsize);
-      features = tfeatures;
-      seqs = rseqs;
-
-      if (ap.seqPanel.seqCanvas.getFeatureRenderer().amendFeatures(seqs,
-              features, true, ap))
+
+      if (!seqs.isEmpty())
       {
-        ap.alignFrame.sequenceFeatures.setState(true);
-        ap.av.setShowSequenceFeatures(true);
-        ;
-        ap.highlightSearchResults(null);
+        if (ap.seqPanel.seqCanvas.getFeatureRenderer().amendFeatures(seqs,
+                features, true, ap))
+        {
+          ap.alignFrame.sequenceFeatures.setState(true);
+          ap.av.setShowSequenceFeatures(true);
+          ap.highlightSearchResults(null);
+        }
       }
     }
     else
@@ -836,7 +867,8 @@ public class APopupMenu extends java.awt.PopupMenu implements
     // now returns a full copy of sequence data
     // TODO consider using getSequenceSelection instead here
 
-    FileFormat fileFormat = FileFormat.valueOf(e.getActionCommand());
+    FileFormatI fileFormat = FileFormats.getInstance().forName(
+            e.getActionCommand());
     cap.setText(new AppletFormatAdapter().formatSequences(fileFormat,
             ap.av.getShowJVSuffix(), ap, true));
 
@@ -899,14 +931,14 @@ public class APopupMenu extends java.awt.PopupMenu implements
   void addPDB()
   {
     Vector<PDBEntry> pdbs = seq.getAllPDBEntries();
-    if (pdbs != null&& !pdbs.isEmpty())
+    if (pdbs != null && !pdbs.isEmpty())
     {
       PDBEntry entry = pdbs.firstElement();
 
       if (ap.av.applet.jmolAvailable)
       {
-        new jalview.appletgui.AppletJmol(entry, new SequenceI[] { seq },
-                null, ap, DataSourceType.URL);
+        new AppletJmol(entry, new SequenceI[] { seq }, null, ap,
+                DataSourceType.URL);
       }
       else
       {
@@ -922,7 +954,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
       cap.setPDBImport(seq);
       Frame frame = new Frame();
       frame.add(cap);
-      jalview.bin.JalviewLite.addFrame(frame, MessageManager.formatMessage(
+      JalviewLite.addFrame(frame, MessageManager.formatMessage(
               "label.paste_pdb_file_for_sequence",
               new Object[] { seq.getName() }), 400, 300);
     }
@@ -942,6 +974,8 @@ public class APopupMenu extends java.awt.PopupMenu implements
             .getString("action.create_group"));
     createGroupMenuItem.addActionListener(this);
 
+    modifyPID.setEnabled(abovePIDColour.getState());
+    modifyConservation.setEnabled(conservationColour.getState());
     colourMenu.setLabel(MessageManager.getString("label.group_colour"));
     showBoxes.setLabel(MessageManager.getString("action.boxes"));
     showBoxes.setState(true);
@@ -997,8 +1031,10 @@ public class APopupMenu extends java.awt.PopupMenu implements
     colourMenu.add(purinePyrimidineColour);
     colourMenu.add(userDefinedColour);
     colourMenu.addSeparator();
-    colourMenu.add(abovePIDColour);
     colourMenu.add(conservationColour);
+    colourMenu.add(modifyConservation);
+    colourMenu.add(abovePIDColour);
+    colourMenu.add(modifyPID);
 
     noColour.setLabel(MessageManager.getString("label.none"));
     noColour.addItemListener(this);
@@ -1064,9 +1100,18 @@ public class APopupMenu extends java.awt.PopupMenu implements
     abovePIDColour.setLabel(MessageManager
             .getString("label.above_identity_threshold"));
     abovePIDColour.addItemListener(this);
+    modifyPID.setLabel(MessageManager
+            .getString("label.modify_identity_threshold"));
+    modifyPID.addActionListener(this);
     conservationColour.setLabel(MessageManager
-            .getString("label.conservation"));
+            .getString("action.by_conservation"));
     conservationColour.addItemListener(this);
+    modifyConservation.setLabel(MessageManager
+            .getString("label.modify_conservation_threshold"));
+    modifyConservation.addActionListener(this);
+
+    PIDColour.addActionListener(this);
+    BLOSUM62Colour.addActionListener(this);
 
     editMenu.add(copy);
     copy.addActionListener(this);
@@ -1116,62 +1161,62 @@ public class APopupMenu extends java.awt.PopupMenu implements
   protected void clustalColour_actionPerformed()
   {
     SequenceGroup sg = getGroup();
-    sg.cs = new CollectionColourScheme(new ClustalxColourScheme(sg,
+    sg.cs = new ResidueShader(new ClustalxColourScheme(sg,
             ap.av.getHiddenRepSequences()));
     refresh();
   }
 
   protected void zappoColour_actionPerformed()
   {
-    getGroup().cs = new CollectionColourScheme(new ZappoColourScheme());
+    getGroup().cs = new ResidueShader(new ZappoColourScheme());
     refresh();
   }
 
   protected void taylorColour_actionPerformed()
   {
-    getGroup().cs = new CollectionColourScheme(new TaylorColourScheme());
+    getGroup().cs = new ResidueShader(new TaylorColourScheme());
     refresh();
   }
 
   protected void hydrophobicityColour_actionPerformed()
   {
-    getGroup().cs = new CollectionColourScheme(new HydrophobicColourScheme());
+    getGroup().cs = new ResidueShader(new HydrophobicColourScheme());
     refresh();
   }
 
   protected void helixColour_actionPerformed()
   {
-    getGroup().cs = new CollectionColourScheme(new HelixColourScheme());
+    getGroup().cs = new ResidueShader(new HelixColourScheme());
     refresh();
   }
 
   protected void strandColour_actionPerformed()
   {
-    getGroup().cs = new CollectionColourScheme(new StrandColourScheme());
+    getGroup().cs = new ResidueShader(new StrandColourScheme());
     refresh();
   }
 
   protected void turnColour_actionPerformed()
   {
-    getGroup().cs = new CollectionColourScheme(new TurnColourScheme());
+    getGroup().cs = new ResidueShader(new TurnColourScheme());
     refresh();
   }
 
   protected void buriedColour_actionPerformed()
   {
-    getGroup().cs = new CollectionColourScheme(new BuriedColourScheme());
+    getGroup().cs = new ResidueShader(new BuriedColourScheme());
     refresh();
   }
 
   public void nucleotideMenuItem_actionPerformed()
   {
-    getGroup().cs = new CollectionColourScheme(new NucleotideColourScheme());
+    getGroup().cs = new ResidueShader(new NucleotideColourScheme());
     refresh();
   }
 
   public void purinePyrimidineColour_actionPerformed()
   {
-    getGroup().cs = new CollectionColourScheme(
+    getGroup().cs = new ResidueShader(
             new PurinePyrimidineColourScheme());
     refresh();
   }
@@ -1199,11 +1244,11 @@ public class APopupMenu extends java.awt.PopupMenu implements
     else
     // remove PIDColouring
     {
+      SliderPanel.hidePIDSlider();
       sg.cs.setThreshold(0, ap.av.isIgnoreGapsConsensus());
     }
-
+    modifyPID.setEnabled(abovePIDColour.getState());
     refresh();
-
   }
 
   protected void userDefinedColour_actionPerformed()
@@ -1214,7 +1259,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
   protected void PIDColour_actionPerformed()
   {
     SequenceGroup sg = getGroup();
-    sg.cs = new CollectionColourScheme(new PIDColourScheme());
+    sg.cs = new ResidueShader(new PIDColourScheme());
     sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(ap.av
             .getHiddenRepSequences()), 0, ap.av.getAlignment().getWidth()));
     refresh();
@@ -1224,7 +1269,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
   {
     SequenceGroup sg = getGroup();
 
-    sg.cs = new CollectionColourScheme(new Blosum62ColourScheme());
+    sg.cs = new ResidueShader(new Blosum62ColourScheme());
 
     sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(ap.av
             .getHiddenRepSequences()), 0, ap.av.getAlignment().getWidth()));
@@ -1260,9 +1305,10 @@ public class APopupMenu extends java.awt.PopupMenu implements
     else
     // remove ConservationColouring
     {
+      SliderPanel.hideConservationSlider();
       sg.cs.setConservation(null);
     }
-
+    modifyConservation.setEnabled(conservationColour.getState());
     refresh();
   }