]> git.saurik.com Git - wxWidgets.git/commitdiff
implemented moving the dialog (patch 996448)
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 25 Jul 2004 16:56:00 +0000 (16:56 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 25 Jul 2004 16:56:00 +0000 (16:56 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28492 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/msw/filedlg.h
src/msw/filedlg.cpp

index 7994db2be6d7363ef769e178bc4357583881f7de..968b0f03d4030994f28fe039feb3824fa6c5b37f 100644 (file)
@@ -254,6 +254,7 @@ wxMSW:
 - fixed UNC paths handling in wxFileSystem (Daniel Nash)
 - set wxKeyEvent::m_uniChar in Unicode build
 - support for alpha channel in toolbar bitmaps (Jurgen Doornik)
+- wxFileDialog can now be moved and centered (Randall Fox)
 
 wxWinCE:
 
index fe7a4856bbe0263f82aaf33cc41720cb2100e2f7..c84b139b960796e08f627b64bc60b354f52b8cb4 100644 (file)
@@ -37,8 +37,14 @@ public:
 
     virtual int ShowModal();
 
+protected:
+    virtual void DoMoveWindow(int x, int y, int width, int height);
+    virtual void DoGetSize( int *width, int *height ) const;
+    virtual void DoGetPosition( int *x, int *y ) const;
+
 private:
     wxArrayString m_fileNames;
+    bool m_bMovedWindow;
 
     DECLARE_DYNAMIC_CLASS(wxFileDialog)
     DECLARE_NO_COPY_CLASS(wxFileDialog)
index 1e3eba9bf2255ec3970fde66204a5e53c05ea587..541ea70c691133bb915667ae6f776e5a82d5e7cf 100644 (file)
 
 # define wxMAXEXT    5
 
+// ----------------------------------------------------------------------------
+// globals
+// ----------------------------------------------------------------------------
+
+// standard dialog size
+static wxRect gs_rectDialog(0, 0, 428, 266);
+
 // ============================================================================
 // implementation
 // ============================================================================
 
 IMPLEMENT_CLASS(wxFileDialog, wxFileDialogBase)
 
+// ----------------------------------------------------------------------------
+// hook function for moving the dialog
+// ----------------------------------------------------------------------------
+
+UINT APIENTRY
+wxFileDialogHookFunction(HWND      hDlg,
+                         UINT      iMsg,
+                         WPARAM    WXUNUSED(wParam),
+                         LPARAM    lParam)
+{
+    HWND   hwndDialog;
+    hwndDialog = ::GetParent( hDlg );
+    switch (iMsg)
+    {
+        case WM_DESTROY:
+            {
+                RECT dlgRect;
+                GetWindowRect( hwndDialog, & dlgRect );
+                gs_rectDialog.x = dlgRect.left;
+                gs_rectDialog.y = dlgRect.top;
+                gs_rectDialog.width = dlgRect.right - dlgRect.left;
+                gs_rectDialog.height = dlgRect.bottom - dlgRect.top;
+            }
+            break;
+
+        case WM_NOTIFY:
+            {
+                OFNOTIFY *   pNotifyCode;
+                pNotifyCode = (LPOFNOTIFY) lParam;
+                if (CDN_INITDONE == (pNotifyCode->hdr).code)
+                {
+                    SetWindowPos( hwndDialog, HWND_TOP,
+                                  gs_rectDialog.x,
+                                  gs_rectDialog.y,
+                                  gs_rectDialog.width,
+                                  gs_rectDialog.height,
+                                  SWP_NOZORDER|SWP_NOSIZE);
+                 }
+            }
+            break;
+    }
+
+    // do the default processing
+    return 0;
+}
+
 // ----------------------------------------------------------------------------
 // wxFileDialog
 // ----------------------------------------------------------------------------
@@ -88,13 +141,22 @@ wxFileDialog::wxFileDialog(wxWindow *parent,
                            const wxString& wildCard,
                            long style,
                            const wxPoint& pos)
-             :wxFileDialogBase(parent, message, defaultDir, defaultFileName, wildCard, style, pos)
+            : wxFileDialogBase(parent, message, defaultDir, defaultFileName,
+                               wildCard, style, pos)
 
 {
     if ( ( m_dialogStyle & wxMULTIPLE ) && ( m_dialogStyle & wxSAVE ) )
         m_dialogStyle &= ~wxMULTIPLE;
-}
 
+    m_bMovedWindow = false;
+
+    // Must set to zero, otherwise the wx routines won't size the window
+    // the second time you call the file dialog, because it thinks it is
+    // already at the requested size.. (when centering)
+    gs_rectDialog.x =
+    gs_rectDialog.y = 0;
+
+}
 void wxFileDialog::GetPaths(wxArrayString& paths) const
 {
     paths.Empty();
@@ -126,6 +188,34 @@ void wxFileDialog::SetPath(const wxString& path)
         m_fileName << _T('.') << ext;
 }
 
+void wxFileDialog::DoGetPosition( int *x, int *y ) const
+{
+    *x = gs_rectDialog.x;
+    *y = gs_rectDialog.y;
+}
+
+
+void wxFileDialog::DoGetSize(int *width, int *height) const
+{
+    *width  = gs_rectDialog.width;
+    *height = gs_rectDialog.height;
+}
+
+void wxFileDialog::DoMoveWindow(int x, int y, int WXUNUSED(width), int WXUNUSED(height))
+{
+    m_bMovedWindow = true;
+
+    gs_rectDialog.x = x;
+    gs_rectDialog.y = y;
+
+    /*
+        The width and height can not be set by the programmer
+        its just not possible.  But the program can get the
+        size of the Dlg after it has been shown, in case they need
+        that data.
+    */
+}
+
 int wxFileDialog::ShowModal()
 {
     HWND hWnd = 0;
@@ -149,6 +239,21 @@ int wxFileDialog::ShowModal()
 
     if ( m_dialogStyle & wxFILE_MUST_EXIST )
         msw_flags |= OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
+    /*
+        If the window has been moved the programmer is probably
+        trying to center or position it.  Thus we set the callback
+        or hook function so that we can actually adjust the position.
+        Without moving or centering the dlg, it will just stay
+        in the upper left of the frame, it does not center
+        automatically..  One additional note, when the hook is
+        enabled, the PLACES BAR in the dlg (shown on later versions
+        of windows (2000 and XP) will automatically be turned off
+        according to the MSDN docs.  This is normal.  If the
+        programmer needs the PLACES BAR (left side of dlg) they
+        just shouldn't move or center the dlg.
+    */
+    if (m_bMovedWindow) // we need the these flags.
+        msw_flags |= OFN_EXPLORER|OFN_ENABLEHOOK|OFN_ENABLESIZING;
 
     if (m_dialogStyle & wxMULTIPLE )
     {
@@ -216,7 +321,7 @@ int wxFileDialog::ShowModal()
                     if (i > 0)
                         i++;
                     else
-                        break;    
+                        break;
                 }
                 // fall through
 
@@ -229,6 +334,7 @@ int wxFileDialog::ShowModal()
     of.lpstrInitialDir   = dir.c_str();
 
     of.Flags             = msw_flags;
+    of.lpfnHook          = wxFileDialogHookFunction;
 
     wxArrayString wildDescriptions, wildFilters;
 
@@ -285,7 +391,7 @@ int wxFileDialog::ShowModal()
             of.lpstrDefExt = defextBuffer.c_str();
         }
     }
+
      //== Execute FileDialog >>=================================================
 
     //== Execute FileDialog >>=================================================
@@ -362,7 +468,7 @@ int wxFileDialog::ShowModal()
 
             m_filterIndex = (int)of.nFilterIndex - 1;
 
-            if ( !of.nFileExtension || 
+            if ( !of.nFileExtension ||
                  (of.nFileExtension && fileNameBuffer[of.nFileExtension] == wxT('\0')) )
             {
                 // User has typed a filename without an extension: