⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filedlg.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////// Name:        src/mac/classic/filedlg.cpp// Purpose:     wxFileDialog// Author:      Stefan Csomor// Modified by:// Created:     1998-01-01// RCS-ID:      $Id: filedlg.cpp,v 1.12 2006/05/30 07:25:26 ABX Exp $// Copyright:   (c) Stefan Csomor// Licence:     wxWindows licence/////////////////////////////////////////////////////////////////////////////#include "wx/wxprec.h"#ifdef __BORLANDC__    #pragma hdrstop#endif#include "wx/filedlg.h"#ifndef WX_PRECOMP    #include "wx/intl.h"    #include "wx/app.h"    #include "wx/utils.h"    #include "wx/dialog.h"#endif#include "wx/tokenzr.h"#include "wx/filename.h"#ifndef __DARWIN__    #include "PLStringFuncs.h"#endifIMPLEMENT_CLASS(wxFileDialog, wxFileDialogBase)// begin wxmac#include "wx/mac/private.h"#include <Navigation.h>#ifdef __DARWIN__#  include "MoreFilesX.h"#else#  include "MoreFiles.h"#  include "MoreFilesExtras.h"#endifextern bool gUseNavServices ;// the data we need to pass to our standard file hook routine// includes a pointer to the dialog, a pointer to the standard// file reply record (so we can inspect the current selection)// and a copy of the "previous" file spec of the reply record// so we can see if the selection has changedstruct OpenUserDataRec {  int                currentfilter ;  bool               saveMode ;  wxArrayString      name ;  wxArrayString      extensions ;  wxArrayLong        filtermactypes ;  wxString           defaultLocation;#if TARGET_CARBON  CFArrayRef         menuitems ;#else  NavMenuItemSpecArrayHandle menuitems ;#endif};typedef struct OpenUserDataRecOpenUserDataRec, *OpenUserDataRecPtr;static pascal void    NavEventProc(                                NavEventCallbackMessage        inSelector,                                NavCBRecPtr                    ioParams,                                NavCallBackUserData            ioUserData);#if TARGET_CARBON        static NavEventUPP    sStandardNavEventFilter = NewNavEventUPP(NavEventProc);#else        static NavEventUPP    sStandardNavEventFilter = NewNavEventProc(NavEventProc);#endifstatic pascal voidNavEventProc(    NavEventCallbackMessage        inSelector,    NavCBRecPtr                    ioParams,    NavCallBackUserData    ioUserData    ){    OpenUserDataRec * data = ( OpenUserDataRec *) ioUserData ;    if (inSelector == kNavCBEvent) {#if TARGET_CARBON#else        wxTheApp->MacHandleOneEvent(ioParams->eventData.eventDataParms.event);#endif    }    else if ( inSelector == kNavCBStart )    {#if TARGET_CARBON        if (data && !(data->defaultLocation).empty())        {            // Set default location for the modern Navigation APIs            // Apple Technical Q&A 1151            FSSpec theFSSpec;            wxMacFilename2FSSpec(data->defaultLocation, &theFSSpec);            AEDesc theLocation = {typeNull, NULL};            if (noErr == ::AECreateDesc(typeFSS, &theFSSpec, sizeof(FSSpec), &theLocation))                ::NavCustomControl(ioParams->context, kNavCtlSetLocation, (void *) &theLocation);        }#else        if ( data->menuitems )            NavCustomControl(ioParams->context, kNavCtlSelectCustomType, &(*data->menuitems)[data->currentfilter]);#endif    }    else if ( inSelector == kNavCBPopupMenuSelect )    {        NavMenuItemSpec * menu = (NavMenuItemSpec *) ioParams->eventData.eventDataParms.param ;#if TARGET_CARBON#else        if ( menu->menuCreator == 'WXNG' )#endif        {            data->currentfilter = menu->menuType ;            if ( data->saveMode )            {                int i = menu->menuType ;                wxString extension =  data->extensions[i].AfterLast('.') ;                extension.MakeLower() ;                wxString sfilename ;#if TARGET_CARBON                wxMacCFStringHolder cfString( NavDialogGetSaveFileName( ioParams->context ) , false  );                sfilename = cfString.AsString() ;#else                Str255 filename ;                // get the current filename                NavCustomControl(ioParams->context, kNavCtlGetEditFileName, &filename);                sfilename = wxMacMakeStringFromPascal( filename ) ;#endif                int pos = sfilename.Find('.', true) ;                if ( pos != wxNOT_FOUND )                {                    sfilename = sfilename.Left(pos+1)+extension ;#if TARGET_CARBON                    cfString.Assign( sfilename , wxFONTENCODING_DEFAULT ) ;                    NavDialogSetSaveFileName( ioParams->context , cfString ) ;#else                    wxMacStringToPascal( sfilename , filename ) ;                    NavCustomControl(ioParams->context, kNavCtlSetEditFileName, &filename);#endif                }            }        }    }}void MakeUserDataRec(OpenUserDataRec    *myData , const wxString& filter ){    myData->menuitems = NULL ;    myData->currentfilter = 0 ;    myData->saveMode = false ;    if ( filter && filter[0] )    {        wxString filter2(filter) ;        int filterIndex = 0;        bool isName = true ;        wxString current ;        for( unsigned int i = 0; i < filter2.length() ; i++ )        {            if( filter2.GetChar(i) == wxT('|') )            {                if( isName ) {                    myData->name.Add( current ) ;                }                else {                    myData->extensions.Add( current.MakeUpper() ) ;                    ++filterIndex ;                }                isName = !isName ;                current = wxEmptyString ;            }            else            {                current += filter2.GetChar(i) ;            }        }        // we allow for compatibility reason to have a single filter expression (like *.*) without        // an explanatory text, in that case the first part is name and extension at the same time        wxASSERT_MSG( filterIndex == 0 || !isName , wxT("incorrect format of format string") ) ;        if ( current.empty() )            myData->extensions.Add( myData->name[filterIndex] ) ;        else            myData->extensions.Add( current.MakeUpper() ) ;        if ( filterIndex == 0 || isName )            myData->name.Add( current.MakeUpper() ) ;        ++filterIndex ;        const size_t extCount = myData->extensions.GetCount();        for ( size_t i = 0 ; i < extCount; i++ )        {            wxUint32 fileType;            wxUint32 creator;            wxString extension = myData->extensions[i];            if (extension.GetChar(0) == '*')                extension = extension.Mid(1);  // Remove leading *            if (extension.GetChar(0) == '.')            {                extension = extension.Mid(1);  // Remove leading .            }            if (wxFileName::MacFindDefaultTypeAndCreator( extension, &fileType, &creator ))            {                myData->filtermactypes.Add( (OSType)fileType );            }            else            {                myData->filtermactypes.Add( '****' ) ;   // We'll fail safe if it's not recognized            }        }    }}static Boolean CheckFile( const wxString &filename , OSType type , OpenUserDataRecPtr data){    wxString file(filename) ;    file.MakeUpper() ;    if ( data->extensions.GetCount() > 0 )    {        //for ( int i = 0 ; i < data->numfilters ; ++i )        int i = data->currentfilter ;        if ( data->extensions[i].Right(2) == wxT(".*") )            return true ;        {            if ( type == (OSType)data->filtermactypes[i] )                return true ;            wxStringTokenizer tokenizer( data->extensions[i] , wxT(";") ) ;            while( tokenizer.HasMoreTokens() )            {                wxString extension = tokenizer.GetNextToken() ;                if ( extension.GetChar(0) == '*' )                    extension = extension.Mid(1) ;                if ( file.length() >= extension.length() && extension == file.Right(extension.length() ) )                    return true ;            }        }        return false ;    }    return true ;}#ifndef __DARWIN__static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, void *dataPtr){    OpenUserDataRecPtr data = (OpenUserDataRecPtr) dataPtr ;    // return true if this item is invisible or a file    Boolean visibleFlag;    Boolean folderFlag;    visibleFlag = ! (myCInfoPBPtr->hFileInfo.ioFlFndrInfo.fdFlags & kIsInvisible);    folderFlag = (myCInfoPBPtr->hFileInfo.ioFlAttrib & 0x10);    // because the semantics of the filter proc are "true means don't show    // it" we need to invert the result that we return    if ( !visibleFlag )        return true ;    if ( !folderFlag )    {        wxString file = wxMacMakeStringFromPascal( myCInfoPBPtr->hFileInfo.ioNamePtr ) ;        return !CheckFile( file , myCInfoPBPtr->hFileInfo.ioFlFndrInfo.fdType , data ) ;    }    return false ;}#endif// end wxmacwxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,        const wxString& defaultDir, const wxString& defaultFileName, const wxString& wildCard,        long style, const wxPoint& pos, const wxSize& sz, const wxString& name)             :wxFileDialogBase(parent, message, defaultDir, defaultFileName, wildCard, style, pos, sz, name){    wxASSERT_MSG( NavServicesAvailable() , wxT("Navigation Services are not running") ) ;}pascal Boolean CrossPlatformFilterCallback (    AEDesc *theItem,    void *info,    void *callBackUD,    NavFilterModes filterMode){    bool display = true;    OpenUserDataRecPtr data = (OpenUserDataRecPtr) callBackUD ;    if (filterMode == kNavFilteringBrowserList)    {        NavFileOrFolderInfo* theInfo = (NavFileOrFolderInfo*) info ;        if ( !theInfo->isFolder )        {            if (theItem->descriptorType == typeFSS )            {                FSSpec    spec;                memcpy( &spec , *theItem->dataHandle , sizeof(FSSpec) ) ;                wxString file = wxMacMakeStringFromPascal( spec.name ) ;                display = CheckFile( file , theInfo->fileAndFolder.fileInfo.finderInfo.fdType , data ) ;            }#if TARGET_CARBON            else if ( theItem->descriptorType == typeFSRef )            {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -