X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/789295bf7bd4b58b0270800fb689fce0786dae15..f8b13b5868b380ba53a0c030d6349f72dc4a9fae:/include/wx/caret.h diff --git a/include/wx/caret.h b/include/wx/caret.h index 6a314bc94e..c3d3ebd2bd 100644 --- a/include/wx/caret.h +++ b/include/wx/caret.h @@ -1,28 +1,38 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: caret.h +// Name: wx/caret.h // Purpose: wxCaretBase class - the interface of wxCaret // Author: Vadim Zeitlin // Modified by: // Created: 23.05.99 // RCS-ID: $Id$ -// Copyright: (c) wxWindows team +// Copyright: (c) wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// #ifndef _WX_CARET_H_BASE_ #define _WX_CARET_H_BASE_ +#include "wx/defs.h" + +#if wxUSE_CARET + // --------------------------------------------------------------------------- // forward declarations // --------------------------------------------------------------------------- -class WXDLLEXPORT wxWindow; -class WXDLLEXPORT wxWindowBase; +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxWindowBase; -// --------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// headers we have to include +// ---------------------------------------------------------------------------- + +#include "wx/gdicmn.h" // for wxPoint, wxSize + +// ---------------------------------------------------------------------------- // A caret is a blinking cursor showing the position where the typed text will // appear. It can be either a solid block or a custom bitmap (TODO) -// --------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- class WXDLLEXPORT wxCaretBase { @@ -47,6 +57,9 @@ public: (void)Create(window, size); } + // a virtual dtor has been provided since this class has virtual members + virtual ~wxCaretBase() { } + // Create() functions - same as ctor but returns the success code // -------------------------------------------------------------- @@ -63,6 +76,9 @@ public: // is the caret valid? bool IsOk() const { return m_width != 0 && m_height != 0; } + // is the caret currently shown? + bool IsVisible() const { return m_countVisible > 0; } + // get the caret position void GetPosition(int *x, int *y) const { @@ -82,6 +98,15 @@ public: // get the window we're associated with wxWindow *GetWindow() const { return (wxWindow *)m_window; } + // change the size of the caret + void SetSize(int width, int height) { + m_width = width; + m_height = height; + DoSize(); + } + void SetSize(const wxSize& size) { SetSize(size.x, size.y); } + + // operations // ---------- @@ -92,20 +117,20 @@ public: // show/hide the caret (should be called by wxWindow when needed): // Show() must be called as many times as Hide() + 1 to make the caret // visible - virtual void Show(bool show = TRUE) + virtual void Show(bool show = true) { if ( show ) { - if ( ++m_countVisible > 0 ) + if ( m_countVisible++ == 0 ) DoShow(); } else { - if ( --m_countVisible < 1 ) + if ( --m_countVisible == 0 ) DoHide(); } } - virtual void Hide() { Show(FALSE); } + virtual void Hide() { Show(false); } // blink time is measured in milliseconds and is the time elapsed // between 2 inversions of the caret (blink time of the caret is common @@ -130,13 +155,14 @@ protected: m_width = width; m_height = height; - return TRUE; + return true; } // pure virtuals to implement in the derived class virtual void DoShow() = 0; virtual void DoHide() = 0; virtual void DoMove() = 0; + virtual void DoSize() { } // the common initialization void Init() @@ -160,19 +186,67 @@ protected: int m_countVisible; private: - DECLARE_NO_COPY_CLASS(wxCaretBase); + DECLARE_NO_COPY_CLASS(wxCaretBase) }; // --------------------------------------------------------------------------- // now include the real thing // --------------------------------------------------------------------------- -#ifdef __WXMSW__ +#if defined(__WXMSW__) #include "wx/msw/caret.h" #else - // not implemented yet - typedef wxCaretBase wxCaret; + #include "wx/generic/caret.h" #endif // platform -#endif // _WX_CARET_H_BASE_ +// ---------------------------------------------------------------------------- +// wxCaretSuspend: a simple class which hides the caret in its ctor and +// restores it in the dtor, this should be used when drawing on the screen to +// avoid overdrawing the caret +// ---------------------------------------------------------------------------- + +#ifdef wxHAS_CARET_USING_OVERLAYS + +// we don't need to hide the caret if it's rendered using overlays +class WXDLLEXPORT wxCaretSuspend +{ +public: + wxCaretSuspend(wxWindow *WXUNUSED(win)) {} + + DECLARE_NO_COPY_CLASS(wxCaretSuspend) +}; + +#else // !wxHAS_CARET_USING_OVERLAYS + +class WXDLLEXPORT wxCaretSuspend +{ +public: + wxCaretSuspend(wxWindow *win) + { + m_caret = win->GetCaret(); + m_show = false; + if ( m_caret && m_caret->IsVisible() ) + { + m_caret->Hide(); + m_show = true; + } + } + ~wxCaretSuspend() + { + if ( m_caret && m_show ) + m_caret->Show(); + } + +private: + wxCaret *m_caret; + bool m_show; + + DECLARE_NO_COPY_CLASS(wxCaretSuspend) +}; + +#endif // wxHAS_CARET_USING_OVERLAYS/!wxHAS_CARET_USING_OVERLAYS + +#endif // wxUSE_CARET + +#endif // _WX_CARET_H_BASE_