]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
GtkChoicePeer.java (postItemEvent): Rename to...
authorFernando Nasser <fnasser@redhat.com>
Tue, 23 Dec 2003 19:24:00 +0000 (19:24 +0000)
committerFernando Nasser <fnasser@gcc.gnu.org>
Tue, 23 Dec 2003 19:24:00 +0000 (19:24 +0000)
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 (add): Generate ItemEvent for the first item
        added.
        (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 ItemEvents.
        * 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.

From-SVN: r74979

libjava/ChangeLog
libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java
libjava/java/awt/Choice.java
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
libjava/jni/gtk-peer/gtkpeer.h

index c6da6ab4c16cba0f3dbb94f4bba7002c7f495c75..9b2294e4299bde96a58f9cfa6795abb5f270f556 100644 (file)
@@ -1,3 +1,30 @@
+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 (add): Generate ItemEvent for the first item
+       added.
+       (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 ItemEvents.
+       * 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.
+
 2003-12-23  Michael Koch  <konqueror@gmx.de>
 
        * javax/print/attribute/standard/Copies.java,
index c4398e5041c7c60c3dccbe9b425a49c352017cd4..7e5579b3bc71c48c641df25114113ad1c2a6cb63 100644 (file)
@@ -84,10 +84,10 @@ public class GtkChoicePeer extends GtkComponentPeer
   }
   */
 
-  protected void postItemEvent (Object item, int stateChange)
+  protected void choicePostItemEvent (String label, int stateChange)
   {
     if (stateChange == ItemEvent.SELECTED)
-      ((Choice) awtComponent).select ((String) item);
-    super.postItemEvent (item, stateChange);
+      ((Choice) awtComponent).select (label);
+    super.postItemEvent (label, stateChange);
   }
 }
index 0b5e3d61dad87e4c6b332fedcfa0ad429e997fa0..863888c5b37c6f5fbffe38956344335192539f65 100644 (file)
@@ -171,7 +171,15 @@ add(String item)
     }
 
   if (i == 0)
-    select (0);
+  {
+    selectedIndex = 0;
+    // We must generate an ItemEvent here
+    Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent (
+      new ItemEvent ((ItemSelectable)this, 
+                     ItemEvent.ITEM_STATE_CHANGED,
+                     getItem(0),
+                     ItemEvent.SELECTED));
+  }
 }
 
 /*************************************************************************/
@@ -223,7 +231,15 @@ insert(String item, int index)
     }
 
   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));
+  }
 }
 
 /*************************************************************************/
@@ -265,8 +281,16 @@ remove(int index)
       cp.remove (index);
     }
 
-  if (index == selectedIndex)
+  if ((index == selectedIndex) && (getItemCount() > 0))
+  {
     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;
 }
@@ -281,11 +305,27 @@ removeAll()
 {
   int count = getItemCount();
 
-  for (int i = 0; i < count; i++)
+  if (count <= 0)
+    return;
+  
+  ChoicePeer cp = (ChoicePeer) peer;
+
+  // Select the first item to prevent an spurious ItemEvent to be generated
+  if (cp != null)
+    {
+      cp.select (0);
+      selectedIndex = 0; // Just to keep consistent
+    }
+
+  for (int i = (count - 1); i >= 0; i--)
     {
-      // Always remove 0.
-      remove(0);
+      // Always remove the last to avoid generation of ItemEvents.
+      pItems.removeElementAt(i);
+      if (cp != null)
+        cp.remove (i);
     }
+
+  selectedIndex = -1;
 }
 
 /*************************************************************************/
index c57cfd1217c2e1cceadd6130d95276cb21c55b3a..068cf1e42549fce9a9c893a50d66c66fcc90f935 100644 (file)
@@ -41,8 +41,9 @@ exception statement from your version. */
 
 static void connect_choice_item_selectable_hook (JNIEnv *env, 
                                                 jobject peer_obj, 
-                                                GtkItem *item, 
-                                                jobject item_obj);
+                                                GtkItem *menuitem, 
+                                                const char *label);
+
 JNIEXPORT void JNICALL 
 Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create 
   (JNIEnv *env, jobject obj)
@@ -101,14 +102,13 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_append
       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);
+                                          GTK_ITEM (menuitem), label);
+
+      (*env)->ReleaseStringUTFChars (env, item, label);
     }
   
   if (need_set_history)
@@ -139,7 +139,8 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_add
   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);
+
+  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);
@@ -155,14 +156,19 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_remove
 {
   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);
-  gtk_container_remove (menu, GTK_WIDGET (g_list_nth (children, index)->data));
+  menuitem = GTK_WIDGET (g_list_nth (children, index)->data);
+  gtk_container_remove (menu, menuitem);
+  gtk_widget_destroy (menuitem);
+
   gdk_threads_leave ();
 }
 
@@ -179,38 +185,49 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_select
   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,
-                             postItemEventID,
-                             ie->item_obj,
+                             choicePostItemEventID,
+                             label,
                              (jint) AWT_ITEM_SELECTED);
   gdk_threads_enter ();
 }
 
 static void
-connect_choice_item_selectable_hook (JNIEnv *env, jobject peer_obj, 
-                                    GtkItem *item, jobject item_obj)
+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;
-  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;
+  ie->label = strdup (label);
 
-  g_signal_connect (G_OBJECT (item), "activate", 
-                     GTK_SIGNAL_FUNC (item_activate), ie);
+  g_signal_connect_data (G_OBJECT (menuitem), "activate", 
+                     GTK_SIGNAL_FUNC (item_activate), ie,
+                     (GClosureNotify) item_removed, 0);
 }
index ed6107b37292ee7adb95dc83628dff171f21ae00..bad4a5168844cb8727f5adc7bc9c228f9cd2806a 100644 (file)
@@ -56,6 +56,7 @@ jmethodID postKeyEventID;
 jmethodID postFocusEventID;
 jmethodID postAdjustmentEventID;
 jmethodID postItemEventID;
+jmethodID choicePostItemEventID;
 jmethodID postListItemEventID;
 jmethodID postTextEventID;
 jmethodID postWindowEventID;
@@ -80,7 +81,7 @@ 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,
+  jclass gtkcomponentpeer, gtkchoicepeer, gtkwindowpeer, gtkscrollbarpeer, gtklistpeer,
     gtkmenuitempeer, gtktextcomponentpeer, window;
 
   NSA_INIT (env, clazz);
@@ -139,6 +140,8 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz)
 
   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, 
@@ -181,6 +184,9 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz)
   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 a35c99b69e062977468a8c9654126d73ff5dc37d..d552e687c9b1efc765bf87e48bb4a2b8a609dfa5 100644 (file)
@@ -395,6 +395,7 @@ extern jmethodID postExposeEventID;
 extern jmethodID postKeyEventID;
 extern jmethodID postFocusEventID;
 extern jmethodID postAdjustmentEventID;
+extern jmethodID choicePostItemEventID;
 extern jmethodID postItemEventID;
 extern jmethodID postListItemEventID;
 extern jmethodID postTextEventID;
@@ -424,7 +425,7 @@ jint keyevent_state_to_awt_mods (GdkEvent *event);
 struct item_event_hook_info
 {
   jobject peer_obj;
-  jobject item_obj;
+  const char *label;
 };
 
 #endif /* __GTKPEER_H */