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] Fix for Choice


The appearance is still not quite right. Tom Fitzsimmons and I even believe it should not be implemented using the Gtk widgets it is currently using but at least this patch makes it _behave_ like the one in the Sun SDK.


2003-12-22 Fernando Nasser <fnasser@redhat.com>


        * gnu/java/awt/peer/gtk/GtkChoicePeer.java (postItemEvent): Rename to...
        (choicePostItemEvent): Change signature to more specific String object.
        * java/awt/Choice.java (insert): Generate ItemEvent if insertion caused
        selection to change.
        (remove): Generate ItemEvent if removal cause selection to change.
        (removeAll): Change algorithm to prevent generation of  multiple events.
         * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
        (connect_choice_item_selectable_hook): Change argument type.
        Fix argument value.
        Make sure resources are feed by registering callback.
        (Java_gnu_java_awt_peer_gtk_GtkChoicePeer_append): Adjust call to the
        above function.
        (Java_gnu_java_awt_peer_gtk_GtkChoicePeer_add): Ditto.
        (item_activate): Ditto.
        (Java_gnu_java_awt_peer_gtk_GtkChoicePeer_remove): Destroy removed
        menuitem.
        (item_removed): New function.  Free resources.
        * jni/gtk-peer/gtkpeer.h (item_event_hook_info): Change member type and
        name.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
        (Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit): Obtain MethodID for
        choicePostItemEvent.
Index: gnu/java/awt/peer/gtk/GtkChoicePeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java,v
retrieving revision 1.3
diff -c -p -r1.3 GtkChoicePeer.java
*** gnu/java/awt/peer/gtk/GtkChoicePeer.java	13 Jul 2003 15:09:20 -0000	1.3
--- gnu/java/awt/peer/gtk/GtkChoicePeer.java	22 Dec 2003 21:01:33 -0000
*************** public class GtkChoicePeer extends GtkCo
*** 84,93 ****
    }
    */
  
!   protected void postItemEvent (Object item, int stateChange)
    {
      if (stateChange == ItemEvent.SELECTED)
!       ((Choice) awtComponent).select ((String) item);
!     super.postItemEvent (item, stateChange);
    }
  }
--- 84,93 ----
    }
    */
  
!   protected void choicePostItemEvent (String label, int stateChange)
    {
      if (stateChange == ItemEvent.SELECTED)
!       ((Choice) awtComponent).select (label);
!     super.postItemEvent (label, stateChange);
    }
  }
Index: java/awt/Choice.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/Choice.java,v
retrieving revision 1.11
diff -c -p -r1.11 Choice.java
*** java/awt/Choice.java	5 Jun 2003 19:58:39 -0000	1.11
--- java/awt/Choice.java	22 Dec 2003 21:01:33 -0000
*************** insert(String item, int index)
*** 223,229 ****
--- 223,237 ----
      }
  
    if (getItemCount () == 1 || selectedIndex >= index)
+   {
      select (0);
+     // We must generate an ItemEvent here
+     Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent (
+       new ItemEvent ((ItemSelectable)this, 
+                      ItemEvent.ITEM_STATE_CHANGED,
+                      getItem(0),
+                      ItemEvent.SELECTED));
+   }
  }
  
  /*************************************************************************/
*************** remove(int index)
*** 266,272 ****
--- 274,288 ----
      }
  
    if (index == selectedIndex)
+   {
      select (0);
+     // We must generate an ItemEvent here
+     Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent (
+       new ItemEvent ((ItemSelectable)this, 
+                      ItemEvent.ITEM_STATE_CHANGED,
+                      getItem(0),
+                      ItemEvent.SELECTED));
+   }
    else if (selectedIndex > index)
      --selectedIndex;
  }
*************** removeAll()
*** 281,290 ****
  {
    int count = getItemCount();
  
!   for (int i = 0; i < count; i++)
      {
!       // Always remove 0.
!       remove(0);
      }
  }
  
--- 297,306 ----
  {
    int count = getItemCount();
  
!   for (int i = (count - 1); i >= 0; i--)
      {
!       // Always remove the last to minimize generation of ItemEvents.
!       remove(i);
      }
  }
  
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c,v
retrieving revision 1.4
diff -c -p -r1.4 gnu_java_awt_peer_gtk_GtkChoicePeer.c
*** jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c	13 Dec 2003 01:15:47 -0000	1.4
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c	22 Dec 2003 21:01:35 -0000
*************** exception statement from your version. *
*** 41,48 ****
  
  static void connect_choice_item_selectable_hook (JNIEnv *env, 
  						 jobject peer_obj, 
! 						 GtkItem *item, 
! 						 jobject item_obj);
  JNIEXPORT void JNICALL 
  Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create 
    (JNIEnv *env, jobject obj)
--- 41,49 ----
  
  static void connect_choice_item_selectable_hook (JNIEnv *env, 
  						 jobject peer_obj, 
! 						 GtkItem *menuitem, 
! 						 const char *label);
! 
  JNIEXPORT void JNICALL 
  Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create 
    (JNIEnv *env, jobject obj)
