#include #include #include #include #include "gtk2_interface.h" #include "sun_awt_X11_GtkDirectoryDialogPeer.h" static JavaVM *jvm; static GtkWidget *dialog = NULL; /* To cache some method IDs */ static jmethodID setDirectoryInternalMethodID = NULL; /* * Class: sun_awt_X11_GtkDirectoryDialogPeer * Method: quit * Signature: ()V */ JNIEXPORT void JNICALL Java_sun_awt_X11_GtkDirectoryDialogPeer_quit (JNIEnv * env, jobject jpeer) { if (dialog != NULL) { fp_gtk_widget_hide (dialog); fp_gtk_widget_destroy (dialog); fp_gtk_main_quit (); dialog = NULL; } } static void handle_response(GtkWidget* aDialog, gint responseId, gpointer obj) { JNIEnv *env; char *current_folder; jclass cx; jstring jcurrent_folder; env = (JNIEnv *) JNU_GetEnv(jvm, JNI_VERSION_1_2); current_folder = NULL; if (responseId == GTK_RESPONSE_ACCEPT) { current_folder = fp_gtk_file_chooser_get_current_folder( GTK_FILE_CHOOSER(dialog)); } if (setDirectoryInternalMethodID == NULL) { cx = (*env)->GetObjectClass(env, (jobject) obj); if (cx == NULL) { JNU_ThrowInternalError(env, "Could not get GTK peer class"); return; } setDirectoryInternalMethodID = (*env)->GetMethodID(env, cx, "setDirectoryInternal", "(Ljava/lang/String;)V"); if (setDirectoryInternalMethodID == NULL) { JNU_ThrowInternalError(env, "Could not get setDirectoryInternalMethodID method id"); return; } } jcurrent_folder = (*env)->NewStringUTF(env, current_folder); (*env)->CallVoidMethod(env, obj, setDirectoryInternalMethodID, jcurrent_folder); fp_g_free(current_folder); Java_sun_awt_X11_GtkDirectoryDialogPeer_quit(NULL, NULL); } /* * Class: sun_awt_X11_GtkDirectoryDialogPeer * Method: run * Signature: (Ljava/lang/String;ILjava/lang/String;)V */ JNIEXPORT void JNICALL Java_sun_awt_X11_GtkDirectoryDialogPeer_run(JNIEnv * env, jobject jpeer, jstring jtitle, jstring jdir) { if (jvm == NULL) { (*env)->GetJavaVM(env, &jvm); } fp_gdk_threads_init(); fp_gdk_threads_enter(); const char *title = (*env)->GetStringUTFChars(env, jtitle, 0); /* Action SELECT_FOLDER */ dialog = fp_gtk_file_chooser_dialog_new(title, NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); (*env)->ReleaseStringUTFChars(env, jtitle, title); /* Set the directory */ if (jdir != NULL) { const char *dir = (*env)->GetStringUTFChars(env, jdir, 0); fp_gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), dir); (*env)->ReleaseStringUTFChars(env, jdir, dir); } fp_g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK( handle_response), jpeer); fp_gtk_widget_show(dialog); fp_gtk_main(); fp_gdk_threads_leave(); }