Commit 2067150e by Sven de Marothy Committed by Thomas Fitzsimmons

[multiple changes]

2006-08-02  Sven de Marothy  <sven@physto.se>

	* gnu/java/awt/peer/gtk/GtkChoicePeer.java
	(remove): Force event on removing item 0 when it's selected.
	(handleEvent): Always call Choice.selected().
	* java/awt/Choice.java:
	(remove): Simplify and correct.

2006-07-30  Sven de Marothy  <sven@physto.se>

	* java/awt/Choice.java:
	(accessibleAction): Call select() directly.
	(add, insert, remove): Reimplement.
	(dispatchEventImpl): Always call super.
	(processItemEvent): Does not set the index.
	* include/gnu_java_awt_peer_gtk_GtkChoicePeer.h
	* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
	(append): removed.
	(nativeAdd): Name changed to add.
	(selection_changed_cb): Simplify callback.
	* gnu/java/awt/peer/gtk/GtkChoicePeer.java
	(selected): New field.
	(add): Replaced with native impl.
	(handleEvent): New method.

From-SVN: r117142
parent 36b24193
2006-08-02 Sven de Marothy <sven@physto.se>
* gnu/java/awt/peer/gtk/GtkChoicePeer.java
(remove): Force event on removing item 0 when it's selected.
(handleEvent): Always call Choice.selected().
* java/awt/Choice.java:
(remove): Simplify and correct.
2006-07-30 Sven de Marothy <sven@physto.se>
* java/awt/Choice.java:
(accessibleAction): Call select() directly.
(add, insert, remove): Reimplement.
(dispatchEventImpl): Always call super.
(processItemEvent): Does not set the index.
* include/gnu_java_awt_peer_gtk_GtkChoicePeer.h
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
(append): removed.
(nativeAdd): Name changed to add.
(selection_changed_cb): Simplify callback.
* gnu/java/awt/peer/gtk/GtkChoicePeer.java
(selected): New field.
(add): Replaced with native impl.
(handleEvent): New method.
2006-07-06 Paul Eggert <eggert@cs.ucla.edu> 2006-07-06 Paul Eggert <eggert@cs.ucla.edu>
Port to hosts whose 'sort' and 'tail' implementations Port to hosts whose 'sort' and 'tail' implementations
......
...@@ -39,12 +39,15 @@ exception statement from your version. */ ...@@ -39,12 +39,15 @@ exception statement from your version. */
package gnu.java.awt.peer.gtk; package gnu.java.awt.peer.gtk;
import java.awt.Choice; import java.awt.Choice;
import java.awt.AWTEvent;
import java.awt.event.ItemEvent; import java.awt.event.ItemEvent;
import java.awt.peer.ChoicePeer; import java.awt.peer.ChoicePeer;
public class GtkChoicePeer extends GtkComponentPeer public class GtkChoicePeer extends GtkComponentPeer
implements ChoicePeer implements ChoicePeer
{ {
private int selected;
public GtkChoicePeer (Choice c) public GtkChoicePeer (Choice c)
{ {
super (c); super (c);
...@@ -52,31 +55,33 @@ public class GtkChoicePeer extends GtkComponentPeer ...@@ -52,31 +55,33 @@ public class GtkChoicePeer extends GtkComponentPeer
int count = c.getItemCount (); int count = c.getItemCount ();
if (count > 0) if (count > 0)
{ {
String items[] = new String[count];
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
items[i] = c.getItem (i); add( c.getItem(i), i );
append (items);
}
int selected = c.getSelectedIndex(); selected = c.getSelectedIndex();
if (selected >= 0) if( selected >= 0 )
select(selected); select( selected );
}
else
selected = -1;
} }
native void create (); native void create ();
native void append (String items[]);
native int nativeGetSelected (); native int nativeGetSelected ();
native void nativeAdd (String item, int index);
native void nativeRemove (int index);
native void nativeRemoveAll ();
native void connectSignals (); native void connectSignals ();
native void selectNative (int position); native void selectNative (int position);
native void selectNativeUnlocked (int position); native void selectNativeUnlocked (int position);
public native void add (String item, int index);
native void nativeRemove(int index);
native void nativeRemoveAll();
public void select (int position) public void select (int position)
{ {
if (Thread.currentThread() == GtkToolkit.mainThread) if (Thread.currentThread() == GtkToolkit.mainThread)
...@@ -85,42 +90,18 @@ public class GtkChoicePeer extends GtkComponentPeer ...@@ -85,42 +90,18 @@ public class GtkChoicePeer extends GtkComponentPeer
selectNative (position); selectNative (position);
} }
public void add (String item, int index) public void remove( int index )
{ {
int before = nativeGetSelected(); // Ensure the triggering of an event when removing item zero if zero is the
// selected item, even though the selected index doesn't change.
nativeAdd (item, index); if( index == 0 && selected == 0 )
selected = -1;
/* Generate an ItemEvent if we added the first one or nativeRemove( index );
if we inserted at or before the currently selected item. */
if ((before < 0) || (before >= index))
{
// Must set our state before notifying listeners
((Choice) awtComponent).select (((Choice) awtComponent).getItem (0));
postItemEvent (((Choice) awtComponent).getItem (0), ItemEvent.SELECTED);
}
} }
public void remove (int index) public void removeAll()
{
int before = nativeGetSelected();
int after;
nativeRemove (index);
after = nativeGetSelected();
/* Generate an ItemEvent if we are removing the currently selected item
and there are at least one item left. */
if ((before == index) && (after >= 0))
{
// Must set our state before notifying listeners
((Choice) awtComponent).select (((Choice) awtComponent).getItem (0));
postItemEvent (((Choice) awtComponent).getItem (0), ItemEvent.SELECTED);
}
}
public void removeAll ()
{ {
selected = -1; // we do not want to trigger a select event here.
nativeRemoveAll(); nativeRemoveAll();
} }
...@@ -129,8 +110,34 @@ public class GtkChoicePeer extends GtkComponentPeer ...@@ -129,8 +110,34 @@ public class GtkChoicePeer extends GtkComponentPeer
add (item, position); add (item, position);
} }
protected void postChoiceItemEvent (String label, int stateChange) /**
* Callback from the native side on an item-select event,
* which posts an event. The event is only posted if it represents an actual
* change. Selected is set to the peer's state initially, so that the
* first call to select(int) from the constructor will not trigger an event.
* (it should not)
*/
protected void postChoiceItemEvent ( int index )
{
if( selected != index )
{
selected = index;
postItemEvent (((Choice) awtComponent).getItem( selected ),
ItemEvent.SELECTED);
}
}
/**
* Catches the event and calls Choice.select() if the component state
* needs updating.
*/
public void handleEvent (AWTEvent event)
{ {
postItemEvent (label, stateChange); super.handleEvent( event );
if( event instanceof ItemEvent )
if( ((ItemEvent)event).getItemSelectable() == awtComponent &&
((ItemEvent)event).getStateChange() == ItemEvent.SELECTED )
((Choice)awtComponent).select( selected );
} }
} }
...@@ -11,9 +11,8 @@ extern "C" ...@@ -11,9 +11,8 @@ extern "C"
#endif #endif
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create (JNIEnv *env, jobject); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create (JNIEnv *env, jobject);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkChoicePeer_append (JNIEnv *env, jobject, jobjectArray);
JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeGetSelected (JNIEnv *env, jobject); JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeGetSelected (JNIEnv *env, jobject);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeAdd (JNIEnv *env, jobject, jstring, jint); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkChoicePeer_add (JNIEnv *env, jobject, jstring, jint);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeRemove (JNIEnv *env, jobject, jint); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeRemove (JNIEnv *env, jobject, jint);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeRemoveAll (JNIEnv *env, jobject); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeRemoveAll (JNIEnv *env, jobject);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkChoicePeer_connectSignals (JNIEnv *env, jobject); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkChoicePeer_connectSignals (JNIEnv *env, jobject);
......
/* gtkchoicepeer.c -- Native implementation of GtkChoicePeer /* gtkchoicepeer.c -- Native implementation of GtkChoicePeer
Copyright (C) 1998, 1999 Free Software Foundation, Inc. Copyright (C) 1998, 1999, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath. This file is part of GNU Classpath.
...@@ -52,7 +52,7 @@ cp_gtk_choice_init_jni (void) ...@@ -52,7 +52,7 @@ cp_gtk_choice_init_jni (void)
postChoiceItemEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkchoicepeer, postChoiceItemEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkchoicepeer,
"postChoiceItemEvent", "postChoiceItemEvent",
"(Ljava/lang/String;I)V"); "(I)V");
} }
static void selection_changed_cb (GtkComboBox *combobox, jobject peer); static void selection_changed_cb (GtkComboBox *combobox, jobject peer);
...@@ -106,39 +106,7 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_connectSignals ...@@ -106,39 +106,7 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_connectSignals
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkChoicePeer_append Java_gnu_java_awt_peer_gtk_GtkChoicePeer_add
(JNIEnv *env, jobject obj, jobjectArray items)
{
gpointer ptr;
jsize count, i;
GtkWidget *bin;
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
bin = choice_get_widget (GTK_WIDGET (ptr));
count = (*env)->GetArrayLength (env, items);
for (i = 0; i < count; i++)
{
jobject item;
const char *label;
item = (*env)->GetObjectArrayElement (env, items, i);
label = (*env)->GetStringUTFChars (env, item, NULL);
gtk_combo_box_append_text (GTK_COMBO_BOX (bin), label);
(*env)->ReleaseStringUTFChars (env, item, label);
(*env)->DeleteLocalRef(env, item);
}
gdk_threads_leave ();
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeAdd
(JNIEnv *env, jobject obj, jstring item, jint index) (JNIEnv *env, jobject obj, jstring item, jint index)
{ {
void *ptr; void *ptr;
...@@ -170,14 +138,16 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeRemove ...@@ -170,14 +138,16 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeRemove
ptr = NSA_GET_PTR (env, obj); ptr = NSA_GET_PTR (env, obj);
bin = choice_get_widget (GTK_WIDGET (ptr)); bin = choice_get_widget (GTK_WIDGET (ptr));
/* First, unselect everything, to avoid problems when removing items. */
gtk_combo_box_set_active (GTK_COMBO_BOX (bin), -1);
gtk_combo_box_remove_text (GTK_COMBO_BOX (bin), index); gtk_combo_box_remove_text (GTK_COMBO_BOX (bin), index);
gdk_threads_leave (); gdk_threads_leave ();
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeRemoveAll Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeRemoveAll
(JNIEnv *env, jobject obj) (JNIEnv *env, jobject obj)
{ {
void *ptr; void *ptr;
...@@ -224,8 +194,7 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_selectNativeUnlocked ...@@ -224,8 +194,7 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_selectNativeUnlocked
ptr = NSA_GET_PTR (env, obj); ptr = NSA_GET_PTR (env, obj);
bin = choice_get_widget (GTK_WIDGET (ptr)); bin = choice_get_widget (GTK_WIDGET (ptr));
gtk_combo_box_set_active (GTK_COMBO_BOX (bin), (gint)index);
gtk_combo_box_set_active (GTK_COMBO_BOX (bin), index);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
...@@ -251,26 +220,11 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeGetSelected ...@@ -251,26 +220,11 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeGetSelected
static void static void
selection_changed_cb (GtkComboBox *combobox, jobject peer) selection_changed_cb (GtkComboBox *combobox, jobject peer)
{ {
jstring label; gint index = gtk_combo_box_get_active(combobox);
GtkTreeModel *model;
GtkTreeIter iter;
gchar *selected;
gint index;
index = gtk_combo_box_get_active(combobox);
if (index >= 0) if (index >= 0)
{ (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
model = gtk_combo_box_get_model (combobox); postChoiceItemEventID, (jint)index );
gtk_combo_box_get_active_iter (combobox, &iter);
gtk_tree_model_get (model, &iter, 0, &selected, -1);
label = (*cp_gtk_gdk_env())->NewStringUTF (cp_gtk_gdk_env(), selected);
(*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
postChoiceItemEventID,
label,
(jint) AWT_ITEM_SELECTED);
}
} }
static GtkWidget * static GtkWidget *
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment