update author list in license for (JAL-826)
[jalview.git] / src / jalview / appletgui / AlignmentPanel.java
old mode 100755 (executable)
new mode 100644 (file)
index e4b9b59..224b966
@@ -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.
  * 
@@ -24,6 +24,7 @@ import java.util.Vector;
 
 import jalview.api.AlignmentViewPanel;
 import jalview.datamodel.*;
+import jalview.structure.StructureSelectionManager;
 
 public class AlignmentPanel extends Panel implements AdjustmentListener, AlignmentViewPanel
 {
@@ -48,7 +49,19 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
 
   // this value is set false when selection area being dragged
   boolean fastPaint = true;
-
+  
+  public void finalize() {
+    alignFrame=null;
+    av=null;
+    seqPanel=null;
+    seqPanelHolder=null;
+    sequenceHolderPanel=null;
+    scalePanel=null;
+    scalePanelHolder=null;
+    annotationPanel=null;
+    annotationPanelHolder=null;
+    annotationSpaceFillerHolder=null;
+  }
   public AlignmentPanel(AlignFrame af, final AlignViewport av)
   {
     try
@@ -92,8 +105,12 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
       public void componentResized(ComponentEvent evt)
       {
         setScrollValues(av.getStartRes(), av.getStartSeq());
+        if (getSize().height>0 && annotationPanelHolder.getSize().height>0) {
+          validateAnnotationDimensions(false);
+        }
         repaint();
       }
+      
     });
 
     Dimension d = calculateIdWidth();
@@ -160,6 +177,7 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
     Dimension d = calculateIdWidth();
     d.setSize(d.width + 4, seqPanel.seqCanvas.getSize().height);
     alabels.setSize(d.width + 4, ap);
+    
     idPanel.idCanvas.setSize(d);
     hscrollFillerPanel.setSize(d);
     
@@ -264,6 +282,7 @@ 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)
     {
@@ -283,10 +302,11 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
       }
       if (av.applet.debug) {
         // DEBUG
-        System.out.println("DEBUG: scroll didn't happen: 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];
@@ -298,21 +318,57 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
       {
         return false;
       }
-      if (av.hasHiddenColumns)
+      return scrollTo(start, end, seqIndex, false, redrawOverview);
+    }
+    return true;
+  }
+  public boolean scrollTo(int ostart, int end, int seqIndex, boolean scrollToNearest, boolean redrawOverview)
+  {
+           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)
       {
-        start = av.getColumnSelection().findColumnPosition(start);
-        end = av.getColumnSelection().findColumnPosition(end);
-        if (start == end)
+        if (!scrollToNearest && !av.colSel.isVisible(ostart))
         {
-          if (!av.colSel.isVisible(r[0]))
-          {
-            // don't scroll - position isn't visible
-            return false;
-          }
+          // 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)))
@@ -334,14 +390,14 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
               seqIndex = 0;
             }
           }
+          // System.out.println("trying to scroll to: "+start+" "+seqIndex);
           setScrollValues(start, seqIndex);
-        }
+        }/**/
       }
       else
       {
         scrollToWrappedVisible(start);
       }
-    }
     if (redrawOverview && overviewPanel != null)
     {
       overviewPanel.setBoxPosition();
@@ -399,42 +455,53 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
     apvscroll.addNotify();
     hscroll.addNotify();
     validate();
-    addNotify();
-    repaint();
+    paintAlignment(true);
   }
   /**
    * calculate the annotation dimensions and refresh slider values accordingly.
    * need to do repaints/notifys afterwards. 
    */
   protected void validateAnnotationDimensions(boolean adjustPanelHeight) {
+    boolean modified=false;
     int height = annotationPanel.calcPanelHeight();
+    int minsize=0;
     if (hscroll.isVisible())
     {
-      height += hscroll.getPreferredSize().height;
+      height += (minsize=hscroll.getPreferredSize().height);
+    }
+    if (apvscroll.isVisible()) {
+      minsize+=apvscroll.getPreferredSize().height;
     }
     int mheight = height;
+    Dimension d=sequenceHolderPanel.getSize(),e=idPanel.getSize(); 
+    int seqandannot=d.height-scalePanelHolder.getSize().height;
     // sets initial preferred height
-    if ((height+40) > getSize().height / 2)
+    if ((height+40) > seqandannot / 2)
     {
-      height = getSize().height / 2;
+      height = seqandannot / 2;
     }
     if (!adjustPanelHeight)
     {
       // maintain same window layout whilst updating sliders
-      height=seqPanelHolder.getSize().height;
+      height=annotationPanelHolder.getSize().height;
+    }
+            
+    if (seqandannot-height<5)
+    {
+      height = seqandannot;
     }
-    Dimension d=seqPanelHolder.getSize(),e=idPanel.getSize(); 
     annotationPanel.setSize(new Dimension(d.width,height));
-    alabels.setSize(e.width,height);
+    alabels.setSize(new Dimension(e.width,height));
     annotationSpaceFillerHolder.setSize(new Dimension(e.width, height));
     annotationPanelHolder.setSize(new Dimension(d.width, height));
-    seqPanelHolder.setSize(d.width,d.height-height);
+    seqPanelHolder.setSize(d.width,seqandannot-height);
+    seqPanel.seqCanvas.setSize(d.width, seqPanel.seqCanvas.getSize().height);
     int s=apvscroll.getValue();
     if (s>mheight-height)
     {
       s = 0;
     }
-    apvscroll.setValues(apvscroll.getValue(), height, 0, mheight);
+    apvscroll.setValues(s, height, 0, mheight);
     annotationPanel.setScrollOffset(apvscroll.getValue());
     alabels.setScrollOffset(apvscroll.getValue());
   }
@@ -528,9 +595,7 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
     {
       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;
@@ -547,6 +612,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;
     }
 
@@ -562,6 +629,7 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
 
     if (x < 0)
     {
+      System.err.println("x was "+x);
       x = 0;
     }
 
@@ -574,6 +642,9 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
     }
 
     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);
 
@@ -581,6 +652,8 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
     {
       overviewPanel.setBoxPosition();
     }
+    sendViewPosition();
+
 
   }
 
@@ -658,8 +731,13 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
         annotationPanel.fastPaint(av.getStartRes() - oldX);
       }
     }
+    sendViewPosition();
 
   }
+  private void sendViewPosition()
+  {
+    StructureSelectionManager.getStructureSelectionManager(av.applet).sendViewPosition(this, av.startRes, av.endRes, av.startSeq, av.endSeq);
+  }
 
   public void paintAlignment(boolean updateOverview)
   {
@@ -668,7 +746,7 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
     if (updateOverview)
     {
       jalview.structure.StructureSelectionManager
-              .getStructureSelectionManager().sequenceColoursChanged(this);
+              .getStructureSelectionManager(av.applet).sequenceColoursChanged(this);
 
       if (overviewPanel != null)
       {
@@ -896,5 +974,10 @@ public class AlignmentPanel extends Panel implements AdjustmentListener, Alignme
   {
     return av.alignment;
   }
+  @Override
+  public StructureSelectionManager getStructureSelectionManager()
+  {
+    return StructureSelectionManager.getStructureSelectionManager(av.applet);
+  }
 
 }