Here is the second, corrected version of the patch to prevent scrolling to 0,0 on revalidation.

2006-01-28  Audrius Meskauskas  <[EMAIL PROTECTED]>

 * javax/swing/ViewportLayout.java (layoutContainer): Rewritten
Index: ViewportLayout.java
===================================================================
RCS file: /sources/classpath/classpath/javax/swing/ViewportLayout.java,v
retrieving revision 1.23
diff -u -r1.23 ViewportLayout.java
--- ViewportLayout.java	10 Jan 2006 13:38:59 -0000	1.23
+++ ViewportLayout.java	28 Jan 2006 22:05:22 -0000
@@ -1,5 +1,5 @@
 /* ViewportLayout.java --
-   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2004, 2006 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -46,9 +46,16 @@
 import java.io.Serializable;
 
 /**
- * ViewportLayout
- * @author	Andrew Selkirk
- * @author	Graydon Hoare
+ * The default layout for [EMAIL PROTECTED] JViewport}. The viewport makes its view the 
+ * same size as itself, but not smaller than its minimum size. 
+ * 
+ * If the port extends extends into space <em>past</em> the edge of the view,
+ * this layout manager moves the port up or to the left, in view space, by the
+ * amount of empty space (keep the lower and right edges lined up).
+ * 
+ * @author  Andrew Selkirk
+ * @author  Graydon Hoare
+ * @author  Audrius Meskauskas ([EMAIL PROTECTED])
  */
 public class ViewportLayout implements LayoutManager, Serializable
 {
@@ -58,17 +65,31 @@
   {
     // Nothing to do here.
   }
-
+  
+  /**
+   * The method is not used with this manager.
+   */
   public void addLayoutComponent(String name, Component c) 
   {
     // Nothing to do here.
   }
 
+  /**
+   * The method is not used with this manager.
+   */
   public void removeLayoutComponent(Component c) 
   {
     // Nothing to do here.
   }
-
+  
+  /**
+   * Get the preferred layout size. If the view implements
+   * [EMAIL PROTECTED] Scrollable}, this method returns 
+   * [EMAIL PROTECTED] Scrollable#getPreferredScrollableViewportSize}.
+   * Otherwise, it returns [EMAIL PROTECTED] Component#getPreferredSize()}.
+   * 
+   * @return the preferred layout size, as described about.
+   */
   public Dimension preferredLayoutSize(Container parent) 
   {
     JViewport vp = (JViewport)parent;
@@ -83,6 +104,14 @@
       return new Dimension();
   }
 
+  /**
+   * Get the minimum layout size. Normally this method returns the value,
+   * returned by the view method [EMAIL PROTECTED] Component#getMinimumSize()}.
+   * 
+   * If the view is not set, the zero size is returned.  
+   * 
+   * @return the minimum layout size.
+   */
   public Dimension minimumLayoutSize(Container parent) 
   {
     JViewport vp = (JViewport)parent;
@@ -101,15 +130,13 @@
    *
    * <ol> 
    * 
-   * <li>If the port is larger than the view's minimum size, put the port
-   * at view position <code>(0,0)</code> and make the view's size equal to
-   * the port's.</li>
-   *
    * <li>If the port is smaller than the view, leave the view at its
-   * minimum size. also, do not move the port, <em>unless</em> the port
+   * current size. Also, do not move the port, <em>unless</em> the port
    * extends into space <em>past</em> the edge of the view. If so, move the
    * port up or to the left, in view space, by the amount of empty space
    * (keep the lower and right edges lined up)</li>
+   * <li>In [EMAIL PROTECTED] JViewport#setViewSize(Dimension)}, the view size is never
+   * set smaller that its minimum size.</li>
    *
    * </ol>
    *
@@ -118,7 +145,6 @@
    * @see JViewport#getViewPosition
    * @see JViewport#setViewPosition
    */
-
   public void layoutContainer(Container parent) 
   {
     // The way to interpret this function is basically to ignore the names
@@ -141,23 +167,22 @@
     Rectangle portBounds = port.getViewRect();
     Dimension viewPref = view.getPreferredSize();
     Dimension viewMinimum = view.getMinimumSize();
+    
     Point portLowerRight = new Point(portBounds.x + portBounds.width,
                                      portBounds.y + portBounds.height);
+    int overextension;
 
     // vertical implementation of the above rules
     if ((! (view instanceof Scrollable) && viewPref.height < portBounds.height
          || (view instanceof Scrollable
             && ((Scrollable) view).getScrollableTracksViewportHeight())))
       viewPref.height = portBounds.height;
-
-    if (portBounds.height >= viewMinimum.height)
-      portBounds.y = 0;
-    else
-      {
-        int overextension = portLowerRight.y - viewPref.height;
-        if (overextension > 0)
-            portBounds.y -= overextension;
-      }
+   
+    // If the view is larger than the port, and port is partly outside
+    // the view, it is moved fully into the view area.
+    overextension = portLowerRight.y - viewPref.height;
+    if (overextension > 0)
+      portBounds.y -= overextension;
 
     // horizontal implementation of the above rules
     if ((! (view instanceof Scrollable) && viewPref.width < portBounds.width
@@ -165,16 +190,25 @@
          && ((Scrollable) view).getScrollableTracksViewportWidth())))
       viewPref.width = portBounds.width;
 
-    if (portBounds.width >= viewMinimum.width)
-      portBounds.x = 0;
-    else
+    // If the view is larger than the port, and port is partly outside
+    // the view, it is moved fully into the view area.
+    overextension = portLowerRight.x - viewPref.width;
+    if (overextension > 0)
+      portBounds.x -= overextension;
+
+    // If the calculated view size was smaller than the minimum size,
+    // extend till the minimum size.
+    if (viewPref.height<viewMinimum.height)
+      {
+        viewPref.height = viewMinimum.height;
+      }
+    
+    if (viewPref.width<viewMinimum.width)
       {
-        int overextension = portLowerRight.x - viewPref.width;
-        if (overextension > 0)
-            portBounds.x -= overextension;
+        viewPref.width = viewMinimum.width;
       }
 
-    port.setViewPosition(portBounds.getLocation());
     port.setViewSize(viewPref);
+    port.setViewPosition(portBounds.getLocation());
   }
 }

Reply via email to