diff --git a/include/wx/dc.h b/include/wx/dc.h index b11ec40d9a..faed2c0dce 100644 --- a/include/wx/dc.h +++ b/include/wx/dc.h @@ -963,5 +963,66 @@ private: DECLARE_NO_COPY_CLASS(wxDCClipper) }; +// ---------------------------------------------------------------------------- +// creates an overlay over an existing window, allowing for manipulations like +// rubberbanding etc. this API is not stable yet, not to be used outside wx +// internal code +// ---------------------------------------------------------------------------- + +class wxOverlayImpl ; +class wxWindowDC ; + +class WXDLLEXPORT wxOverlay +{ +public : + wxOverlay(); + ~wxOverlay(); + + // clears the overlay without restoring the former state + // to be done eg when the window content has been changed and repainted + void Reset(); + +private : + friend class WXDLLEXPORT wxDCOverlay; + + // returns true if it has been setup + bool IsOk(); + + void Init( wxWindowDC* dc, int x , int y , int width , int height ); + + void BeginDrawing( wxWindowDC* dc); + + void EndDrawing( wxWindowDC* dc); + + void Clear( wxWindowDC* dc); + + wxOverlayImpl* m_impl; + + bool m_inDrawing; +} ; + +class WXDLLEXPORT wxDCOverlay +{ +public : + // connects this overlay to the corresponding drawing dc, if the overlay is not initialized yet + // this call will do so + wxDCOverlay(wxOverlay &overlay, wxWindowDC *dc, int x , int y , int width , int height); + + // convenience wrapper that behaves the same using the entire area of the dc + wxDCOverlay(wxOverlay &overlay, wxWindowDC *dc); + + // removes the connection between the overlay and the dc + virtual ~wxDCOverlay(); + + // clears the layer, restoring the state at the last init + void Clear(); +private : + void Init(wxWindowDC *dc, int x , int y , int width , int height); + + wxOverlay& m_overlay; + + wxWindowDC* m_dc; +} ; + #endif // _WX_DC_H_BASE_ diff --git a/include/wx/generic/caret.h b/include/wx/generic/caret.h index 644917c28a..78ca72141e 100644 --- a/include/wx/generic/caret.h +++ b/include/wx/generic/caret.h @@ -26,6 +26,18 @@ private: wxCaret *m_caret; }; +#ifndef wxUSE_OVERLAY + #if defined(wxMAC_USE_CORE_GRAPHICS) && wxMAC_USE_CORE_GRAPHICS + #define wxUSE_OVERLAY 1 + #else + #define wxUSE_OVERLAY 0 + #endif +#endif + +#if wxUSE_OVERLAY + #include "wx/dc.h" +#endif + class WXDLLIMPEXP_CORE wxCaret : public wxCaretBase { public: @@ -70,11 +82,16 @@ private: // GTK specific initialization void InitGeneric(); +#if wxUSE_OVERLAY + // the overlay for displaying the caret + wxOverlay m_overlay; +#else // the bitmap holding the part of window hidden by the caret when it was // at (m_xOld, m_yOld) wxBitmap m_bmpUnderCaret; int m_xOld, m_yOld; +#endif wxCaretTimer m_timer; bool m_blinkedOut, // true => caret hidden right now