// Author: Markus Greither and Vadim Zeitlin
// Modified by:
// Created: 23/03/2001
-// RCS-ID:
+// RCS-ID: $Id$
// Copyright: (c) Markus Greither
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// headers
// ----------------------------------------------------------------------------
-#ifdef __GNUG__
- #pragma implementation "mswfdrepdlg.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#if wxUSE_FINDREPLDLG
#ifndef WX_PRECOMP
+ #include "wx/msw/wrapcdlg.h"
#include "wx/intl.h"
#include "wx/log.h"
#endif
-#include "wx/msw/private.h"
-
-#if !defined(__WIN32__) || defined(__SALFORDC__) || defined(__WXWINE__)
- #include <commdlg.h>
-#endif
-
#include "wx/fdrepdlg.h"
+#include "wx/msw/mslu.h"
+
// ----------------------------------------------------------------------------
// functions prototypes
// ----------------------------------------------------------------------------
-LRESULT APIENTRY wxFindReplaceWindowProc(HWND hwnd, WXUINT nMsg,
- WPARAM wParam, LPARAM lParam);
+LRESULT CALLBACK wxFindReplaceWindowProc(HWND hwnd, WXUINT nMsg,
+ WPARAM wParam, LPARAM lParam);
-UINT CALLBACK wxFindReplaceDialogHookProc(HWND hwnd,
- UINT uiMsg,
- WPARAM wParam,
- LPARAM lParam);
+UINT_PTR CALLBACK wxFindReplaceDialogHookProc(HWND hwnd,
+ UINT uiMsg,
+ WPARAM wParam,
+ LPARAM lParam);
// ----------------------------------------------------------------------------
// wxWin macros
FINDREPLACE *GetPtrFindReplace() { return &m_findReplace; }
// set/query the "closed by user" flag
- void SetClosedByUser() { m_wasClosedByUser = TRUE; }
+ void SetClosedByUser() { m_wasClosedByUser = true; }
bool WasClosedByUser() const { return m_wasClosedByUser; }
private:
// the find replace data used by the dialog
FINDREPLACE m_findReplace;
- // TRUE if the user closed us, FALSE otherwise
+ // true if the user closed us, false otherwise
bool m_wasClosedByUser;
// registered Message for Dialog
static UINT ms_msgFindDialog;
+
+ DECLARE_NO_COPY_CLASS(wxFindReplaceDialogImpl)
};
UINT wxFindReplaceDialogImpl::ms_msgFindDialog = 0;
m_hwndOwner = NULL;
m_oldParentWndProc = NULL;
- m_wasClosedByUser = FALSE;
+ m_wasClosedByUser = false;
wxZeroMemory(m_findReplace);
*ppStr = new wxChar[len];
wxStrcpy(*ppStr, str);
- *pLen = len;
+ *pLen = (WORD)len;
}
void wxFindReplaceDialogImpl::InitFindWhat(const wxString& str)
// check that we don't subclass the parent twice: this would be a bad idea
// as then we'd have infinite recursion in wxFindReplaceWindowProc
- if ( !wxCheckWindowWndProc((WXHWND)hwnd, (WXFARPROC)wxFindReplaceWindowProc) )
- {
- WNDPROC oldParentWndProc = (WNDPROC)::GetWindowLong(hwnd, GWL_WNDPROC);
- // save old wnd proc elsewhere to access it from
- // wxFindReplaceWindowProc
- m_oldParentWndProc = oldParentWndProc;
- (void)::SetWindowLong(hwnd, GWL_USERDATA, (LONG)oldParentWndProc);
-
- // and set the new one
- (void)::SetWindowLong(hwnd, GWL_WNDPROC, (LONG)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()
if ( m_hwndOwner )
{
- ::SetWindowLong(m_hwndOwner, GWL_WNDPROC, (LONG)m_oldParentWndProc);
+ // undo subclassing
+ wxSetWindowProc(m_hwndOwner, m_oldParentWndProc);
}
}
// Window Proc for handling RegisterWindowMessage(FINDMSGSTRING)
// ----------------------------------------------------------------------------
-LRESULT APIENTRY wxFindReplaceWindowProc(HWND hwnd, WXUINT nMsg,
+LRESULT CALLBACK wxFindReplaceWindowProc(HWND hwnd, WXUINT nMsg,
WPARAM wParam, LPARAM lParam)
{
+#if wxUSE_UNICODE_MSLU
+ static unsigned long s_lastMsgFlags = 0;
+
+ // This flag helps us to identify the bogus ANSI message
+ // sent by UNICOWS.DLL (see below)
+ // while we're sending our message to the dialog
+ // we ignore possible messages sent in between
+ static bool s_blockMsg = false;
+#endif // wxUSE_UNICODE_MSLU
+
if ( nMsg == wxFindReplaceDialogImpl::GetFindDialogMessage() )
{
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;
+#endif // wxUSE_UNICODE_MSLU
+
wxFindReplaceDialog *dialog = (wxFindReplaceDialog *)pFR->lCustData;
// map flags from Windows
wxEventType evtType;
- bool replace = FALSE;
+ bool replace = false;
if ( pFR->Flags & FR_DIALOGTERM )
{
// we have to notify the dialog that it's being closed by user and
{
evtType = wxEVT_COMMAND_FIND_REPLACE;
- replace = TRUE;
+ replace = true;
}
else if ( pFR->Flags & FR_REPLACEALL )
{
evtType = wxEVT_COMMAND_FIND_REPLACE_ALL;
- replace = TRUE;
+ replace = true;
}
else
{
event.SetReplaceString(pFR->lpstrReplaceWith);
}
+#if wxUSE_UNICODE_MSLU
+ s_blockMsg = true;
+#endif // wxUSE_UNICODE_MSLU
+
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;
+#endif // wxUSE_UNICODE_MSLU
- WNDPROC wndProc = (WNDPROC)::GetWindowLong(hwnd, GWL_USERDATA);
+ WNDPROC wndProc = (WNDPROC)wxGetWindowUserData(hwnd);
// sanity check
wxASSERT_MSG( wndProc != wxFindReplaceWindowProc,
// Find/replace dialog hook proc
// ----------------------------------------------------------------------------
-UINT CALLBACK wxFindReplaceDialogHookProc(HWND hwnd,
- UINT uiMsg,
- WPARAM WXUNUSED(wParam),
- LPARAM lParam)
+UINT_PTR CALLBACK
+wxFindReplaceDialogHookProc(HWND hwnd,
+ UINT uiMsg,
+ WPARAM WXUNUSED(wParam),
+ LPARAM lParam)
{
if ( uiMsg == WM_INITDIALOG )
{
m_FindReplaceData = NULL;
// as we're created in the hidden state, bring the internal flag in sync
- m_isShown = FALSE;
+ m_isShown = false;
}
wxFindReplaceDialog::wxFindReplaceDialog(wxWindow *parent,
delete m_impl;
// prevent the base class dtor from trying to hide us!
- m_isShown = FALSE;
+ m_isShown = false;
// and from destroying our window [again]
m_hWnd = (WXHWND)NULL;
if ( !wxWindowBase::Show(show) )
{
// visibility status didn't change
- return FALSE;
+ return false;
}
// do we already have the dialog window?
// yes, just use it
(void)::ShowWindow(GetHwnd(), show ? SW_SHOW : SW_HIDE);
- return TRUE;
+ return true;
}
if ( !show )
{
// well, it doesn't exist which is as good as being hidden
- return TRUE;
+ return true;
}
- wxCHECK_MSG( m_FindReplaceData, FALSE, _T("call Create() first!") );
+ wxCHECK_MSG( m_FindReplaceData, false, _T("call Create() first!") );
wxASSERT_MSG( !m_impl, _T("why don't we have the window then?") );
delete m_impl;
m_impl = NULL;
- return FALSE;
+ return false;
}
// subclass parent window in order to get FINDMSGSTRING message
m_hWnd = (WXHWND)hwnd;
- return TRUE;
+ return true;
}
// ----------------------------------------------------------------------------
}
#endif // wxUSE_FINDREPLDLG
-