mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
10590d375b
commit
a104538631
|
|
@ -1,3 +1,16 @@
|
||||||
|
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. */
|
||||||
|
|
||||||
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
|
||||||
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()
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
/* 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,
|
||||||
|
|
@ -866,6 +875,31 @@ awt_event_handler (GdkEvent *event)
|
||||||
NULL,
|
NULL,
|
||||||
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;
|
||||||
|
|
@ -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.
|
||||||
|
* 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);
|
||||||
|
|
||||||
grab_obj_ptr = event_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)
|
||||||
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)
|
||||||
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)
|
||||||
/* 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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
}
|
}
|
||||||
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)
|
||||||
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
|
||||||
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 ();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue