]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/filedlg.cpp
Forward-ported wxPython-bindings related cleanup from 2.9.0 branch
[wxWidgets.git] / src / msw / filedlg.cpp
index 546b6c7ab05f48d5e92a600cf9b5e7ab06fa9f3d..c553328fb42753e7a96f29ff99e742188e83f083 100644 (file)
@@ -86,6 +86,16 @@ wxFileDialogHookFunction(HWND      hDlg,
 {
     switch ( iMsg )
     {
+#ifndef __WXWINCE__
+        case WM_INITDIALOG:
+            {
+                OPENFILENAME* ofn = reinterpret_cast<OPENFILENAME *>(lParam);
+                reinterpret_cast<wxFileDialog *>(ofn->lCustData)
+                    ->MSWOnInitDialogHook((WXHWND)hDlg);
+            }
+            break;
+#endif // __WXWINCE__
+
         case WM_NOTIFY:
             {
                 OFNOTIFY *pNotifyCode = reinterpret_cast<OFNOTIFY *>(lParam);
@@ -167,7 +177,7 @@ void wxFileDialog::GetFilenames(wxArrayString& files) const
 void wxFileDialog::SetPath(const wxString& path)
 {
     wxString ext;
-    wxSplitPath(path, &m_dir, &m_fileName, &ext);
+    wxFileName::SplitPath(path, &m_dir, &m_fileName, &ext);
     if ( !ext.empty() )
         m_fileName << _T('.') << ext;
 }
@@ -360,6 +370,17 @@ static bool ShowCommFileDialog(OPENFILENAME *of, long style)
     return true;
 }
 
+#ifndef __WXWINCE__
+void wxFileDialog::MSWOnInitDialogHook(WXHWND hwnd)
+{
+   SetHWND(hwnd);
+
+   CreateExtraControl();
+
+   SetHWND(NULL);
+}
+#endif // __WXWINCE__
+
 int wxFileDialog::ShowModal()
 {
     HWND hWnd = 0;
@@ -385,7 +406,7 @@ int wxFileDialog::ShowModal()
         in the upper left of the frame, it does not center
         automatically.
     */
-    if (m_bMovedWindow) // we need these flags.
+    if (m_bMovedWindow || HasExtraControlCreator()) // we need these flags.
     {
         msw_flags |= OFN_EXPLORER|OFN_ENABLEHOOK;
 #ifndef __WXWINCE__
@@ -421,6 +442,36 @@ int wxFileDialog::ShowModal()
     of.lpstrFileTitle    = titleBuffer;
     of.nMaxFileTitle     = wxMAXFILE + 1 + wxMAXEXT;
 
+#ifndef __WXWINCE__
+    GlobalPtr hgbl;
+    if ( HasExtraControlCreator() )
+    {
+        msw_flags |= OFN_ENABLETEMPLATEHANDLE;
+
+        hgbl.Init(256, GMEM_ZEROINIT);
+        GlobalPtrLock hgblLock(hgbl);
+        LPDLGTEMPLATE lpdt = static_cast<LPDLGTEMPLATE>(hgblLock.Get());
+
+        // Define a dialog box.
+
+        lpdt->style = DS_CONTROL | WS_CHILD | WS_CLIPSIBLINGS;
+        lpdt->cdit = 0;         // Number of controls
+        lpdt->x = 0;
+        lpdt->y = 0;
+
+        // convert the size of the extra controls to the dialog units
+        const wxSize extraSize = GetExtraControlSize();
+        const LONG baseUnits = ::GetDialogBaseUnits();
+        lpdt->cx = ::MulDiv(extraSize.x, 4, LOWORD(baseUnits));
+        lpdt->cy = ::MulDiv(extraSize.y, 8, HIWORD(baseUnits));
+
+        // after the DLGTEMPLATE there are 3 additional WORDs for dialog menu,
+        // class and title, all three set to zeros.
+
+        of.hInstance = (HINSTANCE)lpdt;
+    }
+#endif // __WXWINCE__
+
     // Convert forward slashes to backslashes (file selector doesn't like
     // forward slashes) and also squeeze multiple consecutive slashes into one
     // as it doesn't like two backslashes in a row neither
@@ -494,7 +545,7 @@ int wxFileDialog::ShowModal()
 
     //=== Setting defaultFileName >>=========================================
 
-    wxStrlcpy(fileNameBuffer, m_fileName, WXSIZEOF(fileNameBuffer));
+    wxStrlcpy(fileNameBuffer, m_fileName.c_str(), WXSIZEOF(fileNameBuffer));
 
     of.lpstrFile = fileNameBuffer;  // holds returned filename
     of.nMaxFile  = wxMAXPATH;