diff options
author | Fernando Nasser <fnasser@redhat.com> | 2003-12-23 19:24:00 +0000 |
---|---|---|
committer | Fernando Nasser <fnasser@gcc.gnu.org> | 2003-12-23 19:24:00 +0000 |
commit | baba70d019dcf4ce9cbd6544465b25154eaed5e0 (patch) | |
tree | 29c9440c1526ef9518e40450118087067dad5e4d /libjava | |
parent | 459ac19fa525d64829e364d549814deb09854c2a (diff) | |
download | gcc-baba70d019dcf4ce9cbd6544465b25154eaed5e0.zip gcc-baba70d019dcf4ce9cbd6544465b25154eaed5e0.tar.gz gcc-baba70d019dcf4ce9cbd6544465b25154eaed5e0.tar.bz2 |
GtkChoicePeer.java (postItemEvent): Rename to...
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
Diffstat (limited to 'libjava')
-rw-r--r-- | libjava/ChangeLog | 27 | ||||
-rw-r--r-- | libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java | 6 | ||||
-rw-r--r-- | libjava/java/awt/Choice.java | 50 | ||||
-rw-r--r-- | libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c | 55 | ||||
-rw-r--r-- | libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c | 8 | ||||
-rw-r--r-- | libjava/jni/gtk-peer/gtkpeer.h | 3 |
6 files changed, 120 insertions, 29 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index c6da6ab..9b2294e 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -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, diff --git a/libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java b/libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java index c4398e5..7e5579b 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java @@ -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); } } diff --git a/libjava/java/awt/Choice.java b/libjava/java/awt/Choice.java index 0b5e3d6..863888c 100644 --- a/libjava/java/awt/Choice.java +++ b/libjava/java/awt/Choice.java @@ -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; } /*************************************************************************/ diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c index c57cfd1..068cf1e 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c @@ -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); } diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c index ed6107b..bad4a51 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c @@ -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"); diff --git a/libjava/jni/gtk-peer/gtkpeer.h b/libjava/jni/gtk-peer/gtkpeer.h index a35c99b..d552e68 100644 --- a/libjava/jni/gtk-peer/gtkpeer.h +++ b/libjava/jni/gtk-peer/gtkpeer.h @@ -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 */ |