]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/carbon/filedlg.cpp
keeping opaqueness and backgroundcolor in synch with bgstyle
[wxWidgets.git] / src / osx / carbon / filedlg.cpp
index ef50e3d93b0d05c0c7d90bf7879066a85d8dd7d8..9592010d29a745d114973d963cbf30ef7a4d8a8b 100644 (file)
@@ -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;
 }
 
@@ -467,11 +464,21 @@ wxFileDialog::wxFileDialog(
     wxASSERT_MSG( NavServicesAvailable() , wxT("Navigation Services are not running") ) ;
 }
 
+void wxFileDialog::SetupExtraControls(WXWindow nativeWindow)
+{
+    wxTopLevelWindow::Create( GetParent(), nativeWindow );
+
+    if (HasExtraControlCreator())
+    {
+        CreateExtraControl();
+    }
+}
+
 int wxFileDialog::ShowModal()
 {
     m_paths.Empty();
     m_fileNames.Empty();
-    
+
     OSErr err;
     NavDialogCreationOptions dialogCreateOptions;
 
@@ -490,9 +497,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 +537,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 +602,7 @@ int wxFileDialog::ShowModal()
         m_dir = wxPathOnly(m_path);
     }
 
+    UnsubclassWin();
     ::NavDisposeReply(&navReply);
     ::NavDialogDispose(dialog);