1 |
/* gtkcheckboxpeer.c -- Native implementation of GtkCheckboxPeer |
/* gtkcheckboxpeer.c -- Native implementation of GtkCheckboxPeer |
2 |
Copyright (C) 1998, 1999 Free Software Foundation, Inc. |
Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc. |
3 |
|
|
4 |
This file is part of GNU Classpath. |
This file is part of GNU Classpath. |
5 |
|
|
44 |
GtkToggleButton *item, |
GtkToggleButton *item, |
45 |
jobject item_obj); |
jobject item_obj); |
46 |
|
|
47 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
48 |
Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkRadioButtonSetGroup |
Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeCreate |
49 |
(JNIEnv *env, jobject obj, jobject group) |
(JNIEnv *env, jobject obj, jobject group) |
50 |
{ |
{ |
|
GtkRadioButton *button; |
|
|
void *native_group, *ptr; |
|
|
|
|
|
native_group = NSA_GET_PTR (env, group); |
|
|
ptr = NSA_GET_PTR (env, obj); |
|
|
|
|
|
gdk_threads_enter (); |
|
|
|
|
|
button=GTK_RADIO_BUTTON(ptr); |
|
|
|
|
|
if (native_group==NULL) |
|
|
gtk_radio_button_set_group (button, NULL); |
|
|
else |
|
|
gtk_radio_button_set_group (button, |
|
|
gtk_radio_button_group |
|
|
(GTK_RADIO_BUTTON (native_group))); |
|
|
|
|
|
gdk_threads_leave (); |
|
|
|
|
|
if (native_group==NULL) |
|
|
NSA_SET_PTR (env, group, native_group); |
|
|
} |
|
|
|
|
|
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkRadioButtonPeer_create |
|
|
(JNIEnv *env, jobject obj) |
|
|
{ |
|
|
gpointer widget; |
|
|
|
|
|
gdk_threads_enter (); |
|
|
widget = gtk_type_new (gtk_radio_button_get_type ()); |
|
|
gdk_threads_leave (); |
|
|
|
|
|
NSA_SET_PTR (env, obj, widget); |
|
|
} |
|
|
|
|
|
|
|
|
JNIEXPORT void JNICALL |
|
|
Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkRadioButtonNew |
|
|
(JNIEnv *env, jobject obj, jobject parent_obj, |
|
|
jobject group, jboolean checked, jstring label) |
|
|
{ |
|
51 |
GtkWidget *button; |
GtkWidget *button; |
|
const char *str; |
|
|
void *native_group; |
|
|
void *parent; |
|
|
|
|
|
str = (*env)->GetStringUTFChars (env, label, NULL); |
|
|
native_group = NSA_GET_PTR (env, group); |
|
|
parent = NSA_GET_PTR (env, parent_obj); |
|
52 |
|
|
53 |
gdk_threads_enter (); |
gdk_threads_enter (); |
54 |
|
|
55 |
/* All checkboxes get a label, even if it is blank. */ |
if (group == NULL) |
56 |
|
button = gtk_check_button_new_with_label (""); |
|
if (native_group==NULL) |
|
|
button=gtk_radio_button_new_with_label_from_widget (NULL, str); |
|
57 |
else |
else |
58 |
button=gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON |
{ |
59 |
(native_group), str); |
void *native_group = NSA_GET_PTR (env, group); |
60 |
set_parent (button, GTK_CONTAINER (parent)); |
button = gtk_radio_button_new_with_label_from_widget (native_group, ""); |
61 |
gtk_widget_realize (button); |
if (native_group == NULL) |
62 |
connect_awt_hook (env, obj, 1, |
{ |
63 |
GTK_TOGGLE_BUTTON (button)->event_window); |
/* Set the native group so we can use the correct value the |
64 |
connect_checkbox_item_selectable_hook (env, obj, GTK_TOGGLE_BUTTON (button), |
next time around. FIXME: this doesn't work! */ |
65 |
label); |
NSA_SET_PTR (env, group, button); |
66 |
|
} |
67 |
if (checked) |
} |
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); |
|
|
|
|
|
gdk_threads_leave (); |
|
|
(*env)->ReleaseStringUTFChars (env, label, str); |
|
|
|
|
|
if (native_group==NULL) |
|
|
NSA_SET_PTR (env, group, button); |
|
|
|
|
|
NSA_SET_PTR (env, obj, button); |
|
|
} |
|
|
|
|
|
JNIEXPORT void JNICALL |
|
|
Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkCheckButtonNew |
|
|
(JNIEnv *env, jobject obj, jobject parent_obj, |
|
|
jboolean checked, jstring label) |
|
|
{ |
|
|
GtkWidget *button; |
|
|
const char *str; |
|
|
void *parent; |
|
|
|
|
|
parent = NSA_GET_PTR (env, parent_obj); |
|
|
str = (*env)->GetStringUTFChars (env, label, NULL); |
|
|
|
|
|
gdk_threads_enter (); |
|
68 |
|
|
|
/* All checkboxes get a label, even if it is blank. */ |
|
|
button=gtk_check_button_new_with_label (str); |
|
|
if (checked) |
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); |
|
|
|
|
|
set_parent (button, GTK_CONTAINER (parent)); |
|
|
gtk_widget_realize (button); |
|
|
connect_awt_hook (env, obj, 1, |
|
|
GTK_TOGGLE_BUTTON (button)->event_window); |
|
|
connect_checkbox_item_selectable_hook (env, obj, GTK_TOGGLE_BUTTON (button), |
|
|
label); |
|
69 |
gdk_threads_leave (); |
gdk_threads_leave (); |
70 |
|
|
|
(*env)->ReleaseStringUTFChars (env, label, str); |
|
|
|
|
71 |
NSA_SET_PTR (env, obj, button); |
NSA_SET_PTR (env, obj, button); |
72 |
} |
} |
73 |
|
|
|
|
|
74 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
75 |
Java_gnu_java_awt_peer_gtk_GtkToggleButtonPeer_setState |
Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeSetCheckboxGroup |
76 |
(JNIEnv *env, jobject obj, jboolean checked) |
(JNIEnv *env, jobject obj, jobject group, jobject old_group) |
77 |
{ |
{ |
78 |
void *ptr; |
GtkRadioButton *button; |
79 |
|
void *native_group, *ptr; |
80 |
|
|
81 |
ptr = NSA_GET_PTR (env, obj); |
ptr = NSA_GET_PTR (env, obj); |
82 |
|
|
83 |
gdk_threads_enter (); |
gdk_threads_enter (); |
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ptr), |
|
|
(checked) ? TRUE : FALSE); |
|
|
gdk_threads_leave (); |
|
|
} |
|
84 |
|
|
85 |
JNIEXPORT void JNICALL |
/* FIXME: we can't yet switch between a checkbutton and a |
86 |
Java_gnu_java_awt_peer_gtk_GtkToggleButtonPeer_setLabel |
radiobutton. However, AWT requires this. For now we just |
87 |
(JNIEnv *env, jobject obj, jstring label) |
crash. */ |
88 |
{ |
|
89 |
void *ptr; |
button = GTK_RADIO_BUTTON (ptr); |
90 |
const char *str; |
|
91 |
GList *child; |
if (old_group != NULL) |
92 |
|
{ |
93 |
|
/* First, update our old group, if one exists, to point to some |
94 |
|
other widget in the group. We have to do this because Gtk |
95 |
|
doesn't have a separate object to represent a radio button's |
96 |
|
group. */ |
97 |
|
GSList *list; |
98 |
|
for (list = gtk_radio_button_group (button); list != NULL; |
99 |
|
list = list->next) |
100 |
|
{ |
101 |
|
if (list->data != button) |
102 |
|
break; |
103 |
|
} |
104 |
|
|
105 |
ptr = NSA_GET_PTR (env, obj); |
NSA_SET_PTR (env, old_group, list ? list->data : NULL); |
106 |
|
} |
107 |
printf("labelset\n"); |
|
108 |
|
native_group = NSA_GET_PTR (env, group); |
109 |
|
if (native_group == NULL) |
110 |
|
gtk_radio_button_set_group (button, NULL); |
111 |
|
else |
112 |
|
gtk_radio_button_set_group (button, |
113 |
|
gtk_radio_button_group |
114 |
|
(GTK_RADIO_BUTTON (native_group))); |
115 |
|
|
|
str = (*env)->GetStringUTFChars (env, label, NULL); |
|
|
gdk_threads_enter (); |
|
|
|
|
|
/* We assume that the checkbutton has 1 child, a label. */ |
|
|
|
|
|
child=gtk_container_children (GTK_CONTAINER(ptr)); |
|
|
if (!child) |
|
|
printf("No children in button!\n"); |
|
|
if(!GTK_IS_LABEL(child->data)) |
|
|
printf("Child is not label!\n"); |
|
|
|
|
|
gtk_label_set (GTK_LABEL(child->data),str); |
|
|
|
|
116 |
gdk_threads_leave (); |
gdk_threads_leave (); |
117 |
|
|
118 |
g_list_free(child); |
/* If the native group wasn't set on the new CheckboxGroup, then set |
119 |
(*env)->ReleaseStringUTFChars (env, label, str); |
it now so that the right thing will happen with the next |
120 |
|
radiobutton. */ |
121 |
|
if (native_group == NULL) |
122 |
|
NSA_SET_PTR (env, group, native_group); |
123 |
} |
} |
124 |
|
|
125 |
static void |
static void |