Merge branch 'develop' into update_212_Dec_merge_with_21125_chamges
[jalview.git] / src / jalview / gui / SeqPanel.java
index 111b4c0..c8a2ec9 100644 (file)
@@ -87,6 +87,7 @@ public class SeqPanel extends JPanel
         SequenceListener, SelectionListener
 {
   /*
+   * 
    * a class that holds computed mouse position
    * - column of the alignment (0...)
    * - sequence offset (0...)
@@ -242,11 +243,13 @@ public class SeqPanel extends JPanel
    */
   public SeqPanel(AlignViewport viewport, AlignmentPanel alignPanel)
   {
+    setName("SeqPanel");
     seqARep = new SequenceAnnotationReport(true);
     ToolTipManager.sharedInstance().registerComponent(this);
     ToolTipManager.sharedInstance().setInitialDelay(0);
     ToolTipManager.sharedInstance().setDismissDelay(10000);
-
+    
+    
     this.av = viewport;
     setBackground(Color.white);
 
@@ -292,8 +295,7 @@ public class SeqPanel extends JPanel
     int alignmentHeight = av.getAlignment().getHeight();
     if (av.getWrapAlignment())
     {
-      seqCanvas.calculateWrappedGeometry(seqCanvas.getWidth(),
-              seqCanvas.getHeight());
+      seqCanvas.calculateWrappedGeometry();
 
       /*
        * yPos modulo height of repeating width
@@ -341,7 +343,6 @@ public class SeqPanel extends JPanel
 
     return new MousePos(col, seqIndex, annIndex);
   }
-
   /**
    * Returns the aligned sequence position (base 0) at the mouse position, or
    * the closest visible one
@@ -429,8 +430,7 @@ public class SeqPanel extends JPanel
       if (editCommand != null && editCommand.getSize() > 0)
       {
         ap.alignFrame.addHistoryItem(editCommand);
-        av.firePropertyChange("alignment", null,
-                av.getAlignment().getSequences());
+        ap.av.notifyAlignment();
       }
     } finally
     {
@@ -483,9 +483,8 @@ public class SeqPanel extends JPanel
 
   void moveCursor(int dx, int dy)
   {
-    moveCursor(dx, dy, false);
+    moveCursor(dx, dy,false);
   }
-
   void moveCursor(int dx, int dy, boolean nextWord)
   {
     HiddenColumns hidden = av.getAlignment().getHiddenColumns();
@@ -493,13 +492,11 @@ public class SeqPanel extends JPanel
     if (nextWord)
     {
       int maxWidth = av.getAlignment().getWidth();
-      int maxHeight = av.getAlignment().getHeight();
-      SequenceI seqAtRow = av.getAlignment()
-              .getSequenceAt(seqCanvas.cursorY);
+      int maxHeight=av.getAlignment().getHeight();
+      SequenceI seqAtRow = av.getAlignment().getSequenceAt(seqCanvas.cursorY);
       // look for next gap or residue
-      boolean isGap = Comparison
-              .isGap(seqAtRow.getCharAt(seqCanvas.cursorX));
-      int p = seqCanvas.cursorX, lastP, r = seqCanvas.cursorY, lastR;
+      boolean isGap = Comparison.isGap(seqAtRow.getCharAt(seqCanvas.cursorX));
+      int p = seqCanvas.cursorX,lastP,r=seqCanvas.cursorY,lastR;
       do
       {
         lastP = p;
@@ -520,23 +517,19 @@ public class SeqPanel extends JPanel
         p = nextVisible(hidden, maxWidth, p, dx);
       } while ((dx != 0 ? p != lastP : r != lastR)
               && isGap == Comparison.isGap(seqAtRow.getCharAt(p)));
-      seqCanvas.cursorX = p;
-      seqCanvas.cursorY = r;
-    }
-    else
-    {
+      seqCanvas.cursorX=p;
+      seqCanvas.cursorY=r;
+    } else {
       int maxWidth = av.getAlignment().getWidth();
-      seqCanvas.cursorX = nextVisible(hidden, maxWidth, seqCanvas.cursorX,
-              dx);
+      seqCanvas.cursorX = nextVisible(hidden, maxWidth, seqCanvas.cursorX, dx);
       seqCanvas.cursorY += dy;
     }
     scrollToVisible(false);
   }
 
-  private int nextVisible(HiddenColumns hidden, int maxWidth, int original,
-          int dx)
+  private int nextVisible(HiddenColumns hidden,int maxWidth, int original, int dx)
   {
-    int newCursorX = original + dx;
+    int newCursorX=original+dx;
     if (av.hasHiddenColumns() && !hidden.isVisible(newCursorX))
     {
       int visx = hidden.absoluteToVisibleColumn(newCursorX - dx);
@@ -557,13 +550,13 @@ public class SeqPanel extends JPanel
       }
     }
     newCursorX = (newCursorX < 0) ? 0 : newCursorX;
-    if (newCursorX >= maxWidth || !hidden.isVisible(newCursorX))
+    if (newCursorX >= maxWidth
+            || !hidden.isVisible(newCursorX))
     {
       newCursorX = original;
     }
     return newCursorX;
   }
-
   /**
    * Scroll to make the cursor visible in the viewport.
    * 
@@ -619,7 +612,7 @@ public class SeqPanel extends JPanel
     if (av.getAlignment().getHiddenColumns().isVisible(seqCanvas.cursorX))
     {
       setStatusMessage(av.getAlignment().getSequenceAt(seqCanvas.cursorY),
-              seqCanvas.cursorX, seqCanvas.cursorY);
+            seqCanvas.cursorX, seqCanvas.cursorY);
     }
 
     if (repaintNeeded)
@@ -628,6 +621,7 @@ public class SeqPanel extends JPanel
     }
   }
 
+
   void setSelectionAreaAtCursor(boolean topLeft)
   {
     SequenceI sequence = av.getAlignment().getSequenceAt(seqCanvas.cursorY);
@@ -966,7 +960,8 @@ public class SeqPanel extends JPanel
         SequenceI seq = match.getSequence();
         SequenceI ds = seq.getDatasetSequence() == null ? seq
                 : seq.getDatasetSequence();
-        MappedFeatures mf = fr2.findComplementFeaturesAtResidue(ds, pos);
+        MappedFeatures mf = fr2
+                .findComplementFeaturesAtResidue(ds, pos);
         if (mf != null)
         {
           for (SequenceFeature sf : mf.features)
@@ -1109,8 +1104,9 @@ public class SeqPanel extends JPanel
     {
       List<SequenceFeature> features = ap.getFeatureRenderer()
               .findFeaturesAtColumn(sequence, column + 1);
-      unshownFeatures = seqARep.appendFeatures(tooltipText, pos, features,
-              this.ap.getSeqPanel().seqCanvas.fr, MAX_TOOLTIP_LENGTH);
+      unshownFeatures = seqARep.appendFeatures(tooltipText, pos,
+              features, this.ap.getSeqPanel().seqCanvas.fr,
+              MAX_TOOLTIP_LENGTH);
 
       /*
        * add features in CDS/protein complement at the corresponding
@@ -1128,8 +1124,8 @@ public class SeqPanel extends JPanel
                   pos);
           if (mf != null)
           {
-            unshownFeatures += seqARep.appendFeatures(tooltipText, pos, mf,
-                    fr2, MAX_TOOLTIP_LENGTH);
+            unshownFeatures += seqARep.appendFeatures(tooltipText,
+                    pos, mf, fr2, MAX_TOOLTIP_LENGTH);
           }
         }
       }
@@ -1157,7 +1153,8 @@ public class SeqPanel extends JPanel
       if (!textString.equals(lastTooltip))
       {
         lastTooltip = textString;
-        lastFormattedTooltip = JvSwingUtils.wrapTooltip(true, textString);
+        lastFormattedTooltip = JvSwingUtils.wrapTooltip(true,
+                textString);
         setToolTipText(lastFormattedTooltip);
       }
     }
@@ -1184,8 +1181,8 @@ public class SeqPanel extends JPanel
 
     String tooltip = AnnotationPanel.buildToolTip(anns[rowIndex], column,
             anns);
-    if (tooltip == null ? tooltip != lastTooltip
-            : !tooltip.equals(lastTooltip))
+    boolean tooltipChanged = tooltip == null ? lastTooltip != null : !tooltip.equals(lastTooltip);
+    if (tooltipChanged)
     {
       lastTooltip = tooltip;
       lastFormattedTooltip = tooltip == null ? null
@@ -1241,8 +1238,8 @@ public class SeqPanel extends JPanel
 
     tempTip.setTipText(lastFormattedTooltip);
     int tipWidth = (int) tempTip.getPreferredSize().getWidth();
-
-    // was x += (w - x < 200) ? -(w / 2) : 5;
+    
+    // was      x += (w - x < 200) ? -(w / 2) : 5;
     x = (x + tipWidth < w ? x + 10 : w - tipWidth);
     Point p = new Point(x, y + av.getCharHeight()); // BH 2018 was - 20?
 
@@ -1256,8 +1253,7 @@ public class SeqPanel extends JPanel
    * changed, so selective redraws can be applied (ie. only structures, only
    * overview, etc)
    */
-  private boolean updateOverviewAndStructs = false; // TODO: refactor to
-                                                    // avcontroller
+  private boolean updateOverviewAndStructs = false; // TODO: refactor to avcontroller
 
   /**
    * set if av.getSelectionGroup() refers to a group that is defined on the
@@ -1319,7 +1315,8 @@ public class SeqPanel extends JPanel
      * Sequence number (if known), and sequence name.
      */
     String seqno = seqIndex == -1 ? "" : " " + (seqIndex + 1);
-    text.append("Sequence").append(seqno).append(" ID: ").append(seqName);
+    text.append("Sequence").append(seqno).append(" ID: ")
+            .append(seqName);
 
     String residue = null;
 
@@ -1578,12 +1575,12 @@ public class SeqPanel extends JPanel
     String label = null;
     if (groupEditing)
     {
-      message.append("Edit group:");
+        message.append("Edit group:");
       label = MessageManager.getString("action.edit_group");
     }
     else
     {
-      message.append("Edit sequence: " + seq.getName());
+        message.append("Edit sequence: " + seq.getName());
       label = seq.getName();
       if (label.length() > 10)
       {
@@ -1775,7 +1772,8 @@ public class SeqPanel extends JPanel
           {
             for (int j = 0; j < startres - editLastRes; j++)
             {
-              if (!Comparison.isGap(groupSeqs[g].getCharAt(fixedRight - j)))
+              if (!Comparison
+                      .isGap(groupSeqs[g].getCharAt(fixedRight - j)))
               {
                 blank = false;
                 break;
@@ -2167,8 +2165,8 @@ public class SeqPanel extends JPanel
          * highlight the first feature at the position on the alignment
          */
         SearchResultsI highlight = new SearchResults();
-        highlight.addResult(sequence, features.get(0).getBegin(),
-                features.get(0).getEnd());
+        highlight.addResult(sequence, features.get(0).getBegin(), features
+                .get(0).getEnd());
         seqCanvas.highlightSearchResults(highlight, true);
 
         /*
@@ -2432,7 +2430,7 @@ public class SeqPanel extends JPanel
       return;
     }
 
-    res = Math.min(res, av.getAlignment().getWidth() - 1);
+    res = Math.min(res, av.getAlignment().getWidth()-1);
 
     if (stretchGroup.getEndRes() == res)
     {
@@ -2942,4 +2940,44 @@ public class SeqPanel extends JPanel
   {
     return lastSearchResults;
   }
+  
+  /**
+   * scroll to the given row/column - or nearest visible location
+   * 
+   * @param row
+   * @param column
+   */
+  public void scrollTo(int row, int column)
+  {
+
+    row = row < 0 ? ap.av.getRanges().getStartSeq() : row;
+    column = column < 0 ? ap.av.getRanges().getStartRes() : column;
+    ap.scrollTo(column, column, row, true, true);
+  }
+
+  /**
+   * scroll to the given row - or nearest visible location
+   * 
+   * @param row
+   */
+  public void scrollToRow(int row)
+  {
+
+    row = row < 0 ? ap.av.getRanges().getStartSeq() : row;
+    ap.scrollTo(ap.av.getRanges().getStartRes(),
+            ap.av.getRanges().getStartRes(), row, true, true);
+  }
+
+  /**
+   * scroll to the given column - or nearest visible location
+   * 
+   * @param column
+   */
+  public void scrollToColumn(int column)
+  {
+
+    column = column < 0 ? ap.av.getRanges().getStartRes() : column;
+    ap.scrollTo(column, column, ap.av.getRanges().getStartSeq(), true,
+            true);
+  }
 }