OSDN Git Service

* gnu/java/awt/peer/gtk/GtkTextComponentPeer.java
authorfitzsim <fitzsim@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Jul 2003 19:56:04 +0000 (19:56 +0000)
committerfitzsim <fitzsim@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Jul 2003 19:56:04 +0000 (19:56 +0000)
(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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@69054 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java
libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java
libjava/java/awt/event/ActionEvent.java
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
libjava/jni/gtk-peer/gtkpeer.h

index 585da3b..02c9d5b 100644 (file)
@@ -1,3 +1,24 @@
+2003-07-07  Thomas Fitzsimmons  <fitzsim@redhat.com>
+
+       * 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  <ro@TechFak.Uni-Bielefeld.DE>
 
        * configure.in: Check for usleep declaration.
index d9ebd40..102e439 100644 (file)
@@ -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 ();
+      }
+  }
 }
index 628cdd6..05112d1 100644 (file)
@@ -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);
+  }
 }
index 4f77fe0..97f9807 100644 (file)
@@ -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)
index 2573a18..3c40011 100644 (file)
@@ -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,
index cd4d7e2..83fab1c 100644 (file)
@@ -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, "<init>", "(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");
 }
 
 /*
index 8cdff34..de59035 100644 (file)
@@ -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
     {
index fa1f19b..1cfa6c4 100644 (file)
@@ -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;