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]: Fixes to AWT List


This patch fixes many problems in the AWT List widget. It became usable now.
Many thanks to Thomas Fitzsimmons as without his help I would not be able to come up with these fixes.


Regards to all,
Fernando

2003-12-01 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.
Index: libjava/gnu/java/awt/peer/gtk/GtkListPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java,v
retrieving revision 1.2
diff -c -p -r1.2 GtkListPeer.java
*** libjava/gnu/java/awt/peer/gtk/GtkListPeer.java	13 Jul 2003 15:09:20 -0000	1.2
--- libjava/gnu/java/awt/peer/gtk/GtkListPeer.java	1 Dec 2003 23:19:21 -0000
*************** exception statement from your version. *
*** 38,45 ****
--- 38,48 ----
  
  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
*************** public class GtkListPeer extends GtkComp
*** 119,124 ****
--- 122,150 ----
    public void setMultipleSelections (boolean b)
    {
      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)
Index: libjava/java/awt/List.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/List.java,v
retrieving revision 1.14
diff -c -p -r1.14 List.java
*** libjava/java/awt/List.java	5 Jun 2003 19:58:39 -0000	1.14
--- libjava/java/awt/List.java	1 Dec 2003 23:19:22 -0000
*************** getSelectedIndex()
*** 668,674 ****
        selected = l.getSelectedIndexes ();
      }
  
!   if (selected == null || selected.length > 1)
      return -1;
    return selected[0];
  }
--- 668,674 ----
        selected = l.getSelectedIndexes ();
      }
  
!   if (selected == null || selected.length != 1)
      return -1;
    return selected[0];
  }
Index: libjava/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.9
diff -c -p -r1.9 gnu_java_awt_peer_gtk_GtkEvents.c
*** libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c	9 Oct 2003 00:26:29 -0000	1.9
--- libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c	1 Dec 2003 23:19:28 -0000
*************** generates_key_typed_event (GdkEvent *eve
*** 813,819 ****
  void
  awt_event_handler (GdkEvent *event)
  {
!   jobject *event_obj_ptr;
    static guint32 button_click_time = 0;
    static GdkWindow *button_window = NULL;
    static guint button_number = -1;
--- 813,819 ----
  void
  awt_event_handler (GdkEvent *event)
  {
!   jobject *event_obj_ptr = NULL;
    static guint32 button_click_time = 0;
    static GdkWindow *button_window = NULL;
    static guint button_number = -1;
*************** awt_event_handler (GdkEvent *event)
*** 827,832 ****
--- 827,850 ----
        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)
*************** awt_event_handler (GdkEvent *event)
*** 845,862 ****
  
    /* 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,
  			   gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
  			   gdk_atom_intern ("CARDINAL", FALSE),
  			   0,
--- 863,871 ----
  
    /* 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.  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,
*************** awt_event_handler (GdkEvent *event)
*** 867,872 ****
--- 876,906 ----
  			   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;
*************** awt_event_handler (GdkEvent *event)
*** 879,908 ****
  	  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))
  	    {
! 	      g_free (grab_obj_ptr);
  
! 	      grab_obj_ptr = event_obj_ptr;
  	    }
  	}
!       else
  	grab_obj_ptr = event_obj_ptr;
  
        switch (event->type)
  	{
--- 913,959 ----
  	  grab_widget = global_gtk_window_group->grabs->data;
  	  g_assert (grab_widget);
  
  	  ptr = NSA_GET_PTR (gdk_env, *event_obj_ptr);
  	  event_widget = GTK_WIDGET(ptr);
  
! 	  /* 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))
  	    {
!               /* 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);
  
! 	        }
  	    }
  	}
! 
!       if (!grab_obj_ptr)
  	grab_obj_ptr = event_obj_ptr;
+       else
+         g_free (event_obj_ptr);
  
        switch (event->type)
  	{
*************** awt_event_handler (GdkEvent *event)
*** 1046,1052 ****
  		bottom = r.height - h - y;
  		right = r.width - w - x;
  
! 		(*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr,
  					    postConfigureEventID,
  					    (jint) event->configure.x,
  					    (jint) event->configure.y,
--- 1097,1103 ----
  		bottom = r.height - h - y;
  		right = r.width - w - x;
  
! 		(*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
  					    postConfigureEventID,
  					    (jint) event->configure.x,
  					    (jint) event->configure.y,
*************** awt_event_handler (GdkEvent *event)
*** 1062,1068 ****
  	  break;
  	case GDK_EXPOSE:
  	  {
! 	    (*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr,
  					postExposeEventID,
  					(jint)event->expose.area.x,
  					(jint)event->expose.area.y,
--- 1113,1119 ----
  	  break;
  	case GDK_EXPOSE:
  	  {
! 	    (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
  					postExposeEventID,
  					(jint)event->expose.area.x,
  					(jint)event->expose.area.y,
*************** awt_event_handler (GdkEvent *event)
*** 1093,1099 ****
                  /* 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))
                    obj_window = gtk_widget_get_parent (window->focus_widget)->window;
                  else
                    obj_window = window->focus_widget->window;
--- 1144,1151 ----
                  /* 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)
!                     || GTK_IS_CLIST (window->focus_widget))
                    obj_window = gtk_widget_get_parent (window->focus_widget)->window;
                  else
                    obj_window = window->focus_widget->window;
*************** awt_event_handler (GdkEvent *event)
*** 1148,1154 ****
  	      {
  		gtk_widget_activate (window->focus_widget);
  
!                 if (GTK_IS_TEXT_VIEW (window->focus_widget))
                    obj_window = gtk_widget_get_parent (window->focus_widget)->window;
                  else
                    obj_window = window->focus_widget->window;
--- 1200,1207 ----
  	      {
  		gtk_widget_activate (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;
*************** awt_event_handler (GdkEvent *event)
*** 1176,1182 ****
            }
            break;
  	case GDK_FOCUS_CHANGE:
! 	  (*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr,
  				      postFocusEventID,
  				      (jint) (event->focus_change.in) ? 
  				      AWT_FOCUS_GAINED : AWT_FOCUS_LOST,
--- 1229,1235 ----
            }
            break;
  	case GDK_FOCUS_CHANGE:
! 	  (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
  				      postFocusEventID,
  				      (jint) (event->focus_change.in) ? 
  				      AWT_FOCUS_GAINED : AWT_FOCUS_LOST,
*************** awt_event_handler (GdkEvent *event)
*** 1185,1191 ****
          default:
  	  break;
  	}
!       g_free (event_obj_ptr);
      }
  
    gtk_main_do_event (event);
--- 1238,1244 ----
          default:
  	  break;
  	}
!       g_free (grab_obj_ptr);
      }
  
    gtk_main_do_event (event);
Index: libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c,v
retrieving revision 1.4
diff -c -p -r1.4 gnu_java_awt_peer_gtk_GtkListPeer.c
*** libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c	30 Oct 2003 01:49:39 -0000	1.4
--- libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c	1 Dec 2003 23:19:28 -0000
*************** Java_gnu_java_awt_peer_gtk_GtkListPeer_d
*** 192,203 ****
    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);
  
    gdk_threads_leave ();
  }
--- 192,205 ----
    list = CLIST_FROM_SW (ptr);
  
    if (end == -1)		/* special case for removing all rows */
!     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 ();
  }

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