corrected file type pop up for only one liners, added parsing for different types on same line

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12115 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor 2001-10-20 20:50:11 +00:00
parent 10207b728d
commit fe35d097d6
2 changed files with 70 additions and 58 deletions

View File

@ -19,6 +19,7 @@
#include "wx/dialog.h" #include "wx/dialog.h"
#include "wx/filedlg.h" #include "wx/filedlg.h"
#include "wx/intl.h" #include "wx/intl.h"
#include "wx/tokenzr.h"
#ifndef __DARWIN__ #ifndef __DARWIN__
#include "PLStringFuncs.h" #include "PLStringFuncs.h"
@ -269,7 +270,7 @@ void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter )
current += filter2.GetChar(i) ; current += filter2.GetChar(i) ;
} }
} }
if ( filterIndex > 0 ) // if ( filterIndex > 0 )
{ {
wxASSERT_MSG( !isName , "incorrect format of format string" ) ; wxASSERT_MSG( !isName , "incorrect format of format string" ) ;
myData->extensions[filterIndex] = current.MakeUpper() ; myData->extensions[filterIndex] = current.MakeUpper() ;
@ -300,8 +301,6 @@ void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter )
} }
} }
#if !TARGET_CARBON
void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const char *filter , FileFilterYDUPP fileFilter, StandardFileReply *theSFR ) void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const char *filter , FileFilterYDUPP fileFilter, StandardFileReply *theSFR )
{ {
Point thePt; Point thePt;
@ -314,6 +313,7 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const
OSErr err; OSErr err;
SFTypeList types ; SFTypeList types ;
// presumably we're running System 7 or later so CustomGetFile is // presumably we're running System 7 or later so CustomGetFile is
// available // available
@ -326,6 +326,8 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const
MakeUserDataRec( &myData , filter ) ; MakeUserDataRec( &myData , filter ) ;
// display the dialog // display the dialog
#if !TARGET_CARBON
dlgHookUPP = NULL ; dlgHookUPP = NULL ;
// dlgHookUPP = NewDlgHookYDProc(SFGetFolderDialogHook); // dlgHookUPP = NewDlgHookYDProc(SFGetFolderDialogHook);
myModalFilterUPP = NewModalFilterYDProc(SFGetFolderModalDialogFilter); myModalFilterUPP = NewModalFilterYDProc(SFGetFolderModalDialogFilter);
@ -348,7 +350,8 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const
DisposeRoutineDescriptor(dlgHookUPP); DisposeRoutineDescriptor(dlgHookUPP);
DisposeRoutineDescriptor(myModalFilterUPP); DisposeRoutineDescriptor(myModalFilterUPP);
#else
#endif
// if cancel wasn't pressed and no fatal error occurred... // if cancel wasn't pressed and no fatal error occurred...
if (theSFR->sfGood) if (theSFR->sfGood)
@ -402,7 +405,6 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const
} }
} }
} }
#endif
static Boolean CheckFile( ConstStr255Param name , OSType type , OpenUserDataRecPtr data) static Boolean CheckFile( ConstStr255Param name , OSType type , OpenUserDataRecPtr data)
{ {
@ -420,27 +422,30 @@ static Boolean CheckFile( ConstStr255Param name , OSType type , OpenUserDataRecP
if ( data->numfilters > 0 ) if ( data->numfilters > 0 )
{ {
//for ( int i = 0 ; i < data->numfilters ; ++i ) //for ( int i = 0 ; i < data->numfilters ; ++i )
int i = data->currentfilter ; int i = data->currentfilter ;
if ( data->extensions[i].Right(2) == ".*" ) if ( data->extensions[i].Right(2) == ".*" )
return true ; return true ;
{ {
if ( type == data->filtermactypes[i] ) if ( type == data->filtermactypes[i] )
return true ; return true ;
wxString extension = data->extensions[i] ; wxStringTokenizer tokenizer( data->extensions[i] , ";" ) ;
if ( extension.GetChar(0) == '*' ) while( tokenizer.HasMoreTokens() )
extension = extension.Mid(1) ; {
wxString extension = tokenizer.GetNextToken() ;
if ( file.Len() >= extension.Len() && extension == file.Right(extension.Len() ) ) if ( extension.GetChar(0) == '*' )
return true ; extension = extension.Mid(1) ;
}
return false ; if ( file.Len() >= extension.Len() && extension == file.Right(extension.Len() ) )
return true ;
}
}
return false ;
} }
return true ; return true ;
} }
#if !TARGET_CARBON
static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, void *dataPtr) static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, void *dataPtr)
{ {
OpenUserDataRecPtr data = (OpenUserDataRecPtr) dataPtr ; OpenUserDataRecPtr data = (OpenUserDataRecPtr) dataPtr ;
@ -465,7 +470,6 @@ static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, void *dat
return false ; return false ;
} }
#endif
// end wxmac // end wxmac
@ -561,11 +565,7 @@ pascal Boolean CrossPlatformFilterCallback (
if (theItem->descriptorType == typeFSS && !theInfo->isFolder) if (theItem->descriptorType == typeFSS && !theInfo->isFolder)
{ {
FSSpec spec; FSSpec spec;
#if TARGET_CARBON memcpy( &spec , *theItem->dataHandle , sizeof(FSSpec) ) ;
::AEGetDescData(theItem, &spec, sizeof(FSSpec) ) ;
#else
memcpy( &spec , (*theItem->dataHandle) , sizeof(FSSpec) ) ;
#endif
display = CheckFile( spec.name , theInfo->fileAndFolder.fileInfo.finderInfo.fdType , data ) ; display = CheckFile( spec.name , theInfo->fileAndFolder.fileInfo.finderInfo.fdType , data ) ;
} }
} }
@ -614,10 +614,15 @@ int wxFileDialog::ShowModal()
StandardFileReply reply ; StandardFileReply reply ;
FileFilterYDUPP crossPlatformFileFilterUPP = 0 ; FileFilterYDUPP crossPlatformFileFilterUPP = 0 ;
#if !TARGET_CARBON
crossPlatformFileFilterUPP = crossPlatformFileFilterUPP =
NewFileFilterYDProc(CrossPlatformFileFilter); NewFileFilterYDProc(CrossPlatformFileFilter);
#endif
ExtendedOpenFile( prompt , path , m_wildCard , crossPlatformFileFilterUPP, &reply); ExtendedOpenFile( prompt , path , m_wildCard , crossPlatformFileFilterUPP, &reply);
#if !TARGET_CARBON
DisposeFileFilterYDUPP(crossPlatformFileFilterUPP); DisposeFileFilterYDUPP(crossPlatformFileFilterUPP);
#endif
if ( reply.sfGood == false ) if ( reply.sfGood == false )
{ {
m_path = "" ; m_path = "" ;
@ -625,7 +630,7 @@ int wxFileDialog::ShowModal()
} }
else else
{ {
m_path = wxMacFSSpec2MacFilename( &reply.sfFile ) ; m_path = wxMacFSSpec2UnixFilename( &reply.sfFile ) ;
return wxID_OK ; return wxID_OK ;
} }
} }
@ -762,12 +767,13 @@ int wxFileDialog::ShowModal()
FSSpec outFileSpec ; FSSpec outFileSpec ;
AEDesc specDesc ; AEDesc specDesc ;
AEKeyword keyWord ;
long count ; long count ;
::AECountItems( &mNavReply.selection , &count ) ; ::AECountItems( &mNavReply.selection , &count ) ;
for ( long i = 1 ; i <= count ; ++i ) 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 ) { if ( err != noErr ) {
m_path = "" ; m_path = "" ;
return wxID_CANCEL ; return wxID_CANCEL ;
@ -787,7 +793,7 @@ int wxFileDialog::ShowModal()
m_path = m_paths[ 0 ] ; m_path = m_paths[ 0 ] ;
m_fileName = wxFileNameFromPath(m_path); m_fileName = wxFileNameFromPath(m_path);
m_dir = wxPathOnly(m_path); m_dir = wxPathOnly(m_path);
NavDisposeReply( &mNavReply ) ;
return wxID_OK ; return wxID_OK ;
} }
return wxID_CANCEL; return wxID_CANCEL;

