summaryrefslogtreecommitdiff
path: root/native
diff options
context:
space:
mode:
authorLillian Angel <langel@redhat.com>2006-06-30 14:47:15 +0000
committerLillian Angel <langel@redhat.com>2006-06-30 14:47:15 +0000
commit0eb701748dbfd2390ece1496946a44d4a085cad3 (patch)
treeda9e2b74d0b2594bbd0ee138d36ed795835c92ab /native
parente911f0a36cab61c963f9b2abe338b6434435ba1a (diff)
downloadclasspath-0eb701748dbfd2390ece1496946a44d4a085cad3.tar.gz
2006-06-30 Lillian Angel <langel@redhat.com>
Tom Fitzsimmons <fitzsim@redhat.com> * gnu/java/awt/peer/gtk/GtkCheckboxGroupPeer.java: Removed class. * gnu/java/awt/peer/gtk/GtkCheckboxPeer.java: Added current_group, groupMap fields. Added definitions for new native functions. (create): Removed FIXME. Added code to create the check button or radio button when appropriate. Updated groupMap to contain pointer to the newly created group. (setCheckboxGroup): Added code to handle all cases. Removing a button from a group, adding a button to a group, or changing the group of a button. (dispose): Changed to call super. * include/Makefile.am: Removed reference to gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.h. * include/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.h: Removed file. * include/gnu_java_awt_peer_gtk_GtkCheckboxPeer.h: Added definitions for new functions. * native/jni/gtk-peer/Makefile.am: Removed reference to gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c. * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c: Removed file. * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c (Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_combobox_get_widget): Renamed to checkbox_get_widget. (Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectSignals): Changed to use checkbox_get_widget. (Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeSetCheckboxGroup): Removed. (Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkWidgetModifyFont): Changed to use checkbox_get_widget. (Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkButtonSetLabel): Likewise. (Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_createCheckButton): New function. Creates checkbutton without a group. (Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_createRadioButton): Creates a radio button in a group, using groupPointer. If groupPointer is 0, then a new group is created. (Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_addToGroup): Adds the check button to a group, using groupPointer. A radio button is created in its place. If groupPointer is 0, then a new group is created. (Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_removeFromGroup): The radio button is removed from the group. A check button is created in its place. (Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_switchToGroup): The radio button is moved to a new group.
Diffstat (limited to 'native')
-rw-r--r--native/jni/gtk-peer/Makefile.am1
-rw-r--r--native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c87
-rw-r--r--native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c314
3 files changed, 226 insertions, 176 deletions
diff --git a/native/jni/gtk-peer/Makefile.am b/native/jni/gtk-peer/Makefile.am
index 8a39f34fe..397240270 100644
--- a/native/jni/gtk-peer/Makefile.am
+++ b/native/jni/gtk-peer/Makefile.am
@@ -15,7 +15,6 @@ libgtkpeer_la_SOURCES = gnu_java_awt_peer_gtk_CairoSurface.c \
gnu_java_awt_peer_gtk_GdkTextLayout.c \
gnu_java_awt_peer_gtk_GtkButtonPeer.c \
gnu_java_awt_peer_gtk_GtkCanvasPeer.c \
- gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c \
gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c \
gnu_java_awt_peer_gtk_GtkCheckboxPeer.c \
gnu_java_awt_peer_gtk_GtkChoicePeer.c \
diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c
deleted file mode 100644
index 16ef43c40..000000000
--- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/* gtkcheckboxgrouppeer.c -- Native implementation of GtkCheckboxGroupPeer
- Copyright (C) 2004 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-
-#include "gtkpeer.h"
-#include "gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.h"
-
-static GtkWidget *comboboxgroup_get_widget (GtkWidget *widget);
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer_dispose
- (JNIEnv *env, jobject obj)
-{
- /* The actual underlying widget is owned by a different class. So
- we just clean up the hash table here. */
- NSA_DEL_PTR (env, obj);
-}
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer_remove
- (JNIEnv *env, jobject obj, jobject checkbox)
-{
- GtkRadioButton *button;
- void *ptr;
- GSList *list;
-
- gdk_threads_enter ();
-
- ptr = NSA_GET_PTR (env, checkbox);
- button = GTK_RADIO_BUTTON (comboboxgroup_get_widget (GTK_WIDGET (ptr)));
-
- /* Update the group to point to some other widget in the group. We
- have to do this because Gtk doesn't have a separate object to
- represent a radio button's group. */
- for (list = gtk_radio_button_get_group (button); list != NULL;
- list = list->next)
- {
- if (list->data != button)
- break;
- }
-
- NSA_SET_PTR (env, obj, list ? list->data : NULL);
-
- gdk_threads_leave ();
-}
-
-static GtkWidget *
-comboboxgroup_get_widget (GtkWidget *widget)
-{
- if (GTK_IS_EVENT_BOX (widget))
- return gtk_bin_get_child (GTK_BIN(widget));
- return widget;
-}
diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
index 191cdda8f..8db0d4b73 100644
--- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
+++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
@@ -40,9 +40,11 @@ exception statement from your version. */
#include "gtkpeer.h"
#include "gnu_java_awt_peer_gtk_GtkCheckboxPeer.h"
#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
+#include "jcl.h"
static jmethodID postItemEventID;
-static GtkWidget *combobox_get_widget (GtkWidget *widget);
+static GtkWidget *checkbox_get_widget (GtkWidget *widget);
+static void item_toggled_cb (GtkToggleButton *item, jobject peer);
void
cp_gtk_checkbox_init_jni (void)
@@ -57,59 +59,19 @@ cp_gtk_checkbox_init_jni (void)
"(Ljava/lang/Object;Z)V");
}
-static void item_toggled_cb (GtkToggleButton *item, jobject peer);
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_create
- (JNIEnv *env, jobject obj, jobject group)
-{
- GtkWidget *button;
- GtkWidget *eventbox;
-
- gdk_threads_enter ();
-
- NSA_SET_GLOBAL_REF (env, obj);
- eventbox = gtk_event_box_new ();
-
- if (group == NULL)
- {
- button = gtk_check_button_new_with_label ("");
- gtk_container_add (GTK_CONTAINER (eventbox), button);
- gtk_widget_show (button);
- }
- else
- {
- void *native_group = NSA_GET_PTR (env, group);
- button = gtk_radio_button_new_with_label_from_widget (native_group, "");
- gtk_container_add (GTK_CONTAINER (eventbox), button);
- gtk_widget_show (button);
-
- if (native_group == NULL)
- {
- /* Set the native group so we can use the correct value the
- next time around. FIXME: this doesn't work! */
- NSA_SET_PTR (env, group, button);
- }
- }
-
- NSA_SET_PTR (env, obj, eventbox);
-
- gdk_threads_leave ();
-}
-
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectSignals
(JNIEnv *env, jobject obj)
{
- void *ptr = NULL;
- jobject *gref = NULL;
+ void *ptr;
+ jobject *gref;
GtkWidget *bin;
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
gref = NSA_GET_GLOBAL_REF (env, obj);
- bin = combobox_get_widget (GTK_WIDGET (ptr));
+ bin = checkbox_get_widget (GTK_WIDGET (ptr));
/* Checkbox signals */
g_signal_connect (G_OBJECT (bin), "toggled",
@@ -121,46 +83,6 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectSignals
gdk_threads_leave ();
}
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeSetCheckboxGroup
- (JNIEnv *env, jobject obj, jobject group)
-{
- GtkRadioButton *button;
- void *native_group, *ptr;
- GtkWidget *bin;
-
- gdk_threads_enter ();
-
- ptr = NSA_GET_PTR (env, obj);
- bin = combobox_get_widget (GTK_WIDGET (ptr));
-
- /* FIXME: we can't yet switch between a checkbutton and a
- radiobutton. However, AWT requires this. For now we just
- crash. */
-
- button = GTK_RADIO_BUTTON (bin);
-
- native_group = NSA_GET_PTR (env, group);
- if (native_group == NULL)
- gtk_radio_button_set_group (button, NULL);
- else
- gtk_radio_button_set_group (button,
- gtk_radio_button_get_group
- (GTK_RADIO_BUTTON (native_group)));
-
- /* If the native group wasn't set on the new CheckboxGroup, then set
- it now so that the right thing will happen with the next
- radiobutton. The native state for a CheckboxGroup is a pointer
- to one of the widgets in the group. We are careful to keep this
- always pointing at a live widget; whenever a widget is destroyed
- (or otherwise removed from the group), the CheckboxGroup peer is
- notified. */
- if (native_group == NULL)
- NSA_SET_PTR (env, group, native_group);
-
- gdk_threads_leave ();
-}
-
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkToggleButtonSetActive
(JNIEnv *env, jobject obj, jboolean is_active)
@@ -171,7 +93,7 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkToggleButtonSetActive
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
- bin = combobox_get_widget (GTK_WIDGET (ptr));
+ bin = checkbox_get_widget (GTK_WIDGET (ptr));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bin), is_active);
@@ -192,7 +114,7 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkWidgetModifyFont
ptr = NSA_GET_PTR (env, obj);
- button = combobox_get_widget (GTK_WIDGET (ptr));
+ button = checkbox_get_widget (GTK_WIDGET (ptr));
label = gtk_bin_get_child (GTK_BIN(button));
if (!label)
@@ -233,7 +155,7 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkButtonSetLabel
c_label = (*env)->GetStringUTFChars (env, label, NULL);
- label_widget = gtk_bin_get_child (GTK_BIN (combobox_get_widget (GTK_WIDGET (ptr))));
+ label_widget = gtk_bin_get_child (GTK_BIN (checkbox_get_widget (GTK_WIDGET (ptr))));
gtk_label_set_text (GTK_LABEL (label_widget), c_label);
(*env)->ReleaseStringUTFChars (env, label, c_label);
@@ -241,6 +163,222 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkButtonSetLabel
gdk_threads_leave ();
}
+/* A check button is created if we are not part of
+ a group.
+ This function is called when initially creating the
+ button, so an eventbox is created.
+ */
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_createCheckButton
+ (JNIEnv *env, jobject obj)
+{
+ GtkWidget *button;
+ GtkWidget *eventbox;
+
+ gdk_threads_enter ();
+
+ NSA_SET_GLOBAL_REF (env, obj);
+ eventbox = gtk_event_box_new ();
+
+ button = gtk_check_button_new_with_label ("");
+ gtk_container_add (GTK_CONTAINER (eventbox), button);
+ gtk_widget_show (button);
+
+ NSA_SET_PTR (env, obj, eventbox);
+
+ gdk_threads_leave ();
+}
+
+/* A radio button is created if we are part of a group.
+ groupPointer points to the corresponding group. If 0,
+ a new group is created.
+ This function is called when initially creating the
+ button, so an eventbox is created.
+ */
+JNIEXPORT jlong JNICALL
+Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_createRadioButton
+ (JNIEnv *env, jobject obj, jlong groupPointer)
+{
+ GtkWidget *button;
+ GtkWidget *eventbox;
+ GSList *native_group = NULL;
+
+ gdk_threads_enter ();
+
+ NSA_SET_GLOBAL_REF (env, obj);
+ eventbox = gtk_event_box_new ();
+
+ if (groupPointer != 0)
+ {
+ native_group = JLONG_TO_PTR (GSList, groupPointer);
+ if(! GTK_IS_RADIO_BUTTON (native_group->data))
+ native_group = NULL;
+ }
+ button = gtk_radio_button_new_with_label (native_group, "");
+
+ if (native_group == NULL)
+ native_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
+ if (g_slist_index (native_group, GTK_RADIO_BUTTON (button)) == -1)
+ {
+ native_group = g_slist_prepend (native_group, GTK_RADIO_BUTTON (button));
+ GTK_RADIO_BUTTON(button)->group = native_group;
+ }
+
+ gtk_container_add (GTK_CONTAINER (eventbox), button);
+ gtk_widget_show (button);
+
+ NSA_SET_PTR (env, obj, eventbox);
+
+ gdk_threads_leave ();
+
+ return PTR_TO_JLONG (native_group);
+}
+
+/* Add the object to the group pointed to by groupPointer.
+ If groupPointer is 0, create a new group and create
+ a radio button. Otherwise, creating a radio button in an
+ existing group.
+ */
+JNIEXPORT jlong JNICALL
+Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_addToGroup
+ (JNIEnv *env, jobject obj, jlong groupPointer)
+{
+ void *ptr;
+ GtkWidget *container;
+ GtkWidget *check_button;
+ GtkWidget *radio_button;
+ const gchar *label;
+ GSList *native_group = NULL;
+
+ gdk_threads_enter ();
+
+ ptr = NSA_GET_PTR (env, obj);
+ container = GTK_WIDGET (ptr);
+ check_button = checkbox_get_widget (container);
+ label = gtk_label_get_text (GTK_LABEL (gtk_bin_get_child
+ (GTK_BIN (check_button))));
+
+ /* Need to remove the check_button, and replace it with
+ a radio button in a group.
+ */
+ if (groupPointer != 0)
+ {
+ native_group = JLONG_TO_PTR (GSList, groupPointer);
+ if(! GTK_IS_RADIO_BUTTON (native_group->data))
+ native_group = NULL;
+ }
+
+ radio_button = gtk_radio_button_new_with_label (native_group, label);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button),
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_button)));
+
+ if (native_group == NULL)
+ native_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button));
+ if (g_slist_index (native_group, GTK_RADIO_BUTTON (radio_button)) == -1)
+ {
+ native_group = g_slist_prepend (native_group, GTK_RADIO_BUTTON (radio_button));
+ GTK_RADIO_BUTTON(radio_button)->group = native_group;
+ }
+
+ gtk_container_remove (GTK_CONTAINER (container), check_button);
+
+ NSA_DEL_PTR (env, obj);
+ NSA_SET_PTR (env, obj, container);
+
+ gtk_container_add (GTK_CONTAINER (container), radio_button);
+ gtk_widget_show (radio_button);
+
+ gdk_threads_leave ();
+
+ return PTR_TO_JLONG (native_group);
+}
+
+/* Remove the object from the group pointed to by groupPointer.
+ We are removing the radio button and creating a check button.
+ */
+JNIEXPORT jlong JNICALL
+Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_removeFromGroup
+ (JNIEnv *env, jobject obj)
+{
+ void *ptr;
+ GtkWidget *container;
+ GtkWidget *check_button;
+ GtkWidget *radio_button;
+ GSList *native_group;
+ const gchar *label;
+
+ gdk_threads_enter ();
+
+ ptr = NSA_GET_PTR (env, obj);
+ container = GTK_WIDGET (ptr);
+ radio_button = checkbox_get_widget (container);
+ label = gtk_label_get_text (GTK_LABEL (gtk_bin_get_child
+ (GTK_BIN (radio_button))));
+
+ /* Need to remove the radio_button, and replace it with
+ a check button.
+ */
+ check_button = gtk_check_button_new_with_label (label);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio_button)));
+
+ native_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button));
+ native_group = g_slist_remove (native_group, GTK_RADIO_BUTTON (radio_button));
+ GTK_RADIO_BUTTON(radio_button)->group = NULL;
+
+ gtk_container_remove (GTK_CONTAINER (container), radio_button);
+
+ NSA_DEL_PTR (env, obj);
+ NSA_SET_PTR (env, obj, container);
+
+ gtk_container_add (GTK_CONTAINER (container), check_button);
+ gtk_widget_show (check_button);
+
+ gdk_threads_leave ();
+
+ return PTR_TO_JLONG (native_group);
+}
+
+/* Move the radio button to a new group. If groupPointer is
+ 0, create a new group.
+ */
+JNIEXPORT jlong JNICALL
+Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_switchToGroup
+ (JNIEnv *env, jobject obj, jlong groupPointer)
+{
+ void *ptr;
+ GtkWidget *radio_button;
+ GSList *native_group = NULL;
+
+ gdk_threads_enter ();
+
+ ptr = NSA_GET_PTR (env, obj);
+ radio_button = checkbox_get_widget (GTK_WIDGET (ptr));
+
+ native_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button));
+ native_group = g_slist_remove (native_group, GTK_RADIO_BUTTON (radio_button));
+ GTK_RADIO_BUTTON(radio_button)->group = NULL;
+
+ if (groupPointer != 0)
+ {
+ native_group = JLONG_TO_PTR (GSList, groupPointer);
+ if(! GTK_IS_RADIO_BUTTON (native_group->data))
+ native_group = NULL;
+ }
+ gtk_radio_button_set_group (GTK_RADIO_BUTTON (radio_button), native_group);
+
+ native_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button));
+ if (g_slist_index (native_group, GTK_RADIO_BUTTON (radio_button)) == -1)
+ {
+ native_group = g_slist_prepend (native_group, GTK_RADIO_BUTTON (radio_button));
+ GTK_RADIO_BUTTON(radio_button)->group = native_group;
+ }
+
+ gdk_threads_leave ();
+
+ return PTR_TO_JLONG (native_group);
+}
+
static void
item_toggled_cb (GtkToggleButton *item, jobject peer)
{
@@ -251,7 +389,7 @@ item_toggled_cb (GtkToggleButton *item, jobject peer)
}
static GtkWidget *
-combobox_get_widget (GtkWidget *widget)
+checkbox_get_widget (GtkWidget *widget)
{
GtkWidget *wid;