X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/98daf410db36ef0c93078d2fea2c53757c473174..71a09c3579dd5cb4cd8fa7fdc143561cbff74e12:/src/osx/carbon/filedlg.cpp?ds=inline diff --git a/src/osx/carbon/filedlg.cpp b/src/osx/carbon/filedlg.cpp index ef50e3d93b..fb953d1986 100644 --- a/src/osx/carbon/filedlg.cpp +++ b/src/osx/carbon/filedlg.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id$ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -26,6 +25,7 @@ #include "wx/filename.h" #include "wx/osx/private.h" +#include "wx/modalhook.h" #ifndef __DARWIN__ #include @@ -44,14 +44,14 @@ class OpenUserDataRec { public: OpenUserDataRec( wxFileDialog* dialog ); - + bool FilterCallback( AEDesc *theItem, void *info, NavFilterModes filterMode ); void EventProc( NavEventCallbackMessage inSelector, NavCBRecPtr ioParams ); int GetCurrentFilter() const {return m_currentfilter;} CFArrayRef GetMenuItems() const { return m_menuitems;} - - + + private: void EventProcCBEvent( NavCBRecPtr ioParams ); void EventProcCBEventMouseDown( NavCBRecPtr ioParams); @@ -61,7 +61,7 @@ private: void EventProcCBAdjustRect( NavCBRecPtr ioParams ); bool CheckFile( const wxString &filename , OSType type); void MakeUserDataRec( const wxString& filter); - + wxFileDialog* m_dialog; int m_currentfilter; wxString m_defaultLocation; @@ -72,21 +72,21 @@ private: bool m_saveMode; SInt16 m_lastRight; SInt16 m_lastBottom; - bool m_firstAdjustRect; + bool m_controlAdded; }; OpenUserDataRec::OpenUserDataRec( wxFileDialog* d) { m_dialog = d; - m_firstAdjustRect = true; + m_controlAdded = false; m_saveMode = m_dialog->HasFdFlag(wxFD_SAVE); - + m_defaultLocation = m_dialog->GetDirectory(); MakeUserDataRec(m_dialog->GetWildcard()); m_currentfilter = m_dialog->GetFilterIndex(); - + m_menuitems = NULL; - + size_t numFilters = m_extensions.GetCount(); if (numFilters) { @@ -133,7 +133,7 @@ void OpenUserDataRec::EventProcCBEvent(NavCBRecPtr callBackParms) EventProcCBEventMouseDown(callBackParms); break; } - } + } } void OpenUserDataRec::EventProcCBEventMouseDown(NavCBRecPtr callBackParms) @@ -141,17 +141,17 @@ void OpenUserDataRec::EventProcCBEventMouseDown(NavCBRecPtr callBackParms) EventRecord *evt = callBackParms->eventData.eventDataParms.event; Point where = evt->where; QDGlobalToLocalPoint(GetWindowPort(callBackParms->window), &where); - + ControlRef whichControl = FindControlUnderMouse(where, callBackParms->window, NULL); if (whichControl != NULL) { ControlKind theKind; GetControlKind(whichControl, &theKind); - + // Moving the focus if we clicked in an focusable control - if ((theKind.kind == kControlKindEditUnicodeText) || - (theKind.kind == kControlKindEditText) || - (theKind.kind == kControlKindDataBrowser) || + if ((theKind.kind == kControlKindEditUnicodeText) || + (theKind.kind == kControlKindEditText) || + (theKind.kind == kControlKindDataBrowser) || (theKind.kind == kControlKindListBox)) { ControlRef currentlyFocusedControl; @@ -175,7 +175,7 @@ void OpenUserDataRec::EventProcCBStart(NavCBRecPtr ioParams) if (noErr == ::AECreateDesc(typeFSRef, &theFile, sizeof(FSRef), &theLocation)) ::NavCustomControl(ioParams->context, kNavCtlSetLocation, (void *) &theLocation); } - + if( m_extensions.GetCount() > 0 ) { NavMenuItemSpec menuItem; @@ -184,36 +184,37 @@ void OpenUserDataRec::EventProcCBStart(NavCBRecPtr ioParams) menuItem.menuType = m_currentfilter; ::NavCustomControl(ioParams->context, kNavCtlSelectCustomType, &menuItem); } - + if (m_dialog->GetExtraControl()) { + m_controlAdded = true; ControlRef ref = m_dialog->GetExtraControl()->GetPeer()->GetControlRef(); NavCustomControl(ioParams->context, kNavCtlAddControl, ref); } - + } void OpenUserDataRec::EventProcCBPopupMenuSelect(NavCBRecPtr ioParams) { NavMenuItemSpec * menu = (NavMenuItemSpec *) ioParams->eventData.eventDataParms.param ; const size_t numFilters = m_extensions.GetCount(); - + if ( menu->menuType < numFilters ) { m_currentfilter = menu->menuType ; if ( m_saveMode ) { int i = menu->menuType ; - + // isolate the first extension string wxString firstExtension = m_extensions[i].BeforeFirst('|').BeforeFirst(';'); - + wxString extension = firstExtension.AfterLast('.') ; wxString sfilename ; - + wxCFStringRef cfString( wxCFRetain( NavDialogGetSaveFileName( ioParams->context ) ) ); sfilename = cfString.AsString() ; - + int pos = sfilename.Find('.', true) ; if ( pos != wxNOT_FOUND && extension != wxT("*") ) { @@ -228,21 +229,21 @@ void OpenUserDataRec::EventProcCBPopupMenuSelect(NavCBRecPtr ioParams) void OpenUserDataRec::EventProcCBCustomize(NavCBRecPtr ioParams) { wxWindow* control = m_dialog->GetExtraControl(); - + if ( control ) { SInt16 neededRight, neededBottom; - + wxSize size = m_dialog->GetExtraControl()->GetSize(); neededRight = ioParams->customRect.left + size.x; neededBottom = ioParams->customRect.top + size.y; - + if (ioParams->customRect.right == 0 && ioParams->customRect.bottom == 0) { ioParams->customRect.right = neededRight; ioParams->customRect.bottom = neededBottom; } - else + else { if ( ioParams->customRect.right != m_lastRight ) { @@ -263,16 +264,12 @@ void OpenUserDataRec::EventProcCBCustomize(NavCBRecPtr ioParams) void OpenUserDataRec::EventProcCBAdjustRect(NavCBRecPtr ioParams) { wxWindow* control = m_dialog->GetExtraControl(); - - if ( control ) + + if ( control && m_controlAdded) { - // workaround because the first time this is called it still seems to be - // in composited coordinates, while later it is not - if ( !m_firstAdjustRect ) - { - control->Move(ioParams->customRect.left , ioParams->customRect.top); - } - m_firstAdjustRect = false; + control->SetSize(ioParams->customRect.left , ioParams->customRect.top, + ioParams->customRect.right - ioParams->customRect.left, + ioParams->customRect.bottom - ioParams->customRect.top); } } @@ -327,11 +324,11 @@ void OpenUserDataRec::MakeUserDataRec( const wxString& filter ) wxString extension = m_extensions[i]; // Remove leading '*' - if (extension.length() && (extension.GetChar(0) == '*')) + if ( !extension.empty() && (extension.GetChar(0) == '*') ) extension = extension.Mid( 1 ); // Remove leading '.' - if (extension.length() && (extension.GetChar(0) == '.')) + if ( !extension.empty() && (extension.GetChar(0) == '.') ) extension = extension.Mid( 1 ); if (wxFileName::MacFindDefaultTypeAndCreator( extension, &fileType, &creator )) @@ -390,19 +387,19 @@ bool OpenUserDataRec::FilterCallback( // check if a folder is a package before deciding what to do. NavFileOrFolderInfo* theInfo = (NavFileOrFolderInfo*) info ; FSRef fsref; - + if ( theInfo->isFolder ) { // check bundle bit (using Finder Services - used by OS9 on some bundles) FSCatalogInfo catalogInfo; if (FSGetCatalogInfo (&fsref, kFSCatInfoFinderInfo, &catalogInfo, NULL, NULL, NULL) != noErr) return true; - + // Check bundle item (using Launch Services - used by OS-X through info.plist or APP) LSItemInfoRecord lsInfo; if (LSCopyItemInfoForRef(&fsref, kLSRequestBasicFlagsOnly, &lsInfo ) != noErr) return true; - + // If it's not a bundle, then it's a normal folder and it passes our filter FileInfo *fileInfo = (FileInfo *) catalogInfo.finderInfo; if ( !(fileInfo->finderFlags & kHasBundle) && @@ -419,7 +416,7 @@ bool OpenUserDataRec::FilterCallback( } } } - + return true; } @@ -458,20 +455,37 @@ static pascal void NavEventProc( } -wxFileDialog::wxFileDialog( +void wxFileDialog::Init() +{ +} + +void wxFileDialog::Create( 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) { + wxFileDialogBase::Create(parent, message, defaultDir, defaultFileName, wildCard, style, pos, sz, name); + wxASSERT_MSG( NavServicesAvailable() , wxT("Navigation Services are not running") ) ; } +void wxFileDialog::SetupExtraControls(WXWindow nativeWindow) +{ + wxTopLevelWindow::Create( GetParent(), nativeWindow ); + + if (HasExtraControlCreator()) + { + CreateExtraControl(); + } +} + int wxFileDialog::ShowModal() { + WX_HOOK_MODAL_DIALOG(); + m_paths.Empty(); m_fileNames.Empty(); - + OSErr err; NavDialogCreationOptions dialogCreateOptions; @@ -490,9 +504,9 @@ int wxFileDialog::ShowModal() NavDialogRef dialog; NavObjectFilterUPP navFilterUPP = NULL; OpenUserDataRec myData( this ); - + dialogCreateOptions.popupExtension = myData.GetMenuItems(); - + if (HasFdFlag(wxFD_SAVE)) { dialogCreateOptions.optionFlags |= kNavDontAutoTranslate; @@ -530,16 +544,15 @@ int wxFileDialog::ShowModal() (void *) &myData, // inClientData &dialog ); } - - wxNonOwnedWindow::Create( GetParent(), NavDialogGetWindow(dialog) ); - if (HasExtraControlCreator()) - { - CreateExtraControl(); - } - + SetupExtraControls(NavDialogGetWindow(dialog)); + if (err == noErr) + { + wxDialog::OSXBeginModalDialog(); err = ::NavDialogRun(dialog); + wxDialog::OSXEndModalDialog(); + } // clean up filter related data, etc. if (navFilterUPP) @@ -596,6 +609,7 @@ int wxFileDialog::ShowModal() m_dir = wxPathOnly(m_path); } + UnsubclassWin(); ::NavDisposeReply(&navReply); ::NavDialogDispose(dialog);