src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c

Print this page

        

@@ -169,10 +169,54 @@
     }
 
     return array;
 }
 
+/**
+ * Convert a GSList to an array of filenames (with the parent folder)
+ */
+static jobjectArray toPathAndFilenamesArray(JNIEnv *env, GSList* list)
+{
+    jstring str;
+    jclass stringCls;
+    GSList *iterator;
+    jobjectArray array;
+    int i;
+    char* entry;
+
+
+    if (NULL == list) {
+        return NULL;
+    }
+
+    stringCls = (*env)->FindClass(env, "java/lang/String");
+    if (stringCls == NULL) {
+        JNU_ThrowInternalError(env, "Could not get java.lang.String class");
+        return NULL;
+    }
+
+    array = (*env)->NewObjectArray(env, fp_gtk_g_slist_length(list), stringCls,
+            NULL);
+    if (array == NULL) {
+        JNU_ThrowInternalError(env, "Could not instantiate array files array");
+        return NULL;
+    }
+
+    i = 0;
+    for (iterator = list; iterator; iterator = iterator->next) {
+        entry = (char*) iterator->data;
+        //check for leading slash.
+        if( (entry-strchr(entry, '/')) == 0) entry++;
+        
+        str = (*env)->NewStringUTF(env, entry);
+        (*env)->SetObjectArrayElement(env, array, i, str);
+        i++;
+    }
+
+    return array;
+}
+
 static void handle_response(GtkWidget* aDialog, gint responseId, gpointer obj)
 {
     JNIEnv *env;
     char *current_folder;
     GSList *filenames;

@@ -181,20 +225,30 @@
     jobjectArray jfilenames;
 
     env = (JNIEnv *) JNU_GetEnv(jvm, JNI_VERSION_1_2);
     current_folder = NULL;
     filenames = NULL;
+    gboolean full_path_names = FALSE;
 
     if (responseId == GTK_RESPONSE_ACCEPT) {
         current_folder = fp_gtk_file_chooser_get_current_folder(
                 GTK_FILE_CHOOSER(aDialog));
+        if(NULL == current_folder){
+            full_path_names=TRUE;
+        }
         filenames = fp_gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(aDialog));
     }
+    if(full_path_names){
+        //This is a hack for use with "Recent Folders" in gtk where each
+        //file could have its own directory.
+        jcurrent_folder = (*env)->NewStringUTF(env, "/");
+        jfilenames = toPathAndFilenamesArray(env, filenames);
 
+    } else{
     jcurrent_folder = (*env)->NewStringUTF(env, current_folder);
     jfilenames = toFilenamesArray(env, filenames);
-
+    }
     (*env)->CallVoidMethod(env, obj, setFileInternalMethodID, jcurrent_folder,
             jfilenames);
     fp_g_free(current_folder);
 
     quit(env, (jobject)obj, TRUE);