]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/carbon/filedlg.cpp
avoid setting initial position if it was not specified, broken in r70734
[wxWidgets.git] / src / osx / carbon / filedlg.cpp
index 4fb787eacff74d2558040e61bb80a058e7fde5d1..fb953d198679faf8dbdd1e1a3bfe4b6cd37eb43c 100644 (file)
@@ -4,7 +4,6 @@
 // Author:      Stefan Csomor
 // Modified by:
 // Created:     1998-01-01
 // Author:      Stefan Csomor
 // Modified by:
 // Created:     1998-01-01
-// RCS-ID:      $Id$
 // Copyright:   (c) Stefan Csomor
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 // Copyright:   (c) Stefan Csomor
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -26,6 +25,7 @@
 #include "wx/filename.h"
 
 #include "wx/osx/private.h"
 #include "wx/filename.h"
 
 #include "wx/osx/private.h"
+#include "wx/modalhook.h"
 
 #ifndef __DARWIN__
     #include <Navigation.h>
 
 #ifndef __DARWIN__
     #include <Navigation.h>
@@ -44,14 +44,14 @@ class OpenUserDataRec
 {
 public:
     OpenUserDataRec( wxFileDialog* dialog );
 {
 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;}
     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);
 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);
     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;
     wxFileDialog*       m_dialog;
     int                 m_currentfilter;
     wxString            m_defaultLocation;
@@ -80,13 +80,13 @@ OpenUserDataRec::OpenUserDataRec( wxFileDialog* d)
     m_dialog = d;
     m_controlAdded = false;
     m_saveMode = m_dialog->HasFdFlag(wxFD_SAVE);
     m_dialog = d;
     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_defaultLocation = m_dialog->GetDirectory();
     MakeUserDataRec(m_dialog->GetWildcard());
     m_currentfilter = m_dialog->GetFilterIndex();
-    
+
     m_menuitems = NULL;
     m_menuitems = NULL;
-    
+
     size_t numFilters = m_extensions.GetCount();
     if (numFilters)
     {
     size_t numFilters = m_extensions.GetCount();
     if (numFilters)
     {
@@ -133,7 +133,7 @@ void OpenUserDataRec::EventProcCBEvent(NavCBRecPtr callBackParms)
             EventProcCBEventMouseDown(callBackParms);
             break;
         }
             EventProcCBEventMouseDown(callBackParms);
             break;
         }
-    }            
+    }
 }
 
 void OpenUserDataRec::EventProcCBEventMouseDown(NavCBRecPtr callBackParms)
 }
 
 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);
     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);
     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
         // 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;
             (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 (noErr == ::AECreateDesc(typeFSRef, &theFile, sizeof(FSRef), &theLocation))
             ::NavCustomControl(ioParams->context, kNavCtlSetLocation, (void *) &theLocation);
     }
-    
+
     if( m_extensions.GetCount() > 0 )
     {
         NavMenuItemSpec  menuItem;
     if( m_extensions.GetCount() > 0 )
     {
         NavMenuItemSpec  menuItem;
@@ -184,37 +184,37 @@ void OpenUserDataRec::EventProcCBStart(NavCBRecPtr ioParams)
         menuItem.menuType = m_currentfilter;
         ::NavCustomControl(ioParams->context, kNavCtlSelectCustomType, &menuItem);
     }
         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);
     }
     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();
 }
 
 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 ;
     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(';');
             // isolate the first extension string
             wxString firstExtension = m_extensions[i].BeforeFirst('|').BeforeFirst(';');
-            
+
             wxString extension = firstExtension.AfterLast('.') ;
             wxString sfilename ;
             wxString extension = firstExtension.AfterLast('.') ;
             wxString sfilename ;
-            
+
             wxCFStringRef cfString( wxCFRetain( NavDialogGetSaveFileName( ioParams->context ) ) );
             sfilename = cfString.AsString() ;
             wxCFStringRef cfString( wxCFRetain( NavDialogGetSaveFileName( ioParams->context ) ) );
             sfilename = cfString.AsString() ;
