| 
							- /*
 -   ==============================================================================
 - 
 -    This file is part of the JUCE library - "Jules' Utility Class Extensions"
 -    Copyright 2004-7 by Raw Material Software ltd.
 - 
 -   ------------------------------------------------------------------------------
 - 
 -    JUCE can be redistributed and/or modified under the terms of the
 -    GNU General Public License, as published by the Free Software Foundation;
 -    either version 2 of the License, or (at your option) any later version.
 - 
 -    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.
 - 
 -    You should have received a copy of the GNU General Public License
 -    along with JUCE; if not, visit www.gnu.org/licenses or write to the
 -    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
 -    Boston, MA 02111-1307 USA
 - 
 -   ------------------------------------------------------------------------------
 - 
 -    If you'd like to release a closed-source product which uses JUCE, commercial
 -    licenses are also available: visit www.rawmaterialsoftware.com/juce for
 -    more information.
 - 
 -   ==============================================================================
 - */
 - 
 - #include <Carbon/Carbon.h>
 - #include <fnmatch.h>
 - 
 - #include "../../../src/juce_core/basics/juce_StandardHeader.h"
 - 
 - BEGIN_JUCE_NAMESPACE
 - 
 - 
 - #include "../../../src/juce_appframework/gui/components/filebrowser/juce_FileChooser.h"
 - #include "../../../src/juce_appframework/gui/components/juce_Desktop.h"
 - #include "../../../src/juce_appframework/application/juce_Application.h"
 - #include "../../../src/juce_appframework/events/juce_MessageManager.h"
 - #include "../../../src/juce_core/misc/juce_PlatformUtilities.h"
 - #include "../../../src/juce_core/text/juce_LocalisedStrings.h"
 - 
 - 
 - //==============================================================================
 - struct JuceNavInfo
 - {
 -     StringArray filters;
 -     AEDesc defaultLocation;
 -     bool defaultLocationValid;
 - };
 - 
 - static void pascal juceNavEventProc (NavEventCallbackMessage callbackSelector,
 -                                      NavCBRecPtr callbackParms,
 -                                      void *callBackUD)
 - {
 -     if (callbackSelector == kNavCBStart)
 -     {
 -         if (((JuceNavInfo*) callBackUD)->defaultLocationValid)
 -         {
 -             NavCustomControl (callbackParms->context,
 -                               kNavCtlSetLocation,
 -                               (void*) &((JuceNavInfo*) callBackUD)->defaultLocation);
 -         }
 - 
 -         for (int i = Desktop::getInstance().getNumComponents(); --i >= 0;)
 -         {
 -             Component* const c = Desktop::getInstance().getComponent (i);
 - 
 -             if (c != 0 && c->isAlwaysOnTop() && c->isVisible())
 -             {
 -                 SetWindowGroup (callbackParms->window,
 -                                 GetWindowGroup ((WindowRef) c->getWindowHandle()));
 - 
 -                 break;
 -             }
 -         }
 - 
 -         BringToFront (callbackParms->window);
 -         SelectWindow (callbackParms->window);
 -         SetUserFocusWindow (callbackParms->window);
 -     }
 - }
 - 
 - static Boolean pascal juceNavFilterProc (AEDesc* theItem,
 -                                          void*,
 -                                          void* callBackUD,
 -                                          NavFilterModes filterMode)
 - {
 -     // must return true if we don't understand the object
 -     bool result = true;
 - 
 -     if (filterMode == kNavFilteringBrowserList)
 -     {
 -         AEDesc desc;
 -         if (AECoerceDesc (theItem, typeFSRef, &desc) == noErr)
 -         {
 -             Size size = AEGetDescDataSize (&desc);
 - 
 -             if (size > 0)
 -             {
 -                 void* data = juce_calloc (size);
 - 
 -                 if (AEGetDescData (&desc, data, size) == noErr)
 -                 {
 -                     const String path (PlatformUtilities::makePathFromFSRef ((FSRef*) data));
 - 
 -                     if (path.isNotEmpty())
 -                     {
 -                         const File file (path);
 - 
 -                         if ((! file.isDirectory()) || PlatformUtilities::isBundle (path))
 -                         {
 -                             const String filename (file.getFileName().toLowerCase());
 -                             const char* const filenameUTF8 = filename.toUTF8();
 - 
 -                             const JuceNavInfo* const info = (const JuceNavInfo*) callBackUD;
 - 
 -                             if (info != 0)
 -                             {
 -                                 result = false;
 - 
 -                                 for (int i = info->filters.size(); --i >= 0;)
 -                                 {
 -                                     const String wildcard (info->filters[i].toLowerCase());
 - 
 -                                     if (fnmatch (wildcard.toUTF8(), filenameUTF8, 0) == 0)
 -                                     {
 -                                         result = true;
 -                                         break;
 -                                     }
 -                                 }
 -                             }
 -                         }
 -                     }
 -                 }
 - 
 -                 juce_free (data);
 -             }
 - 
 -             AEDisposeDesc (&desc);
 -         }
 -     }
 - 
 -     return result;
 - }
 - 
 - void FileChooser::showPlatformDialog (OwnedArray<File>& results,
 -                                       const String& title,
 -                                       const File& currentFileOrDirectory,
 -                                       const String& filter,
 -                                       bool selectsDirectory,
 -                                       bool isSaveDialogue,
 -                                       bool warnAboutOverwritingExistingFiles,
 -                                       bool selectMultipleFiles,
 -                                       FilePreviewComponent* extraInfoComponent)
 - {
 -     JuceNavInfo userInfo;
 -     userInfo.filters.addTokens (filter.replaceCharacters (T(",:"), T(";;")), T(";"), 0);
 -     userInfo.filters.trim();
 -     userInfo.filters.removeEmptyStrings();
 -     userInfo.defaultLocationValid = false;
 -     void* const userInfoPtr = (void*) &userInfo;
 - 
 -     const int oldTimeBeforeWaitCursor = MessageManager::getInstance()->getTimeBeforeShowingWaitCursor();
 -     MessageManager::getInstance()->setTimeBeforeShowingWaitCursor (0);
 - 
 -     NavEventUPP eventProc = NewNavEventUPP (juceNavEventProc);
 -     NavObjectFilterUPP filterProc = NewNavObjectFilterUPP (juceNavFilterProc);
 - 
 -     FSRef defaultRef;
 - 
 -     if ((currentFileOrDirectory.isOnHardDisk()
 -            && PlatformUtilities::makeFSRefFromPath (&defaultRef,
 -                                                     currentFileOrDirectory.getFullPathName()))
 -         || (currentFileOrDirectory.getParentDirectory().isOnHardDisk()
 -              && PlatformUtilities::makeFSRefFromPath (&defaultRef,
 -                                                       currentFileOrDirectory.getParentDirectory().getFullPathName())))
 -     {
 -         if (AECreateDesc (typeFSRef, &defaultRef, sizeof (defaultRef), &userInfo.defaultLocation) == noErr)
 -         {
 -             userInfo.defaultLocationValid = true;
 -         }
 -     }
 - 
 -     WindowRef lastFocused = GetUserFocusWindow();
 -     NavDialogCreationOptions options;
 - 
 -     if (NavGetDefaultDialogCreationOptions (&options) == noErr)
 -     {
 -         options.optionFlags |= kNavSelectDefaultLocation
 -                                 | kNavSupportPackages
 -                                 | kNavAllowPreviews;
 - 
 -         if (! warnAboutOverwritingExistingFiles)
 -             options.optionFlags |= kNavDontConfirmReplacement;
 - 
 -         if (selectMultipleFiles)
 -             options.optionFlags |= kNavAllowMultipleFiles;
 - 
 -         const String name (selectsDirectory ? TRANS("Choose folder")
 -                                             : TRANS("Choose file"));
 - 
 -         options.clientName = PlatformUtilities::juceStringToCFString (name);
 -         CFStringRef message = PlatformUtilities::juceStringToCFString (title);
 - 
 -         // nasty layout bug if the message text is set for a directory browser..
 -         if (selectsDirectory)
 -             options.windowTitle = message;
 -         else
 -             options.message = message;
 - 
 -         NavDialogRef dialog = 0;
 -         bool ok = false;
 - 
 -         if (selectsDirectory)
 -         {
 -             ok = (NavCreateChooseFolderDialog (&options, eventProc, 0, userInfoPtr, &dialog) == noErr);
 -         }
 -         else if (isSaveDialogue)
 -         {
 -             ok = (NavCreatePutFileDialog (&options, 0, 0, eventProc, userInfoPtr, &dialog) == noErr);
 -         }
 -         else
 -         {
 -             ok = (NavCreateGetFileDialog (&options, 0, eventProc, 0, filterProc, userInfoPtr, &dialog) == noErr);
 -         }
 - 
 -         if (ok && (NavDialogRun (dialog) == noErr))
 -         {
 -             NavReplyRecord reply;
 -             if (NavDialogGetReply (dialog, &reply) == noErr)
 -             {
 -                 if (reply.validRecord)
 -                 {
 -                     long count;
 -                     if (AECountItems (&(reply.selection), &count) == noErr
 -                         && count > 0)
 -                     {
 -                         AEKeyword theKeyword;
 -                         DescType actualType;
 -                         Size actualSize;
 -                         FSRef file;
 - 
 -                         for (int i = 1; i <= count; ++i)
 -                         {
 -                             // Get a pointer to selected file
 -                             if (AEGetNthPtr (&(reply.selection),
 -                                              i,
 -                                              typeFSRef,
 -                                              &theKeyword,
 -                                              &actualType,
 -                                              &file,
 -                                              sizeof (file),
 -                                              &actualSize) == noErr)
 -                             {
 -                                 String result (PlatformUtilities::makePathFromFSRef (&file));
 - 
 -                                 if (result.isNotEmpty() && isSaveDialogue && ! selectsDirectory)
 -                                 {
 -                                     CFStringRef saveName = NavDialogGetSaveFileName (dialog);
 - 
 -                                     result = File (result)
 -                                                 .getChildFile (PlatformUtilities::convertToPrecomposedUnicode (PlatformUtilities::cfStringToJuceString (saveName)))
 -                                                 .getFullPathName();
 -                                 }
 - 
 -                                 results.add (new File (result));
 -                             }
 -                         }
 -                     }
 -                 }
 - 
 -                 NavDisposeReply (&reply);
 -             }
 -         }
 - 
 -         if (dialog != 0)
 -             NavDialogDispose (dialog);
 - 
 -         CFRelease (message);
 -         CFRelease (options.clientName);
 -     }
 - 
 -     if (userInfo.defaultLocationValid)
 -         AEDisposeDesc (&userInfo.defaultLocation);
 - 
 -     DisposeNavEventUPP (eventProc);
 -     DisposeNavObjectFilterUPP (filterProc);
 - 
 -     MessageManager::getInstance()->setTimeBeforeShowingWaitCursor (oldTimeBeforeWaitCursor);
 - 
 -     SetUserFocusWindow (lastFocused);
 - }
 - 
 - END_JUCE_NAMESPACE
 
 
  |