JAL-966 @mungo TODO complete: List rather than bare int array
[jalview.git] / src / jalview / gui / SeqPanel.java
index cca1685..bd8bb7c 100644 (file)
@@ -24,7 +24,6 @@ import jalview.api.AlignViewportI;
 import jalview.commands.EditCommand;
 import jalview.commands.EditCommand.Action;
 import jalview.commands.EditCommand.Edit;
-import jalview.datamodel.AlignedCodonFrame;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.SearchResults;
 import jalview.datamodel.Sequence;
@@ -39,7 +38,9 @@ import jalview.structure.SequenceListener;
 import jalview.structure.StructureSelectionManager;
 import jalview.structure.VamsasSource;
 import jalview.util.Comparison;
+import jalview.util.MappingUtils;
 import jalview.util.MessageManager;
+import jalview.viewmodel.AlignmentViewport;
 
 import java.awt.BorderLayout;
 import java.awt.Color;
@@ -170,16 +171,17 @@ public class SeqPanel extends JPanel implements MouseListener,
     int res = 0;
     int x = evt.getX();
 
-    if (av.wrapAlignment)
+    if (av.getWrapAlignment())
     {
 
-      int hgap = av.charHeight;
-      if (av.scaleAboveWrapped)
+      int hgap = av.getCharHeight();
+      if (av.getScaleAboveWrapped())
       {
-        hgap += av.charHeight;
+        hgap += av.getCharHeight();
       }
 
-      int cHeight = av.getAlignment().getHeight() * av.charHeight + hgap
+      int cHeight = av.getAlignment().getHeight() * av.getCharHeight()
+              + hgap
               + seqCanvas.getAnnotationHeight();
 
       int y = evt.getY();
@@ -223,15 +225,16 @@ public class SeqPanel extends JPanel implements MouseListener,
     int seq = 0;
     int y = evt.getY();
 
-    if (av.wrapAlignment)
+    if (av.getWrapAlignment())
     {
-      int hgap = av.charHeight;
-      if (av.scaleAboveWrapped)
+      int hgap = av.getCharHeight();
+      if (av.getScaleAboveWrapped())
       {
-        hgap += av.charHeight;
+        hgap += av.getCharHeight();
       }
 
-      int cHeight = av.getAlignment().getHeight() * av.charHeight + hgap
+      int cHeight = av.getAlignment().getHeight() * av.getCharHeight()
+              + hgap
               + seqCanvas.getAnnotationHeight();
 
       y -= hgap;
@@ -248,44 +251,6 @@ public class SeqPanel extends JPanel implements MouseListener,
     return seq;
   }
 
-  SequenceFeature[] findFeaturesAtRes(SequenceI sequence, int res)
-  {
-    Vector tmp = new Vector();
-    SequenceFeature[] features = sequence.getSequenceFeatures();
-    if (features != null)
-    {
-      for (int i = 0; i < features.length; i++)
-      {
-        if (av.featuresDisplayed == null
-                || !av.featuresDisplayed.containsKey(features[i].getType()))
-        {
-          continue;
-        }
-
-        if (features[i].featureGroup != null
-                && seqCanvas.fr.featureGroups != null
-                && seqCanvas.fr.featureGroups
-                        .containsKey(features[i].featureGroup)
-                && !((Boolean) seqCanvas.fr.featureGroups
-                        .get(features[i].featureGroup)).booleanValue())
-        {
-          continue;
-        }
-
-        if ((features[i].getBegin() <= res)
-                && (features[i].getEnd() >= res))
-        {
-          tmp.addElement(features[i]);
-        }
-      }
-    }
-
-    features = new SequenceFeature[tmp.size()];
-    tmp.copyInto(features);
-
-    return features;
-  }
-
   /**
    * When all of a sequence of edits are complete, put the resulting edit list
    * on the history stack (undo list), and reset flags for editing in progress.
@@ -396,7 +361,7 @@ public class SeqPanel extends JPanel implements MouseListener,
     }
 
     endEditing();
-    if (av.wrapAlignment)
+    if (av.getWrapAlignment())
     {
       ap.scrollToWrappedVisible(seqCanvas.cursorX);
     }
@@ -410,7 +375,7 @@ public class SeqPanel extends JPanel implements MouseListener,
       {
         ap.scrollUp(false);
       }
-      if (!av.wrapAlignment)
+      if (!av.getWrapAlignment())
       {
         while (seqCanvas.cursorX < av.getColumnSelection()
                 .adjustForHiddenColumns(av.startRes))
@@ -665,6 +630,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   String lastMessage;
 
+  @Override
   public void mouseOverSequence(SequenceI sequence, int index, int pos)
   {
     String tmp = sequence.hashCode() + " " + index + " " + pos;
@@ -695,6 +661,7 @@ public class SeqPanel extends JPanel implements MouseListener,
   {
     return this.ap == null ? null : this.ap.av;
   }
+  @Override
   public void updateColours(SequenceI seq, int index)
   {
     System.out.println("update the seqPanel colours");
@@ -762,14 +729,14 @@ public class SeqPanel extends JPanel implements MouseListener,
     }
 
     // use aa to see if the mouse pointer is on a
-    if (av.showSequenceFeatures)
+    if (av.isShowSequenceFeatures())
     {
       int rpos;
-      SequenceFeature[] features = findFeaturesAtRes(
+      List<SequenceFeature> features = ap.getFeatureRenderer().findFeaturesAtRes(
               sequence.getDatasetSequence(),
               rpos = sequence.findPosition(res));
       seqARep.appendFeatures(tooltipText, rpos, features,
-              this.ap.seqPanel.seqCanvas.fr.minmax);
+              this.ap.getSeqPanel().seqCanvas.fr.getMinMax());
     }
     if (tooltipText.length() == 6) // <html></html>
     {
@@ -878,7 +845,7 @@ public class SeqPanel extends JPanel implements MouseListener,
   {
     if (mouseWheelPressed)
     {
-      int oldWidth = av.charWidth;
+      int oldWidth = av.getCharWidth();
 
       // Which is bigger, left-right or up-down?
       if (Math.abs(evt.getY() - lastMousePress.getY()) > Math.abs(evt
@@ -901,25 +868,25 @@ public class SeqPanel extends JPanel implements MouseListener,
         }
 
         av.setFont(new Font(av.font.getName(), av.font.getStyle(), fontSize));
-        av.charWidth = oldWidth;
+        av.setCharWidth(oldWidth);
         ap.fontChanged();
       }
       else
       {
-        if (evt.getX() < lastMousePress.getX() && av.charWidth > 1)
+        if (evt.getX() < lastMousePress.getX() && av.getCharWidth() > 1)
         {
-          av.charWidth--;
+          av.setCharWidth(av.getCharWidth() - 1);
         }
         else if (evt.getX() > lastMousePress.getX())
         {
-          av.charWidth++;
+          av.setCharWidth(av.getCharWidth() + 1);
         }
 
         ap.paintAlignment(false);
       }
 
       FontMetrics fm = getFontMetrics(av.getFont());
-      av.validCharWidth = fm.charWidth('M') <= av.charWidth;
+      av.validCharWidth = fm.charWidth('M') <= av.getCharWidth();
 
       lastMousePress = evt.getPoint();
 
@@ -1423,21 +1390,21 @@ public class SeqPanel extends JPanel implements MouseListener,
         av.setSelectionGroup(null);
       }
 
-      SequenceFeature[] features = findFeaturesAtRes(
+      List<SequenceFeature> features = seqCanvas.getFeatureRenderer().findFeaturesAtRes(
               sequence.getDatasetSequence(),
               sequence.findPosition(findRes(evt)));
 
-      if (features != null && features.length > 0)
+      if (features != null && features.size()> 0)
       {
         SearchResults highlight = new SearchResults();
-        highlight.addResult(sequence, features[0].getBegin(),
-                features[0].getEnd());
+        highlight.addResult(sequence, features.get(0).getBegin(),
+                features.get(0).getEnd());
         seqCanvas.highlightSearchResults(highlight);
       }
-      if (features != null && features.length > 0)
+      if (features != null && features.size()> 0)
       {
         seqCanvas.getFeatureRenderer().amendFeatures(new SequenceI[]
-        { sequence }, features, false, ap);
+        { sequence }, features.toArray(new SequenceFeature[features.size()]), false, ap);
 
         seqCanvas.highlightSearchResults(null);
       }
@@ -1488,7 +1455,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
     startWrapBlock = wrappedBlock;
 
-    if (av.wrapAlignment && seq > av.getAlignment().getHeight())
+    if (av.getWrapAlignment() && seq > av.getAlignment().getHeight())
     {
       JOptionPane.showInternalMessageDialog(Desktop.desktop, MessageManager
               .getString("label.cannot_edit_annotations_in_wrapped_view"),
@@ -1552,16 +1519,16 @@ public class SeqPanel extends JPanel implements MouseListener,
 
     if (javax.swing.SwingUtilities.isRightMouseButton(evt))
     {
-      SequenceFeature[] allFeatures = findFeaturesAtRes(
+      List<SequenceFeature> allFeatures = ap.getFeatureRenderer().findFeaturesAtRes(
               sequence.getDatasetSequence(), sequence.findPosition(res));
       Vector links = new Vector();
-      for (int i = 0; i < allFeatures.length; i++)
+      for (SequenceFeature sf:allFeatures)
       {
-        if (allFeatures[i].links != null)
+        if (sf.links != null)
         {
-          for (int j = 0; j < allFeatures[i].links.size(); j++)
+          for (int j = 0; j < sf.links.size(); j++)
           {
-            links.addElement(allFeatures[i].links.elementAt(j));
+            links.addElement(sf.links.elementAt(j));
           }
         }
       }
@@ -1872,7 +1839,7 @@ public class SeqPanel extends JPanel implements MouseListener,
     // TODO: extend config options to allow user to control if selections may be
     // shared between viewports.
     boolean iSentTheSelection = (av == source
-            || (source instanceof AlignViewport && ((AlignViewport) source)
+            || (source instanceof AlignViewport && ((AlignmentViewport) source)
             .getSequenceSetId().equals(av.getSequenceSetId())));
     if (iSentTheSelection || !av.followSelection)
     {
@@ -1888,9 +1855,10 @@ public class SeqPanel extends JPanel implements MouseListener,
     }
 
     /*
-     * Check for selection in a view of which this one is a 'slave'.
+     * Check for selection in a view of which this one is a dna/protein
+     * complement.
      */
-    if (selectionAsSlave(seqsel, colsel, source))
+    if (selectionFromTranslation(seqsel, colsel, source))
     {
       return;
     }
@@ -1976,62 +1944,41 @@ public class SeqPanel extends JPanel implements MouseListener,
   }
 
   /**
-   * If this panel is a 'slave' of the selection source, tries to map the source
-   * selection to a local one, and returns true. Else returns false.
+   * If this panel is a cdna/protein translation view of the selection source,
+   * tries to map the source selection to a local one, and returns true. Else
+   * returns false.
    * 
    * @param seqsel
    * @param colsel
    * @param source
    */
