This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]