X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/789295bf7bd4b58b0270800fb689fce0786dae15..486fd225d4942c852b913636bdc81d9a0a27f7d5:/src/msw/caret.cpp diff --git a/src/msw/caret.cpp b/src/msw/caret.cpp index 29ec0e3f03..daf68049e9 100644 --- a/src/msw/caret.cpp +++ b/src/msw/caret.cpp @@ -30,12 +30,27 @@ #ifndef WX_PRECOMP #include "wx/window.h" + #include "wx/log.h" #endif // WX_PRECOMP #include "wx/caret.h" #include "wx/msw/private.h" +// --------------------------------------------------------------------------- +// macros +// --------------------------------------------------------------------------- + +// under Win16 the caret APIs are void but under Win32 they may return an +// error code which we want to check - this macro does just this +#ifdef __WIN16__ + #define CALL_CARET_API(api, args) api args +#else // Win32 + #define CALL_CARET_API(api, args) \ + if ( !api args ) \ + wxLogLastError(_T(#api)) +#endif // Win16/32 + // =========================================================================== // implementation // =========================================================================== @@ -50,7 +65,7 @@ int wxCaretBase::GetBlinkTime() int blinkTime = ::GetCaretBlinkTime(); if ( !blinkTime ) { - wxLogLastError("GetCaretBlinkTime"); + wxLogLastError(wxT("GetCaretBlinkTime")); } return blinkTime; @@ -59,10 +74,7 @@ int wxCaretBase::GetBlinkTime() //static void wxCaretBase::SetBlinkTime(int milliseconds) { - if ( !::SetCaretBlinkTime(milliseconds) ) - { - wxLogLastError("SetCaretBlinkTime"); - } + CALL_CARET_API(SetCaretBlinkTime, (milliseconds)); } // --------------------------------------------------------------------------- @@ -71,19 +83,15 @@ void wxCaretBase::SetBlinkTime(int milliseconds) bool wxCaret::MSWCreateCaret() { - wxASSERT_MSG( GetWindow(), "caret without window cannot be created" ); - wxASSERT_MSG( IsOk(), "caret of zero size cannot be created" ); + wxASSERT_MSG( GetWindow(), wxT("caret without window cannot be created") ); + wxASSERT_MSG( IsOk(), wxT("caret of zero size cannot be created") ); if ( !m_hasCaret ) { - if ( !::CreateCaret(GetWinHwnd(GetWindow()), 0, m_width, m_height) ) - { - wxLogLastError("CreateCaret"); - } - else - { - m_hasCaret = TRUE; - } + CALL_CARET_API(CreateCaret, (GetWinHwnd(GetWindow()), 0, + m_width, m_height)); + + m_hasCaret = TRUE; } return m_hasCaret; @@ -111,10 +119,7 @@ void wxCaret::OnKillFocus() { m_hasCaret = FALSE; - if ( !::DestroyCaret() ) - { - wxLogLastError("DestroyCaret"); - } + CALL_CARET_API(DestroyCaret, ()); } } @@ -124,27 +129,21 @@ void wxCaret::OnKillFocus() void wxCaret::DoShow() { - wxASSERT_MSG( GetWindow(), "caret without window cannot be shown" ); - wxASSERT_MSG( IsOk(), "caret of zero size cannot be shown" ); - - if ( !m_hasCaret ) - { - (void)MSWCreateCaret(); - } + wxASSERT_MSG( GetWindow(), wxT("caret without window cannot be shown") ); + wxASSERT_MSG( IsOk(), wxT("caret of zero size cannot be shown") ); - if ( !::ShowCaret(GetWinHwnd(GetWindow())) ) + if ( m_hasCaret ) { - wxLogLastError("ShowCaret"); + CALL_CARET_API(ShowCaret, (GetWinHwnd(GetWindow()))); } + //else: will be shown when we get the focus } void wxCaret::DoHide() { - wxASSERT_MSG( m_hasCaret, "cannot hide non existent caret" ); - - if ( !::HideCaret(GetWinHwnd(GetWindow())) ) + if ( m_hasCaret ) { - wxLogLastError("HideCaret"); + CALL_CARET_API(HideCaret, (GetWinHwnd(GetWindow()))); } } @@ -154,10 +153,28 @@ void wxCaret::DoHide() void wxCaret::DoMove() { - wxASSERT_MSG( m_hasCaret, "cannot move non existent caret" ); + if ( m_hasCaret ) + { + wxASSERT_MSG( wxWindow::FindFocus() == GetWindow(), + wxT("how did we lose focus?") ); + + CALL_CARET_API(SetCaretPos, (m_x, m_y)); + } + //else: we don't have caret right now, nothing to do (this does happen) +} + + +// --------------------------------------------------------------------------- +// resizing the caret +// --------------------------------------------------------------------------- - if ( !::SetCaretPos(m_x, m_y) ) +void wxCaret::DoSize() +{ + if ( m_hasCaret ) { - wxLogLastError("SetCaretPos"); + m_hasCaret = FALSE; + CALL_CARET_API(DestroyCaret, ()); + MSWCreateCaret(); + DoMove(); } }