1. corrected problem with label updating in wxProgressDialog

2. optical fix in wxTipDlg: use wxTE_RICH control to avoid vert scrollbar
3. put wxProgressDialog demo into dialogs sample, seems more appropriate
4. fixed a serious bug in wxProgressDialog when its parent was not a top
   level window (as in controls sample)
5. fixes in BringWindowToTop() usage in msw/dialog.cpp
6. fixed another serious bug in wxProgressDialog::OnClose()
7. wxDialog restores focus to previously focused window once again
8. attempts at fixing wxBusyCursor with modal dialogs problem - unsuccessful


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6273 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2000-02-25 02:20:44 +00:00
parent 488fe1feb6
commit abceee76ea
7 changed files with 217 additions and 296 deletions

View File

@@ -70,6 +70,8 @@ wxWindowList wxModelessWindows;
// all modal dialogs currently shown
static wxWindowList wxModalDialogs;
static wxWindow *m_oldFocus;
// ----------------------------------------------------------------------------
// wxWin macros
// ----------------------------------------------------------------------------
@@ -110,6 +112,8 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id,
long style,
const wxString& name)
{
m_oldFocus = FindFocus();
SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
SetName(name);
@@ -206,26 +210,10 @@ wxDialog::~wxDialog()
wxTopLevelWindows.DeleteObject(this);
// this will call BringWindowToTop() if necessary to bring back our parent
// window to top
Show(FALSE);
// VZ: this is bogus and breaks focus handling - it won't be returned to
// the window which had it previosuly if we do this
#if 0
if (m_modalShowing)
{
// For some reason, wxWindows can activate another task altogether
// when a frame is destroyed after a modal dialog has been invoked.
// Try to bring the parent to the top.
// dfgg: I moved this following line from end of function -
// must not call if another window is on top!!
// This can often happen with Close() and delayed deleting
if (GetParent() && GetParent()->GetHWND())
::BringWindowToTop((HWND) GetParent()->GetHWND());
}
m_modalShowing = FALSE;
#endif // 0
if ( !IsModal() )
wxModelessWindows.DeleteObject(this);
@@ -327,194 +315,6 @@ bool wxDialog::IsModal() const
return (GetWindowStyleFlag() & wxDIALOG_MODAL) != 0;
}
// VZ: this is the old version unchanged (reindented only), it will be removed
// as soon as we're sure the new one works correctly
#if 0
bool wxDialog::Show(bool show)
{
m_isShown = show;
if (show)
InitDialog();
bool modal = IsModal();
if (modal)
{
if (show)
{
// find the top level window which had focus before - we will restore
// focus to it later
m_hwndOldFocus = 0;
for ( HWND hwnd = ::GetFocus(); hwnd; hwnd = ::GetParent(hwnd) )
{
m_hwndOldFocus = (WXHWND)hwnd;
}
if (m_modalShowing)
{
BringWindowToTop((HWND) GetHWND());
return TRUE;
}
m_modalShowing = TRUE;
wxNode *node = wxModalDialogs.First();
while (node)
{
wxDialog *box = (wxDialog *)node->Data();
if (box != this)
::EnableWindow((HWND) box->GetHWND(), FALSE);
node = node->Next();
}
// if we don't do it, some window might be deleted while we have pointers
// to them in our disabledWindows list and the program will crash when it
// will try to reenable them after the modal dialog end
wxTheApp->DeletePendingObjects();
wxList disabledWindows;
node = wxModelessWindows.First();
while (node)
{
wxWindow *win = (wxWindow *)node->Data();
if (::IsWindowEnabled((HWND) win->GetHWND()))
{
::EnableWindow((HWND) win->GetHWND(), FALSE);
disabledWindows.Append(win);
}
node = node->Next();
}
ShowWindow((HWND) GetHWND(), SW_SHOW);
EnableWindow((HWND) GetHWND(), TRUE);
BringWindowToTop((HWND) GetHWND());
if ( !wxModalDialogs.Find(this) )
wxModalDialogs.Append(this);
MSG msg;
// Must test whether this dialog still exists: we may not process
// a message before the deletion.
while (wxModalDialogs.Find(this) && m_modalShowing && GetMessage(&msg, NULL, 0, 0))
{
if ( m_acceleratorTable.Ok() &&
::TranslateAccelerator((HWND)GetHWND(),
(HACCEL)m_acceleratorTable.GetHACCEL(),
&msg) )
{
// Have processed the message
}
else if ( !wxTheApp->ProcessMessage((WXMSG *)&msg) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// If we get crashes (as per George Tasker's message) with nested modal dialogs,
// we should try removing the m_modalShowing test
if (m_modalShowing && !::PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE))
// dfgg: NB MUST test m_modalShowing again as the message loop could have triggered
// a Show(FALSE) in the mean time!!!
// Without the test, we might delete the dialog before the end of modal showing.
{
while (wxTheApp->ProcessIdle() && m_modalShowing)
{
// Keep going until we decide we've done enough
}
}
}
// dfgg: now must specifically re-enable all other app windows that we disabled earlier
node=disabledWindows.First();
while(node) {
wxWindow* win = (wxWindow*) node->Data();
if (wxModalDialogs.Find(win) || wxModelessWindows.Find(win))
{
HWND hWnd = (HWND) win->GetHWND();
if (::IsWindow(hWnd))
::EnableWindow(hWnd,TRUE);
}
node=node->Next();
}
}
else // !show
{
::SetFocus((HWND)m_hwndOldFocus);
wxModalDialogs.DeleteObject(this);
wxNode *last = wxModalDialogs.Last();
// If there's still a modal dialog active, we
// enable it, else we enable all modeless windows
if (last)
{
// VZ: I don't understand what this is supposed to do, so I'll leave
// it out for now and look for horrible consequences
wxDialog *box = (wxDialog *)last->Data();
HWND hwnd = (HWND) box->GetHWND();
#if 0
if (box->IsUserEnabled())
#endif // 0
EnableWindow(hwnd, TRUE);
BringWindowToTop(hwnd);
}
else
{
wxNode *node = wxModelessWindows.First();
while (node)
{
wxWindow *win = (wxWindow *)node->Data();
HWND hwnd = (HWND) win->GetHWND();
// Only enable again if not user-disabled.
#if 0
if (win->IsUserEnabled())
#endif // 0
EnableWindow(hwnd, TRUE);
node = node->Next();
}
}
// Try to highlight the correct window (the parent)
HWND hWndParent = 0;
if (GetParent())
{
hWndParent = (HWND) GetParent()->GetHWND();
if (hWndParent)
::BringWindowToTop(hWndParent);
}
ShowWindow((HWND) GetHWND(), SW_HIDE);
m_modalShowing = FALSE;
}
}
else // !modal
{
if (show)
{
ShowWindow((HWND) GetHWND(), SW_SHOW);
BringWindowToTop((HWND) GetHWND());
}
else
{
// Try to highlight the correct window (the parent)
HWND hWndParent = 0;
if (GetParent())
{
hWndParent = (HWND) GetParent()->GetHWND();
if (hWndParent)
::BringWindowToTop(hWndParent);
}
if ( m_hWnd )
ShowWindow((HWND) GetHWND(), SW_HIDE);
}
}
return TRUE;
}
#else // 1
bool wxDialog::IsModalShowing() const
{
return wxModalDialogs.Find((wxDialog *)this) != NULL; // const_cast
@@ -529,14 +329,13 @@ void wxDialog::DoShowModal()
wxWindow *parent = GetParent();
// remember where the focus was
wxWindow *winFocus = FindFocus();
if ( !winFocus )
if ( !m_oldFocus )
{
winFocus = parent;
m_oldFocus = parent;
}
if ( !winFocus )
if ( !m_oldFocus )
{
winFocus = wxTheApp->GetTopWindow();
m_oldFocus = wxTheApp->GetTopWindow();
}
// disable the parent window first
@@ -567,27 +366,29 @@ void wxDialog::DoShowModal()
}
// and restore focus
if ( winFocus && (winFocus != this) )
if ( m_oldFocus && (m_oldFocus != this) )
{
winFocus->SetFocus();
m_oldFocus->SetFocus();
}
}
bool wxDialog::Show(bool show)
{
// The following is required when the parent has been disabled,
// (modal dialogs, or modeless dialogs with disabling such as wxProgressDialog).
// Otherwise the parent disappears behind other windows when the dialog is hidden.
if (!show)
// The following is required when the parent has been disabled, (modal
// dialogs, or modeless dialogs with disabling such as wxProgressDialog).
// Otherwise the parent disappears behind other windows when the dialog is
// hidden.
if ( !show )
{
HWND hwndParent = GetParent() ? (HWND) GetParent()->GetHWND() : (HWND)NULL;
if ( hwndParent )
wxWindow *parent = GetParent();
if ( parent )
{
::BringWindowToTop(hwndParent);
::BringWindowToTop(GetHwndOf(parent));
}
}
if ( !wxDialogBase::Show(show) )
// ShowModal() may be called for already shown dialog
if ( !wxDialogBase::Show(show) && !(show && IsModal()) )
{
// nothing to do
return FALSE;
@@ -616,8 +417,6 @@ bool wxDialog::Show(bool show)
return TRUE;
}
#endif // 0/1
// Replacement for Show(TRUE) for modal dialogs - returns return code
int wxDialog::ShowModal()
{
@@ -728,6 +527,17 @@ long wxDialog::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
// message - otherwise it would close us
processed = !Close();
break;
case WM_SETCURSOR:
// we want to override the busy cursor for modal dialogs:
// typically, wxBeginBusyCursor() is called and then a modal dialog
// is shown, but the modal dialog shouldn't have this cursor
if ( wxIsBusy() )
{
rc = TRUE;
processed = TRUE;
}
}
if ( !processed )