Hey,

This patch fixes a couple of bugs in ScrollPane's getScrollPosition and
setScrollPosition methods:

- Both methods should throw a NPE if the scrollpane does have a child
(i.e. no componenent).  

- In the setScrollPosition(int, int) method, we need to check that both
parameters are within the allowed bounds.  That is, x >= 0, y >=0 ,
width <= (child's width - viewport width) and 
height <= (child's height - viewport height).

This patch passes a couple of failing Harmony's tests.  I have also
commited mauve tests for these changes.

Cheers,
Tania


2006-12-08  Tania Bento  <[EMAIL PROTECTED]>

        * java/awt/ScrollPane.java
        (getScrollPosition): Throw NullPointerException if scrollpane
        does have a child.
        (setScrollPosition(int, int)): Throw NullPointerException if
        scrollpane does have a child.  Check that both ints are within
        the allowed bounds; If they are not, scroll to the closest
allowed
        bound.

Index: java/awt/ScrollPane.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/awt/ScrollPane.java,v
retrieving revision 1.30
diff -u -r1.30 ScrollPane.java
--- java/awt/ScrollPane.java	6 Dec 2006 20:13:27 -0000	1.30
+++ java/awt/ScrollPane.java	8 Dec 2006 16:36:16 -0000
@@ -338,10 +338,15 @@
   * Returns the current scroll position of the viewport.
   *
   * @return The current scroll position of the viewport.
+  * 
+  * @throws NullPointerException if the scrollpane does have a child.
   */
 public Point
 getScrollPosition()
 {
+  if (getComponentCount() == 0)
+    throw new NullPointerException();
+  
   int x = 0;
   int y = 0;
 
@@ -380,20 +385,35 @@
   * @param x The new X coordinate of the scroll position.
   * @param y The new Y coordinate of the scroll position.
   *
+  * @throws NullPointerException if scrollpane does not have a child.
+  * 
   * @exception IllegalArgumentException If the specified value is outside
   * the legal scrolling range.
   */
 public void
 setScrollPosition(int x, int y)
 {
+  if (getComponentCount() == 0)
+    throw new NullPointerException("child is null");
+
+  if (x > (int) (getComponent(0).getWidth() - getViewportSize().getWidth()))
+    x = (int) (getComponent(0).getWidth() - getViewportSize().getWidth());
+  if (y > (int) (getComponent(0).getHeight() - getViewportSize().getHeight()))
+    y = (int) (getComponent(0).getHeight() - getViewportSize().getHeight());
+
+  if (x < 0)
+    x = 0;
+  if (y < 0)
+    y = 0;
+    
   Adjustable h = getHAdjustable();
   Adjustable v = getVAdjustable();
-
+  
   if (h != null)
     h.setValue(x);
   if (v != null)
     v.setValue(y);
-  
+   
   ScrollPanePeer spp = (ScrollPanePeer)getPeer();
   if (spp != null)
     spp.setScrollPosition(x, y);

Reply via email to