wxRichTextCtrl native caret now flashes, for wxMac/Core Graphics mode

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61096 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2009-06-17 21:10:04 +00:00
parent 209bf72273
commit a188ac2988
2 changed files with 49 additions and 10 deletions

View File

@@ -74,10 +74,14 @@
#define wxRichTextAttr wxTextAttr #define wxRichTextAttr wxTextAttr
#define wxTextAttrEx wxTextAttr #define wxTextAttrEx wxTextAttr
// Setting wxRICHTEXT_USE_OWN_CARET to 1 implements a non-flashing // Setting wxRICHTEXT_USE_OWN_CARET to 1 implements a
// cursor reliably without using wxClientDC in case there // cursor reliably without using wxClientDC in case there
// are platform-specific problems with the generic caret. // are platform-specific problems with the generic caret.
#ifdef __WXMAC__
#define wxRICHTEXT_USE_OWN_CARET 1
#else
#define wxRICHTEXT_USE_OWN_CARET 0 #define wxRICHTEXT_USE_OWN_CARET 0
#endif
// Switch off for binary compatibility, on for faster drawing // Switch off for binary compatibility, on for faster drawing
// Note: this seems to be buggy (overzealous use of extents) so // Note: this seems to be buggy (overzealous use of extents) so

View File

@@ -26,6 +26,7 @@
#include "wx/settings.h" #include "wx/settings.h"
#endif #endif
#include "wx/timer.h"
#include "wx/textfile.h" #include "wx/textfile.h"
#include "wx/ffile.h" #include "wx/ffile.h"
#include "wx/filename.h" #include "wx/filename.h"
@@ -67,18 +68,30 @@ wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_BUFFER_RESET, wxRichTextEvent );
* wxRICHTEXT_USE_OWN_CARET is set in richtextbuffer.h. * wxRICHTEXT_USE_OWN_CARET is set in richtextbuffer.h.
*/ */
class wxRichTextCaret;
class wxRichTextCaretTimer: public wxTimer
{
public:
wxRichTextCaretTimer(wxRichTextCaret* caret)
{
m_caret = caret;
}
virtual void Notify();
wxRichTextCaret* m_caret;
};
class wxRichTextCaret: public wxCaret class wxRichTextCaret: public wxCaret
{ {
public: public:
// ctors // ctors
// ----- // -----
// default - use Create() // default - use Create()
wxRichTextCaret() { Init(); } wxRichTextCaret(): m_timer(this) { Init(); }
// creates a block caret associated with the given window // creates a block caret associated with the given window
wxRichTextCaret(wxRichTextCtrl *window, int width, int height) wxRichTextCaret(wxRichTextCtrl *window, int width, int height)
: wxCaret(window, width, height) { Init(); m_richTextCtrl = window; } : wxCaret(window, width, height), m_timer(this) { Init(); m_richTextCtrl = window; }
wxRichTextCaret(wxRichTextCtrl *window, const wxSize& size) wxRichTextCaret(wxRichTextCtrl *window, const wxSize& size)
: wxCaret(window, size) { Init(); m_richTextCtrl = window; } : wxCaret(window, size), m_timer(this) { Init(); m_richTextCtrl = window; }
virtual ~wxRichTextCaret(); virtual ~wxRichTextCaret();
@@ -99,6 +112,8 @@ public:
bool GetNeedsUpdate() const { return m_needsUpdate; } bool GetNeedsUpdate() const { return m_needsUpdate; }
void SetNeedsUpdate(bool needsUpdate = true ) { m_needsUpdate = needsUpdate; } void SetNeedsUpdate(bool needsUpdate = true ) { m_needsUpdate = needsUpdate; }
void Notify();
protected: protected:
virtual void DoShow(); virtual void DoShow();
virtual void DoHide(); virtual void DoHide();
@@ -115,7 +130,8 @@ private:
m_yOld; m_yOld;
bool m_hasFocus; // true => our window has focus bool m_hasFocus; // true => our window has focus
bool m_needsUpdate; // must be repositioned bool m_needsUpdate; // must be repositioned
bool m_flashOn;
wxRichTextCaretTimer m_timer;
wxRichTextCtrl* m_richTextCtrl; wxRichTextCtrl* m_richTextCtrl;
}; };
#endif #endif
@@ -3480,10 +3496,13 @@ void wxRichTextCaret::Init()
m_yOld = -1; m_yOld = -1;
m_richTextCtrl = NULL; m_richTextCtrl = NULL;
m_needsUpdate = false; m_needsUpdate = false;
m_flashOn = true;
} }
wxRichTextCaret::~wxRichTextCaret() wxRichTextCaret::~wxRichTextCaret()
{ {
if (m_timer.IsRunning())
m_timer.Stop();
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -3492,11 +3511,19 @@ wxRichTextCaret::~wxRichTextCaret()
void wxRichTextCaret::DoShow() void wxRichTextCaret::DoShow()
{ {
m_flashOn = true;
if (!m_timer.IsRunning())
m_timer.Start(GetBlinkTime());
Refresh(); Refresh();
} }
void wxRichTextCaret::DoHide() void wxRichTextCaret::DoHide()
{ {
if (m_timer.IsRunning())
m_timer.Stop();
Refresh(); Refresh();
} }
@@ -3573,17 +3600,25 @@ void wxRichTextCaret::DoDraw(wxDC *dc)
dc->SetBrush(*(m_hasFocus ? wxBLACK_BRUSH : wxTRANSPARENT_BRUSH)); dc->SetBrush(*(m_hasFocus ? wxBLACK_BRUSH : wxTRANSPARENT_BRUSH));
dc->SetPen(*wxBLACK_PEN); dc->SetPen(*wxBLACK_PEN);
// VZ: unfortunately, the rectangle comes out a pixel smaller when this is
// done under wxGTK - no idea why
//dc->SetLogicalFunction(wxINVERT);
wxPoint pt(m_x, m_y); wxPoint pt(m_x, m_y);
if (m_richTextCtrl) if (m_richTextCtrl)
{ {
pt = m_richTextCtrl->GetLogicalPoint(pt); pt = m_richTextCtrl->GetLogicalPoint(pt);
} }
dc->DrawRectangle(pt.x, pt.y, m_width, m_height); if (IsVisible() && m_flashOn)
dc->DrawRectangle(pt.x, pt.y, m_width, m_height);
}
void wxRichTextCaret::Notify()
{
m_flashOn = !m_flashOn;
Refresh();
}
void wxRichTextCaretTimer::Notify()
{
m_caret->Notify();
} }
#endif #endif
// wxRICHTEXT_USE_OWN_CARET // wxRICHTEXT_USE_OWN_CARET