// 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"
#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"
// hook function for moving the dialog
// ----------------------------------------------------------------------------
-UINT APIENTRY
+UINT_PTR APIENTRY
wxFileDialogHookFunction(HWND hDlg,
UINT iMsg,
WPARAM WXUNUSED(wParam),
}
// 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;
// forward slashes) and also squeeze multiple consecutive slashes into one
// as it doesn't like two backslashes in a row neither
- wxString dir;
- size_t i, len = m_dir.length();
+ wxString dir;
+ size_t i, len = m_dir.length();
dir.reserve(len);
for ( i = 0; i < len; i++ )
{
}
}
- //== Execute FileDialog >>=================================================
+ // store off before the standard windows dialog can possibly change it
+ const wxString cwdOrig = wxGetCwd();
//== Execute FileDialog >>=================================================
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))
{
}
-#endif // wxUSE_FILEDLG
+#endif // wxUSE_FILEDLG && !(__SMARTPHONE__ && __WXWINCE__)