X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cc2b747254c8ec8eebba7fb63cd5da5d7166c0db..c6e62f74fcac5b62889b59e7ce7a41d0ce884d7b:/src/msw/dialog.cpp diff --git a/src/msw/dialog.cpp b/src/msw/dialog.cpp index ec5d44eae2..2820cfaa33 100644 --- a/src/msw/dialog.cpp +++ b/src/msw/dialog.cpp @@ -26,6 +26,8 @@ #include "wx/frame.h" #include "wx/app.h" #include "wx/settings.h" +#include "wx/intl.h" +#include "wx/log.h" #endif #include "wx/msw/private.h" @@ -40,11 +42,10 @@ // Lists to keep track of windows, so we can disable/enable them // for modal dialogs -wxList wxModalDialogs; -wxList wxModelessWindows; // Frames and modeless dialogs +wxWindowList wxModalDialogs; +wxWindowList wxModelessWindows; // Frames and modeless dialogs extern wxList WXDLLEXPORT wxPendingDelete; -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxPanel) BEGIN_EVENT_TABLE(wxDialog, wxPanel) @@ -56,14 +57,8 @@ extern wxList WXDLLEXPORT wxPendingDelete; EVT_SYS_COLOUR_CHANGED(wxDialog::OnSysColourChanged) EVT_CLOSE(wxDialog::OnCloseWindow) END_EVENT_TABLE() -#endif -bool wxDialog::MSWOnClose(void) -{ - return Close(); -} - -wxDialog::wxDialog(void) +wxDialog::wxDialog() { m_isShown = FALSE; m_modalShowing = FALSE; @@ -125,13 +120,13 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id, // Allows creation of dialogs with & without captions under MSWindows, // resizeable or not (but a resizeable dialog always has caption - // otherwise it would look too strange) - const char *dlg; - if ( style & wxTHICK_FRAME ) - dlg = "wxResizeableDialog"; + const wxChar *dlg; + if ( style & wxRESIZE_BORDER ) + dlg = wxT("wxResizeableDialog"); else if ( style & wxCAPTION ) - dlg = "wxCaptionDialog"; + dlg = wxT("wxCaptionDialog"); else - dlg = "wxNoCaptionDialog"; + dlg = wxT("wxNoCaptionDialog"); MSWCreate(m_windowId, parent, NULL, this, NULL, x, y, width, height, 0, // style is not used if we have dlg template @@ -174,9 +169,10 @@ wxDialog::~wxDialog() wxTopLevelWindows.DeleteObject(this); + Show(FALSE); + if (m_modalShowing) { - Show(FALSE); // 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. @@ -188,14 +184,10 @@ wxDialog::~wxDialog() } m_modalShowing = FALSE; - if ( GetHWND() ) - ShowWindow((HWND) GetHWND(), SW_HIDE); if ( (GetWindowStyleFlag() & wxDIALOG_MODAL) != wxDIALOG_MODAL ) wxModelessWindows.DeleteObject(this); - UnsubclassWin(); - // If this is the last top-level window, exit. if (wxTheApp && (wxTopLevelWindows.Number() == 0)) { @@ -221,6 +213,9 @@ void wxDialog::OnCharHook(wxKeyEvent& event) cancelEvent.SetEventObject( this ); GetEventHandler()->ProcessEvent(cancelEvent); + // ensure that there is another message for this window so the + // ShowModal loop will exit and won't get stuck in GetMessage(). + ::PostMessage(GetHwnd(), WM_NULL, 0, 0); return; } } @@ -235,7 +230,7 @@ void wxDialog::OnPaint(wxPaintEvent& event) // wxWindow::OnPaint(event); } -void wxDialog::Fit(void) +void wxDialog::Fit() { wxWindow::Fit(); } @@ -245,7 +240,7 @@ void wxDialog::Iconize(bool WXUNUSED(iconize)) // Windows dialog boxes can't be iconized } -bool wxDialog::IsIconized(void) const +bool wxDialog::IsIconized() const { return FALSE; } @@ -282,11 +277,16 @@ void wxDialog::GetPosition(int *x, int *y) const *y = rect.top; } -bool wxDialog::IsShown(void) const +bool wxDialog::IsShown() const { return m_isShown; } +bool wxDialog::IsModal() const +{ + return wxModalDialogs.Find((wxDialog *)this) != 0; // const_cast +} + bool wxDialog::Show(bool show) { m_isShown = show; @@ -299,13 +299,13 @@ bool wxDialog::Show(bool show) #if WXGARBAGE_COLLECTION_ON /* MATTHEW: GC */ if (!modal) { if (show) { - if (!wxModelessWindows.Member(this)) - wxModelessWindows.Append(this); + if (!wxModelessWindows.Find(this)) + wxModelessWindows.Append(this); } else wxModelessWindows.DeleteObject(this); } if (show) { - if (!wxTopLevelWindows.Member(this)) + if (!wxTopLevelWindows.Find(this)) wxTopLevelWindows.Append(this); } else wxTopLevelWindows.DeleteObject(this); @@ -315,7 +315,13 @@ bool wxDialog::Show(bool show) { if (show) { - m_hwndOldFocus = (WXHWND)::GetFocus(); + // 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) { @@ -355,13 +361,13 @@ bool wxDialog::Show(bool show) EnableWindow((HWND) GetHWND(), TRUE); BringWindowToTop((HWND) GetHWND()); - if (!wxModalDialogs.Member(this)) + 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.Member(this) && m_modalShowing && GetMessage(&msg, NULL, 0, 0)) + while (wxModalDialogs.Find(this) && m_modalShowing && GetMessage(&msg, NULL, 0, 0)) { if ( m_acceleratorTable.Ok() && ::TranslateAccelerator((HWND)GetHWND(), @@ -394,7 +400,7 @@ bool wxDialog::Show(bool show) node=disabledWindows.First(); while(node) { wxWindow* win = (wxWindow*) node->Data(); - if (wxModalDialogs.Member(win) || wxModelessWindows.Member(win)) + if (wxModalDialogs.Find(win) || wxModelessWindows.Find(win)) { HWND hWnd = (HWND) win->GetHWND(); if (::IsWindow(hWnd)) @@ -469,7 +475,9 @@ bool wxDialog::Show(bool show) if (hWndParent) ::BringWindowToTop(hWndParent); } - ShowWindow((HWND) GetHWND(), SW_HIDE); + + if ( m_hWnd ) + ShowWindow((HWND) GetHWND(), SW_HIDE); } } return TRUE; @@ -477,10 +485,10 @@ bool wxDialog::Show(bool show) void wxDialog::SetTitle(const wxString& title) { - SetWindowText((HWND) GetHWND(), (const char *)title); + SetWindowText((HWND) GetHWND(), title.c_str()); } -wxString wxDialog::GetTitle(void) const +wxString wxDialog::GetTitle() const { GetWindowText((HWND) GetHWND(), wxBuffer, 1000); return wxString(wxBuffer); @@ -516,7 +524,7 @@ void wxDialog::Centre(int direction) } // Replacement for Show(TRUE) for modal dialogs - returns return code -int wxDialog::ShowModal(void) +int wxDialog::ShowModal() { m_windowStyle |= wxDIALOG_MODAL; Show(TRUE); @@ -605,7 +613,7 @@ void wxDialog::OnCloseWindow(wxCloseEvent& event) } // Destroy the window (delayed, if a managed window) -bool wxDialog::Destroy(void) +bool wxDialog::Destroy() { if (!wxPendingDelete.Member(this)) wxPendingDelete.Append(this); @@ -616,7 +624,8 @@ void wxDialog::OnSize(wxSizeEvent& WXUNUSED(event)) { // if we're using constraints - do use them #if wxUSE_CONSTRAINTS - if ( GetAutoLayout() ) { + if ( GetAutoLayout() ) + { Layout(); } #endif @@ -631,3 +640,27 @@ void wxDialog::OnSysColourChanged(wxSysColourChangedEvent& event) Refresh(); #endif } + +// --------------------------------------------------------------------------- +// dialog window proc +// --------------------------------------------------------------------------- + +long wxDialog::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) +{ + long rc = 0; + bool processed = FALSE; + + switch ( message ) + { + case WM_CLOSE: + // if we can't close, tell the system that we processed the + // message - otherwise it would close us + processed = !Close(); + break; + } + + if ( !processed ) + rc = wxWindow::MSWWindowProc(message, wParam, lParam); + + return rc; +}