/* ============================================================================== This file is part of the JUCE library - "Jules' Utility Class Extensions" Copyright 2004-11 by Raw Material Software Ltd. ------------------------------------------------------------------------------ JUCE can be redistributed and/or modified under the terms of the GNU General Public License (Version 2), as published by the Free Software Foundation. A copy of the license is included in the JUCE distribution, or can be found online at www.gnu.org/licenses. JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.rawmaterialsoftware.com/juce for more information. ============================================================================== */ BEGIN_JUCE_NAMESPACE //============================================================================== FileChooser::FileChooser (const String& chooserBoxTitle, const File& currentFileOrDirectory, const String& fileFilters, const bool useNativeDialogBox_) : title (chooserBoxTitle), filters (fileFilters), startingFile (currentFileOrDirectory), useNativeDialogBox (useNativeDialogBox_) { if (useNativeDialogBox) { static bool canUseNativeBox = isPlatformDialogAvailable(); if (! canUseNativeBox) useNativeDialogBox = false; } if (! fileFilters.containsNonWhitespaceChars()) filters = "*"; } FileChooser::~FileChooser() { } #if JUCE_MODAL_LOOPS_PERMITTED bool FileChooser::browseForFileToOpen (FilePreviewComponent* previewComponent) { return showDialog (false, true, false, false, false, previewComponent); } bool FileChooser::browseForMultipleFilesToOpen (FilePreviewComponent* previewComponent) { return showDialog (false, true, false, false, true, previewComponent); } bool FileChooser::browseForMultipleFilesOrDirectories (FilePreviewComponent* previewComponent) { return showDialog (true, true, false, false, true, previewComponent); } bool FileChooser::browseForFileToSave (const bool warnAboutOverwritingExistingFiles) { return showDialog (false, true, true, warnAboutOverwritingExistingFiles, false, nullptr); } bool FileChooser::browseForDirectory() { return showDialog (true, false, false, false, false, nullptr); } bool FileChooser::showDialog (const bool selectsDirectories, const bool selectsFiles, const bool isSave, const bool warnAboutOverwritingExistingFiles, const bool selectMultipleFiles, FilePreviewComponent* const previewComponent) { WeakReference previouslyFocused (Component::getCurrentlyFocusedComponent()); results.clear(); // the preview component needs to be the right size before you pass it in here.. jassert (previewComponent == nullptr || (previewComponent->getWidth() > 10 && previewComponent->getHeight() > 10)); #if JUCE_WINDOWS if (useNativeDialogBox && ! (selectsFiles && selectsDirectories)) #elif JUCE_MAC || JUCE_LINUX if (useNativeDialogBox && (previewComponent == nullptr)) #else if (false) #endif { showPlatformDialog (results, title, startingFile, filters, selectsDirectories, selectsFiles, isSave, warnAboutOverwritingExistingFiles, selectMultipleFiles, previewComponent); } else { WildcardFileFilter wildcard (selectsFiles ? filters : String::empty, selectsDirectories ? "*" : String::empty, String::empty); int flags = isSave ? FileBrowserComponent::saveMode : FileBrowserComponent::openMode; if (selectsFiles) flags |= FileBrowserComponent::canSelectFiles; if (selectsDirectories) { flags |= FileBrowserComponent::canSelectDirectories; if (! isSave) flags |= FileBrowserComponent::filenameBoxIsReadOnly; } if (selectMultipleFiles) flags |= FileBrowserComponent::canSelectMultipleItems; FileBrowserComponent browserComponent (flags, startingFile, &wildcard, previewComponent); FileChooserDialogBox box (title, String::empty, browserComponent, warnAboutOverwritingExistingFiles, browserComponent.findColour (AlertWindow::backgroundColourId)); if (box.show()) { for (int i = 0; i < browserComponent.getNumSelectedFiles(); ++i) results.add (browserComponent.getSelectedFile (i)); } } if (previouslyFocused != nullptr) previouslyFocused->grabKeyboardFocus(); return results.size() > 0; } #endif File FileChooser::getResult() const { // if you've used a multiple-file select, you should use the getResults() method // to retrieve all the files that were chosen. jassert (results.size() <= 1); return results.getFirst(); } const Array& FileChooser::getResults() const { return results; } //============================================================================== FilePreviewComponent::FilePreviewComponent() { } FilePreviewComponent::~FilePreviewComponent() { } END_JUCE_NAMESPACE