]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/filedlg.cpp
fix for using wxDataObjectComposite with the clipboard
[wxWidgets.git] / src / mac / filedlg.cpp
index b0884be3478482ba6b2cd4a82246a7cf9dbab069..6ca66d390fc4a8f7b6c44af9a88b55b1bc86120f 100644 (file)
@@ -19,8 +19,9 @@
 #include "wx/dialog.h"
 #include "wx/filedlg.h"
 #include "wx/intl.h"
+#include "wx/tokenzr.h"
 
-#if !defined(__UNIX__)
+#ifndef __DARWIN__
   #include "PLStringFuncs.h"
 #endif
 
@@ -30,19 +31,10 @@ IMPLEMENT_CLASS(wxFileDialog, wxDialog)
 
 // begin wxmac
 
-#if defined(__UNIX__)
-  #include <Carbon/Carbon.h>
-#else
-  #include <Navigation.h>
-#endif
+#include <Navigation.h>
 
-#ifndef __UNIX__
-  #include "morefile.h"
-  #include "moreextr.h"
-  #include "fullpath.h"
-  #include "fspcompa.h"
-  #include "PLStringFuncs.h"
-#endif
+#include "MoreFiles.h"
+#include "MoreFilesExtras.h"
 
 extern bool gUseNavServices ;
 
@@ -101,7 +93,7 @@ NavEventProc(
        }
 }
 
-char * gfilters[] =
+const char * gfilters[] =
 {
        "*.TXT" ,
        "*.TIF" ,
@@ -276,7 +268,7 @@ void MakeUserDataRec(OpenUserDataRec        *myData , const wxString& filter )
         current += filter2.GetChar(i) ;
        }
     }
-    if ( filterIndex > 0 )
+//    if ( filterIndex > 0 )
     {
       wxASSERT_MSG( !isName , "incorrect format of format string" ) ;
       myData->extensions[filterIndex] = current.MakeUpper() ;
@@ -307,6 +299,8 @@ void MakeUserDataRec(OpenUserDataRec        *myData , const wxString& filter )
        }
 
 }
+
+#ifndef __DARWIN__
 void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const char *filter , FileFilterYDUPP fileFilter, StandardFileReply *theSFR )
 {
        Point                           thePt;
@@ -343,16 +337,16 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const
        ParamText( message , NULL , NULL , NULL ) ;
        
        CustomGetFile(  fileFilter, 
-                                       -1,                                     // show all types
-                                       NULL,
-                                       theSFR,
-                                       kSFGetFileDlgID,
-                                       thePt,                          // top left point
-                                       dlgHookUPP,
-                                       myModalFilterUPP,
-                                       nil,                            // activate list
-                                       nil,                            // activate proc
-                                       &myData);
+                       -1,                             // show all types
+                       NULL,
+                       theSFR,
+                       kSFGetFileDlgID,
+                       thePt,                          // top left point
+                       dlgHookUPP,
+                       myModalFilterUPP,
+                       nil,                            // activate list
+                       nil,                            // activate proc
+                       &myData);
                                        
        DisposeRoutineDescriptor(dlgHookUPP);
        DisposeRoutineDescriptor(myModalFilterUPP);
@@ -368,7 +362,7 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const
                if (theSFR->sfFile.name[0] == '\0')
                {
                        err = FSMakeFSSpec(theSFR->sfFile.vRefNum, theSFR->sfFile.parID,
-                                                               "\p", &tempSpec);
+                                          "\p", &tempSpec);
                        if (err == noErr)
                        {
                                theSFR->sfFile = tempSpec;
@@ -411,39 +405,49 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const
                }
        }
 }
+#endif
 
 static Boolean CheckFile( ConstStr255Param name , OSType type , OpenUserDataRecPtr data)
 {
-         Str255                        filename ;
-               PLstrcpy( filename , name ) ;
-
-               if ( data->numfilters > 0 )
-               {
-               for( int j = 1 ; j <= filename[0] ; j++ )
-               {
-                       filename[j] = toupper( filename[j] ) ;
-               }
-               //for ( int i = 0 ; i < data->numfilters ; ++i )
-               int i = data->currentfilter ;
-               if ( data->extensions[i].Right(2) == ".*" )
-                 return true ;
-                 
-               {
-                       if ( type == data->filtermactypes[i] )
-                               return true ;
-
-        wxString extension = data->extensions[i] ;
-        if ( extension.GetChar(0) == '*' )
-          extension = extension.Mid(1) ;
-
-                       if ( filename[0] >= extension.Len() && extension == (char*) filename + 1 + filename[0] - extension.Len() )
-                                       return true ;
-               }
-               return false ;
-       }
-       return true ;
+    Str255                     filename ;
+    
+#if TARGET_CARBON
+    p2cstrcpy((char *)filename, name) ;
+#else
+    PLstrcpy( filename , name ) ;
+    p2cstr( filename ) ;
+#endif
+    wxString file(filename) ;
+    file.MakeUpper() ;
+    
+    if ( data->numfilters > 0 )
+    {
+       //for ( int i = 0 ; i < data->numfilters ; ++i )
+           int i = data->currentfilter ;
+           if ( data->extensions[i].Right(2) == ".*" )
+             return true ;
+       
+           {
+             if ( type == data->filtermactypes[i] )
+                     return true ;
+           
+             wxStringTokenizer tokenizer( data->extensions[i] , ";" ) ;
+             while( tokenizer.HasMoreTokens() )
+             {
+               wxString extension = tokenizer.GetNextToken() ;
+             if ( extension.GetChar(0) == '*' )
+                     extension = extension.Mid(1) ;
+           
+             if ( file.Len() >= extension.Len() && extension == file.Right(extension.Len() ) )
+                     return true ;
+                   }
+           }
+           return false ;
+    }
+    return true ;
 }
 
