Commit a1045386 by Fernando Nasser Committed by Fernando Nasser

GtkListPeer.java (handleEvent): New method.

2003-12-02  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.

From-SVN: r74189
parent 10590d37
2003-12-02 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.
2003-12-02 Ito Kazumitsu <kaz@maczuka.gcd.org> 2003-12-02 Ito Kazumitsu <kaz@maczuka.gcd.org>
* java/text/SimpleDateFormat.java (compileFormat): * java/text/SimpleDateFormat.java (compileFormat):
......
...@@ -38,8 +38,11 @@ exception statement from your version. */ ...@@ -38,8 +38,11 @@ exception statement from your version. */
package gnu.java.awt.peer.gtk; package gnu.java.awt.peer.gtk;
import java.awt.AWTEvent;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.List; import java.awt.List;
import java.awt.event.MouseEvent;
import java.awt.event.KeyEvent;
import java.awt.peer.ListPeer; import java.awt.peer.ListPeer;
public class GtkListPeer extends GtkComponentPeer public class GtkListPeer extends GtkComponentPeer
...@@ -121,6 +124,29 @@ public class GtkListPeer extends GtkComponentPeer ...@@ -121,6 +124,29 @@ public class GtkListPeer extends GtkComponentPeer
setMultipleMode (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) protected void postItemEvent (int item, int stateChange)
{ {
postItemEvent (new Integer (item), stateChange); postItemEvent (new Integer (item), stateChange);
......
...@@ -668,7 +668,7 @@ getSelectedIndex() ...@@ -668,7 +668,7 @@ getSelectedIndex()
selected = l.getSelectedIndexes (); selected = l.getSelectedIndexes ();
} }
if (selected == null || selected.length > 1) if (selected == null || selected.length != 1)
return -1; return -1;
return selected[0]; return selected[0];
} }
......
...@@ -813,7 +813,7 @@ generates_key_typed_event (GdkEvent *event, GtkWidget *source) ...@@ -813,7 +813,7 @@ generates_key_typed_event (GdkEvent *event, GtkWidget *source)
void void
awt_event_handler (GdkEvent *event) awt_event_handler (GdkEvent *event)
{ {
jobject *event_obj_ptr; jobject *event_obj_ptr = NULL;
static guint32 button_click_time = 0; static guint32 button_click_time = 0;
static GdkWindow *button_window = NULL; static GdkWindow *button_window = NULL;
static guint button_number = -1; static guint button_number = -1;
...@@ -827,6 +827,24 @@ awt_event_handler (GdkEvent *event) ...@@ -827,6 +827,24 @@ awt_event_handler (GdkEvent *event)
return; 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 /* keep track of clickCount ourselves, since the AWT allows more
than a triple click to occur */ than a triple click to occur */
if (event->type == GDK_BUTTON_PRESS) if (event->type == GDK_BUTTON_PRESS)
...@@ -845,18 +863,9 @@ awt_event_handler (GdkEvent *event) ...@@ -845,18 +863,9 @@ awt_event_handler (GdkEvent *event)
/* for all input events, which have a window with a jobject attached, /* 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 send the input event off to Java before GTK has a chance to process
the event */ the event. Note that the jobject may be in the parent for widgets
if ((event->type == GDK_BUTTON_PRESS that are always inside a scrolled window, like List */
|| event->type == GDK_BUTTON_RELEASE if (!gdk_property_get (event->any.window,
|| 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 ("_GNU_GTKAWT_ADDR", FALSE),
gdk_atom_intern ("CARDINAL", FALSE), gdk_atom_intern ("CARDINAL", FALSE),
0, 0,
...@@ -867,6 +876,31 @@ awt_event_handler (GdkEvent *event) ...@@ -867,6 +876,31 @@ awt_event_handler (GdkEvent *event)
NULL, NULL,
(guchar **)&event_obj_ptr)) (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 *event_widget;
GtkWidget *grab_widget; GtkWidget *grab_widget;
jobject *grab_obj_ptr = NULL; jobject *grab_obj_ptr = NULL;
...@@ -879,30 +913,47 @@ awt_event_handler (GdkEvent *event) ...@@ -879,30 +913,47 @@ awt_event_handler (GdkEvent *event)
grab_widget = global_gtk_window_group->grabs->data; grab_widget = global_gtk_window_group->grabs->data;
g_assert (grab_widget); 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); ptr = NSA_GET_PTR (gdk_env, *event_obj_ptr);
event_widget = GTK_WIDGET(ptr); event_widget = GTK_WIDGET(ptr);
if (GTK_WIDGET_IS_SENSITIVE (event_widget) && /* Don't need to do this if it is the same widget as we
gtk_widget_is_ancestor (event_widget, grab_widget)) * 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); /* If the grab widget is an ancestor of the event widget
* then we send the event to the original event widget.
grab_obj_ptr = event_obj_ptr; * 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; grab_obj_ptr = event_obj_ptr;
else
g_free (event_obj_ptr);
switch (event->type) switch (event->type)
{ {
...@@ -1035,7 +1086,7 @@ awt_event_handler (GdkEvent *event) ...@@ -1035,7 +1086,7 @@ awt_event_handler (GdkEvent *event)
bottom = 6; bottom = 6;
right = 6; right = 6;
(*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr, (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
postConfigureEventID, postConfigureEventID,
(jint) event->configure.x, (jint) event->configure.x,
(jint) event->configure.y, (jint) event->configure.y,
...@@ -1051,7 +1102,7 @@ awt_event_handler (GdkEvent *event) ...@@ -1051,7 +1102,7 @@ awt_event_handler (GdkEvent *event)
break; break;
case GDK_EXPOSE: case GDK_EXPOSE:
{ {
(*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr, (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
postExposeEventID, postExposeEventID,
(jint)event->expose.area.x, (jint)event->expose.area.x,
(jint)event->expose.area.y, (jint)event->expose.area.y,
...@@ -1082,7 +1133,8 @@ awt_event_handler (GdkEvent *event) ...@@ -1082,7 +1133,8 @@ awt_event_handler (GdkEvent *event)
/* TextArea peers are attached to the scrolled window /* TextArea peers are attached to the scrolled window
that contains the GtkTextView, not to the text view that contains the GtkTextView, not to the text view
itself. */ 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; obj_window = gtk_widget_get_parent (window->focus_widget)->window;
else else
obj_window = window->focus_widget->window; obj_window = window->focus_widget->window;
...@@ -1137,7 +1189,8 @@ awt_event_handler (GdkEvent *event) ...@@ -1137,7 +1189,8 @@ awt_event_handler (GdkEvent *event)
{ {
gtk_widget_activate (window->focus_widget); 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; obj_window = gtk_widget_get_parent (window->focus_widget)->window;
else else
obj_window = window->focus_widget->window; obj_window = window->focus_widget->window;
...@@ -1165,7 +1218,7 @@ awt_event_handler (GdkEvent *event) ...@@ -1165,7 +1218,7 @@ awt_event_handler (GdkEvent *event)
} }
break; break;
case GDK_FOCUS_CHANGE: case GDK_FOCUS_CHANGE:
(*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr, (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
postFocusEventID, postFocusEventID,
(jint) (event->focus_change.in) ? (jint) (event->focus_change.in) ?
AWT_FOCUS_GAINED : AWT_FOCUS_LOST, AWT_FOCUS_GAINED : AWT_FOCUS_LOST,
...@@ -1174,7 +1227,7 @@ awt_event_handler (GdkEvent *event) ...@@ -1174,7 +1227,7 @@ awt_event_handler (GdkEvent *event)
default: default:
break; break;
} }
g_free (event_obj_ptr); g_free (grab_obj_ptr);
} }
gtk_main_do_event (event); gtk_main_do_event (event);
......
...@@ -192,12 +192,14 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_delItems ...@@ -192,12 +192,14 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_delItems
list = CLIST_FROM_SW (ptr); list = CLIST_FROM_SW (ptr);
if (end == -1) /* special case for removing all rows */ if (end == -1) /* special case for removing all rows */
end = list->rows; gtk_clist_clear (list);
else
gtk_clist_freeze (list); {
for (i = start; i < end; i++) gtk_clist_freeze (list);
gtk_clist_remove (list, i); for (i = end; i >= start; i--)
gtk_clist_thaw (list); gtk_clist_remove (list, i);
gtk_clist_thaw (list);
}
gdk_threads_leave (); gdk_threads_leave ();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment