This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[PATCH] Fix for Choice
- From: Fernando Nasser <fnasser at redhat dot com>
- To: GCJ Patches <java-patches at gcc dot gnu dot org>
- Date: Mon, 22 Dec 2003 17:21:33 -0500
- Subject: [PATCH] Fix for Choice
- Organization: Red Hat , Inc. - Toronto
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 */