*************** Java_gnu_java_awt_peer_gtk_GtkChoicePeer
*** 101,114 ****
        label = (*env)->GetStringUTFChars (env, item, NULL);
  
        menuitem = gtk_menu_item_new_with_label (label);
- 
-       (*env)->ReleaseStringUTFChars (env, item, label);
- 
        gtk_menu_append (menu, menuitem);
        gtk_widget_show (menuitem);
  
        connect_choice_item_selectable_hook (env, obj, 
! 					   GTK_ITEM (menuitem), item);
      }
    
    if (need_set_history)
--- 102,114 ----
        label = (*env)->GetStringUTFChars (env, item, NULL);
  
        menuitem = gtk_menu_item_new_with_label (label);
        gtk_menu_append (menu, menuitem);
        gtk_widget_show (menuitem);
  
        connect_choice_item_selectable_hook (env, obj, 
! 					   GTK_ITEM (menuitem), label);
! 
!       (*env)->ReleaseStringUTFChars (env, item, label);
      }
    
    if (need_set_history)
*************** Java_gnu_java_awt_peer_gtk_GtkChoicePeer
*** 139,145 ****
    menuitem = gtk_menu_item_new_with_label (label);
    gtk_menu_insert (GTK_MENU (menu), menuitem, index);
    gtk_widget_show (menuitem);
!   connect_choice_item_selectable_hook (env, obj, GTK_ITEM (menuitem), item);
  
    if (need_set_history)
      gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), 0);
--- 139,146 ----
    menuitem = gtk_menu_item_new_with_label (label);
    gtk_menu_insert (GTK_MENU (menu), menuitem, index);
    gtk_widget_show (menuitem);
! 
!   connect_choice_item_selectable_hook (env, obj, GTK_ITEM (menuitem), label);
  
    if (need_set_history)
      gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), 0);
*************** Java_gnu_java_awt_peer_gtk_GtkChoicePeer
*** 155,168 ****
  {
    void *ptr;
    GtkContainer *menu;
    GList *children;
  
    ptr = NSA_GET_PTR (env, obj);
  
    gdk_threads_enter ();
    menu = GTK_CONTAINER (gtk_option_menu_get_menu (GTK_OPTION_MENU (ptr)));
    children = gtk_container_children (menu);
!   gtk_container_remove (menu, GTK_WIDGET (g_list_nth (children, index)->data));
    gdk_threads_leave ();
  }
  
--- 156,174 ----
  {
    void *ptr;
    GtkContainer *menu;
+   GtkWidget *menuitem;
    GList *children;
  
    ptr = NSA_GET_PTR (env, obj);
  
    gdk_threads_enter ();
+ 
    menu = GTK_CONTAINER (gtk_option_menu_get_menu (GTK_OPTION_MENU (ptr)));
    children = gtk_container_children (menu);
!   menuitem = GTK_WIDGET (g_list_nth (children, index)->data);
!   gtk_container_remove (menu, menuitem);
!   gtk_widget_destroy (menuitem);
! 
    gdk_threads_leave ();
  }
  
*************** Java_gnu_java_awt_peer_gtk_GtkChoicePeer
*** 179,216 ****
    gdk_threads_leave ();
  }
  
- 
  static void
  item_activate (GtkItem *item __attribute__((unused)),
  	       struct item_event_hook_info *ie)
  {
    gdk_threads_leave ();
    (*gdk_env)->CallVoidMethod (gdk_env, ie->peer_obj,
! 			      postItemEventID,
! 			      ie->item_obj,
  			      (jint) AWT_ITEM_SELECTED);
    gdk_threads_enter ();
  }
  
  static void
! connect_choice_item_selectable_hook (JNIEnv *env, jobject peer_obj, 
! 				     GtkItem *item, jobject item_obj)
  {
    struct item_event_hook_info *ie;
    jobject *peer_objGlobPtr;
-   jobject *item_objGlobPtr;
  
    ie = (struct item_event_hook_info *) 
      malloc (sizeof (struct item_event_hook_info));
  
    peer_objGlobPtr = NSA_GET_GLOBAL_REF (env, peer_obj);
    g_assert (peer_objGlobPtr);
-   item_objGlobPtr = NSA_GET_GLOBAL_REF (env, item_obj);
-   g_assert (item_objGlobPtr);
  
    ie->peer_obj = *peer_objGlobPtr;
!   ie->item_obj = *item_objGlobPtr;
  
!   g_signal_connect (G_OBJECT (item), "activate", 
! 		      GTK_SIGNAL_FUNC (item_activate), ie);
  }
--- 185,233 ----
    gdk_threads_leave ();
  }
  
  static void
  item_activate (GtkItem *item __attribute__((unused)),
  	       struct item_event_hook_info *ie)
  {
    gdk_threads_leave ();
+ 
+   jstring label = (*gdk_env)->NewStringUTF (gdk_env, ie->label);
    (*gdk_env)->CallVoidMethod (gdk_env, ie->peer_obj,
! 			      choicePostItemEventID,
! 			      label,
  			      (jint) AWT_ITEM_SELECTED);
    gdk_threads_enter ();
  }
  
  static void
