From cfb468f0b8ff4de614f1d80634fe4102fa87a7ba Mon Sep 17 00:00:00 2001 From: "caillon%redhat.com" Date: Mon, 27 Sep 2004 17:52:57 +0000 Subject: [PATCH] Read in multiple files from the file chooser when in openMultiple mode. Fixes bug 255900. r+sr=bryner a=asa git-svn-id: svn://10.0.0.236/trunk@162842 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/widget/src/gtk2/nsFilePicker.cpp | 37 ++++++++++++++++++++---- mozilla/widget/src/gtk2/nsFilePicker.h | 4 +-- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/mozilla/widget/src/gtk2/nsFilePicker.cpp b/mozilla/widget/src/gtk2/nsFilePicker.cpp index 7f865c91afa..4b8349a45b6 100644 --- a/mozilla/widget/src/gtk2/nsFilePicker.cpp +++ b/mozilla/widget/src/gtk2/nsFilePicker.cpp @@ -43,7 +43,7 @@ #include "nsIURI.h" #include "nsIWidget.h" #include "nsILocalFile.h" -#include "nsISupportsArray.h" +#include "nsArrayEnumerator.h" #include "nsVoidArray.h" #include "nsMemory.h" #include "nsEnumeratorUtils.h" @@ -80,6 +80,7 @@ typedef enum typedef gchar* (*_gtk_file_chooser_get_filename_fn)(GtkFileChooser *chooser); +typedef GSList* (*_gtk_file_chooser_get_filenames_fn)(GtkFileChooser *chooser); typedef GtkWidget* (*_gtk_file_chooser_dialog_new_fn)(const gchar *title, GtkWindow *parent, GtkFileChooserAction action, @@ -95,6 +96,7 @@ typedef void (*_gtk_file_filter_set_name_fn)(GtkFileFilter* filter, const gchar* DECL_FUNC_PTR(gtk_file_chooser_get_filename); +DECL_FUNC_PTR(gtk_file_chooser_get_filenames); DECL_FUNC_PTR(gtk_file_chooser_dialog_new); DECL_FUNC_PTR(gtk_file_chooser_set_select_multiple); DECL_FUNC_PTR(gtk_file_chooser_set_current_name); @@ -148,6 +150,7 @@ nsFilePicker::LoadSymbolsGTK24() GET_LIBGTK_FUNC(gtk_file_chooser_get_filename); } + GET_LIBGTK_FUNC(gtk_file_chooser_get_filenames); GET_LIBGTK_FUNC(gtk_file_chooser_dialog_new); GET_LIBGTK_FUNC(gtk_file_chooser_set_select_multiple); GET_LIBGTK_FUNC(gtk_file_chooser_set_current_name); @@ -211,13 +214,37 @@ nsFilePicker::~nsFilePicker() { } +void +ReadMultipleFiles(gpointer filename, gpointer array) +{ + nsCOMPtr localfile; + nsresult rv = NS_NewNativeLocalFile(nsDependentCString(NS_STATIC_CAST(char*, filename)), + PR_FALSE, + getter_AddRefs(localfile)); + if (NS_SUCCEEDED(rv)) { + nsCOMArray& files = *NS_STATIC_CAST(nsCOMArray*, array); + files.AppendObject(localfile); + } + + g_free(filename); +} + void nsFilePicker::ReadValuesFromFileChooser(GtkWidget *file_chooser) { - // Grab the filename - gchar *filename = _gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(file_chooser)); - mFile.Assign(filename); - g_free(filename); + mFiles.Clear(); + + if (mMode == nsIFilePicker::modeOpenMultiple) { + mFile.Truncate(); + + GSList *list = _gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER(file_chooser)); + g_slist_foreach(list, ReadMultipleFiles, NS_STATIC_CAST(gpointer, &mFiles)); + g_slist_free(list); + } else { + gchar *filename = _gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(file_chooser)); + mFile.Assign(filename); + g_free(filename); + } // Remember last used directory. nsCOMPtr file; diff --git a/mozilla/widget/src/gtk2/nsFilePicker.h b/mozilla/widget/src/gtk2/nsFilePicker.h index 63232aaab91..a3a21f11aa2 100644 --- a/mozilla/widget/src/gtk2/nsFilePicker.h +++ b/mozilla/widget/src/gtk2/nsFilePicker.h @@ -43,10 +43,10 @@ #include "nsBaseFilePicker.h" #include "nsString.h" #include "nsVoidArray.h" +#include "nsCOMArray.h" class nsIWidget; class nsILocalFile; -class nsISupportsArray; class PRLibrary; class nsFilePicker : public nsBaseFilePicker @@ -70,7 +70,7 @@ protected: nsCOMPtr mParentWidget; nsCOMPtr mDisplayDirectory; - nsCOMPtr mFiles; + nsCOMArray mFiles; PRInt16 mMode; PRInt16 mSelectedType;