From: Fernando Nasser Date: Tue, 2 Dec 2003 16:19:28 +0000 (+0000) Subject: GtkListPeer.java (handleEvent): New method. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a1045386316fccf1a884820f8ce0589ecf8dcdd9;p=gcc.git GtkListPeer.java (handleEvent): New method. 2003-12-02 Fernando Nasser * gnu/java/awt/peer/gtk/GtkListPeer.java (handleEvent): New method. Handle mouse and key events that must generate ActionEvents. * java/awt/List.java (getSelectedIndex): Return -1 if no list element is selected. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c (awt_event_handler): Correct handling of mouse and key events so that List receives them. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c (Java_gnu_java_awt_peer_gtk_GtkListPeer_delItems): Fix removal of multiple list elements. From-SVN: r74189 --- diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 05b92374852..60857083f4f 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,16 @@ +2003-12-02 Fernando Nasser + + * gnu/java/awt/peer/gtk/GtkListPeer.java (handleEvent): New + method. Handle mouse and key events that must generate + ActionEvents. + * java/awt/List.java (getSelectedIndex): Return -1 + if no list element is selected. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c (awt_event_handler): + Correct handling of mouse and key events so that List receives them. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c + (Java_gnu_java_awt_peer_gtk_GtkListPeer_delItems): Fix removal of + multiple list elements. + 2003-12-02 Ito Kazumitsu * java/text/SimpleDateFormat.java (compileFormat): diff --git a/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java index 2ba183b09ea..f90497e7182 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java @@ -38,8 +38,11 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; +import java.awt.AWTEvent; import java.awt.Dimension; import java.awt.List; +import java.awt.event.MouseEvent; +import java.awt.event.KeyEvent; import java.awt.peer.ListPeer; public class GtkListPeer extends GtkComponentPeer @@ -121,6 +124,29 @@ public class GtkListPeer extends GtkComponentPeer setMultipleMode (b); } + public void handleEvent (AWTEvent e) + { + if (e.getID () == MouseEvent.MOUSE_CLICKED && isEnabled ()) + { + MouseEvent me = (MouseEvent) e; + if (!me.isConsumed () + && (me.getModifiers () & MouseEvent.BUTTON1_MASK) != 0 + && me.getClickCount() > 1) + postActionEvent (((List)awtComponent).getSelectedItem (), + me.getModifiers ()); + } + + if (e.getID () == KeyEvent.KEY_PRESSED) + { + KeyEvent ke = (KeyEvent) e; + if (!ke.isConsumed () && ke.getKeyCode () == KeyEvent.VK_ENTER) + postActionEvent (((List)awtComponent).getSelectedItem (), + ke.getModifiers ()); + } + + super.handleEvent (e); + } + protected void postItemEvent (int item, int stateChange) { postItemEvent (new Integer (item), stateChange); diff --git a/libjava/java/awt/List.java b/libjava/java/awt/List.java index 2f4932ef29f..23ca34fab0c 100644 --- a/libjava/java/awt/List.java +++ b/libjava/java/awt/List.java @@ -668,7 +668,7 @@ getSelectedIndex() selected = l.getSelectedIndexes (); } - if (selected == null || selected.length > 1) + if (selected == null || selected.length != 1) return -1; return selected[0]; } diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c index 74939f8eca5..0411352c7ca 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c @@ -813,7 +813,7 @@ generates_key_typed_event (GdkEvent *event, GtkWidget *source) void awt_event_handler (GdkEvent *event) { - jobject *event_obj_ptr; + jobject *event_obj_ptr = NULL; static guint32 button_click_time = 0; static GdkWindow *button_window = NULL; static guint button_number = -1; @@ -827,6 +827,24 @@ awt_event_handler (GdkEvent *event) return; } + /* If it is not an input event, let the main loop handle it */ + if (!(event->type == GDK_BUTTON_PRESS + || event->type == GDK_BUTTON_RELEASE + || event->type == GDK_ENTER_NOTIFY + || event->type == GDK_LEAVE_NOTIFY + || event->type == GDK_CONFIGURE + || event->type == GDK_EXPOSE + || event->type == GDK_KEY_PRESS + || event->type == GDK_KEY_RELEASE + || event->type == GDK_FOCUS_CHANGE + || event->type == GDK_MOTION_NOTIFY)) + { + gtk_main_do_event (event); + return; + } + + /* Handle input events */ + /* keep track of clickCount ourselves, since the AWT allows more than a triple click to occur */ if (event->type == GDK_BUTTON_PRESS) @@ -845,18 +863,9 @@ awt_event_handler (GdkEvent *event) /* for all input events, which have a window with a jobject attached, send the input event off to Java before GTK has a chance to process - the event */ - if ((event->type == GDK_BUTTON_PRESS - || event->type == GDK_BUTTON_RELEASE - || event->type == GDK_ENTER_NOTIFY - || event->type == GDK_LEAVE_NOTIFY - || event->type == GDK_CONFIGURE - || event->type == GDK_EXPOSE - || event->type == GDK_KEY_PRESS - || event->type == GDK_KEY_RELEASE - || event->type == GDK_FOCUS_CHANGE - || event->type == GDK_MOTION_NOTIFY) - && gdk_property_get (event->any.window, + the event. Note that the jobject may be in the parent for widgets + that are always inside a scrolled window, like List */ + if (!gdk_property_get (event->any.window, gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE), gdk_atom_intern ("CARDINAL", FALSE), 0, @@ -866,6 +875,31 @@ awt_event_handler (GdkEvent *event) NULL, NULL, (guchar **)&event_obj_ptr)) + { + /* See if is contained in a scrolled pane */ + GtkWidget *widget; + gdk_window_get_user_data (event->any.window, (void **) &widget); + + if ((gtk_widget_get_parent (widget) != NULL) + && (gtk_widget_get_parent (widget)->window != NULL)) + { + GtkWidget *parent = gtk_widget_get_parent (widget); + + if (GTK_IS_SCROLLED_WINDOW (parent)) + gdk_property_get (gtk_widget_get_parent (widget)->window, + gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE), + gdk_atom_intern ("CARDINAL", FALSE), + 0, + sizeof (jobject), + FALSE, + NULL, + NULL, + NULL, + (guchar **)&event_obj_ptr); + } + } + + if (event_obj_ptr) { GtkWidget *event_widget; GtkWidget *grab_widget; @@ -879,30 +913,47 @@ awt_event_handler (GdkEvent *event) grab_widget = global_gtk_window_group->grabs->data; g_assert (grab_widget); - gdk_property_get (grab_widget->window, - gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE), - gdk_atom_intern ("CARDINAL", FALSE), - 0, - sizeof (jobject), - FALSE, - NULL, - NULL, - NULL, - (guchar **)&grab_obj_ptr); - ptr = NSA_GET_PTR (gdk_env, *event_obj_ptr); event_widget = GTK_WIDGET(ptr); - if (GTK_WIDGET_IS_SENSITIVE (event_widget) && - gtk_widget_is_ancestor (event_widget, grab_widget)) + /* Don't need to do this if it is the same widget as we + * already got the jobject above. + * Also, don't do it for the BUTTON_PRESS as the focus may be + * changing and the event widget is the one that must + * receive it (again, we have the jobject already) + */ + if ((event_widget != grab_widget) + && (event->type != GDK_BUTTON_PRESS)) { - g_free (grab_obj_ptr); - - grab_obj_ptr = event_obj_ptr; + /* If the grab widget is an ancestor of the event widget + * then we send the event to the original event widget. + * This is the key to implementing modality. + * Unless the widget is disabled, in this case the grab + * widget still gets the event. + * XXX: But the grab widget may not be an ancestor!!! + */ + if (!GTK_WIDGET_IS_SENSITIVE (event_widget) + || !gtk_widget_is_ancestor (event_widget, grab_widget)) + { + gdk_property_get (grab_widget->window, + gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE), + gdk_atom_intern ("CARDINAL", FALSE), + 0, + sizeof (jobject), + FALSE, + NULL, + NULL, + NULL, + (guchar **)&grab_obj_ptr); + + } } } - else + + if (!grab_obj_ptr) grab_obj_ptr = event_obj_ptr; + else + g_free (event_obj_ptr); switch (event->type) { @@ -1035,7 +1086,7 @@ awt_event_handler (GdkEvent *event) bottom = 6; right = 6; - (*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr, + (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postConfigureEventID, (jint) event->configure.x, (jint) event->configure.y, @@ -1051,7 +1102,7 @@ awt_event_handler (GdkEvent *event) break; case GDK_EXPOSE: { - (*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr, + (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postExposeEventID, (jint)event->expose.area.x, (jint)event->expose.area.y, @@ -1082,7 +1133,8 @@ awt_event_handler (GdkEvent *event) /* TextArea peers are attached to the scrolled window that contains the GtkTextView, not to the text view itself. */ - if (GTK_IS_TEXT_VIEW (window->focus_widget)) + if (GTK_IS_TEXT_VIEW (window->focus_widget) + || GTK_IS_CLIST (window->focus_widget)) obj_window = gtk_widget_get_parent (window->focus_widget)->window; else obj_window = window->focus_widget->window; @@ -1137,7 +1189,8 @@ awt_event_handler (GdkEvent *event) { gtk_widget_activate (window->focus_widget); - if (GTK_IS_TEXT_VIEW (window->focus_widget)) + if (GTK_IS_TEXT_VIEW (window->focus_widget) + || GTK_IS_CLIST (window->focus_widget)) obj_window = gtk_widget_get_parent (window->focus_widget)->window; else obj_window = window->focus_widget->window; @@ -1165,7 +1218,7 @@ awt_event_handler (GdkEvent *event) } break; case GDK_FOCUS_CHANGE: - (*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr, + (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postFocusEventID, (jint) (event->focus_change.in) ? AWT_FOCUS_GAINED : AWT_FOCUS_LOST, @@ -1174,7 +1227,7 @@ awt_event_handler (GdkEvent *event) default: break; } - g_free (event_obj_ptr); + g_free (grab_obj_ptr); } gtk_main_do_event (event); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c index 6c37aeb82e2..94c303e0cdd 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c @@ -192,12 +192,14 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_delItems list = CLIST_FROM_SW (ptr); if (end == -1) /* special case for removing all rows */ - end = list->rows; - - gtk_clist_freeze (list); - for (i = start; i < end; i++) - gtk_clist_remove (list, i); - gtk_clist_thaw (list); + gtk_clist_clear (list); + else + { + gtk_clist_freeze (list); + for (i = end; i >= start; i--) + gtk_clist_remove (list, i); + gtk_clist_thaw (list); + } gdk_threads_leave (); }