39 |
#include "gtkpeer.h" |
#include "gtkpeer.h" |
40 |
#include "gnu_java_awt_peer_gtk_GtkChoicePeer.h" |
#include "gnu_java_awt_peer_gtk_GtkChoicePeer.h" |
41 |
|
|
42 |
static void connect_choice_item_selectable_hook (JNIEnv *env, |
static void selection_changed (GtkComboBox *combobox, gpointer data); |
|
jobject peer_obj, |
|
|
GtkItem *menuitem, |
|
|
const char *label); |
|
43 |
|
|
44 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
45 |
Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create |
Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create |
46 |
(JNIEnv *env, jobject obj) |
(JNIEnv *env, jobject obj) |
47 |
{ |
{ |
48 |
GtkWidget *menu; |
GtkWidget *menu; |
49 |
GtkOptionMenu *option_menu; |
GtkComboBox *combobox; |
|
GtkRequisition child_requisition; |
|
50 |
|
|
51 |
NSA_SET_GLOBAL_REF (env, obj); |
NSA_SET_GLOBAL_REF (env, obj); |
52 |
|
|
53 |
gdk_threads_enter (); |
gdk_threads_enter (); |
54 |
|
|
55 |
option_menu = GTK_OPTION_MENU (gtk_option_menu_new ()); |
combobox = gtk_combo_box_new_text (); |
56 |
menu = gtk_menu_new (); |
|
57 |
gtk_widget_show (menu); |
g_signal_connect (combobox, "changed", |
58 |
|
G_CALLBACK (selection_changed), obj); |
|
gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu); |
|
|
|
|
|
gtk_widget_size_request (gtk_menu_item_new_with_label (""), |
|
|
&child_requisition); |
|
|
option_menu->width = child_requisition.width; |
|
|
option_menu->height = child_requisition.height; |
|
59 |
|
|
60 |
gdk_threads_leave (); |
gdk_threads_leave (); |
61 |
|
|
62 |
NSA_SET_PTR (env, obj, option_menu); |
NSA_SET_PTR (env, obj, combobox); |
63 |
} |
} |
64 |
|
|
65 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
67 |
(JNIEnv *env, jobject obj, jobjectArray items) |
(JNIEnv *env, jobject obj, jobjectArray items) |
68 |
{ |
{ |
69 |
gpointer ptr; |
gpointer ptr; |
|
GtkMenu *menu; |
|
70 |
jsize count, i; |
jsize count, i; |
|
int need_set_history = 0; |
|
71 |
|
|
72 |
ptr = NSA_GET_PTR (env, obj); |
ptr = NSA_GET_PTR (env, obj); |
73 |
|
|
74 |
gdk_threads_enter (); |
gdk_threads_enter (); |
75 |
|
|
|
menu = GTK_MENU (gtk_option_menu_get_menu (GTK_OPTION_MENU (ptr))); |
|
|
|
|
|
/* Are we adding the first element? */ |
|
|
if (gtk_option_menu_get_history (GTK_OPTION_MENU (ptr)) < 0) |
|
|
need_set_history = 1; |
|
|
|
|
76 |
count = (*env)->GetArrayLength (env, items); |
count = (*env)->GetArrayLength (env, items); |
77 |
|
|
78 |
for (i = 0; i < count; i++) |
for (i = 0; i < count; i++) |
79 |
{ |
{ |
80 |
jobject item; |
jobject item; |
81 |
const char *label; |
const char *label; |
|
GtkWidget *menuitem; |
|
82 |
|
|
83 |
item = (*env)->GetObjectArrayElement (env, items, i); |
item = (*env)->GetObjectArrayElement (env, items, i); |
84 |
label = (*env)->GetStringUTFChars (env, item, NULL); |
label = (*env)->GetStringUTFChars (env, item, NULL); |
85 |
|
|
86 |
menuitem = gtk_menu_item_new_with_label (label); |
gtk_combo_box_append_text (GTK_COMBO_BOX (ptr), label); |
|
gtk_menu_append (menu, menuitem); |
|
|
gtk_widget_show (menuitem); |
|
|
|
|
|
connect_choice_item_selectable_hook (env, obj, |
|
|
GTK_ITEM (menuitem), label); |
|
87 |
|
|
88 |
(*env)->ReleaseStringUTFChars (env, item, label); |
(*env)->ReleaseStringUTFChars (env, item, label); |
89 |
} |
} |
90 |
|
|
|
/* If we just added the first element select it. */ |
|
|
if (need_set_history) |
|
|
gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), 0); |
|
|
|
|
91 |
gdk_threads_leave (); |
gdk_threads_leave (); |
92 |
} |
} |
93 |
|
|
97 |
{ |
{ |
98 |
void *ptr; |
void *ptr; |
99 |
const char *label; |
const char *label; |
|
GtkWidget *menu, *menuitem; |
|
|
int current; |
|
|
int need_set_history = 0; |
|
100 |
|
|
101 |
ptr = NSA_GET_PTR (env, obj); |
ptr = NSA_GET_PTR (env, obj); |
102 |
|
|
103 |
label = (*env)->GetStringUTFChars (env, item, 0); |
label = (*env)->GetStringUTFChars (env, item, 0); |
104 |
|
|
105 |
gdk_threads_enter (); |
gdk_threads_enter (); |
106 |
|
gtk_combo_box_insert_text (GTK_COMBO_BOX (ptr), index, label); |
|
current = gtk_option_menu_get_history (GTK_OPTION_MENU (ptr)); |
|
|
|
|
|
/* Are we adding the first element or below or at the currently |
|
|
selected one? */ |
|
|
if ((current < 0) || (current >= index)) |
|
|
need_set_history = 1; |
|
|
|
|
|
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (ptr)); |
|
|
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 we just added the first element select it. |
|
|
If we added at of below the currently selected position make |
|
|
the first item the selected one. */ |
|
|
if (need_set_history) |
|
|
gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), 0); |
|
|
|
|
107 |
gdk_threads_leave (); |
gdk_threads_leave (); |
108 |
|
|
109 |
(*env)->ReleaseStringUTFChars (env, item, label); |
(*env)->ReleaseStringUTFChars (env, item, label); |
114 |
(JNIEnv *env, jobject obj, jint index) |
(JNIEnv *env, jobject obj, jint index) |
115 |
{ |
{ |
116 |
void *ptr; |
void *ptr; |
|
GtkContainer *menu; |
|
|
GtkWidget *menuitem; |
|
|
GList *children; |
|
|
int need_set_history = 0; |
|
|
int i, from, to; |
|
117 |
|
|
118 |
ptr = NSA_GET_PTR (env, obj); |
ptr = NSA_GET_PTR (env, obj); |
119 |
|
|
120 |
gdk_threads_enter (); |
gdk_threads_enter (); |
121 |
|
gtk_combo_box_remove_text (GTK_COMBO_BOX (ptr), index); |
122 |
|
gdk_threads_leave (); |
123 |
|
} |
124 |
|
|
125 |
menu = GTK_CONTAINER (gtk_option_menu_get_menu (GTK_OPTION_MENU (ptr))); |
JNIEXPORT void JNICALL |
126 |
children = gtk_container_children (menu); |
Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeRemoveAll |
127 |
|
(JNIEnv *env, jobject obj) |
128 |
|
{ |
129 |
|
void *ptr; |
130 |
|
GtkTreeModel *model; |
131 |
|
gint count, i; |
132 |
|
|
133 |
if (index == -1) |
ptr = NSA_GET_PTR (env, obj); |
|
{ |
|
|
/* Remove all elements (removeAll) */ |
|
|
from = g_list_length (children) - 1; |
|
|
to = 0; |
|
134 |
|
|
135 |
/* Select the first item to prevent spurious activate signals */ |
gdk_threads_enter (); |
|
gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), 0); |
|
|
} |
|
|
else |
|
|
{ |
|
|
/* Remove the specific index element */ |
|
|
from = index; |
|
|
to = index; |
|
|
|
|
|
/* Are we removing the currently selected element? */ |
|
|
if (gtk_option_menu_get_history (GTK_OPTION_MENU (ptr)) == index) |
|
|
need_set_history = 1; |
|
|
} |
|
136 |
|
|
137 |
for (i = from; i >= to; i--) |
model = gtk_combo_box_get_model (GTK_COMBO_BOX (ptr)); |
138 |
{ |
count = gtk_tree_model_iter_n_children (model, NULL); |
139 |
menuitem = GTK_WIDGET (g_list_nth (children, i)->data); |
|
140 |
gtk_container_remove (menu, menuitem); |
/* First, unselect everything, to avoid problems when removing items. */ |
141 |
gtk_widget_destroy (menuitem); |
gtk_combo_box_set_active (GTK_COMBO_BOX (ptr), -1); |
|
} |
|
142 |
|
|
143 |
/* If we just removed the currently selected element and there are |
for (i = count - 1; i >= 0; i--) { |
144 |
still elements left in the list, make the first item the selected one. */ |
gtk_combo_box_remove_text (GTK_COMBO_BOX (ptr), i); |
145 |
if (need_set_history && gtk_container_children (menu)) |
} |
|
gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), 0); |
|
146 |
|
|
147 |
gdk_threads_leave (); |
gdk_threads_leave (); |
148 |
} |
} |
156 |
ptr = NSA_GET_PTR (env, obj); |
ptr = NSA_GET_PTR (env, obj); |
157 |
|
|
158 |
gdk_threads_enter (); |
gdk_threads_enter (); |
159 |
gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), index); |
gtk_combo_box_set_active (GTK_COMBO_BOX (ptr), index); |
160 |
gdk_threads_leave (); |
gdk_threads_leave (); |
161 |
} |
} |
162 |
|
|
163 |
JNIEXPORT jint JNICALL |
JNIEXPORT jint JNICALL |
164 |
Java_gnu_java_awt_peer_gtk_GtkChoicePeer_getHistory |
Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeGetSelected |
165 |
(JNIEnv *env, jobject obj) |
(JNIEnv *env, jobject obj) |
166 |
{ |
{ |
167 |
void *ptr; |
void *ptr; |
170 |
ptr = NSA_GET_PTR (env, obj); |
ptr = NSA_GET_PTR (env, obj); |
171 |
|
|
172 |
gdk_threads_enter (); |
gdk_threads_enter (); |
173 |
|
index = gtk_combo_box_get_active (GTK_COMBO_BOX (ptr)); |
|
index = gtk_option_menu_get_history (GTK_OPTION_MENU (ptr)); |
|
|
|
|
174 |
gdk_threads_leave (); |
gdk_threads_leave (); |
175 |
|
|
176 |
return index; |
return index; |
177 |
} |
} |
178 |
|
|
179 |
static void |
void selection_changed (GtkComboBox *combobox, jobject peer) |
|
item_activate (GtkItem *item __attribute__((unused)), |
|
|
struct item_event_hook_info *ie) |
|
180 |
{ |
{ |
181 |
jstring label; |
jstring label; |
182 |
gdk_threads_leave (); |
GtkTreeModel *model; |
183 |
|
GtkTreeIter iter; |
184 |
|
GValue value; |
185 |
|
gchar *selected; |
186 |
|
gint index; |
187 |
|
|
188 |
label = (*gdk_env)->NewStringUTF (gdk_env, ie->label); |
index = gtk_combo_box_get_active(combobox); |
|
(*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; |
|
189 |
|
|
190 |
free ((void *) ie->label); |
if (index >= 0) |
191 |
free (ie); |
{ |
192 |
} |
model = gtk_combo_box_get_model (combobox); |
|
|
|
|
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)); |
|
193 |
|
|
194 |
peer_objGlobPtr = NSA_GET_GLOBAL_REF (env, peer_obj); |
gtk_combo_box_get_active_iter (combobox, &iter); |
|
g_assert (peer_objGlobPtr); |
|
195 |
|
|
196 |
ie->peer_obj = *peer_objGlobPtr; |
gtk_tree_model_get (model, &iter, 0, &selected, -1); |
|
ie->label = strdup (label); |
|
197 |
|
|
198 |
g_signal_connect_data (G_OBJECT (menuitem), "activate", |
gdk_threads_leave (); |
|
GTK_SIGNAL_FUNC (item_activate), ie, |
|
|
(GClosureNotify) item_removed, 0); |
|
|
} |
|
199 |
|
|
200 |
JNIEXPORT void JNICALL |
label = (*gdk_env)->NewStringUTF (gdk_env, selected); |
201 |
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetParent |
(*gdk_env)->CallVoidMethod (gdk_env, peer, |
202 |
(JNIEnv *env, jobject obj, jobject parent) |
choicePostItemEventID, |
203 |
{ |
label, |
204 |
void *ptr; |
(jint) AWT_ITEM_SELECTED); |
205 |
void *parent_ptr; |
gdk_threads_enter (); |
|
GtkWidget *widget; |
|
|
GtkWidget *parent_widget; |
|
|
|
|
|
ptr = NSA_GET_PTR (env, obj); |
|
|
parent_ptr = NSA_GET_PTR (env, parent); |
|
|
|
|
|
gdk_threads_enter (); |
|
|
|
|
|
widget = GTK_WIDGET (ptr); |
|
|
parent_widget = GTK_WIDGET (parent_ptr); |
|
|
|
|
|
if (GTK_IS_WINDOW (parent_widget)) |
|
|
{ |
|
|
GList *children = gtk_container_children |
|
|
(GTK_CONTAINER (GTK_BIN (parent_widget)->child)); |
|
|
|
|
|
if (GTK_IS_MENU_BAR (children->data)) |
|
|
gtk_layout_put (GTK_LAYOUT (children->next->data), widget, 0, 0); |
|
|
else |
|
|
gtk_layout_put (GTK_LAYOUT (children->data), widget, 0, 0); |
|
206 |
} |
} |
|
else |
|
|
if (GTK_IS_SCROLLED_WINDOW (parent_widget)) |
|
|
{ |
|
|
gtk_scrolled_window_add_with_viewport |
|
|
(GTK_SCROLLED_WINDOW (parent_widget), widget); |
|
|
gtk_viewport_set_shadow_type (GTK_VIEWPORT (widget->parent), |
|
|
GTK_SHADOW_NONE); |
|
|
|
|
|
} |
|
|
else |
|
|
gtk_layout_put (GTK_LAYOUT (parent_widget), widget, 0, 0); |
|
|
|
|
|
gdk_threads_leave (); |
|
|
} |
|
|
|
|
|
JNIEXPORT void JNICALL |
|
|
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetSensitive |
|
|
(JNIEnv *env, jobject obj, jboolean sensitive) |
|
|
{ |
|
|
void *ptr; |
|
|
|
|
|
ptr = NSA_GET_PTR (env, obj); |
|
|
|
|
|
gdk_threads_enter (); |
|
|
|
|
|
gtk_widget_set_sensitive (GTK_WIDGET (ptr), sensitive); |
|
|
|
|
|
gdk_threads_leave (); |
|
207 |
} |
} |