virtual int ShowModal();
+ // wxMSW-specific implementation from now on
+ // -----------------------------------------
+
+ // called from the hook procedure on CDN_INITDONE reception
+ virtual void MSWOnInitDone(WXHWND hDlg);
+
protected:
#if !(defined(__SMARTPHONE__) && defined(__WXWINCE__))
virtual void DoMoveWindow(int x, int y, int width, int height);
+ virtual void DoCentre(int dir);
virtual void DoGetSize( int *width, int *height ) const;
virtual void DoGetPosition( int *x, int *y ) const;
#endif // !(__SMARTPHONE__ && __WXWINCE__)
private:
wxArrayString m_fileNames;
+
+ // remember if our SetPosition() or Centre() (which requires special
+ // treatment) was called
bool m_bMovedWindow;
+ int m_centreDir; // nothing to do if 0
DECLARE_DYNAMIC_CLASS(wxFileDialog)
DECLARE_NO_COPY_CLASS(wxFileDialog)
// globals
// ----------------------------------------------------------------------------
-// standard dialog size
+// standard dialog size for the old Windows systems where the dialog wasn't
+// resizeable
static wxRect gs_rectDialog(0, 0, 428, 266);
+// we have no way to retrieve the dialog size before it is shown so calling
+// Centre() before ShowModal() doesn't work correctly (and we can't do it
+// after), hence we set a special flag and recenter the dialog when it's about
+// to be shown
+static bool gs_centerDialog = false;
+
// ============================================================================
// implementation
// ============================================================================
OFNOTIFY *pNotifyCode = wx_reinterpret_cast(OFNOTIFY *, lParam);
if ( pNotifyCode->hdr.code == CDN_INITDONE )
{
- // note that we need to move the parent window: hDlg is a
- // child of it when OFN_EXPLORER is used
- ::SetWindowPos
- (
- ::GetParent(hDlg),
- HWND_TOP,
- gs_rectDialog.x, gs_rectDialog.y,
- 0, 0,
- SWP_NOZORDER | SWP_NOSIZE
- );
+ wx_reinterpret_cast(wxFileDialog *,
+ pNotifyCode->lpOFN->lCustData)
+ ->MSWOnInitDone((WXHWND)hDlg);
}
}
break;
// NB: all style checks are done by wxFileDialogBase::Create
m_bMovedWindow = false;
+ m_centreDir = 0;
// 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();
*y = gs_rectDialog.y;
}
-
void wxFileDialog::DoGetSize(int *width, int *height) const
{
if ( width )
void wxFileDialog::DoMoveWindow(int x, int y, int WXUNUSED(w), int WXUNUSED(h))
{
- m_bMovedWindow = true;
-
gs_rectDialog.x = x;
gs_rectDialog.y = y;
- // size of the dialog can't be changed because the controls are not laid
- // out correctly then
+ // our HWND is only set when we're called from MSWOnInitDone(), test if
+ // this is the case
+ HWND hwnd = GetHwnd();
+ if ( hwnd )
+ {
+ // size of the dialog can't be changed because the controls are not
+ // laid out correctly then
+ ::SetWindowPos(hwnd, HWND_TOP, x, y, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
+ }
+ else // just remember that we were requested to move the window
+ {
+ m_bMovedWindow = true;
+
+ // if Centre() had been called before, it shouldn't be taken into
+ // account now
+ m_centreDir = 0;
+ }
+}
+
+void wxFileDialog::DoCentre(int dir)
+{
+ m_centreDir = dir;
+ m_bMovedWindow = true;
+
+ // it's unnecessary to do anything else at this stage as we'll redo it in
+ // MSWOnInitDone() anyhow
+}
+
+void wxFileDialog::MSWOnInitDone(WXHWND hDlg)
+{
+ // note the the dialog is the parent window: hDlg is a child of it when
+ // OFN_EXPLORER is used
+ HWND hFileDlg = ::GetParent((HWND)hDlg);
+
+ // set HWND so that our DoMoveWindow() works correctly
+ SetHWND((WXHWND)hFileDlg);
+
+ if ( m_centreDir )
+ {
+ // now we have the real dialog size, remember it
+ RECT rect;
+ GetWindowRect(hFileDlg, &rect);
+ gs_rectDialog = wxRectFromRECT(rect);
+
+ // and position the window correctly: notice that we must use the base
+ // class version as our own doesn't do anything except setting flags
+ wxFileDialogBase::DoCentre(m_centreDir);
+ }
+ else // need to just move it to the correct place
+ {
+ SetPosition(gs_rectDialog.GetPosition());
+ }
+
+ // we shouldn't destroy this HWND
+ SetHWND(NULL);
}
// helper used below in ShowModal(): style is used to determine whether to show
of.Flags = msw_flags;
of.lpfnHook = wxFileDialogHookFunction;
+ of.lCustData = (LPARAM)this;
wxArrayString wildDescriptions, wildFilters;