/[classpath]/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
ViewVC logotype

Diff of /classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.11 by mark, Sat Jun 26 17:01:43 2004 UTC revision 1.12 by mark, Thu Jul 22 19:45:39 2004 UTC
# Line 40  exception statement from your version. * Line 40  exception statement from your version. *
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  static void window_closed (GtkDialog *dialog,  static void handle_response (GtkDialog *dialog,
44                             gint responseId,                             gint responseId,
45                             jobject peer_obj);                             jobject peer_obj);
 static void ok_clicked (GtkButton *button,  
                         jobject peer_obj);  
 static void cancel_clicked (GtkButton *button,  
                             jobject peer_obj);  
46    
47  /*  /*
48   * Make a new file selection dialog   * Make a new file selection dialog
# Line 54  static void cancel_clicked (GtkButton *b Line 50  static void cancel_clicked (GtkButton *b
50    
51  JNIEXPORT void JNICALL  JNIEXPORT void JNICALL
52  Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_create  Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_create
53    (JNIEnv *env, jobject obj)    (JNIEnv *env, jobject obj, jobject parent)
54  {  {
55      void *parentp;
56    gpointer widget;    gpointer widget;
57    
58    /* Create global reference and save it for future use */    /* Create global reference and save it for future use */
59    NSA_SET_GLOBAL_REF (env, obj);    NSA_SET_GLOBAL_REF (env, obj);
60    
61      parentp = NSA_GET_PTR(env, parent);
62    
63    gdk_threads_enter ();    gdk_threads_enter ();
64        
65    widget = gtk_file_selection_new ("");    widget = gtk_file_chooser_dialog_new("",
66                                           GTK_WINDOW(parentp),
67                                           GTK_FILE_CHOOSER_ACTION_OPEN,
68                                           GTK_STOCK_OK, GTK_RESPONSE_OK,
69                                           GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
70                                           NULL);
71    
72      /* GtkFileChooser doesn't show hidden files by default. */
73      g_object_set(GTK_FILE_CHOOSER(widget), "show_hidden", TRUE);
74    
75    /* GtkFileSelect is not modal by default */    /* GtkFileSelect is not modal by default */
76    gtk_window_set_modal (GTK_WINDOW (widget), TRUE);    gtk_window_set_modal (GTK_WINDOW (widget), TRUE);
77    
# Line 103  Java_gnu_java_awt_peer_gtk_GtkFileDialog Line 111  Java_gnu_java_awt_peer_gtk_GtkFileDialog
111    
112    gtk_widget_realize (GTK_WIDGET (ptr));    gtk_widget_realize (GTK_WIDGET (ptr));
113    
   /* connect buttons to handlers */  
   
114    g_signal_connect (G_OBJECT (GTK_DIALOG (ptr)),    g_signal_connect (G_OBJECT (GTK_DIALOG (ptr)),
115                      "response",                      "response",
116                      GTK_SIGNAL_FUNC (window_closed), *gref);                      GTK_SIGNAL_FUNC (handle_response), *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);  
117                                            
118    gdk_threads_leave ();    gdk_threads_leave ();
119    
# Line 123  Java_gnu_java_awt_peer_gtk_GtkFileDialog Line 121  Java_gnu_java_awt_peer_gtk_GtkFileDialog
121    Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);    Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
122  }  }
123    
124  /*  JNIEXPORT jstring JNICALL
125   * Set the filename in the file selection dialog.  Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeGetDirectory
126   */      (JNIEnv *env, jobject obj)
   
 JNIEXPORT void JNICALL  
 Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeSetFile  
     (JNIEnv *env, jobject obj, jstring filename)  
