JAL-1114 - refactor methods handling Vectors and Hashtables to Lists and Maps, and...
[jalview.git] / src / jalview / appletgui / AlignmentPanel.java
index 9d19cf3..e9d418e 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
- * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
+ * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
  * 
  * This file is part of Jalview.
  * 
@@ -282,16 +282,18 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
   public boolean scrollToPosition(SearchResults results,
           boolean redrawOverview)
   {
+         
     // do we need to scroll the panel?
     if (results != null && results.getSize() > 0)
     {
-      int seqIndex = av.alignment.findIndex(results);
+      AlignmentI alignment=av.getAlignment();
+      int seqIndex = alignment.findIndex(results);
       if (seqIndex == -1)
       {
         return false;
       }
-      SequenceI seq = av.alignment.getSequenceAt(seqIndex);
-      int[] r = results.getResults(seq, 0,av.alignment.getWidth());
+      SequenceI seq = alignment.getSequenceAt(seqIndex);
+      int[] r = results.getResults(seq, 0,alignment.getWidth());
       if (r == null)
       {
         if (av.applet.debug) {// DEBUG
@@ -301,10 +303,11 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
       }
       if (av.applet.debug) {
         // DEBUG
-        System.out.println("DEBUG: scroll: start=" + r[0]
+        /*System.out.println("DEBUG: scroll: start=" + r[0]
                 + " av.getStartRes()=" + av.getStartRes() + " end=" + r[1]
                 + " seq.end=" + seq.getEnd() + " av.getEndRes()="
                 + av.getEndRes() + " hextent=" + hextent);
+         */
       }
       int start = r[0];
       int end = r[1];
@@ -322,45 +325,75 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
   }
   public boolean scrollTo(int ostart, int end, int seqIndex, boolean scrollToNearest, boolean redrawOverview)
   {
-    int start=-1;
-    if (av.hasHiddenColumns)
+           int startv, endv, starts, ends, width;
+
+         int start=-1;
+    if (av.hasHiddenColumns())
     {
       start = av.getColumnSelection().findColumnPosition(ostart);
       end = av.getColumnSelection().findColumnPosition(end);
       if (start == end)
       {
-        if (!scrollToNearest && !av.colSel.isVisible(ostart))
+        if (!scrollToNearest && !av.getColumnSelection().isVisible(ostart))
         {
           // don't scroll - position isn't visible
           return false;
         }
-        }
       }
-      if (!av.wrapAlignment)
-      {
+    }
+    else
+    {
+      start = ostart;
+    }
+    if (!av.wrapAlignment)
+    {
+         /*
+         int spos=av.getStartRes(),sqpos=av.getStartSeq();
+          if ((startv = av.getStartRes()) >= start)
+          {
+                 spos=start-1;
+//               seqIn
+//            setScrollValues(start - 1, seqIndex);
+          }
+          else if ((endv = av.getEndRes()) <= end)
+          {
+//            setScrollValues(spos=startv + 1 + end - endv, seqIndex);
+                 spos=startv + 1 + end - endv;
+          }
+          else if ((starts = av.getStartSeq()) > seqIndex)
+          {
+            setScrollValues(av.getStartRes(), seqIndex);
+          }
+          else if ((ends = av.getEndSeq()) <= seqIndex)
+          {
+            setScrollValues(av.getStartRes(), starts + seqIndex - ends + 1);
+          }
+
+         /* */
         if ((av.getStartRes() > end)
                 || (av.getEndRes() < start)
                 || ((av.getStartSeq() > seqIndex) || (av.getEndSeq() < seqIndex)))
         {
-          if (start > av.alignment.getWidth() - hextent)
+          if (start > av.getAlignment().getWidth() - hextent)
           {
-            start = av.alignment.getWidth() - hextent;
+            start = av.getAlignment().getWidth() - hextent;
             if (start < 0)
             {
               start = 0;
             }
 
           }
-          if (seqIndex > av.alignment.getHeight() - vextent)
+          if (seqIndex > av.getAlignment().getHeight() - vextent)
           {
-            seqIndex = av.alignment.getHeight() - vextent;
+            seqIndex = av.getAlignment().getHeight() - vextent;
             if (seqIndex < 0)
             {
               seqIndex = 0;
             }
           }
+          // System.out.println("trying to scroll to: "+start+" "+seqIndex);
           setScrollValues(start, seqIndex);
-        }
+        }/**/
       }
       else
       {
@@ -423,7 +456,7 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
     apvscroll.addNotify();
     hscroll.addNotify();
     validate();
-    repaint();
+    paintAlignment(true);
   }
   /**
    * calculate the annotation dimensions and refresh slider values accordingly.
@@ -463,6 +496,7 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
     annotationSpaceFillerHolder.setSize(new Dimension(e.width, height));
     annotationPanelHolder.setSize(new Dimension(d.width, height));
     seqPanelHolder.setSize(d.width,seqandannot-height);
+    seqPanel.seqCanvas.setSize(d.width, seqPanel.seqCanvas.getSize().height);
     int s=apvscroll.getValue();
     if (s>mheight-height)
     {
@@ -555,16 +589,14 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
 
   public void setScrollValues(int x, int y)
   {
-    int width = av.alignment.getWidth();
-    int height = av.alignment.getHeight();
+    int width = av.getAlignment().getWidth();
+    int height = av.getAlignment().getHeight();
 
-    if (av.hasHiddenColumns)
+    if (av.hasHiddenColumns())
     {
       width = av.getColumnSelection().findColumnPosition(width);
     }
-
-    av.setStartRes(x);
-    av.setEndRes((x + (seqPanel.seqCanvas.getSize().width / av.charWidth)) - 1);
+    if (x<0) { x = 0; };
 
     hextent = seqPanel.seqCanvas.getSize().width / av.charWidth;
     vextent = seqPanel.seqCanvas.getSize().height / av.charHeight;
@@ -581,6 +613,8 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
 
     if ((hextent + x) > width)
     {
+      System.err.println("hextent was "+hextent+" and x was "+x);
+
       x = width - hextent;
     }
 
@@ -596,18 +630,22 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
 
     if (x < 0)
     {
+      System.err.println("x was "+x);
       x = 0;
     }
 
     av.setStartSeq(y);
 
     int endSeq = y + vextent;
-    if (endSeq > av.alignment.getHeight())
+    if (endSeq > av.getAlignment().getHeight())
     {
-      endSeq = av.alignment.getHeight();
+      endSeq = av.getAlignment().getHeight();
     }
 
     av.setEndSeq(endSeq);
+    av.setStartRes(x);
+    av.setEndRes((x + (seqPanel.seqCanvas.getSize().width / av.charWidth)) - 1);
+
     hscroll.setValues(x, hextent, 0, width);
     vscroll.setValues(y, vextent, 0, height);
 
@@ -731,9 +769,9 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
     
     if (av.getWrapAlignment())
     {
-      int maxwidth = av.alignment.getWidth();
+      int maxwidth = av.getAlignment().getWidth();
 
-      if (av.hasHiddenColumns)
+      if (av.hasHiddenColumns())
       {
         maxwidth = av.getColumnSelection().findColumnPosition(maxwidth) - 1;
       }
@@ -881,10 +919,10 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
     // remove old automatic annotation
     // add any new annotation
 
-    Vector gr = av.alignment.getGroups(); // OrderedBy(av.alignment.getSequencesArray());
+    ; // OrderedBy(av.alignment.getSequencesArray());
     // intersect alignment annotation with alignment groups
 
-    AlignmentAnnotation[] aan = av.alignment.getAlignmentAnnotation();
+    AlignmentAnnotation[] aan = av.getAlignment().getAlignmentAnnotation();
     Hashtable oldrfs = new Hashtable();
     if (aan != null)
     {
@@ -893,18 +931,16 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
         if (aan[an].autoCalculated && aan[an].groupRef != null)
         {
           oldrfs.put(aan[an].groupRef, aan[an].groupRef);
-          av.alignment.deleteAnnotation(aan[an]);
+          av.getAlignment().deleteAnnotation(aan[an]);
           aan[an] = null;
         }
       }
     }
-    SequenceGroup sg;
-    if (gr != null)
+    if (av.getAlignment().getGroups()!= null)
     {
-      for (int g = 0; g < gr.size(); g++)
+      for (SequenceGroup sg:av.getAlignment().getGroups())
       {
         updateCalcs = false;
-        sg = (SequenceGroup) gr.elementAt(g);
         if (applyGlobalSettings || !oldrfs.containsKey(sg))
         {
           // set defaults for this group's conservation/consensus
@@ -914,12 +950,12 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
         if (conv)
         {
           updateCalcs = true;
-          av.alignment.addAnnotation(sg.getConservationRow(), 0);
+          av.getAlignment().addAnnotation(sg.getConservationRow(), 0);
         }
         if (cons)
         {
           updateCalcs = true;
-          av.alignment.addAnnotation(sg.getConsensus(), 0);
+          av.getAlignment().addAnnotation(sg.getConsensus(), 0);
         }
         // refresh the annotation rows
         if (updateCalcs)
@@ -935,12 +971,19 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
   @Override
   public AlignmentI getAlignment()
   {
-    return av.alignment;
+    return av.getAlignment();
   }
   @Override
   public StructureSelectionManager getStructureSelectionManager()
   {
     return StructureSelectionManager.getStructureSelectionManager(av.applet);
   }
+  @Override
+  public void raiseOOMWarning(String string, OutOfMemoryError error)
+  {
+    // TODO: JAL-960
+    System.err.println("Out of memory whilst '"+string+"'");
+    error.printStackTrace();
+  }
 
 }