]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/filedlg.cpp
More name changes
[wxWidgets.git] / src / mac / carbon / filedlg.cpp
index d003e602ab94a0ddabc14e81f1222103ad50c089..2c2004b9c4dd1e4f9121eb523a36963202fee8fc 100644 (file)
@@ -105,6 +105,14 @@ NavEventProc(
             if (noErr == ::AECreateDesc(typeFSS, &theFSSpec, sizeof(FSSpec), &theLocation))
                 ::NavCustomControl(ioParams->context, kNavCtlSetLocation, (void *) &theLocation);
         }
+
+        NavMenuItemSpec  menuItem;
+        menuItem.version = kNavMenuItemSpecVersion;
+        menuItem.menuCreator = 'WXNG';
+        menuItem.menuType = data->currentfilter;
+        wxMacStringToPascal( data->name[data->currentfilter] , (StringPtr)(menuItem.menuItemName) ) ;
+        ::NavCustomControl(ioParams->context, kNavCtlSelectCustomType, &menuItem);
+
 #else
         if ( data->menuitems )
             NavCustomControl(ioParams->context, kNavCtlSelectCustomType, &(*data->menuitems)[data->currentfilter]);
@@ -114,6 +122,9 @@ NavEventProc(
     {
         NavMenuItemSpec * menu = (NavMenuItemSpec *) ioParams->eventData.eventDataParms.param ;
 #if TARGET_CARBON
+        const size_t numFilters = data->extensions.GetCount();
+
+        if ( menu->menuType < numFilters )
 #else
         if ( menu->menuCreator == 'WXNG' )
 #endif
@@ -333,6 +344,7 @@ pascal Boolean CrossPlatformFilterCallback (
                CFURLPathStyle pathstyle = kCFURLHFSPathStyle;
 #endif
                CFStringRef cfString = CFURLCopyFileSystemPath(fullURLRef, pathstyle);
+               ::CFRelease( fullURLRef ) ;
                wxString file = wxMacCFStringHolder(cfString).AsString(wxFont::GetDefaultEncoding());
 
                 display = CheckFile( file , theInfo->fileAndFolder.fileInfo.finderInfo.fdType , data ) ;
@@ -355,38 +367,42 @@ int wxFileDialog::ShowModal()
     // this was always unset in the old code
     dialogCreateOptions.optionFlags &= ~kNavSelectDefaultLocation;
 
-#if wxUSE_UNICODE
-    // tried using wxMacCFStringHolder in the code below, but it seems
-    // the CFStrings were being released before the save dialog was called,
-    // causing a crash - open dialog works fine with or without wxMacCFStringHolder
-    CFStringRef titleRef = ::CFStringCreateWithCharacters( kCFAllocatorDefault,
-                                (const unsigned short*)m_message.wc_str(), 
-                                m_message.Len() );
-#else
-    CFStringRef titleRef = ::CFStringCreateWithCString(NULL,
-                                                       m_message.c_str(),
-                                                       m_font.GetEncoding() );
-#endif
-    dialogCreateOptions.windowTitle = titleRef;
-#if wxUSE_UNICODE
-    CFStringRef defaultFileNameRef = ::CFStringCreateWithCharacters( kCFAllocatorDefault,
-                                        (const unsigned short*)m_fileName.wc_str(), 
-                                        m_fileName.Len() );
-#else
-    CFStringRef defaultFileNameRef = ::CFStringCreateWithCString(NULL,
-                                                                 m_fileName.c_str(),
-                                                                 m_font.GetEncoding());
-#endif
-    dialogCreateOptions.saveFileName = defaultFileNameRef;
+    wxMacCFStringHolder message(m_message, m_font.GetEncoding());
+    dialogCreateOptions.windowTitle = message;
+
+    wxMacCFStringHolder defaultFileName(m_fileName, m_font.GetEncoding());
+    dialogCreateOptions.saveFileName = defaultFileName;
+
+
     NavDialogRef dialog;
     NavObjectFilterUPP navFilterUPP = NULL;
     CFArrayRef cfArray = NULL; // for popupExtension
     OpenUserDataRec myData;
     myData.defaultLocation = m_dir;
 
+    MakeUserDataRec(&myData , m_wildCard);
+    myData.currentfilter = m_filterIndex;
+    size_t numFilters = myData.extensions.GetCount();
+    if (numFilters)
+    {
+        CFMutableArrayRef popup = CFArrayCreateMutable( kCFAllocatorDefault ,
+            numFilters , &kCFTypeArrayCallBacks ) ;
+        dialogCreateOptions.popupExtension = popup ;
+        myData.menuitems = dialogCreateOptions.popupExtension ;
+        for ( size_t i = 0 ; i < numFilters ; ++i )
+        {
+            CFArrayAppendValue( popup , (CFStringRef) wxMacCFStringHolder( myData.name[i] , m_font.GetEncoding() ) ) ;
+        }
+    }
+
     if (m_dialogStyle & wxSAVE)
     {
-        dialogCreateOptions.optionFlags |= kNavNoTypePopup;
+        myData.saveMode = true;
+
+        if (!numFilters)
+        {
+            dialogCreateOptions.optionFlags |= kNavNoTypePopup;
+        }
         dialogCreateOptions.optionFlags |= kNavDontAutoTranslate;
         dialogCreateOptions.optionFlags |= kNavDontAddTranslateItems;
 
@@ -394,28 +410,14 @@ int wxFileDialog::ShowModal()
         dialogCreateOptions.optionFlags |= kNavPreserveSaveFileExtension;
 
         err = ::NavCreatePutFileDialog(&dialogCreateOptions,
-                                       'TEXT',
-                                       'TEXT',
+                                       // Suppresses the 'Default' (top) menu item
+                                       kNavGenericSignature, kNavGenericSignature,
                                        sStandardNavEventFilter,
                                        &myData, // for defaultLocation
                                        &dialog);
     }
     else
     {
-        MakeUserDataRec(&myData , m_wildCard);
-        size_t numfilters = myData.extensions.GetCount();
-        if (numfilters > 0)
-        {
-            CFMutableArrayRef popup = CFArrayCreateMutable( kCFAllocatorDefault ,
-                numfilters , &kCFTypeArrayCallBacks ) ;
-            dialogCreateOptions.popupExtension = popup ;
-            myData.menuitems = dialogCreateOptions.popupExtension ;
-            for ( size_t i = 0 ; i < numfilters ; ++i )
-            {
-                CFArrayAppendValue( popup , (CFStringRef) wxMacCFStringHolder( myData.name[i] , m_font.GetEncoding() ) ) ;
-            }
-        }
-
         navFilterUPP = NewNavObjectFilterUPP(CrossPlatformFilterCallback);
         err = ::NavCreateGetFileDialog(&dialogCreateOptions,
                                        NULL, // NavTypeListHandle
@@ -433,20 +435,8 @@ int wxFileDialog::ShowModal()
     if (navFilterUPP)
         ::DisposeNavObjectFilterUPP(navFilterUPP);
     if (cfArray)
-    {
-        CFIndex n = ::CFArrayGetCount(cfArray);
-        for (CFIndex i = 0; i < n; i++)
-        {
-            CFStringRef str = (CFStringRef) ::CFArrayGetValueAtIndex(cfArray, i);
-            if (str)
-                ::CFRelease(str);
-        }
         ::CFRelease(cfArray);
-    }
-    if (titleRef)
-        ::CFRelease(titleRef);
-    if (defaultFileNameRef)
-        ::CFRelease(defaultFileNameRef);
+
     if (err != noErr)
         return wxID_CANCEL;
 
@@ -459,16 +449,19 @@ int wxFileDialog::ShowModal()
         Size        actualSize;
         FSRef       theFSRef;
         wxString thePath ;
+
+        m_filterIndex = myData.currentfilter ;
+
         long count;
         ::AECountItems(&navReply.selection , &count);
         for (long i = 1; i <= count; ++i)
         {
-            err = ::AEGetNthPtr(&(navReply.selection), 1, typeFSRef, &theKeyword, &actualType,
+            err = ::AEGetNthPtr(&(navReply.selection), i, typeFSRef, &theKeyword, &actualType,
                                 &theFSRef, sizeof(theFSRef), &actualSize);
             if (err != noErr)
                 break;
 
-            CFURLRef fullURLRef;
+            CFURLRef fullURLRef = 0 ;
             if (m_dialogStyle & wxSAVE)
             {
                 CFURLRef parentURLRef = ::CFURLCreateFromFSRef(NULL, &theFSRef);