From: Thomas Fitzsimmons Date: Mon, 7 Jul 2003 19:56:04 +0000 (+0000) Subject: * gnu/java/awt/peer/gtk/GtkTextComponentPeer.java X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b6fa901bc961f54ec9b24c77538f159ad6736d20;p=gcc.git * gnu/java/awt/peer/gtk/GtkTextComponentPeer.java (setCaretPosition, setEditable): Rely entirely on native implementation. (getArgs): Remove. (postTextEvent): New method. (handleEvent): New method. * gnu/java/awt/peer/gtk/GtkTextFieldPeer.java (handleEvent): New method. * java/awt/event/ActionEvent.java (paramString): Fix formatting. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c (keysym_to_awt_keycode): Fix range checks. (generates_key_typed_event): New function. (awt_event_handler): Post AWT_KEY_RELEASED events to event queue. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c (gtkInit): Store TextComponent's postTextEvent method ID. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c (setText): Post TEXT_VALUE_CHANGED event to event queue. From-SVN: r69054 --- diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 585da3becf2..02c9d5b2f33 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,24 @@ +2003-07-07 Thomas Fitzsimmons + + * gnu/java/awt/peer/gtk/GtkTextComponentPeer.java + (setCaretPosition, setEditable): Rely entirely on native + implementation. + (getArgs): Remove. + (postTextEvent): New method. + (handleEvent): New method. + * gnu/java/awt/peer/gtk/GtkTextFieldPeer.java (handleEvent): New + method. + * java/awt/event/ActionEvent.java (paramString): Fix formatting. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c + (keysym_to_awt_keycode): Fix range checks. + (generates_key_typed_event): New function. + (awt_event_handler): Post AWT_KEY_RELEASED events to event + queue. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c + (gtkInit): Store TextComponent's postTextEvent method ID. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c + (setText): Post TEXT_VALUE_CHANGED event to event queue. + 2003-07-07 Rainer Orth * configure.in: Check for usleep declaration. diff --git a/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java index d9ebd40aa72..102e43973a1 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java @@ -39,6 +39,7 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; import java.awt.peer.*; import java.awt.*; +import java.awt.event.*; public class GtkTextComponentPeer extends GtkComponentPeer implements TextComponentPeer @@ -51,32 +52,14 @@ public class GtkTextComponentPeer extends GtkComponentPeer } public native int getCaretPosition (); - public void setCaretPosition (int pos) - { - set ("text_position", pos); - } + public native void setCaretPosition (int pos); public native int getSelectionStart (); public native int getSelectionEnd (); public native String getText (); public native void select (int start, int end); - - public void setEditable (boolean state) - { - set ("editable", state); - } - + public native void setEditable (boolean state); public native void setText (String text); - - public void getArgs (Component component, GtkArgList args) - { - super.getArgs (component, args); - - TextComponent tc = (TextComponent) component; - - args.add ("text_position", tc.getCaretPosition ()); - args.add ("editable", tc.isEditable ()); - } - + public int getIndexAtPoint(int x, int y) { return 0; // FIXME @@ -91,4 +74,21 @@ public class GtkTextComponentPeer extends GtkComponentPeer { return filter; // FIXME } + + protected void postTextEvent () + { + q.postEvent (new TextEvent (awtComponent, TextEvent.TEXT_VALUE_CHANGED)); + } + + public void handleEvent (AWTEvent e) + { + if (e.getID () == KeyEvent.KEY_TYPED + && ((TextComponent)e.getSource()).isEditable()) + { + KeyEvent ke = (KeyEvent)e; + + if (!ke.isConsumed()) + postTextEvent (); + } + } } diff --git a/libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java index 628cdd627ae..05112d16b8b 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java @@ -37,6 +37,7 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; +import java.awt.event.KeyEvent; import java.awt.peer.*; import java.awt.*; @@ -102,4 +103,18 @@ public class GtkTextFieldPeer extends GtkTextComponentPeer { gtkSetFont(((GtkFontPeer)f.getPeer()).getXLFD(), f.getSize()); } + + public void handleEvent (AWTEvent e) + { + if (e.getID () == KeyEvent.KEY_PRESSED) + { + KeyEvent ke = (KeyEvent)e; + + if (!ke.isConsumed() + && ke.getKeyCode() == KeyEvent.VK_ENTER) + postActionEvent (getText(), ke.getModifiers ()); + } + + super.handleEvent (e); + } } diff --git a/libjava/java/awt/event/ActionEvent.java b/libjava/java/awt/event/ActionEvent.java index 4f77fe06eea..97f98070416 100644 --- a/libjava/java/awt/event/ActionEvent.java +++ b/libjava/java/awt/event/ActionEvent.java @@ -205,7 +205,7 @@ public class ActionEvent extends AWTEvent StringBuffer s = new StringBuffer(id == ACTION_PERFORMED ? "ACTION_PERFORMED,cmd=" : "unknown type,cmd="); - s.append(actionCommand).append(",when=").append(when).append("modifiers"); + s.append(actionCommand).append(",when=").append(when).append(",modifiers"); int len = s.length(); s.setLength(len + 1); if ((modifiers & META_MASK) != 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 2573a1823c3..3c400114e4b 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 @@ -90,10 +90,10 @@ keysym_to_awt_keycode (guint keyval) vk = gdk_keyval_to_upper (keyval); - if (vk <= 0x41 && vk <= 0x5A) /* VK_A through VK_Z */ + if (vk >= 0x41 && vk <= 0x5A) /* VK_A through VK_Z */ return vk; - if (vk <= 0x30 && vk <= 39) /* VK_0 through VK_9 */ + if (vk >= 0x30 && vk <= 0x39) /* VK_0 through VK_9 */ return vk; switch (vk) @@ -232,6 +232,24 @@ keysym_to_awt_keycode (guint keyval) } } +static int +generates_key_typed_event (guint keyval) +{ + guint vk; + + vk = gdk_keyval_to_upper (keyval); + + if ((vk >= 0x20 && vk <= 0x7e) /* Most printable keysyms on a + standard US keyboard. */ + || (vk >= 0xFF9F && vk <= 0xFFB9) /* Numeric Keypad keysyms. */ + || vk == GDK_BackSpace + || vk == GDK_Delete + || vk == GDK_Return) + return 1; + else + return 0; +} + void awt_event_handler (GdkEvent *event) { @@ -275,6 +293,7 @@ awt_event_handler (GdkEvent *event) || 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, @@ -468,29 +487,70 @@ awt_event_handler (GdkEvent *event) NULL, NULL, (guchar **)&obj_ptr); - + /* if (grab && GTK_WIDGET_HAS_DEFAULT (widget) ) */ /* { */ (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, postKeyEventID, (jint) AWT_KEY_PRESSED, (jlong) event->key.time, - state_to_awt_mods (event->key.state), - keysym_to_awt_keycode (event->key.keyval), + state_to_awt_mods (event->key.state), + keysym_to_awt_keycode (event->key.keyval), (jchar) (event->key.length) ? event->key.string[0] : AWT_KEY_CHAR_UNDEFINED); - if (event->key.length) + + if (event->key.length + && generates_key_typed_event(event->key.keyval)) (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, postKeyEventID, (jint) AWT_KEY_TYPED, (jlong) event->key.time, - state_to_awt_mods (event->key.state), + state_to_awt_mods (event->key.state), VK_UNDEFINED, (jchar) event->key.string[0]); } } break; + case GDK_KEY_RELEASE: + { + GtkWidget *widget; + GtkWindow *window; + + gdk_window_get_user_data (event->any.window, (void **) &widget); + + window = GTK_WINDOW (gtk_widget_get_ancestor (widget, + GTK_TYPE_WINDOW)); + if (window + && GTK_WIDGET_IS_SENSITIVE (window) + && window->focus_widget + && GTK_WIDGET_IS_SENSITIVE (window->focus_widget) + && window->focus_widget->window) + { + gtk_widget_activate (window->focus_widget); + gdk_property_get (window->focus_widget->window, + gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE), + gdk_atom_intern ("CARDINAL", FALSE), + 0, + sizeof (jobject), + FALSE, + NULL, + NULL, + NULL, + (guchar **)&obj_ptr); + + (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, + postKeyEventID, + (jint) AWT_KEY_RELEASED, + (jlong) event->key.time, + state_to_awt_mods (event->key.state), + keysym_to_awt_keycode (event->key.keyval), + (jchar) (event->key.length) ? + event->key.string[0] : + AWT_KEY_CHAR_UNDEFINED); + } + } + break; case GDK_FOCUS_CHANGE: (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, postFocusEventID, diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c index cd4d7e2fe7b..83fab1cb8c0 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c @@ -54,6 +54,7 @@ jmethodID postFocusEventID; jmethodID postAdjustmentEventID; jmethodID postItemEventID; jmethodID postListItemEventID; +jmethodID postTextEventID; JNIEnv *gdk_env; #ifdef PORTABLE_NATIVE_SYNC @@ -72,7 +73,8 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz) char **argv; char *homedir, *rcpath = NULL; /* jclass gtkgenericpeer; */ - jclass gtkcomponentpeer, gtkwindowpeer, gtkscrollbarpeer, gtklistpeer, gtkmenuitempeer; + jclass gtkcomponentpeer, gtkwindowpeer, gtkscrollbarpeer, gtklistpeer, + gtkmenuitempeer, gtktextcomponentpeer; NSA_INIT (env, clazz); @@ -133,6 +135,7 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz) "gnu/java/awt/peer/gtk/GtkScrollbarPeer"); gtklistpeer = (*env)->FindClass (env, "gnu/java/awt/peer/gtk/GtkListPeer"); gtkmenuitempeer = (*env)->FindClass (env, "gnu/java/awt/peer/gtk/GtkMenuItemPeer"); + gtktextcomponentpeer = (*env)->FindClass (env, "gnu/java/awt/peer/gtk/GtkTextComponentPeer"); /* gdkColor = (*env)->FindClass (env, */ /* "gnu/java/awt/peer/gtk/GdkColor"); */ /* gdkColorID = (*env)->GetMethodID (env, gdkColor, "", "(III)V"); */ @@ -162,6 +165,9 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz) postListItemEventID = (*env)->GetMethodID (env, gtklistpeer, "postItemEvent", "(II)V"); + postTextEventID = (*env)->GetMethodID (env, gtktextcomponentpeer, + "postTextEvent", + "()V"); } /* diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c index 8cdff34f11b..de590352dd1 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c @@ -361,6 +361,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setText const char *str; GtkWidget *text = NULL; // type of GtkTextView (TextArea) GtkTextBuffer *buf; + jobject *obj_ptr; ptr = NSA_GET_PTR (env, obj); str = (*env)->GetStringUTFChars (env, contents, NULL); @@ -370,6 +371,18 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setText if (GTK_IS_EDITABLE (ptr)) { gtk_entry_set_text (GTK_ENTRY (ptr), str); + + if (gdk_property_get (GTK_WIDGET(ptr)->window, + gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE), + gdk_atom_intern ("CARDINAL", FALSE), + 0, + sizeof (jobject), + FALSE, + NULL, + NULL, + NULL, + (guchar **)&obj_ptr)) + (*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, postTextEventID); } else { diff --git a/libjava/jni/gtk-peer/gtkpeer.h b/libjava/jni/gtk-peer/gtkpeer.h index fa1f19b5a1d..1cfa6c472cd 100644 --- a/libjava/jni/gtk-peer/gtkpeer.h +++ b/libjava/jni/gtk-peer/gtkpeer.h @@ -266,6 +266,7 @@ extern jmethodID postFocusEventID; extern jmethodID postAdjustmentEventID; extern jmethodID postItemEventID; extern jmethodID postListItemEventID; +extern jmethodID postTextEventID; extern jmethodID syncAttrsID; extern jclass gdkColor; extern jmethodID gdkColorID;