OSDN Git Service

2003-12-02 Fernando Nasser <fnasser@redhat.com>
authorfnasser <fnasser@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Dec 2003 16:19:28 +0000 (16:19 +0000)
committerfnasser <fnasser@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Dec 2003 16:19:28 +0000 (16:19 +0000)
        * 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.

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

libjava/ChangeLog
libjava/gnu/java/awt/peer/gtk/GtkListPeer.java
libjava/java/awt/List.java
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c

index 05b9237..6085708 100644 (file)
@@ -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>
 
        * java/text/SimpleDateFormat.java (compileFormat):
index 2ba183b..f90497e 100644 (file)
@@ -38,8 +38,11 @@ exception statement from your version. */
 
 package gnu.java.awt.peer.gtk;
 
+import java.awt.AWTEvent;
 import java.awt.Dimension;
 import java.awt.List;
+import java.awt.event.MouseEvent;
+import java.awt.event.KeyEvent;
 import java.awt.peer.ListPeer;
 
 public class GtkListPeer extends GtkComponentPeer
@@ -121,6 +124,29 @@ public class GtkListPeer extends GtkComponentPeer
     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)
   {
     postItemEvent (new Integer (item), stateChange);
index 2f4932e..23ca34f 100644 (file)
@@ -668,7 +668,7 @@ getSelectedIndex()
       selected = l.getSelectedIndexes ();
     }
 
-  if (selected == null || selected.length > 1)
+  if (selected == null || selected.length != 1)
     return -1;
   return selected[0];
 }
index 74939f8..0411352 100644 (file)
@@ -813,7 +813,7 @@ generates_key_typed_event (GdkEvent *event, GtkWidget *source)
 void
 awt_event_handler (GdkEvent *event)
 {
-  jobject *event_obj_ptr;
+  jobject *event_obj_ptr = NULL;
   static guint32 button_click_time = 0;
   static GdkWindow *button_window = NULL;
   static guint button_number = -1;
@@ -827,6 +827,24 @@ awt_event_handler (GdkEvent *event)
       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
      than a triple click to occur */
   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,
      send the input event off to Java before GTK has a chance to process
-     the event */
-  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)
-      && gdk_property_get (event->any.window,
+     the event.  Note that the jobject may be in the parent for widgets
+     that are always inside a scrolled window, like List */
+  if (!gdk_property_get (event->any.window,
                           gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
                           gdk_atom_intern ("CARDINAL", FALSE),
                           0,
@@ -867,6 +876,31 @@ awt_event_handler (GdkEvent *event)
                           NULL,
                           (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 *grab_widget;
       jobject *grab_obj_ptr = NULL;
@@ -879,30 +913,47 @@ awt_event_handler (GdkEvent *event)
          grab_widget = global_gtk_window_group->grabs->data;
          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);
          event_widget = GTK_WIDGET(ptr);
 
-         if (GTK_WIDGET_IS_SENSITIVE (event_widget) &&
-             gtk_widget_is_ancestor (event_widget, grab_widget))
+         /* Don't need to do this if it is the same widget as we
+          *  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);
-
-             grab_obj_ptr = event_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);
+
+               }
            }
        }
-      else
+
+      if (!grab_obj_ptr)
        grab_obj_ptr = event_obj_ptr;
+      else
+        g_free (event_obj_ptr);
 
       switch (event->type)
        {
@@ -1035,7 +1086,7 @@ awt_event_handler (GdkEvent *event)
                bottom = 6;
                right = 6;
 
-               (*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr,
+               (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
                                            postConfigureEventID,
                                            (jint) event->configure.x,
                                            (jint) event->configure.y,
@@ -1051,7 +1102,7 @@ awt_event_handler (GdkEvent *event)
          break;
        case GDK_EXPOSE:
          {
-           (*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr,
+           (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
                                        postExposeEventID,
                                        (jint)event->expose.area.x,
                                        (jint)event->expose.area.y,
@@ -1082,7 +1133,8 @@ awt_event_handler (GdkEvent *event)
                 /* TextArea peers are attached to the scrolled window
                    that contains the GtkTextView, not to the text view
                    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;
                 else
                   obj_window = window->focus_widget->window;
@@ -1137,7 +1189,8 @@ awt_event_handler (GdkEvent *event)
              {
                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;
                 else
                   obj_window = window->focus_widget->window;
@@ -1165,7 +1218,7 @@ awt_event_handler (GdkEvent *event)
           }
           break;
        case GDK_FOCUS_CHANGE:
-         (*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr,
+         (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
                                      postFocusEventID,
                                      (jint) (event->focus_change.in) ? 
                                      AWT_FOCUS_GAINED : AWT_FOCUS_LOST,
@@ -1174,7 +1227,7 @@ awt_event_handler (GdkEvent *event)
         default:
          break;
        }
-      g_free (event_obj_ptr);
+      g_free (grab_obj_ptr);
     }
 
   gtk_main_do_event (event);
index 6c37aeb..94c303e 100644 (file)
@@ -192,12 +192,14 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_delItems
   list = CLIST_FROM_SW (ptr);
 
   if (end == -1)               /* special case for removing all rows */
-    end = list->rows;
-
-  gtk_clist_freeze (list);
-  for (i = start; i < end; i++)
-    gtk_clist_remove (list, i);
-  gtk_clist_thaw (list);
+    gtk_clist_clear (list);
+  else
+    {
+      gtk_clist_freeze (list);
+      for (i = end; i >= start; i--)
+        gtk_clist_remove (list, i);
+      gtk_clist_thaw (list);
+    }
 
   gdk_threads_leave ();
 }