aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorFernando Nasser <fnasser@redhat.com>2003-12-23 19:24:00 +0000
committerFernando Nasser <fnasser@gcc.gnu.org>2003-12-23 19:24:00 +0000
commitbaba70d019dcf4ce9cbd6544465b25154eaed5e0 (patch)
tree29c9440c1526ef9518e40450118087067dad5e4d /libjava
parent459ac19fa525d64829e364d549814deb09854c2a (diff)
downloadgcc-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/ChangeLog27
-rw-r--r--libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java6
-rw-r--r--libjava/java/awt/Choice.java50
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c55
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c8
-rw-r--r--libjava/jni/gtk-peer/gtkpeer.h3
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 */