implemented moving the dialog (patch 996448)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28492 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -254,6 +254,7 @@ wxMSW:
|
|||||||
- fixed UNC paths handling in wxFileSystem (Daniel Nash)
|
- fixed UNC paths handling in wxFileSystem (Daniel Nash)
|
||||||
- set wxKeyEvent::m_uniChar in Unicode build
|
- set wxKeyEvent::m_uniChar in Unicode build
|
||||||
- support for alpha channel in toolbar bitmaps (Jurgen Doornik)
|
- support for alpha channel in toolbar bitmaps (Jurgen Doornik)
|
||||||
|
- wxFileDialog can now be moved and centered (Randall Fox)
|
||||||
|
|
||||||
wxWinCE:
|
wxWinCE:
|
||||||
|
|
||||||
|
@@ -37,8 +37,14 @@ public:
|
|||||||
|
|
||||||
virtual int ShowModal();
|
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:
|
private:
|
||||||
wxArrayString m_fileNames;
|
wxArrayString m_fileNames;
|
||||||
|
bool m_bMovedWindow;
|
||||||
|
|
||||||
DECLARE_DYNAMIC_CLASS(wxFileDialog)
|
DECLARE_DYNAMIC_CLASS(wxFileDialog)
|
||||||
DECLARE_NO_COPY_CLASS(wxFileDialog)
|
DECLARE_NO_COPY_CLASS(wxFileDialog)
|
||||||
|
@@ -71,12 +71,65 @@
|
|||||||
|
|
||||||
# define wxMAXEXT 5
|
# define wxMAXEXT 5
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// globals
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// standard dialog size
|
||||||
|
static wxRect gs_rectDialog(0, 0, 428, 266);
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// implementation
|
// implementation
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
IMPLEMENT_CLASS(wxFileDialog, wxFileDialogBase)
|
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
|
// wxFileDialog
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -88,13 +141,22 @@ wxFileDialog::wxFileDialog(wxWindow *parent,
|
|||||||
const wxString& wildCard,
|
const wxString& wildCard,
|
||||||
long style,
|
long style,
|
||||||
const wxPoint& pos)
|
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 ) )
|
if ( ( m_dialogStyle & wxMULTIPLE ) && ( m_dialogStyle & wxSAVE ) )
|
||||||
m_dialogStyle &= ~wxMULTIPLE;
|
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
|
void wxFileDialog::GetPaths(wxArrayString& paths) const
|
||||||
{
|
{
|
||||||
paths.Empty();
|
paths.Empty();
|
||||||
@@ -126,6 +188,34 @@ void wxFileDialog::SetPath(const wxString& path)
|
|||||||
m_fileName << _T('.') << ext;
|
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()
|
int wxFileDialog::ShowModal()
|
||||||
{
|
{
|
||||||
HWND hWnd = 0;
|
HWND hWnd = 0;
|
||||||
@@ -149,6 +239,21 @@ int wxFileDialog::ShowModal()
|
|||||||
|
|
||||||
if ( m_dialogStyle & wxFILE_MUST_EXIST )
|
if ( m_dialogStyle & wxFILE_MUST_EXIST )
|
||||||
msw_flags |= OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
|
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 )
|
if (m_dialogStyle & wxMULTIPLE )
|
||||||
{
|
{
|
||||||
@@ -216,7 +321,7 @@ int wxFileDialog::ShowModal()
|
|||||||
if (i > 0)
|
if (i > 0)
|
||||||
i++;
|
i++;
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// fall through
|
// fall through
|
||||||
|
|
||||||
@@ -229,6 +334,7 @@ int wxFileDialog::ShowModal()
|
|||||||
of.lpstrInitialDir = dir.c_str();
|
of.lpstrInitialDir = dir.c_str();
|
||||||
|
|
||||||
of.Flags = msw_flags;
|
of.Flags = msw_flags;
|
||||||
|
of.lpfnHook = wxFileDialogHookFunction;
|
||||||
|
|
||||||
wxArrayString wildDescriptions, wildFilters;
|
wxArrayString wildDescriptions, wildFilters;
|
||||||
|
|
||||||
@@ -285,7 +391,7 @@ int wxFileDialog::ShowModal()
|
|||||||
of.lpstrDefExt = defextBuffer.c_str();
|
of.lpstrDefExt = defextBuffer.c_str();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//== Execute FileDialog >>=================================================
|
//== Execute FileDialog >>=================================================
|
||||||
|
|
||||||
//== Execute FileDialog >>=================================================
|
//== Execute FileDialog >>=================================================
|
||||||
@@ -362,7 +468,7 @@ int wxFileDialog::ShowModal()
|
|||||||
|
|
||||||
m_filterIndex = (int)of.nFilterIndex - 1;
|
m_filterIndex = (int)of.nFilterIndex - 1;
|
||||||
|
|
||||||
if ( !of.nFileExtension ||
|
if ( !of.nFileExtension ||
|
||||||
(of.nFileExtension && fileNameBuffer[of.nFileExtension] == wxT('\0')) )
|
(of.nFileExtension && fileNameBuffer[of.nFileExtension] == wxT('\0')) )
|
||||||
{
|
{
|
||||||
// User has typed a filename without an extension:
|
// User has typed a filename without an extension:
|
||||||
|
Reference in New Issue
Block a user