! item_removed (gpointer data, 
! 	      GClosure gc __attribute__((unused)))
! {
!   struct item_event_hook_info *ie = data;
! 
!   free (ie->label);
!   free (ie);
! }
! 
! static void
! connect_choice_item_selectable_hook (JNIEnv *env, 
! 				     jobject peer_obj, 
! 				     GtkItem *menuitem, 
! 				     const char *label)
  {
    struct item_event_hook_info *ie;
    jobject *peer_objGlobPtr;
  
    ie = (struct item_event_hook_info *) 
      malloc (sizeof (struct item_event_hook_info));
  
    peer_objGlobPtr = NSA_GET_GLOBAL_REF (env, peer_obj);
    g_assert (peer_objGlobPtr);
  
    ie->peer_obj = *peer_objGlobPtr;
!   ie->label = strdup (label);
  
!   g_signal_connect_data (G_OBJECT (menuitem), "activate", 
! 		      GTK_SIGNAL_FUNC (item_activate), ie,
! 		      (GClosureNotify) item_removed, 0);
  }
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.10
diff -c -p -r1.10 gnu_java_awt_peer_gtk_GtkMainThread.c
*** jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c	13 Dec 2003 01:15:47 -0000	1.10
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c	22 Dec 2003 21:01:36 -0000
*************** jmethodID postKeyEventID;
*** 56,61 ****
--- 56,62 ----
  jmethodID postFocusEventID;
  jmethodID postAdjustmentEventID;
  jmethodID postItemEventID;
+ jmethodID choicePostItemEventID;
  jmethodID postListItemEventID;
  jmethodID postTextEventID;
  jmethodID postWindowEventID;
*************** Java_gnu_java_awt_peer_gtk_GtkMainThread
*** 80,86 ****
    char **argv;
    char *homedir, *rcpath = NULL;
  /*    jclass gtkgenericpeer; */
!   jclass gtkcomponentpeer, gtkwindowpeer, gtkscrollbarpeer, gtklistpeer,
      gtkmenuitempeer, gtktextcomponentpeer, window;
  
    NSA_INIT (env, clazz);
--- 81,87 ----
    char **argv;
    char *homedir, *rcpath = NULL;
  /*    jclass gtkgenericpeer; */
!   jclass gtkcomponentpeer, gtkchoicepeer, gtkwindowpeer, gtkscrollbarpeer, gtklistpeer,
      gtkmenuitempeer, gtktextcomponentpeer, window;
  
    NSA_INIT (env, clazz);
*************** Java_gnu_java_awt_peer_gtk_GtkMainThread
*** 139,144 ****
--- 140,147 ----
  
    gtkcomponentpeer = (*env)->FindClass (env,
  				     "gnu/java/awt/peer/gtk/GtkComponentPeer");
+   gtkchoicepeer = (*env)->FindClass (env,
+ 				     "gnu/java/awt/peer/gtk/GtkChoicePeer");
    gtkwindowpeer = (*env)->FindClass (env,
  				     "gnu/java/awt/peer/gtk/GtkWindowPeer");
    gtkscrollbarpeer = (*env)->FindClass (env, 
*************** Java_gnu_java_awt_peer_gtk_GtkMainThread
*** 181,186 ****
--- 184,192 ----
    postItemEventID = (*env)->GetMethodID (env, gtkcomponentpeer,
  					 "postItemEvent", 
  					 "(Ljava/lang/Object;I)V");
+   choicePostItemEventID = (*env)->GetMethodID (env, gtkchoicepeer,
+ 					 "choicePostItemEvent", 
+ 					 "(Ljava/lang/String;I)V");
    postListItemEventID = (*env)->GetMethodID (env, gtklistpeer,
  					     "postItemEvent",
  					     "(II)V");
Index: jni/gtk-peer/gtkpeer.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gtkpeer.h,v
retrieving revision 1.11
diff -c -p -r1.11 gtkpeer.h
*** jni/gtk-peer/gtkpeer.h	13 Dec 2003 01:15:47 -0000	1.11
--- jni/gtk-peer/gtkpeer.h	22 Dec 2003 21:01:36 -0000
*************** extern jmethodID postExposeEventID;
*** 395,400 ****
--- 395,401 ----
  extern jmethodID postKeyEventID;
  extern jmethodID postFocusEventID;
  extern jmethodID postAdjustmentEventID;
+ extern jmethodID choicePostItemEventID;
  extern jmethodID postItemEventID;
  extern jmethodID postListItemEventID;
  extern jmethodID postTextEventID;
*************** jint keyevent_state_to_awt_mods (GdkEven
*** 424,430 ****
  struct item_event_hook_info
  {
    jobject peer_obj;
!   jobject item_obj;
  };
  
  #endif /* __GTKPEER_H */
--- 425,431 ----
  struct item_event_hook_info
  {
    jobject peer_obj;
!   const char *label;
  };
  
  #endif /* __GTKPEER_H */

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