Hi,

The GtkScrollbarPeer wasn't setting the new value on the Scrollbar
component. And Component didn't handle translation of the
AdjustmentEvents to old style Events for use in handleEvent(). My test
application was using old style Events. It ignored the actual value in
the Event. And tried to use the Scrollbar.getValue() result to adjust
some properties. With this patch this all works now.

2006-02-20  Mark Wielaard  <[EMAIL PROTECTED]>

    * java/awt/Component.java (translateEvent): Translate
    AdjustmentEvents to 1.0 Events.
    * gnu/java/awt/peer/gtk/GtkScrollbarPeer.java (changing): New field.
    (setValues): Check whether we are currently changing and being called
    back from the Scrollbar component.
    (setBarValues): New native method.
    (postAdjustmentEvent): Set new Scrollbar value.
    * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c
    (Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setValues): Renamed to
    Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setBarValue
    * include/gnu_java_awt_peer_gtk_GtkScrollbarPeer.h: Regenerated.

My main question is whether the "loopback" protection is correct. I got
the idea from GtkCheckboxPeer.

All vte tests using Scrollbars also still work.

Cheers,

Mark
Index: java/awt/Component.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/awt/Component.java,v
retrieving revision 1.100
diff -u -r1.100 Component.java
--- java/awt/Component.java	15 Feb 2006 20:55:07 -0000	1.100
+++ java/awt/Component.java	20 Feb 2006 22:31:13 -0000
@@ -1,5 +1,6 @@
 /* Component.java -- a graphics component
-   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004  Free Software Foundation
+   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2006
+   Free Software Foundation
 
 This file is part of GNU Classpath.
 
@@ -40,6 +41,7 @@
 
 import java.awt.dnd.DropTarget;
 import java.awt.event.ActionEvent;
+import java.awt.event.AdjustmentEvent;
 import java.awt.event.ComponentEvent;
 import java.awt.event.ComponentListener;
 import java.awt.event.FocusEvent;
@@ -4876,6 +4878,25 @@
                                     0, 0, oldKey, oldMods);
           }
       }
+    else if (e instanceof AdjustmentEvent)
+      {
+	AdjustmentEvent ae = (AdjustmentEvent) e;
+	int type = ae.getAdjustmentType();
+	int oldType;
+	if (type == AdjustmentEvent.BLOCK_DECREMENT)
+	  oldType = Event.SCROLL_PAGE_UP;
+	else if (type == AdjustmentEvent.BLOCK_INCREMENT)
+	  oldType = Event.SCROLL_PAGE_DOWN;
+	else if (type == AdjustmentEvent.TRACK)
+	  oldType = Event.SCROLL_ABSOLUTE;
+	else if (type == AdjustmentEvent.UNIT_DECREMENT)
+	  oldType = Event.SCROLL_LINE_UP;
+	else if (type == AdjustmentEvent.UNIT_INCREMENT)
+	  oldType = Event.SCROLL_LINE_DOWN;
+	else
+	  oldType = type;
+	translated = new Event(target, oldType, new Integer(ae.getValue()));
+      }
     else if (e instanceof ActionEvent)
       translated = new Event (target, Event.ACTION_EVENT,
                               ((ActionEvent) e).getActionCommand ());
Index: gnu/java/awt/peer/gtk/GtkScrollbarPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java,v
retrieving revision 1.19
diff -u -r1.19 GtkScrollbarPeer.java
--- gnu/java/awt/peer/gtk/GtkScrollbarPeer.java	2 Jul 2005 20:32:12 -0000	1.19
+++ gnu/java/awt/peer/gtk/GtkScrollbarPeer.java	20 Feb 2006 22:31:13 -0000
@@ -1,5 +1,5 @@
 /* GtkScrollbarPeer.java -- Implements ScrollbarPeer with GTK+
-   Copyright (C) 1998, 1999, 2005  Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2005, 2006  Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -46,6 +46,10 @@
 public class GtkScrollbarPeer extends GtkComponentPeer
     implements ScrollbarPeer
 {
+  // Set to true if we are just setting the new value.
+  // Prevents looping between component and peer setValue() calls.
+  private boolean changing;
+
   void create ()
   {
     Scrollbar sb = (Scrollbar) awtComponent;
@@ -69,11 +73,30 @@
 
   public native void setLineIncrement(int amount);
   public native void setPageIncrement(int amount);
-  public native void setValues(int value, int visible, int min, int max);
 
+  public void setValues(int value, int visible, int min, int max)
+  {
+    // If we were the one just setting a new value, don't set it again.
+    if (changing && Thread.currentThread() == GtkToolkit.mainThread)
+      {
+        changing = false;
+        return;
+      }
+    setBarValues(value, visible, min, max);
+  }
+
+  private native void setBarValues(int value, int visible, int min, int max);
+
+  /**
+   * Called from the native site when the scrollbar changed.
+   * Notifies the Scrollbar component and posts an event.
+   */
   protected void postAdjustmentEvent (int type, int value)
   {
-    q().postEvent (new AdjustmentEvent ((Adjustable)awtComponent, 
+    Scrollbar bar = (Scrollbar) awtComponent;
+    changing = true;
+    bar.setValue(value);
+    q().postEvent (new AdjustmentEvent(bar, 
 				      AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED,
 				      type, value));
   }
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c,v
retrieving revision 1.3
diff -u -r1.3 gnu_java_awt_peer_gtk_GtkScrollbarPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c	9 Feb 2006 16:00:49 -0000	1.3
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c	20 Feb 2006 22:31:13 -0000
@@ -1,5 +1,5 @@
 /* gtkscrollbarpeer.c -- Native implementation of GtkScrollbarPeer
-   Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2006 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -179,7 +179,7 @@
 }
 
 JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setValues
+Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setBarValues
   (JNIEnv *env, jobject obj, jint value, jint visible, jint min, jint max)
 {
   void *ptr;
Index: include/gnu_java_awt_peer_gtk_GtkScrollbarPeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkScrollbarPeer.h,v
retrieving revision 1.6
diff -u -r1.6 gnu_java_awt_peer_gtk_GtkScrollbarPeer.h
--- include/gnu_java_awt_peer_gtk_GtkScrollbarPeer.h	8 Oct 2004 22:16:09 -0000	1.6
+++ include/gnu_java_awt_peer_gtk_GtkScrollbarPeer.h	20 Feb 2006 22:31:13 -0000
@@ -14,7 +14,7 @@
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectSignals (JNIEnv *env, jobject);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setLineIncrement (JNIEnv *env, jobject, jint);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setPageIncrement (JNIEnv *env, jobject, jint);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setValues (JNIEnv *env, jobject, jint, jint, jint, jint);
+JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setBarValues (JNIEnv *env, jobject, jint, jint, jint, jint);
 
 #ifdef __cplusplus
 }

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to