This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[PATCH]: Fixes to AWT List
- From: Fernando Nasser <fnasser at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: Mon, 01 Dec 2003 18:47:25 -0500
- Subject: [PATCH]: Fixes to AWT List
- Organization: Red Hat , Inc. - Toronto
This patch fixes many problems in the AWT List widget. It became usable now.
Many thanks to Thomas Fitzsimmons as without his help I would not be able to
come up with these fixes.
Regards to all,
Fernando
2003-12-01 Fernando Nasser <fnasser@redhat.com>
* 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.
Index: libjava/gnu/java/awt/peer/gtk/GtkListPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java,v
retrieving revision 1.2
diff -c -p -r1.2 GtkListPeer.java
*** libjava/gnu/java/awt/peer/gtk/GtkListPeer.java 13 Jul 2003 15:09:20 -0000 1.2
--- libjava/gnu/java/awt/peer/gtk/GtkListPeer.java 1 Dec 2003 23:19:21 -0000
*************** exception statement from your version. *
*** 38,45 ****
--- 38,48 ----
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
*************** public class GtkListPeer extends GtkComp
*** 119,124 ****
--- 122,150 ----
public void setMultipleSelections (boolean b)
{
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)
Index: libjava/java/awt/List.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/List.java,v
retrieving revision 1.14
diff -c -p -r1.14 List.java
*** libjava/java/awt/List.java 5 Jun 2003 19:58:39 -0000 1.14
--- libjava/java/awt/List.java 1 Dec 2003 23:19:22 -0000
*************** getSelectedIndex()
*** 668,674 ****
selected = l.getSelectedIndexes ();
}
! if (selected == null || selected.length > 1)
return -1;
return selected[0];
}
--- 668,674 ----
selected = l.getSelectedIndexes ();
}
! if (selected == null || selected.length != 1)
return -1;
return selected[0];
}
Index: libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c,v
retrieving revision 1.9
diff -c -p -r1.9 gnu_java_awt_peer_gtk_GtkEvents.c
*** libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 9 Oct 2003 00:26:29 -0000 1.9
--- libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 1 Dec 2003 23:19:28 -0000
*************** generates_key_typed_event (GdkEvent *eve
*** 813,819 ****
void
awt_event_handler (GdkEvent *event)
{
! jobject *event_obj_ptr;
static guint32 button_click_time = 0;
static GdkWindow *button_window = NULL;
static guint button_number = -1;
--- 813,819 ----
void
awt_event_handler (GdkEvent *event)
{
! jobject *event_obj_ptr = NULL;
static guint32 button_click_time = 0;
static GdkWindow *button_window = NULL;
static guint button_number = -1;
*************** awt_event_handler (GdkEvent *event)
*** 827,832 ****
--- 827,850 ----
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)
*************** awt_event_handler (GdkEvent *event)
*** 845,862 ****
/* 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,
gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
gdk_atom_intern ("CARDINAL", FALSE),
0,
--- 863,871 ----
/* 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. 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,
*************** awt_event_handler (GdkEvent *event)
*** 867,872 ****
--- 876,906 ----
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;
jobject *grab_obj_ptr = NULL;
*************** awt_event_handler (GdkEvent *event)
*** 879,908 ****
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))
{
! g_free (grab_obj_ptr);
! grab_obj_ptr = event_obj_ptr;
}
}
! else
grab_obj_ptr = event_obj_ptr;
switch (event->type)
{
--- 913,959 ----
grab_widget = global_gtk_window_group->grabs->data;
g_assert (grab_widget);
ptr = NSA_GET_PTR (gdk_env, *event_obj_ptr);
event_widget = GTK_WIDGET(ptr);
! /* 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))
{
! /* 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);
! }
}
}
!
! if (!grab_obj_ptr)
grab_obj_ptr = event_obj_ptr;
+ else
+ g_free (event_obj_ptr);
switch (event->type)
{
*************** awt_event_handler (GdkEvent *event)
*** 1046,1052 ****
bottom = r.height - h - y;
right = r.width - w - x;
! (*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr,
postConfigureEventID,
(jint) event->configure.x,
(jint) event->configure.y,
--- 1097,1103 ----
bottom = r.height - h - y;
right = r.width - w - x;
! (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
postConfigureEventID,
(jint) event->configure.x,
(jint) event->configure.y,
*************** awt_event_handler (GdkEvent *event)
*** 1062,1068 ****
break;
case GDK_EXPOSE:
{
! (*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr,
postExposeEventID,
(jint)event->expose.area.x,
(jint)event->expose.area.y,
--- 1113,1119 ----
break;
case GDK_EXPOSE:
{
! (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
postExposeEventID,
(jint)event->expose.area.x,
(jint)event->expose.area.y,
*************** awt_event_handler (GdkEvent *event)
*** 1093,1099 ****
/* 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))
obj_window = gtk_widget_get_parent (window->focus_widget)->window;
else
obj_window = window->focus_widget->window;
--- 1144,1151 ----
/* 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)
! || GTK_IS_CLIST (window->focus_widget))
obj_window = gtk_widget_get_parent (window->focus_widget)->window;
else
obj_window = window->focus_widget->window;
*************** awt_event_handler (GdkEvent *event)
*** 1148,1154 ****
{
gtk_widget_activate (window->focus_widget);
! if (GTK_IS_TEXT_VIEW (window->focus_widget))
obj_window = gtk_widget_get_parent (window->focus_widget)->window;
else
obj_window = window->focus_widget->window;
--- 1200,1207 ----
{
gtk_widget_activate (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;
*************** awt_event_handler (GdkEvent *event)
*** 1176,1182 ****
}
break;
case GDK_FOCUS_CHANGE:
! (*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr,
postFocusEventID,
(jint) (event->focus_change.in) ?
AWT_FOCUS_GAINED : AWT_FOCUS_LOST,
--- 1229,1235 ----
}
break;
case GDK_FOCUS_CHANGE:
! (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
postFocusEventID,
(jint) (event->focus_change.in) ?
AWT_FOCUS_GAINED : AWT_FOCUS_LOST,
*************** awt_event_handler (GdkEvent *event)
*** 1185,1191 ****
default:
break;
}
! g_free (event_obj_ptr);
}
gtk_main_do_event (event);
--- 1238,1244 ----
default:
break;
}
! g_free (grab_obj_ptr);
}
gtk_main_do_event (event);
Index: libjava/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.4
diff -c -p -r1.4 gnu_java_awt_peer_gtk_GtkListPeer.c
*** libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c 30 Oct 2003 01:49:39 -0000 1.4
--- libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c 1 Dec 2003 23:19:28 -0000
*************** Java_gnu_java_awt_peer_gtk_GtkListPeer_d
*** 192,203 ****
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);
gdk_threads_leave ();
}
--- 192,205 ----
list = CLIST_FROM_SW (ptr);
if (end == -1) /* special case for removing all rows */
! 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 ();
}