diff --git a/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp b/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp index 40c6108cd9..97c3f32525 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp @@ -25,11 +25,13 @@ FileChooser::FileChooser (const String& chooserBoxTitle, const File& currentFileOrDirectory, const String& fileFilters, - const bool useNativeBox) + const bool useNativeBox, + const bool treatFilePackagesAsDirectories) : title (chooserBoxTitle), filters (fileFilters), startingFile (currentFileOrDirectory), - useNativeDialogBox (useNativeBox && isPlatformDialogAvailable()) + useNativeDialogBox (useNativeBox && isPlatformDialogAvailable()), + treatFilePackagesAsDirs (treatFilePackagesAsDirectories) { if (! fileFilters.containsNonWhitespaceChars()) filters = "*"; @@ -106,7 +108,8 @@ bool FileChooser::showDialog (const int flags, FilePreviewComponent* const previ { showPlatformDialog (results, title, startingFile, filters, selectsDirectories, selectsFiles, isSave, - warnAboutOverwrite, selectMultiple, previewComp); + warnAboutOverwrite, selectMultiple, treatFilePackagesAsDirs, + previewComp); } else { diff --git a/modules/juce_gui_basics/filebrowser/juce_FileChooser.h b/modules/juce_gui_basics/filebrowser/juce_FileChooser.h index 4dc44b3d47..f7399751b9 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileChooser.h +++ b/modules/juce_gui_basics/filebrowser/juce_FileChooser.h @@ -60,25 +60,32 @@ public: After creating one of these, use one of the browseFor... methods to display it. - @param dialogBoxTitle a text string to display in the dialog box to - tell the user what's going on - @param initialFileOrDirectory the file or directory that should be selected when - the dialog box opens. If this parameter is set to - File::nonexistent, a sensible default directory - will be used instead. - @param filePatternsAllowed a set of file patterns to specify which files can be - selected - each pattern should be separated by a - comma or semi-colon, e.g. "*" or "*.jpg;*.gif". An - empty string means that all files are allowed - @param useOSNativeDialogBox if true, then a native dialog box will be used if - possible; if false, then a Juce-based browser dialog - box will always be used + @param dialogBoxTitle a text string to display in the dialog box to + tell the user what's going on + @param initialFileOrDirectory the file or directory that should be selected + when the dialog box opens. If this parameter is + set to File::nonexistent, a sensible default + directory will be used instead. + @param filePatternsAllowed a set of file patterns to specify which files + can be selected - each pattern should be + separated by a comma or semi-colon, e.g. "*" or + "*.jpg;*.gif". An empty string means that all + files are allowed + @param useOSNativeDialogBox if true, then a native dialog box will be used + if possible; if false, then a Juce-based + browser dialog box will always be used + @param treatFilePackagesAsDirectories if true, then the file chooser will allow the + selection of files inside packages when + invoked on OS X and when using native dialog + boxes. + @see browseForFileToOpen, browseForFileToSave, browseForDirectory */ FileChooser (const String& dialogBoxTitle, const File& initialFileOrDirectory = File::nonexistent, const String& filePatternsAllowed = String::empty, - bool useOSNativeDialogBox = true); + bool useOSNativeDialogBox = true, + bool treatFilePackagesAsDirectories = false); /** Destructor. */ ~FileChooser(); @@ -183,11 +190,12 @@ private: const File startingFile; Array results; const bool useNativeDialogBox; + const bool treatFilePackagesAsDirs; static void showPlatformDialog (Array& results, const String& title, const File& file, const String& filters, bool selectsDirectories, bool selectsFiles, bool isSave, bool warnAboutOverwritingExistingFiles, bool selectMultipleFiles, - FilePreviewComponent* previewComponent); + bool treatFilePackagesAsDirs, FilePreviewComponent* previewComponent); static bool isPlatformDialogAvailable(); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FileChooser) diff --git a/modules/juce_gui_basics/native/juce_android_FileChooser.cpp b/modules/juce_gui_basics/native/juce_android_FileChooser.cpp index f563fea176..1313f6e2be 100644 --- a/modules/juce_gui_basics/native/juce_android_FileChooser.cpp +++ b/modules/juce_gui_basics/native/juce_android_FileChooser.cpp @@ -31,6 +31,7 @@ void FileChooser::showPlatformDialog (Array& results, bool isSaveDialogue, bool warnAboutOverwritingExistingFiles, bool selectMultipleFiles, + bool /*treatFilePackagesAsDirs*/, FilePreviewComponent* extraInfoComponent) { // TODO diff --git a/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp b/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp index a24b14bfc4..180a0bfaad 100644 --- a/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp +++ b/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp @@ -157,6 +157,7 @@ void FileChooser::showPlatformDialog (Array& results, const String& title, const File& file, const String& filters, bool isDirectory, bool /* selectsFiles */, bool isSave, bool /* warnAboutOverwritingExistingFiles */, + bool /*treatFilePackagesAsDirs*/, bool selectMultipleFiles, FilePreviewComponent*) { const File previousWorkingDirectory (File::getCurrentWorkingDirectory()); diff --git a/modules/juce_gui_basics/native/juce_mac_FileChooser.mm b/modules/juce_gui_basics/native/juce_mac_FileChooser.mm index 8097620cfa..42cfd93ad6 100644 --- a/modules/juce_gui_basics/native/juce_mac_FileChooser.mm +++ b/modules/juce_gui_basics/native/juce_mac_FileChooser.mm @@ -141,6 +141,7 @@ void FileChooser::showPlatformDialog (Array& results, bool isSaveDialogue, bool /*warnAboutOverwritingExistingFiles*/, bool selectMultipleFiles, + bool treatFilePackagesAsDirs, FilePreviewComponent* extraInfoComponent) { JUCE_AUTORELEASEPOOL @@ -177,6 +178,9 @@ void FileChooser::showPlatformDialog (Array& results, [openPanel setCanChooseFiles: selectsFiles]; [openPanel setAllowsMultipleSelection: selectMultipleFiles]; [openPanel setResolvesAliases: YES]; + + if (treatFilePackagesAsDirs) + [openPanel setTreatsFilePackagesAsDirectories: YES]; } if (extraInfoComponent != nullptr) @@ -260,6 +264,7 @@ void FileChooser::showPlatformDialog (Array&, bool /*isSaveDialogue*/, bool /*warnAboutOverwritingExistingFiles*/, bool /*selectMultipleFiles*/, + bool /*treatFilePackagesAsDirs*/, FilePreviewComponent*) { jassertfalse; //there's no such thing in iOS diff --git a/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp b/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp index f610dfb758..ad11d4063d 100644 --- a/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp +++ b/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp @@ -130,7 +130,8 @@ bool FileChooser::isPlatformDialogAvailable() void FileChooser::showPlatformDialog (Array& results, const String& title_, const File& currentFileOrDirectory, const String& filter, bool selectsDirectory, bool /*selectsFiles*/, bool isSaveDialogue, bool warnAboutOverwritingExistingFiles, - bool selectMultipleFiles, FilePreviewComponent* extraInfoComponent) + bool selectMultipleFiles, bool /*treatFilePackagesAsDirs*/, + FilePreviewComponent* extraInfoComponent) { using namespace FileChooserHelpers;