127  {  {
128    void *ptr;    void *ptr;
129    const char *str;    const char *str;
130    
131    ptr = NSA_GET_PTR (env, obj);    ptr = NSA_GET_PTR (env, obj);
132            
   str = (*env)->GetStringUTFChars (env, filename, 0);  
       
133    gdk_threads_enter ();    gdk_threads_enter ();
134    
135    gtk_file_selection_set_filename (GTK_FILE_SELECTION (ptr), str);    str = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER(ptr));
136    
137    gdk_threads_leave ();    gdk_threads_leave ();
138    
139    (*env)->ReleaseStringUTFChars (env, filename, str);    return (*env)->NewStringUTF(env, str);
140  }  }
141    
142  static void  
143  window_closed (GtkDialog *dialog __attribute__((unused)),  /* This function interfaces with the Java callback method of the same name.
144                 gint responseId,     This function extracts the filename from the GtkFileFilterInfo object,
145                 jobject peer_obj)     and passes it to the Java method.  The Java method will call the filter's
146       accept() method and will give back the return value. */
147    gboolean filenameFilterCallback (const GtkFileFilterInfo *filter_info,
148                                     gpointer obj)
149  {  {
150    static int isIDSet = 0;    gchar* dirname;
151    static jmethodID disposeID;    jclass cx;
152    void *ptr;    jmethodID id;
153      jstring *filename;
154    
155    /* We only need this for the case when the user closed the window. */    cx = (*gdk_env)->GetObjectClass (gdk_env, (jobject) obj);
156    if (responseId != GTK_RESPONSE_DELETE_EVENT)    id = (*gdk_env)->GetMethodID (gdk_env, cx, "filenameFilterCallback",
157      return;                                               "(Ljava/lang/String;)Z");
158    
159    ptr = NSA_GET_PTR (gdk_env, peer_obj);    filename = (*gdk_env)->NewStringUTF(gdk_env, filter_info->filename);
160        
161    if (!isIDSet)    gdk_threads_leave();
162      gboolean accepted = (*gdk_env)->CallBooleanMethod(gdk_env, obj, id, filename);
163      gdk_threads_enter();
164    
165      return accepted;
166    }
167    
168    JNIEXPORT void JNICALL
169    Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeSetFilenameFilter
170        (JNIEnv *env, jobject obj, jobject filter_obj)
171      {      {
172        jclass cx = (*gdk_env)->GetObjectClass (gdk_env, peer_obj);    void *ptr;
173        disposeID = (*gdk_env)->GetMethodID (gdk_env, cx, "gtkDisposeFileDialog", "()V");    GtkFileFilter *filter;
174        isIDSet = 1;  
175      ptr = NSA_GET_PTR (env, obj);
176    
177      gdk_threads_enter ();
178    
179      filter = gtk_file_filter_new();
180      gtk_file_filter_add_custom(filter,
181                                 GTK_FILE_FILTER_FILENAME,
182                                 G_CALLBACK(filenameFilterCallback),
183                                 obj,
184                                 NULL);
185    
186      gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(ptr), filter);
187    
188      gdk_threads_leave ();
189      }      }
190            
191    JNIEXPORT void JNICALL
192    Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeSetDirectory
193        (JNIEnv *env, jobject obj, jstring directory)
194    {
195      void *ptr;
196      const char *str;
197    
198      ptr = NSA_GET_PTR (env, obj);
199    
200      str = (*env)->GetStringUTFChars (env, directory, 0);
201    
202      gdk_threads_enter ();
203      gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(ptr), str);
204    gdk_threads_leave ();    gdk_threads_leave ();
205    
206    /* We can dispose of the dialog now (and unblock show) */    (*env)->ReleaseStringUTFChars (env, directory, str);
207    (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, disposeID);  }
208    
209    JNIEXPORT void JNICALL
210    Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeSetFile
211        (JNIEnv *env, jobject obj, jstring filename)
212    {
213      void *ptr;
214      const char *str;
215    
216      ptr = NSA_GET_PTR (env, obj);
217        
218      str = (*env)->GetStringUTFChars (env, filename, 0);
219    
220    gdk_threads_enter ();    gdk_threads_enter ();
221      gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (ptr), str);
222      gdk_threads_leave ();
223    
224      (*env)->ReleaseStringUTFChars (env, filename, str);
225  }  }
226    
227  static void  static void
228  ok_clicked (GtkButton *button __attribute__((unused)),  handle_response (GtkDialog *dialog __attribute__((unused)),
229                     gint responseId,
230                          jobject peer_obj)                          jobject peer_obj)
231  {  {
232      static int isDisposeIDSet = 0;
233    static int isIDSet = 0;    static int isIDSet = 0;
234    static jmethodID gtkSetFilenameID;    static jmethodID gtkSetFilenameID;
235    static jmethodID hideID;    static jmethodID hideID;
236      static jmethodID disposeID;
237    void *ptr;    void *ptr;
238    G_CONST_RETURN gchar *fileName;    G_CONST_RETURN gchar *fileName;
239    jstring str_fileName;    jstring str_fileName;
240    
241    ptr = NSA_GET_PTR (gdk_env, peer_obj);    /* We only need this for the case when the user closed the window,
242         or clicked ok or cancel. */
243      if (responseId != GTK_RESPONSE_DELETE_EVENT
244          && responseId != GTK_RESPONSE_OK
245          && responseId != GTK_RESPONSE_CANCEL)
246        return;
247        
248    fileName = gtk_file_selection_get_filename (    ptr = NSA_GET_PTR (gdk_env, peer_obj);
                GTK_FILE_SELECTION (GTK_WIDGET (ptr)));  
249        
250    if (!isIDSet)    if (responseId == GTK_RESPONSE_DELETE_EVENT)
251      {
252        if (!isDisposeIDSet)
253      {      {
254        jclass cx = (*gdk_env)->GetObjectClass (gdk_env, peer_obj);        jclass cx = (*gdk_env)->GetObjectClass (gdk_env, peer_obj);
255        hideID = (*gdk_env)->GetMethodID (gdk_env, cx, "gtkHideFileDialog", "()V");          disposeID = (*gdk_env)->GetMethodID (gdk_env, cx, "gtkDisposeFileDialog", "()V");
256        gtkSetFilenameID = (*gdk_env)->GetMethodID (gdk_env, cx,          isDisposeIDSet = 1;
                                    "gtkSetFilename", "(Ljava/lang/String;)V");  
       isIDSet = 1;  
257      }      }
258            
259    gdk_threads_leave ();    gdk_threads_leave ();
260        
261    /* Set the Java object field 'file' with this value. */      /* We can dispose of the dialog now (and unblock show) */
262    str_fileName = (*gdk_env)->NewStringUTF (gdk_env, fileName);      (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, disposeID);
   (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, gtkSetFilenameID, str_fileName);  
   
   /* We can hide the dialog now (and unblock show) */  
   (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, hideID);  
263    
264    gdk_threads_enter ();    gdk_threads_enter ();
265        return;
266  }  }
267    
268  static void    if (responseId == GTK_RESPONSE_OK) {
269  cancel_clicked (GtkButton *button __attribute__((unused)),      fileName = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (GTK_WIDGET (ptr)));
270                              jobject peer_obj)      str_fileName = (*gdk_env)->NewStringUTF (gdk_env, fileName);
271  {    } else if (responseId == GTK_RESPONSE_CANCEL) {
272    static int isIDSet = 0;      str_fileName = NULL;
273    static jmethodID gtkSetFilenameID;    }
   static jmethodID hideID;  
   void *ptr;  
   
   ptr = NSA_GET_PTR (gdk_env, peer_obj);  
274        
275    if (!isIDSet)    if (!isIDSet)
276      {      {
# Line 236  cancel_clicked (GtkButton *button __attr Line 283  cancel_clicked (GtkButton *button __attr
283            
284    gdk_threads_leave ();    gdk_threads_leave ();
285    
286    /* Set the Java object field 'file' with the null value. */    /* Set the Java object field 'file' with this value. */
287    (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, gtkSetFilenameID, NULL);    (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, gtkSetFilenameID, str_fileName);
288    
289    /* We can hide the dialog now (and unblock show) */    /* We can hide the dialog now (and unblock show) */
290    (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, hideID);    (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, hideID);
# Line 245  cancel_clicked (GtkButton *button __attr Line 292  cancel_clicked (GtkButton *button __attr
292    gdk_threads_enter ();    gdk_threads_enter ();
293  }  }
294    
   

Legend:
Removed from v.1.11  
changed lines
  Added in v.1.12

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26