X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/57bd4c6031d438f11af0ec540136f49a928b923c..7f73c398d5bb0d820520dde635c712b8b7c66634:/src/msw/fdrepdlg.cpp diff --git a/src/msw/fdrepdlg.cpp b/src/msw/fdrepdlg.cpp index fbfd80833d..61441c2782 100644 --- a/src/msw/fdrepdlg.cpp +++ b/src/msw/fdrepdlg.cpp @@ -34,13 +34,12 @@ #include "wx/fdrepdlg.h" +#include "wx/msw/mslu.h" + // ---------------------------------------------------------------------------- // functions prototypes // ---------------------------------------------------------------------------- -LRESULT CALLBACK wxFindReplaceWindowProc(HWND hwnd, WXUINT nMsg, - WPARAM wParam, LPARAM lParam); - UINT_PTR CALLBACK wxFindReplaceDialogHookProc(HWND hwnd, UINT uiMsg, WPARAM wParam, @@ -65,10 +64,6 @@ public: void InitFindWhat(const wxString& str); void InitReplaceWith(const wxString& str); - void SubclassDialog(HWND hwnd); - - static UINT GetFindDialogMessage() { return ms_msgFindDialog; } - // only for passing to ::FindText or ::ReplaceText FINDREPLACE *GetPtrFindReplace() { return &m_findReplace; } @@ -77,13 +72,15 @@ public: bool WasClosedByUser() const { return m_wasClosedByUser; } private: - void InitString(const wxString& str, LPTSTR *ppStr, WORD *pLen); + // called from window procedure for ms_msgFindDialog + static bool FindMessageHandler(wxWindow *win, + WXUINT nMsg, + WPARAM wParam, + LPARAM lParam); - // the owner of the dialog - HWND m_hwndOwner; + // copy string str contents to ppStr and fill pLen with its length + void InitString(const wxString& str, LPTSTR *ppStr, WORD *pLen); - // the previous window proc of our owner - WNDPROC m_oldParentWndProc; // the find replace data used by the dialog FINDREPLACE m_findReplace; @@ -119,10 +116,13 @@ wxFindReplaceDialogImpl::wxFindReplaceDialogImpl(wxFindReplaceDialog *dialog, { wxLogLastError(_T("RegisterWindowMessage(FINDMSGSTRING)")); } - } - m_hwndOwner = NULL; - m_oldParentWndProc = NULL; + wxWindow::MSWRegisterMessageHandler + ( + ms_msgFindDialog, + &wxFindReplaceDialogImpl::FindMessageHandler + ); + } m_wasClosedByUser = false; @@ -184,40 +184,21 @@ void wxFindReplaceDialogImpl::InitReplaceWith(const wxString& str) &m_findReplace.wReplaceWithLen); } -void wxFindReplaceDialogImpl::SubclassDialog(HWND hwnd) -{ - m_hwndOwner = hwnd; - - // check that we don't subclass the parent twice: this would be a bad idea - // as then we'd have infinite recursion in wxFindReplaceWindowProc - wxCHECK_RET( wxGetWindowProc(hwnd) != &wxFindReplaceWindowProc, - _T("can't have more than one find dialog currently") ); - - // set the new one and save the old as user data to allow access to it - // from wxFindReplaceWindowProc - m_oldParentWndProc = wxSetWindowProc(hwnd, wxFindReplaceWindowProc); - - wxSetWindowUserData(hwnd, (void *)m_oldParentWndProc); -} - wxFindReplaceDialogImpl::~wxFindReplaceDialogImpl() { delete [] m_findReplace.lpstrFindWhat; delete [] m_findReplace.lpstrReplaceWith; - - if ( m_hwndOwner ) - { - // undo subclassing - wxSetWindowProc(m_hwndOwner, m_oldParentWndProc); - } } // ---------------------------------------------------------------------------- -// Window Proc for handling RegisterWindowMessage(FINDMSGSTRING) +// handler for FINDMSGSTRING message // ---------------------------------------------------------------------------- -LRESULT CALLBACK wxFindReplaceWindowProc(HWND hwnd, WXUINT nMsg, - WPARAM wParam, LPARAM lParam) +bool +wxFindReplaceDialogImpl::FindMessageHandler(wxWindow * WXUNUSED(win), + WXUINT WXUNUSED_UNLESS_DEBUG(nMsg), + WPARAM WXUNUSED(wParam), + LPARAM lParam) { #if wxUSE_UNICODE_MSLU static unsigned long s_lastMsgFlags = 0; @@ -229,100 +210,89 @@ LRESULT CALLBACK wxFindReplaceWindowProc(HWND hwnd, WXUINT nMsg, static bool s_blockMsg = false; #endif // wxUSE_UNICODE_MSLU - if ( nMsg == wxFindReplaceDialogImpl::GetFindDialogMessage() ) - { - FINDREPLACE *pFR = (FINDREPLACE *)lParam; + wxASSERT_MSG( nMsg == ms_msgFindDialog, _T("unexpected message received") ); + + FINDREPLACE *pFR = (FINDREPLACE *)lParam; #if wxUSE_UNICODE_MSLU - // This is a hack for a MSLU problem: Versions up to 1.0.4011 - // of UNICOWS.DLL send the correct UNICODE item after button press - // and a bogus ANSI mode item right after this, so lets ignore - // the second bogus message - if ( wxUsingUnicowsDll() && s_lastMsgFlags == pFR->Flags ) - { - s_lastMsgFlags = 0; - return 0; - } - s_lastMsgFlags = pFR->Flags; + // This is a hack for a MSLU problem: Versions up to 1.0.4011 + // of UNICOWS.DLL send the correct UNICODE item after button press + // and a bogus ANSI mode item right after this, so lets ignore + // the second bogus message + if ( wxUsingUnicowsDll() && s_lastMsgFlags == pFR->Flags ) + { + s_lastMsgFlags = 0; + return 0; + } + s_lastMsgFlags = pFR->Flags; #endif // wxUSE_UNICODE_MSLU - wxFindReplaceDialog *dialog = (wxFindReplaceDialog *)pFR->lCustData; + wxFindReplaceDialog *dialog = (wxFindReplaceDialog *)pFR->lCustData; - // map flags from Windows - wxEventType evtType; + // map flags from Windows + wxEventType evtType; - bool replace = false; - if ( pFR->Flags & FR_DIALOGTERM ) - { - // we have to notify the dialog that it's being closed by user and - // not deleted programmatically as it behaves differently in these - // 2 cases - dialog->GetImpl()->SetClosedByUser(); + bool replace = false; + if ( pFR->Flags & FR_DIALOGTERM ) + { + // we have to notify the dialog that it's being closed by user and + // not deleted programmatically as it behaves differently in these + // 2 cases + dialog->GetImpl()->SetClosedByUser(); - evtType = wxEVT_COMMAND_FIND_CLOSE; - } - else if ( pFR->Flags & FR_FINDNEXT ) - { - evtType = wxEVT_COMMAND_FIND_NEXT; - } - else if ( pFR->Flags & FR_REPLACE ) - { - evtType = wxEVT_COMMAND_FIND_REPLACE; + evtType = wxEVT_COMMAND_FIND_CLOSE; + } + else if ( pFR->Flags & FR_FINDNEXT ) + { + evtType = wxEVT_COMMAND_FIND_NEXT; + } + else if ( pFR->Flags & FR_REPLACE ) + { + evtType = wxEVT_COMMAND_FIND_REPLACE; - replace = true; - } - else if ( pFR->Flags & FR_REPLACEALL ) - { - evtType = wxEVT_COMMAND_FIND_REPLACE_ALL; + replace = true; + } + else if ( pFR->Flags & FR_REPLACEALL ) + { + evtType = wxEVT_COMMAND_FIND_REPLACE_ALL; - replace = true; - } - else - { - wxFAIL_MSG( _T("unknown find dialog event") ); + replace = true; + } + else + { + wxFAIL_MSG( _T("unknown find dialog event") ); - return 0; - } + return 0; + } - wxUint32 flags = 0; - if ( pFR->Flags & FR_DOWN ) - flags |= wxFR_DOWN; - if ( pFR->Flags & FR_WHOLEWORD ) - flags |= wxFR_WHOLEWORD; - if ( pFR->Flags & FR_MATCHCASE ) - flags |= wxFR_MATCHCASE; - - wxFindDialogEvent event(evtType, dialog->GetId()); - event.SetEventObject(dialog); - event.SetFlags(flags); - event.SetFindString(pFR->lpstrFindWhat); - if ( replace ) - { - event.SetReplaceString(pFR->lpstrReplaceWith); - } + wxUint32 flags = 0; + if ( pFR->Flags & FR_DOWN ) + flags |= wxFR_DOWN; + if ( pFR->Flags & FR_WHOLEWORD ) + flags |= wxFR_WHOLEWORD; + if ( pFR->Flags & FR_MATCHCASE ) + flags |= wxFR_MATCHCASE; + + wxFindDialogEvent event(evtType, dialog->GetId()); + event.SetEventObject(dialog); + event.SetFlags(flags); + event.SetFindString(pFR->lpstrFindWhat); + if ( replace ) + { + event.SetReplaceString(pFR->lpstrReplaceWith); + } #if wxUSE_UNICODE_MSLU - s_blockMsg = true; + s_blockMsg = true; #endif // wxUSE_UNICODE_MSLU - dialog->Send(event); + dialog->Send(event); #if wxUSE_UNICODE_MSLU - s_blockMsg = false; -#endif // wxUSE_UNICODE_MSLU - } -#if wxUSE_UNICODE_MSLU - else if ( !s_blockMsg ) - s_lastMsgFlags = 0; + s_blockMsg = false; #endif // wxUSE_UNICODE_MSLU - WNDPROC wndProc = (WNDPROC)wxGetWindowUserData(hwnd); - - // sanity check - wxASSERT_MSG( wndProc != wxFindReplaceWindowProc, - _T("infinite recursion detected") ); - - return ::CallWindowProc(wndProc, hwnd, nMsg, wParam, lParam); + return true; } // ---------------------------------------------------------------------------- @@ -340,7 +310,7 @@ wxFindReplaceDialogHookProc(HWND hwnd, FINDREPLACE *pFR = (FINDREPLACE *)lParam; wxFindReplaceDialog *dialog = (wxFindReplaceDialog *)pFR->lCustData; - ::SetWindowText(hwnd, dialog->GetTitle()); + ::SetWindowText(hwnd, dialog->GetTitle().wx_str()); // don't return FALSE from here or the dialog won't be shown return TRUE; @@ -379,20 +349,23 @@ wxFindReplaceDialog::wxFindReplaceDialog(wxWindow *parent, wxFindReplaceDialog::~wxFindReplaceDialog() { - // the dialog might have been already deleted if the user closed it - // manually but in this case we should have got a notification about it and - // the flagmust have been set - if ( !m_impl->WasClosedByUser() ) + if ( m_impl ) { - // if it wasn't, delete the dialog ourselves - if ( !::DestroyWindow(GetHwnd()) ) + // the dialog might have been already deleted if the user closed it + // manually but in this case we should have got a notification about it + // and the flag must have been set + if ( !m_impl->WasClosedByUser() ) { - wxLogLastError(_T("DestroyWindow(find dialog)")); + // if it wasn't, delete the dialog ourselves + if ( !::DestroyWindow(GetHwnd()) ) + { + wxLogLastError(_T("DestroyWindow(find dialog)")); + } } - } - // unsubclass the parent - delete m_impl; + // unsubclass the parent + delete m_impl; + } // prevent the base class dtor from trying to hide us! m_isShown = false; @@ -476,9 +449,6 @@ bool wxFindReplaceDialog::Show(bool show) return false; } - // subclass parent window in order to get FINDMSGSTRING message - m_impl->SubclassDialog(GetHwndOf(m_parent)); - if ( !::ShowWindow(hwnd, SW_SHOW) ) { wxLogLastError(_T("ShowWindow(find dialog)"));