]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/filedlg.cpp
Implement wxChoice::Insert.
[wxWidgets.git] / src / msw / filedlg.cpp
index 05fd4e89ca511a9bca6813ad4ef952bd896cc9bc..2bf5d527c3b387a8a7dbfe99882a2f984dfc2fd9 100644 (file)
 // headers
 // ----------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "filedlg.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
@@ -28,7 +24,7 @@
     #pragma hdrstop
 #endif
 
-#if wxUSE_FILEDLG && !defined(__SMARTPHONE__)
+#if wxUSE_FILEDLG && !(defined(__SMARTPHONE__) && defined(__WXWINCE__))
 
 #ifndef WX_PRECOMP
     #include "wx/utils.h"
     #include "wx/app.h"
 #endif
 
-#include "wx/msw/private.h"
-
-#if !defined(__WIN32__) || defined(__WXWINCE__)
-    #include <commdlg.h>
-#endif
+#include "wx/msw/wrapcdlg.h"
 
-#include <math.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include "wx/filename.h"
 #include "wx/tokenzr.h"
+#include "wx/math.h"
 
 #include "wx/msw/missing.h"
 
@@ -86,7 +78,7 @@ IMPLEMENT_CLASS(wxFileDialog, wxFileDialogBase)
 // hook function for moving the dialog
 // ----------------------------------------------------------------------------
 
-UINT APIENTRY
+UINT_PTR APIENTRY
 wxFileDialogHookFunction(HWND      hDlg,
                          UINT      iMsg,
                          WPARAM    WXUNUSED(wParam),
@@ -265,7 +257,8 @@ int wxFileDialog::ShowModal()
     }
 
     // if wxCHANGE_DIR flag is not given we shouldn't change the CWD which the
-    // standard dialog does by default
+    // standard dialog does by default (notice that under NT it does it anyhow,
+    // OFN_NOCHANGEDIR or not, see below)
     if ( !(m_dialogStyle & wxCHANGE_DIR) )
     {
         msw_flags |= OFN_NOCHANGEDIR;
@@ -395,7 +388,8 @@ int wxFileDialog::ShowModal()
         }
     }
 
-     //== Execute FileDialog >>=================================================
+    // store off before the standard windows dialog can possibly change it
+    const wxString cwdOrig = wxGetCwd();
 
     //== Execute FileDialog >>=================================================
 
@@ -404,6 +398,19 @@ int wxFileDialog::ShowModal()
 
     DWORD errCode = CommDlgExtendedError();
 
+    // GetOpenFileName will always change the current working directory on 
+    // (according to MSDN) "Windows NT 4.0/2000/XP" because the flag
+    // OFN_NOCHANGEDIR has no effect.  If the user did not specify wxCHANGE_DIR
+    // let's restore the current working directory to what it was before the
+    // dialog was shown (assuming this behavior extends to Windows Server 2003
+    // seems safe).
+    if ( success &&
+            (msw_flags & OFN_NOCHANGEDIR) &&
+                wxGetOsVersion() == wxWINDOWS_NT )
+    {
+        wxSetWorkingDirectory(cwdOrig);
+    }
+
 #ifdef __WIN32__
     if (!success && (errCode == CDERR_STRUCTSIZE))
     {
@@ -511,5 +518,5 @@ int wxFileDialog::ShowModal()
 
 }
 
-#endif // wxUSE_FILEDLG
+#endif // wxUSE_FILEDLG && !(__SMARTPHONE__ && __WXWINCE__)