gnu_java_awt_peer_gtk_GtkFileDialogPeer.c [plain text]
#include "gtkpeer.h"
#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include "gnu_java_awt_peer_gtk_GtkFileDialogPeer.h"
static void window_closed (GtkDialog *dialog,
gint responseId,
jobject peer_obj);
static void ok_clicked (GtkButton *button,
jobject peer_obj);
static void cancel_clicked (GtkButton *button,
jobject peer_obj);
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_create
(JNIEnv *env, jobject obj)
{
gpointer widget;
NSA_SET_GLOBAL_REF (env, obj);
gdk_threads_enter ();
widget = gtk_file_selection_new ("");
gtk_window_set_modal (GTK_WINDOW (widget), TRUE);
gtk_window_group_add_window (global_gtk_window_group, GTK_WINDOW (widget));
gdk_threads_leave ();
NSA_SET_PTR (env, obj, widget);
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
gtk_widget_realize (GTK_WIDGET (ptr));
connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
gdk_threads_leave ();
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectSignals
(JNIEnv *env, jobject obj)
{
void *ptr = NSA_GET_PTR (env, obj);
jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
g_assert (gref);
gdk_threads_enter ();
gtk_widget_realize (GTK_WIDGET (ptr));
g_signal_connect (G_OBJECT (GTK_DIALOG (ptr)),
"response",
GTK_SIGNAL_FUNC (window_closed), *gref);
g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (ptr)->ok_button),
"clicked",
GTK_SIGNAL_FUNC (ok_clicked), *gref);
g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (ptr)->cancel_button),
"clicked",
GTK_SIGNAL_FUNC (cancel_clicked), *gref);
gdk_threads_leave ();
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeSetFile
(JNIEnv *env, jobject obj, jstring filename)
{
void *ptr;
const char *str;
ptr = NSA_GET_PTR (env, obj);
str = (*env)->GetStringUTFChars (env, filename, 0);
gdk_threads_enter ();
gtk_file_selection_set_filename (GTK_FILE_SELECTION (ptr), str);
gdk_threads_leave ();
(*env)->ReleaseStringUTFChars (env, filename, str);
}
static void
window_closed (GtkDialog *dialog __attribute__((unused)),
gint responseId,
jobject peer_obj)
{
static int isIDSet = 0;
static jmethodID disposeID;
void *ptr;
if (responseId != GTK_RESPONSE_DELETE_EVENT)
return;
ptr = NSA_GET_PTR (gdk_env, peer_obj);
if (!isIDSet)
{
jclass cx = (*gdk_env)->GetObjectClass (gdk_env, peer_obj);
disposeID = (*gdk_env)->GetMethodID (gdk_env, cx, "gtkDisposeFileDialog", "()V");
isIDSet = 1;
}
gdk_threads_leave ();
(*gdk_env)->CallVoidMethod (gdk_env, peer_obj, disposeID);
gdk_threads_enter ();
}
static void
ok_clicked (GtkButton *button __attribute__((unused)),
jobject peer_obj)
{
static int isIDSet = 0;
static jmethodID gtkSetFilenameID;
static jmethodID hideID;
void *ptr;
G_CONST_RETURN gchar *fileName;
jstring str_fileName;
ptr = NSA_GET_PTR (gdk_env, peer_obj);
fileName = gtk_file_selection_get_filename (
GTK_FILE_SELECTION (GTK_WIDGET (ptr)));
if (!isIDSet)
{
jclass cx = (*gdk_env)->GetObjectClass (gdk_env, peer_obj);
hideID = (*gdk_env)->GetMethodID (gdk_env, cx, "gtkHideFileDialog", "()V");
gtkSetFilenameID = (*gdk_env)->GetMethodID (gdk_env, cx,
"gtkSetFilename", "(Ljava.lang.String;)V");
isIDSet = 1;
}
gdk_threads_leave ();
str_fileName = (*gdk_env)->NewStringUTF (gdk_env, fileName);
(*gdk_env)->CallVoidMethod (gdk_env, peer_obj, gtkSetFilenameID, str_fileName);
(*gdk_env)->CallVoidMethod (gdk_env, peer_obj, hideID);
gdk_threads_enter ();
}
static void
cancel_clicked (GtkButton *button __attribute__((unused)),
jobject peer_obj)
{
static int isIDSet = 0;
static jmethodID gtkSetFilenameID;
static jmethodID hideID;
void *ptr;
ptr = NSA_GET_PTR (gdk_env, peer_obj);
if (!isIDSet)
{
jclass cx = (*gdk_env)->GetObjectClass (gdk_env, peer_obj);
hideID = (*gdk_env)->GetMethodID (gdk_env, cx, "gtkHideFileDialog", "()V");
gtkSetFilenameID = (*gdk_env)->GetMethodID (gdk_env, cx,
"gtkSetFilename", "(Ljava.lang.String;)V");
isIDSet = 1;
}
gdk_threads_leave ();
(*gdk_env)->CallVoidMethod (gdk_env, peer_obj, gtkSetFilenameID, NULL);
(*gdk_env)->CallVoidMethod (gdk_env, peer_obj, hideID);
gdk_threads_enter ();
}