X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/462e243784a59bea163c43db02749a556b552234..410cb77e910dbb799e9201d54ce56e744ac0a631:/src/msw/dialog.cpp diff --git a/src/msw/dialog.cpp b/src/msw/dialog.cpp index d64bf0d7e7..d1979b9a4e 100644 --- a/src/msw/dialog.cpp +++ b/src/msw/dialog.cpp @@ -29,6 +29,7 @@ #endif #include "wx/msw/private.h" +#include "wx/log.h" #if wxUSE_COMMON_DIALOGS #include @@ -39,8 +40,8 @@ // 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 @@ -57,17 +58,7 @@ extern wxList WXDLLEXPORT wxPendingDelete; END_EVENT_TABLE() #endif -bool wxDialog::MSWProcessMessage(WXMSG* pMsg) -{ - return (::IsDialogMessage((HWND) GetHWND(), (MSG*)pMsg) != 0); -} - -bool wxDialog::MSWOnClose(void) -{ - return Close(); -} - -wxDialog::wxDialog(void) +wxDialog::wxDialog() { m_isShown = FALSE; m_modalShowing = FALSE; @@ -82,9 +73,13 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id, long style, const wxString& name) { +#if wxUSE_TOOLTIPS + m_hwndToolTip = 0; +#endif + SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE)); SetName(name); - + if (!parent) wxTopLevelWindows.Append(this); @@ -115,6 +110,9 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id, if (height < 0) height = 500; + // All dialogs should really have this style + m_windowStyle |= wxTAB_TRAVERSAL; + WXDWORD extendedStyle = MakeExtendedStyle(m_windowStyle); if (m_windowStyle & wxSTAY_ON_TOP) extendedStyle |= WS_EX_TOPMOST; @@ -139,13 +137,13 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id, if ( !hwnd ) { - wxLogError(_("Failed to created dialog.")); + wxLogError(_("Failed to create dialog.")); return FALSE; } SubclassWin(GetHWND()); - + SetWindowText(hwnd, title); SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT)); @@ -159,7 +157,7 @@ void wxDialog::SetModal(bool flag) else if ( m_windowStyle & wxDIALOG_MODAL ) m_windowStyle -= wxDIALOG_MODAL ; - + wxModelessWindows.DeleteObject(this); if (!flag) wxModelessWindows.Append(this); @@ -212,13 +210,13 @@ void wxDialog::OnCharHook(wxKeyEvent& event) { if (event.m_keyCode == WXK_ESCAPE) { - // Behaviour changed in 2.0: we'll send a Cancel message - // to the dialog instead of Close. - wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL); - cancelEvent.SetEventObject( this ); - GetEventHandler()->ProcessEvent(cancelEvent); + // Behaviour changed in 2.0: we'll send a Cancel message + // to the dialog instead of Close. + wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL); + cancelEvent.SetEventObject( this ); + GetEventHandler()->ProcessEvent(cancelEvent); - return; + return; } } // We didn't process this event. @@ -232,7 +230,7 @@ void wxDialog::OnPaint(wxPaintEvent& event) // wxWindow::OnPaint(event); } -void wxDialog::Fit(void) +void wxDialog::Fit() { wxWindow::Fit(); } @@ -242,16 +240,16 @@ void wxDialog::Iconize(bool WXUNUSED(iconize)) // Windows dialog boxes can't be iconized } -bool wxDialog::IsIconized(void) const +bool wxDialog::IsIconized() const { return FALSE; } -void wxDialog::SetClientSize(int width, int height) +void wxDialog::DoSetClientSize(int width, int height) { HWND hWnd = (HWND) GetHWND(); RECT rect; - GetClientRect(hWnd, &rect); + ::GetClientRect(hWnd, &rect); RECT rect2; GetWindowRect(hWnd, &rect2); @@ -279,7 +277,7 @@ void wxDialog::GetPosition(int *x, int *y) const *y = rect.top; } -bool wxDialog::IsShown(void) const +bool wxDialog::IsShown() const { return m_isShown; } @@ -296,13 +294,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); @@ -312,14 +310,20 @@ 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) { BringWindowToTop((HWND) GetHWND()); return TRUE; } - + m_modalShowing = TRUE; wxNode *node = wxModalDialogs.First(); while (node) @@ -352,20 +356,22 @@ 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(), (HACCEL) m_acceleratorTable.GetHACCEL(), &msg)) + if ( m_acceleratorTable.Ok() && + ::TranslateAccelerator((HWND)GetHWND(), + (HACCEL)m_acceleratorTable.GetHACCEL(), + &msg) ) { // Have processed the message } - else if (!IsDialogMessage((HWND) GetHWND(), &msg)) + else if ( !wxTheApp->ProcessMessage((WXMSG *)&msg) ) { TranslateMessage(&msg); DispatchMessage(&msg); @@ -389,7 +395,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)) @@ -410,9 +416,13 @@ bool wxDialog::Show(bool show) // 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 (box->m_winEnabled) +#if 0 + if (box->IsUserEnabled()) +#endif // 0 EnableWindow(hwnd, TRUE); BringWindowToTop(hwnd); } @@ -424,7 +434,9 @@ bool wxDialog::Show(bool show) 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(); } @@ -469,7 +481,7 @@ void wxDialog::SetTitle(const wxString& title) SetWindowText((HWND) GetHWND(), (const char *)title); } -wxString wxDialog::GetTitle(void) const +wxString wxDialog::GetTitle() const { GetWindowText((HWND) GetHWND(), wxBuffer, 1000); return wxString(wxBuffer); @@ -505,7 +517,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); @@ -559,7 +571,7 @@ void wxDialog::OnCancel(wxCommandEvent& event) else { SetReturnCode(wxID_CANCEL); - this->Show(FALSE); + this->Show(FALSE); } } @@ -580,12 +592,12 @@ void wxDialog::OnCloseWindow(wxCloseEvent& event) // The default OnCancel (above) simply ends a modal dialog, and hides a modeless dialog. static wxList closing; - + if ( closing.Member(this) ) return; - + closing.Append(this); - + wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL); cancelEvent.SetEventObject( this ); GetEventHandler()->ProcessEvent(cancelEvent); // This may close the dialog @@ -594,7 +606,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); @@ -605,7 +617,8 @@ void wxDialog::OnSize(wxSizeEvent& WXUNUSED(event)) { // if we're using constraints - do use them #if wxUSE_CONSTRAINTS - if ( GetAutoLayout() ) { + if ( GetAutoLayout() ) + { Layout(); } #endif @@ -619,4 +632,28 @@ void wxDialog::OnSysColourChanged(wxSysColourChangedEvent& event) SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE)); Refresh(); #endif -} \ No newline at end of file +} + +// --------------------------------------------------------------------------- +// 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; +}