This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[gui] [PATCH] Fix List peer's native getSize() method
- From: David Jee <djee at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: Tue, 25 May 2004 11:25:57 -0400
- Subject: [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), ¤t_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 ();