-            
+
             int pos = sfilename.Find('.', true) ;
             if ( pos != wxNOT_FOUND && extension != wxT("*") )
             {
             int pos = sfilename.Find('.', true) ;
             if ( pos != wxNOT_FOUND && extension != wxT("*") )
             {
@@ -229,21 +229,21 @@ void OpenUserDataRec::EventProcCBPopupMenuSelect(NavCBRecPtr ioParams)
 void OpenUserDataRec::EventProcCBCustomize(NavCBRecPtr ioParams)
 {
     wxWindow* control = m_dialog->GetExtraControl();
 void OpenUserDataRec::EventProcCBCustomize(NavCBRecPtr ioParams)
 {
     wxWindow* control = m_dialog->GetExtraControl();
-    
+
     if ( control )
     {
         SInt16 neededRight, neededBottom;
     if ( control )
     {
         SInt16 neededRight, neededBottom;
-        
+
         wxSize size = m_dialog->GetExtraControl()->GetSize();
         neededRight = ioParams->customRect.left + size.x;
         neededBottom = ioParams->customRect.top + size.y;
         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;
         }
         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 )
             {
         {
             if ( ioParams->customRect.right != m_lastRight )
             {
@@ -264,10 +264,10 @@ void OpenUserDataRec::EventProcCBCustomize(NavCBRecPtr ioParams)
 void OpenUserDataRec::EventProcCBAdjustRect(NavCBRecPtr ioParams)
 {
     wxWindow* control = m_dialog->GetExtraControl();
 void OpenUserDataRec::EventProcCBAdjustRect(NavCBRecPtr ioParams)
 {
     wxWindow* control = m_dialog->GetExtraControl();
-    
+
     if ( control && m_controlAdded)
     {
     if ( control && m_controlAdded)
     {
-        control->SetSize(ioParams->customRect.left , ioParams->customRect.top, 
+        control->SetSize(ioParams->customRect.left , ioParams->customRect.top,
                          ioParams->customRect.right - ioParams->customRect.left,
                          ioParams->customRect.bottom - ioParams->customRect.top);
     }
                          ioParams->customRect.right - ioParams->customRect.left,
                          ioParams->customRect.bottom - ioParams->customRect.top);
     }
@@ -324,11 +324,11 @@ void OpenUserDataRec::MakeUserDataRec( const wxString& filter )
             wxString extension = m_extensions[i];
 
             // Remove leading '*'
             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 '.'
                 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 ))
                 extension = extension.Mid( 1 );
 
             if (wxFileName::MacFindDefaultTypeAndCreator( extension, &fileType, &creator ))
@@ -387,19 +387,19 @@ bool OpenUserDataRec::FilterCallback(
         // check if a folder is a package before deciding what to do.
         NavFileOrFolderInfo* theInfo = (NavFileOrFolderInfo*) info ;
         FSRef fsref;
         // 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;
         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;
             // 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) &&
             // 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) &&
@@ -416,7 +416,7 @@ bool OpenUserDataRec::FilterCallback(
             }
         }
     }
             }
         }
     }
-    
+
     return true;
 }
 
     return true;
 }
 
@@ -455,19 +455,24 @@ 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)
     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 );
     wxASSERT_MSG( NavServicesAvailable() , wxT("Navigation Services are not running") ) ;
 }
 
 void wxFileDialog::SetupExtraControls(WXWindow nativeWindow)
 {
     wxTopLevelWindow::Create( GetParent(), nativeWindow );
-    
+
     if (HasExtraControlCreator())
     {
         CreateExtraControl();
     if (HasExtraControlCreator())
     {
         CreateExtraControl();
@@ -476,9 +481,11 @@ void wxFileDialog::SetupExtraControls(WXWindow nativeWindow)
 
 int wxFileDialog::ShowModal()
 {
 
 int wxFileDialog::ShowModal()
 {
+    WX_HOOK_MODAL_DIALOG();
+
     m_paths.Empty();
     m_fileNames.Empty();
     m_paths.Empty();
     m_fileNames.Empty();
-    
+
     OSErr err;
     NavDialogCreationOptions dialogCreateOptions;
 
     OSErr err;
     NavDialogCreationOptions dialogCreateOptions;
 
@@ -497,9 +504,9 @@ int wxFileDialog::ShowModal()
     NavDialogRef dialog;
     NavObjectFilterUPP navFilterUPP = NULL;
     OpenUserDataRec myData( this );
     NavDialogRef dialog;
     NavObjectFilterUPP navFilterUPP = NULL;
     OpenUserDataRec myData( this );
-            
+
     dialogCreateOptions.popupExtension = myData.GetMenuItems();
     dialogCreateOptions.popupExtension = myData.GetMenuItems();
-    
+
     if (HasFdFlag(wxFD_SAVE))
     {
         dialogCreateOptions.optionFlags |= kNavDontAutoTranslate;
     if (HasFdFlag(wxFD_SAVE))
     {
         dialogCreateOptions.optionFlags |= kNavDontAutoTranslate;
@@ -537,11 +544,15 @@ int wxFileDialog::ShowModal()
             (void *) &myData, // inClientData
             &dialog );
     }
             (void *) &myData, // inClientData
             &dialog );
     }
-    
+
     SetupExtraControls(NavDialogGetWindow(dialog));
     SetupExtraControls(NavDialogGetWindow(dialog));
-    
+
     if (err == noErr)
     if (err == noErr)
+    {
+        wxDialog::OSXBeginModalDialog();
         err = ::NavDialogRun(dialog);
         err = ::NavDialogRun(dialog);
+        wxDialog::OSXEndModalDialog();
+    }
 
     // clean up filter related data, etc.
     if (navFilterUPP)
 
     // clean up filter related data, etc.
     if (navFilterUPP)
@@ -598,6 +609,7 @@ int wxFileDialog::ShowModal()
         m_dir = wxPathOnly(m_path);
     }
 
         m_dir = wxPathOnly(m_path);
     }
 
+    UnsubclassWin();
     ::NavDisposeReply(&navReply);
     ::NavDialogDispose(dialog);
 
     ::NavDisposeReply(&navReply);
     ::NavDialogDispose(dialog);