View File

@ -19,6 +19,7 @@
#include "wx/dialog.h" #include "wx/dialog.h"
#include "wx/filedlg.h" #include "wx/filedlg.h"
#include "wx/intl.h" #include "wx/intl.h"
#include "wx/tokenzr.h"
#ifndef __DARWIN__ #ifndef __DARWIN__
#include "PLStringFuncs.h" #include "PLStringFuncs.h"
@ -269,7 +270,7 @@ void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter )
current += filter2.GetChar(i) ; current += filter2.GetChar(i) ;
} }
} }
if ( filterIndex > 0 ) // if ( filterIndex > 0 )
{ {
wxASSERT_MSG( !isName , "incorrect format of format string" ) ; wxASSERT_MSG( !isName , "incorrect format of format string" ) ;
myData->extensions[filterIndex] = current.MakeUpper() ; myData->extensions[filterIndex] = current.MakeUpper() ;
@ -300,8 +301,6 @@ void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter )
} }
} }
#if !TARGET_CARBON
void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const char *filter , FileFilterYDUPP fileFilter, StandardFileReply *theSFR ) void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const char *filter , FileFilterYDUPP fileFilter, StandardFileReply *theSFR )
{ {
Point thePt; Point thePt;
@ -314,6 +313,7 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const
OSErr err; OSErr err;
SFTypeList types ; SFTypeList types ;
// presumably we're running System 7 or later so CustomGetFile is // presumably we're running System 7 or later so CustomGetFile is
// available // available
@ -326,6 +326,8 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const
MakeUserDataRec( &myData , filter ) ; MakeUserDataRec( &myData , filter ) ;
// display the dialog // display the dialog
#if !TARGET_CARBON
dlgHookUPP = NULL ; dlgHookUPP = NULL ;
// dlgHookUPP = NewDlgHookYDProc(SFGetFolderDialogHook); // dlgHookUPP = NewDlgHookYDProc(SFGetFolderDialogHook);
myModalFilterUPP = NewModalFilterYDProc(SFGetFolderModalDialogFilter); myModalFilterUPP = NewModalFilterYDProc(SFGetFolderModalDialogFilter);
@ -348,7 +350,8 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const
DisposeRoutineDescriptor(dlgHookUPP); DisposeRoutineDescriptor(dlgHookUPP);
DisposeRoutineDescriptor(myModalFilterUPP); DisposeRoutineDescriptor(myModalFilterUPP);
#else
#endif
// if cancel wasn't pressed and no fatal error occurred... // if cancel wasn't pressed and no fatal error occurred...
if (theSFR->sfGood) if (theSFR->sfGood)
@ -402,7 +405,6 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const
} }
} }
} }
#endif
static Boolean CheckFile( ConstStr255Param name , OSType type , OpenUserDataRecPtr data) static Boolean CheckFile( ConstStr255Param name , OSType type , OpenUserDataRecPtr data)
{ {
@ -420,27 +422,30 @@ static Boolean CheckFile( ConstStr255Param name , OSType type , OpenUserDataRecP
if ( data->numfilters > 0 ) if ( data->numfilters > 0 )
{ {
//for ( int i = 0 ; i < data->numfilters ; ++i ) //for ( int i = 0 ; i < data->numfilters ; ++i )
int i = data->currentfilter ; int i = data->currentfilter ;
if ( data->extensions[i].Right(2) == ".*" ) if ( data->extensions[i].Right(2) == ".*" )
return true ; return true ;
{ {
if ( type == data->filtermactypes[i] ) if ( type == data->filtermactypes[i] )
return true ; return true ;
wxString extension = data->extensions[i] ; wxStringTokenizer tokenizer( data->extensions[i] , ";" ) ;
if ( extension.GetChar(0) == '*' ) while( tokenizer.HasMoreTokens() )
extension = extension.Mid(1) ; {
wxString extension = tokenizer.GetNextToken() ;
if ( file.Len() >= extension.Len() && extension == file.Right(extension.Len() ) ) if ( extension.GetChar(0) == '*' )
return true ; extension = extension.Mid(1) ;
}
return false ; if ( file.Len() >= extension.Len() && extension == file.Right(extension.Len() ) )
return true ;
}
}
return false ;
} }
return true ; return true ;
} }
#if !TARGET_CARBON
static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, void *dataPtr) static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, void *dataPtr)
{ {
OpenUserDataRecPtr data = (OpenUserDataRecPtr) dataPtr ; OpenUserDataRecPtr data = (OpenUserDataRecPtr) dataPtr ;
@ -465,7 +470,6 @@ static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, void *dat
return false ; return false ;
} }
#endif
// end wxmac // end wxmac
@ -561,11 +565,7 @@ pascal Boolean CrossPlatformFilterCallback (
if (theItem->descriptorType == typeFSS && !theInfo->isFolder) if (theItem->descriptorType == typeFSS && !theInfo->isFolder)
{ {
FSSpec spec; FSSpec spec;
#if TARGET_CARBON memcpy( &spec , *theItem->dataHandle , sizeof(FSSpec) ) ;
::AEGetDescData(theItem, &spec, sizeof(FSSpec) ) ;
#else
memcpy( &spec , (*theItem->dataHandle) , sizeof(FSSpec) ) ;
#endif
display = CheckFile( spec.name , theInfo->fileAndFolder.fileInfo.finderInfo.fdType , data ) ; display = CheckFile( spec.name , theInfo->fileAndFolder.fileInfo.finderInfo.fdType , data ) ;
} }
} }
@ -614,10 +614,15 @@ int wxFileDialog::ShowModal()
StandardFileReply reply ; StandardFileReply reply ;
FileFilterYDUPP crossPlatformFileFilterUPP = 0 ; FileFilterYDUPP crossPlatformFileFilterUPP = 0 ;
#if !TARGET_CARBON
crossPlatformFileFilterUPP = crossPlatformFileFilterUPP =
NewFileFilterYDProc(CrossPlatformFileFilter); NewFileFilterYDProc(CrossPlatformFileFilter);
#endif
ExtendedOpenFile( prompt , path , m_wildCard , crossPlatformFileFilterUPP, &reply); ExtendedOpenFile( prompt , path , m_wildCard , crossPlatformFileFilterUPP, &reply);
#if !TARGET_CARBON
DisposeFileFilterYDUPP(crossPlatformFileFilterUPP); DisposeFileFilterYDUPP(crossPlatformFileFilterUPP);
#endif
if ( reply.sfGood == false ) if ( reply.sfGood == false )
{ {
m_path = "" ; m_path = "" ;
@ -625,7 +630,7 @@ int wxFileDialog::ShowModal()
} }
else else
{ {
m_path = wxMacFSSpec2MacFilename( &reply.sfFile ) ; m_path = wxMacFSSpec2UnixFilename( &reply.sfFile ) ;
return wxID_OK ; return wxID_OK ;
} }
} }
@ -762,12 +767,13 @@ int wxFileDialog::ShowModal()
FSSpec outFileSpec ; FSSpec outFileSpec ;
AEDesc specDesc ; AEDesc specDesc ;
AEKeyword keyWord ;
long count ; long count ;
::AECountItems( &mNavReply.selection , &count ) ; ::AECountItems( &mNavReply.selection , &count ) ;
for ( long i = 1 ; i <= count ; ++i ) 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 ) { if ( err != noErr ) {
m_path = "" ; m_path = "" ;
return wxID_CANCEL ; return wxID_CANCEL ;
@ -787,7 +793,7 @@ int wxFileDialog::ShowModal()
m_path = m_paths[ 0 ] ; m_path = m_paths[ 0 ] ;
m_fileName = wxFileNameFromPath(m_path); m_fileName = wxFileNameFromPath(m_path);
m_dir = wxPathOnly(m_path); m_dir = wxPathOnly(m_path);
NavDisposeReply( &mNavReply ) ;
return wxID_OK ; return wxID_OK ;
} }
return wxID_CANCEL; return wxID_CANCEL;