40 |
#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" |
#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" |
41 |
#include "gnu_java_awt_peer_gtk_GtkFileDialogPeer.h" |
#include "gnu_java_awt_peer_gtk_GtkFileDialogPeer.h" |
42 |
|
|
43 |
|
#define AWT_FILEDIALOG_LOAD 0 |
44 |
|
#define AWT_FILEDIALOG_SAVE 1 |
45 |
|
|
46 |
static void handle_response_cb (GtkDialog *dialog, |
static void handle_response_cb (GtkDialog *dialog, |
47 |
gint responseId, |
gint responseId, |
48 |
jobject peer_obj); |
jobject peer_obj); |
49 |
|
|
50 |
|
static jmethodID gtkSetFilenameID; |
51 |
|
static jmethodID gtkHideFileDialogID; |
52 |
|
static jmethodID gtkDisposeFileDialogID; |
53 |
|
static jmethodID filenameFilterCallbackID; |
54 |
|
|
55 |
|
void |
56 |
|
cp_gtk_filedialog_init_jni (void) |
57 |
|
{ |
58 |
|
jclass gtkfiledialogpeer; |
59 |
|
|
60 |
|
gtkfiledialogpeer = |
61 |
|
(*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(), |
62 |
|
"gnu/java/awt/peer/gtk/GtkFileDialogPeer"); |
63 |
|
|
64 |
|
gtkDisposeFileDialogID = |
65 |
|
(*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), |
66 |
|
gtkfiledialogpeer, |
67 |
|
"gtkDisposeFileDialog", "()V"); |
68 |
|
|
69 |
|
gtkHideFileDialogID = |
70 |
|
(*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), |
71 |
|
gtkfiledialogpeer, |
72 |
|
"gtkHideFileDialog", "()V"); |
73 |
|
|
74 |
|
gtkSetFilenameID = |
75 |
|
(*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), |
76 |
|
gtkfiledialogpeer, |
77 |
|
"gtkSetFilename", |
78 |
|
"(Ljava/lang/String;)V"); |
79 |
|
|
80 |
|
filenameFilterCallbackID = |
81 |
|
(*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), |
82 |
|
gtkfiledialogpeer, |
83 |
|
"filenameFilterCallback", |
84 |
|
"(Ljava/lang/String;)Z"); |
85 |
|
} |
86 |
|
|
87 |
/* |
/* |
88 |
* Make a new file selection dialog |
* Make a new file selection dialog |
89 |
*/ |
*/ |
90 |
|
|
91 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
92 |
Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_create |
Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_create |
93 |
(JNIEnv *env, jobject obj, jobject parent) |
(JNIEnv *env, jobject obj, jobject parent, int mode) |
94 |
{ |
{ |
95 |
void *parentp; |
void *parentp; |
96 |
gpointer widget; |
gpointer widget; |
102 |
|
|
103 |
parentp = NSA_GET_PTR(env, parent); |
parentp = NSA_GET_PTR(env, parent); |
104 |
|
|
105 |
/* FIXME: we should be using the default gnome-vfs backend but it is |
if (mode == AWT_FILEDIALOG_LOAD) |
106 |
not currently thread-safe. See: |
widget = gtk_file_chooser_dialog_new |
107 |
http://bugzilla.gnome.org/show_bug.cgi?id=166852 */ |
("Open File", |
108 |
widget = gtk_file_chooser_dialog_new_with_backend |
GTK_WINDOW(parentp), |
109 |
("Open File", |
GTK_FILE_CHOOSER_ACTION_OPEN, |
110 |
GTK_WINDOW(parentp), |
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, |
111 |
GTK_FILE_CHOOSER_ACTION_OPEN, |
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, |
112 |
"gtk+", |
NULL); |
113 |
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, |
else |
114 |
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, |
{ |
115 |
NULL); |
widget = gtk_file_chooser_dialog_new |
116 |
|
("Save File", |
117 |
|
GTK_WINDOW(parentp), |
118 |
|
GTK_FILE_CHOOSER_ACTION_SAVE, |
119 |
|
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, |
120 |
|
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, |
121 |
|
NULL); |
122 |
|
#if GTK_MINOR_VERSION >= 8 |
123 |
|
gtk_file_chooser_set_do_overwrite_confirmation |
124 |
|
(GTK_FILE_CHOOSER (widget), TRUE); |
125 |
|
#endif |
126 |
|
} |
127 |
|
|
128 |
/* GtkFileSelect is not modal by default */ |
|
129 |
|
/* GtkFileChooserDialog is not modal by default */ |
130 |
gtk_window_set_modal (GTK_WINDOW (widget), TRUE); |
gtk_window_set_modal (GTK_WINDOW (widget), TRUE); |
131 |
|
|
132 |
/* We must add this window to the group so input in the others are |
/* We must add this window to the group so input in the others are |
184 |
This function extracts the filename from the GtkFileFilterInfo object, |
This function extracts the filename from the GtkFileFilterInfo object, |
185 |
and passes it to the Java method. The Java method will call the filter's |
and passes it to the Java method. The Java method will call the filter's |
186 |
accept() method and will give back the return value. */ |
accept() method and will give back the return value. */ |
187 |
static gboolean filenameFilterCallback (const GtkFileFilterInfo *filter_info, |
static gboolean filename_filter_cb (const GtkFileFilterInfo *filter_info, |
188 |
gpointer obj) |
gpointer obj) |
189 |
{ |
{ |
|
jclass cx; |
|
|
jmethodID id; |
|
190 |
jstring *filename; |
jstring *filename; |
191 |
gboolean accepted; |
gboolean accepted; |
192 |
|
|
|
cx = (*cp_gtk_gdk_env())->GetObjectClass (cp_gtk_gdk_env(), (jobject) obj); |
|
|
id = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), cx, "filenameFilterCallback", |
|
|
"(Ljava/lang/String;)Z"); |
|
|
|
|
193 |
filename = (*cp_gtk_gdk_env())->NewStringUTF(cp_gtk_gdk_env(), filter_info->filename); |
filename = (*cp_gtk_gdk_env())->NewStringUTF(cp_gtk_gdk_env(), filter_info->filename); |
194 |
|
|
195 |
gdk_threads_leave(); |
accepted = (*cp_gtk_gdk_env())->CallBooleanMethod(cp_gtk_gdk_env(), obj, |
196 |
|
filenameFilterCallbackID, |
197 |
accepted = (*cp_gtk_gdk_env())->CallBooleanMethod(cp_gtk_gdk_env(), obj, id, filename); |
filename); |
|
|
|
|
gdk_threads_enter(); |
|
198 |
|
|
199 |
return accepted; |
return accepted; |
200 |
} |
} |
212 |
|
|
213 |
filter = gtk_file_filter_new(); |
filter = gtk_file_filter_new(); |
214 |
gtk_file_filter_add_custom(filter, GTK_FILE_FILTER_FILENAME, |
gtk_file_filter_add_custom(filter, GTK_FILE_FILTER_FILENAME, |
215 |
filenameFilterCallback, obj, NULL); |
filename_filter_cb, obj, NULL); |
216 |
|
|
217 |
gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(ptr), filter); |
gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(ptr), filter); |
218 |
|
|
264 |
gint responseId, |
gint responseId, |
265 |
jobject peer_obj) |
jobject peer_obj) |
266 |
{ |
{ |
|
static int isDisposeIDSet = 0; |
|
|
static int isIDSet = 0; |
|
|
static jmethodID gtkSetFilenameID; |
|
|
static jmethodID hideID; |
|
|
static jmethodID disposeID; |
|
267 |
void *ptr; |
void *ptr; |
268 |
G_CONST_RETURN gchar *fileName; |
G_CONST_RETURN gchar *fileName; |
269 |
jstring str_fileName = NULL; |
jstring str_fileName = NULL; |
279 |
|
|
280 |
if (responseId == GTK_RESPONSE_DELETE_EVENT) |
if (responseId == GTK_RESPONSE_DELETE_EVENT) |
281 |
{ |
{ |
|
if (!isDisposeIDSet) |
|
|
{ |
|
|
jclass cx = (*cp_gtk_gdk_env())->GetObjectClass (cp_gtk_gdk_env(), peer_obj); |
|
|
disposeID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), cx, "gtkDisposeFileDialog", "()V"); |
|
|
isDisposeIDSet = 1; |
|
|
} |
|
|
|
|
282 |
/* We can dispose of the dialog now (and unblock show) */ |
/* We can dispose of the dialog now (and unblock show) */ |
283 |
gdk_threads_leave (); |
(*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer_obj, |
284 |
(*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer_obj, disposeID); |
gtkDisposeFileDialogID); |
|
gdk_threads_enter (); |
|
285 |
|
|
286 |
return; |
return; |
287 |
} |
} |
288 |
|
|
289 |
if (responseId == GTK_RESPONSE_ACCEPT) { |
if (responseId == GTK_RESPONSE_ACCEPT) |
|
fileName = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (GTK_WIDGET (ptr))); |
|
|
str_fileName = (*cp_gtk_gdk_env())->NewStringUTF (cp_gtk_gdk_env(), fileName); |
|
|
} |
|
|
|
|
|
if (!isIDSet) |
|
290 |
{ |
{ |
291 |
jclass cx = (*cp_gtk_gdk_env())->GetObjectClass (cp_gtk_gdk_env(), peer_obj); |
fileName = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (GTK_WIDGET (ptr))); |
292 |
hideID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), cx, "gtkHideFileDialog", "()V"); |
str_fileName = (*cp_gtk_gdk_env())->NewStringUTF (cp_gtk_gdk_env(), fileName); |
|
gtkSetFilenameID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), cx, |
|
|
"gtkSetFilename", "(Ljava/lang/String;)V"); |
|
|
isIDSet = 1; |
|
293 |
} |
} |
294 |
|
|
295 |
/* Set the Java object field 'file' with this value. */ |
/* Set the Java object field 'file' with this value. */ |
296 |
gdk_threads_leave (); |
(*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer_obj, |
297 |
(*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer_obj, gtkSetFilenameID, str_fileName); |
gtkSetFilenameID, str_fileName); |
298 |
|
|
299 |
/* We can hide the dialog now (and unblock show) */ |
/* We can hide the dialog now (and unblock show) */ |
300 |
(*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer_obj, hideID); |
(*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer_obj, |
301 |
|
gtkHideFileDialogID); |
|
gdk_threads_enter (); |
|
302 |
} |
} |
|
|
|