-  protected boolean selectionAsSlave(SequenceGroup seqsel,
+  protected boolean selectionFromTranslation(SequenceGroup seqsel,
           ColumnSelection colsel, SelectionSource source)
   {
     if (!(source instanceof AlignViewportI)) {
       return false;
     }
     final AlignViewportI sourceAv = (AlignViewportI) source;
-    if (sourceAv.getSlave() != av)
+    if (sourceAv.getCodingComplement() != av && av.getCodingComplement() != sourceAv)
     {
       return false;
     }
 
     /*
-     * Map sequence selection. Note the SequenceGroup holds aligned sequences,
-     * the mappings hold dataset sequences.
+     * Map sequence selection
      */
-    AlignedCodonFrame[] codonFrames = sourceAv.getAlignment()
-            .getCodonFrames();
-    SequenceGroup sg = new SequenceGroup();
-    for (SequenceI selected : seqsel.getSequences())
-    {
-      for (AlignedCodonFrame acf : codonFrames)
-      {
-        SequenceI dnaSeq = acf.getDnaForAaSeq(selected);
-        if (dnaSeq != null)
-        {
-          for (SequenceI seq : av.getAlignment().getSequences())
-          {
-            if (seq.getDatasetSequence() == dnaSeq)
-            {
-              sg.addSequence(seq, false);
-              break;
-            }
-          }
-        }
-      }
-    }
+    SequenceGroup sg = MappingUtils.mapSequenceGroup(seqsel, sourceAv, av);
     av.setSelectionGroup(sg);
     av.isSelectionGroupChanged(true);
-    // ((AlignmentViewport) slave).firePropertyChange("alignment", null, slave
-    // .getAlignment()
-    // .getSequences());
 
     /*
      * Map column selection
      */
-    // TODO
+    ColumnSelection cs = MappingUtils.mapColumnSelection(colsel, sourceAv,
+            av);
+    av.setColumnSelection(cs);
+    av.isColSelChanged(true);
 
-    AlignmentPanel ap = av.getAlignPanel();
     PaintRefresher.Refresh(this, av.getSequenceSetId());
 
     return true;