This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Patch: add ActionEvent and TextEvent handling to TextComponentpeers
- From: Thomas Fitzsimmons <fitzsim at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: 04 Jul 2003 17:11:10 -0400
- Subject: Patch: add ActionEvent and TextEvent handling to TextComponentpeers
Hello,
This patch adds functionality to GtkTextComponentPeer and
GtkTextFieldPeer so that TextField objects may react to ActionEvents and
TextComponents to TextEvents.
KeyEvent generation still needs more work, but it can be done as a
separate patch.
Please review/comment.
Thanks,
Tom
* 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.
Index: gnu/java/awt/peer/gtk/GtkTextComponentPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java,v
retrieving revision 1.2
diff -u -b -B -r1.2 GtkTextComponentPeer.java
--- gnu/java/awt/peer/gtk/GtkTextComponentPeer.java 1 Mar 2003 22:14:20 -0000 1.2
+++ gnu/java/awt/peer/gtk/GtkTextComponentPeer.java 4 Jul 2003 20:30:31 -0000
@@ -39,6 +39,7 @@
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 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
@@ -90,5 +73,22 @@
public long filterEvents (long filter)
{
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 ();
+ }
}
}
Index: gnu/java/awt/peer/gtk/GtkTextFieldPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java,v
retrieving revision 1.2
diff -u -b -B -r1.2 GtkTextFieldPeer.java
--- gnu/java/awt/peer/gtk/GtkTextFieldPeer.java 19 Feb 2003 00:35:35 -0000 1.2
+++ gnu/java/awt/peer/gtk/GtkTextFieldPeer.java 4 Jul 2003 20:30:31 -0000
@@ -37,6 +37,7 @@
package gnu.java.awt.peer.gtk;
+import java.awt.event.KeyEvent;
import java.awt.peer.*;
import java.awt.*;
@@ -101,5 +102,19 @@
public void setFont (Font f)
{
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);
}
}
Index: java/awt/event/ActionEvent.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/event/ActionEvent.java,v
retrieving revision 1.7
diff -u -b -B -r1.7 ActionEvent.java
--- java/awt/event/ActionEvent.java 9 Aug 2002 04:26:15 -0000 1.7
+++ java/awt/event/ActionEvent.java 4 Jul 2003 20:30:31 -0000
@@ -205,7 +205,7 @@
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)
Index: 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.2
diff -u -b -B -r1.2 gnu_java_awt_peer_gtk_GtkEvents.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 30 Jun 2003 23:53:29 -0000 1.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 4 Jul 2003 20:30:32 -0000
@@ -90,10 +90,10 @@
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,23 @@
}
}
+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 +292,7 @@
|| 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,
@@ -480,7 +498,9 @@
(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,
@@ -491,6 +511,45 @@
}
}
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,
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c,v
retrieving revision 1.2
diff -u -b -B -r1.2 gnu_java_awt_peer_gtk_GtkMainThread.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c 30 Jun 2003 23:53:29 -0000 1.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c 4 Jul 2003 20:30:32 -0000
@@ -54,6 +54,7 @@
jmethodID postAdjustmentEventID;
jmethodID postItemEventID;
jmethodID postListItemEventID;
+jmethodID postTextEventID;
JNIEnv *gdk_env;
#ifdef PORTABLE_NATIVE_SYNC
@@ -72,7 +73,7 @@
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 +134,7 @@
"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, "<init>", "(III)V"); */
@@ -162,6 +164,9 @@
postListItemEventID = (*env)->GetMethodID (env, gtklistpeer,
"postItemEvent",
"(II)V");
+ postTextEventID = (*env)->GetMethodID (env, gtktextcomponentpeer,
+ "postTextEvent",
+ "()V");
}
/*
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c,v
retrieving revision 1.2
diff -u -b -B -r1.2 gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c 30 Jun 2003 23:53:29 -0000 1.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c 4 Jul 2003 20:30:32 -0000
@@ -361,6 +361,7 @@
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 @@
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
{
Index: jni/gtk-peer/gtkpeer.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gtkpeer.h,v
retrieving revision 1.1
diff -u -b -B -r1.1 gtkpeer.h
--- jni/gtk-peer/gtkpeer.h 31 Jan 2003 17:54:14 -0000 1.1
+++ jni/gtk-peer/gtkpeer.h 4 Jul 2003 20:30:32 -0000
@@ -266,6 +266,7 @@
extern jmethodID postAdjustmentEventID;
extern jmethodID postItemEventID;
extern jmethodID postListItemEventID;
+extern jmethodID postTextEventID;
extern jmethodID syncAttrsID;
extern jclass gdkColor;
extern jmethodID gdkColorID;