This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[gui] [PATCH] Fix List peer's native getSize() method


Hello,

I committed the following patch to the java-gui-branch.  It fixes List
peer's native getSize() method, so that it properly queries for the
widget's natural size.  The patch also fixes a bug in GtkComponentPeer's
constructor, which was preventing component peers from receiving
setBounds() calls.

-David Jee

2004-05-25  David Jee  <djee@redhat.com>

        * gnu/java/awt/peer/gtk/GtkComponentPeer.java
        (GtkComponentPeer): Set bounds regardless of whether awtComponent
        is valid.
        * gnu/java/awt/peer/gtk/GtkListPeer.java
        (getSize): Change native method declaration.
        (minimumSize): Pass visible row count into getSize().
        (preferredSize): Likewise.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
        (Java_gnu_java_awt_peer_gtk_GtkListPeer_getSize): Use scroll window's
        natural size. Use visible row count to determine the final height
        value to return.


Index: gnu/java/awt/peer/gtk/GtkComponentPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java,v
retrieving revision 1.16.2.9
diff -u -r1.16.2.9 GtkComponentPeer.java
--- gnu/java/awt/peer/gtk/GtkComponentPeer.java	18 May 2004 22:06:01 -0000	1.16.2.9
+++ gnu/java/awt/peer/gtk/GtkComponentPeer.java	25 May 2004 15:15:29 -0000
@@ -145,12 +145,8 @@
                                                      dims[0], dims[1]);
       }
 
-      if (awtComponent.isValid ())
-        {
-          Rectangle bounds = awtComponent.getBounds ();
-
-          setBounds (bounds.x, bounds.y, bounds.width, bounds.height);
-        }
+      Rectangle bounds = awtComponent.getBounds ();
+      setBounds (bounds.x, bounds.y, bounds.width, bounds.height);
     } catch (RuntimeException ex) { ; }
   }
 
Index: gnu/java/awt/peer/gtk/GtkListPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java,v
retrieving revision 1.7.2.2
diff -u -r1.7.2.2 GtkListPeer.java
--- gnu/java/awt/peer/gtk/GtkListPeer.java	18 May 2004 22:06:01 -0000	1.7.2.2
+++ gnu/java/awt/peer/gtk/GtkListPeer.java	25 May 2004 15:15:29 -0000
@@ -63,7 +63,7 @@
   native void gtkSetFont (String name, int style, int size);
   native void gtkWidgetRequestFocus ();
 
-  native void getSize (int rows, int dims[]);
+  native void getSize (int rows, int visibleRows, int dims[]);
 
   public GtkListPeer (List list)
   {
@@ -109,7 +109,8 @@
   {
     int dims[] = new int[2];
 
-    getSize (rows, dims);
+    int visibleRows = ((List) awtComponent).getRows();
+    getSize (rows, visibleRows, dims);
     return new Dimension (dims[0], dims[1]);
   }
 
@@ -117,7 +118,8 @@
   {
     int dims[] = new int[2];
 
-    getSize (rows, dims);
+    int visibleRows = ((List) awtComponent).getRows();
+    getSize (rows, visibleRows, dims);
     return new Dimension (dims[0], dims[1]);
   }
 
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c,v
retrieving revision 1.7.8.2
diff -u -r1.7.8.2 gnu_java_awt_peer_gtk_GtkListPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c	18 May 2004 22:06:01 -0000	1.7.8.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c	25 May 2004 15:15:30 -0000
@@ -348,31 +348,42 @@
 
 JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkListPeer_getSize
-  (JNIEnv *env, jobject obj, jint rows, jintArray jdims)
+  (JNIEnv *env, jobject obj, jint rows, jint visible_rows, jintArray jdims)
 {
   void *ptr;
   jint *dims;
-  GtkTreeView *list;
-  GtkTreeModel *list_store;
-  GtkScrolledWindow *sw;
-  GtkRequisition req;
+  GtkRequisition current_req;
+  GtkRequisition natural_req;
 
   dims = (*env)->GetIntArrayElements (env, jdims, NULL);
   dims[0] = dims[1] = 0;
 
-  if (rows < 3)
-    rows = 3;
-
   ptr = NSA_GET_PTR (env, obj);
 
   gdk_threads_enter ();
 
-  sw = GTK_SCROLLED_WINDOW (ptr);
-  list = TREE_VIEW_FROM_SW (ptr);
-  list_store = gtk_tree_view_get_model (list);
-  gtk_widget_size_request (GTK_WIDGET (sw), &req);
-  dims[1] = req.height;
-  dims[0] = req.width;
+  /* Save the widget's current size request. */
+  gtk_widget_size_request (GTK_WIDGET (ptr), &current_req);
+      
+  /* Get the widget's "natural" size request. */
+  gtk_widget_set_size_request (GTK_WIDGET (ptr), -1, -1);
+  gtk_widget_size_request (GTK_WIDGET (ptr), &natural_req);
+
+  /* Reset the widget's size request. */
+  gtk_widget_set_size_request (GTK_WIDGET (ptr),
+                               current_req.width, current_req.height);
+
+  dims[0] = natural_req.width;
+
+  /* Calculate the final height, by comparing the number of rows
+     in the list to the number of rows requested by the caller.
+     FIXME: Is there a GTK method that counts the number of rows
+     in the list? If so, we don't need to bring visible_rows from
+     the Java peer. */
+  if (rows == visible_rows)
+    dims[1] = natural_req.height;
+  else
+    dims[1] = natural_req.height / visible_rows * rows;
 
   gdk_threads_leave ();
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]