+#ifndef __DARWIN__
 static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, void *dataPtr)
 {      
        OpenUserDataRecPtr data = (OpenUserDataRecPtr) dataPtr ;
@@ -468,6 +472,7 @@ static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, void *dat
                
        return false ;
 }
+#endif
 
 // end wxmac
 
@@ -547,7 +552,7 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
 }
 
 
-Boolean CrossPlatformFilterCallback (
+pascal Boolean CrossPlatformFilterCallback (
     AEDesc *theItem, 
     void *info, 
     void *callBackUD, 
@@ -573,7 +578,7 @@ Boolean CrossPlatformFilterCallback (
 
 int wxFileDialog::ShowModal()
 {
-       #if !TARGET_CARBON
+#if !TARGET_CARBON
        if ( !gUseNavServices )
        {
        if ( m_dialogStyle & wxSAVE )
@@ -582,25 +587,12 @@ int wxFileDialog::ShowModal()
                Str255                          prompt ;
                Str255                          filename ;
 
-#if TARGET_CARBON
-               c2pstrcpy((StringPtr)prompt, m_message) ;
-#else
                strcpy((char *)prompt, m_message) ;
                c2pstr((char *)prompt ) ;
-#endif
-#if TARGET_CARBON
-               c2pstrcpy((StringPtr)filename, m_fileName) ;
-#else
                strcpy((char *)filename, m_fileName) ;
                c2pstr((char *)filename ) ;
-#endif
 
-               #if !TARGET_CARBON
-               
                StandardPutFile( prompt , filename , &reply ) ;
-       
-               #else
-               #endif
                if ( reply.sfGood == false )
                {
                        m_path = "" ;
@@ -618,18 +610,10 @@ int wxFileDialog::ShowModal()
                Str255                          prompt ;
                Str255                          path ;
 
-#if TARGET_CARBON
-               c2pstrcpy((StringPtr)prompt, m_message) ;
-#else
                strcpy((char *)prompt, m_message) ;
                c2pstr((char *)prompt ) ;
-#endif
-#if TARGET_CARBON
-               c2pstrcpy((StringPtr)path, m_dir ) ;
-#else
                strcpy((char *)path, m_dir ) ;
                c2pstr((char *)path ) ;
-#endif
 
                StandardFileReply       reply ;
                FileFilterYDUPP crossPlatformFileFilterUPP = 0 ;
@@ -649,7 +633,7 @@ int wxFileDialog::ShowModal()
                }
                else
                {
-                       m_path = wxMacFSSpec2MacFilename( &reply.sfFile ) ;
+                       m_path = wxMacFSSpec2UnixFilename( &reply.sfFile ) ;
                        return wxID_OK ;
                }
        }
@@ -752,7 +736,7 @@ int wxFileDialog::ShowModal()
                  }
                }
 
-      mNavFilterUPP = NewNavObjectFilterProc( CrossPlatformFilterCallback ) ;
+      mNavFilterUPP = NewNavObjectFilterUPP( CrossPlatformFilterCallback ) ;
                        if ( m_dialogStyle & wxMULTIPLE )
                                mNavOptions.dialogOptionFlags |= kNavAllowMultipleFiles ;
                        else
@@ -786,12 +770,13 @@ int wxFileDialog::ShowModal()
                
                        FSSpec  outFileSpec ;
                        AEDesc specDesc ;
+                       AEKeyword keyWord ;
                        
                        long count ;
                        ::AECountItems( &mNavReply.selection , &count ) ;
                        for ( long i = 1 ; i <= count ; ++i )
                        {
-                               OSErr err = ::AEGetNthDesc( &mNavReply.selection , i , typeFSS, NULL , &specDesc);
+                               OSErr err = ::AEGetNthDesc( &mNavReply.selection , i , typeFSS, &keyWord , &specDesc);
                                if ( err != noErr ) {
                                        m_path = "" ;
                                        return wxID_CANCEL ;
@@ -811,7 +796,7 @@ int wxFileDialog::ShowModal()
                 m_path = m_paths[ 0 ] ;
                 m_fileName = wxFileNameFromPath(m_path);
                 m_dir = wxPathOnly(m_path);
-            
+       NavDisposeReply( &mNavReply ) ;
                        return wxID_OK ;
                }
                return wxID_CANCEL;