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 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
// are platform-specific problems with the generic caret.
#ifdef __WXMAC__
#define wxRICHTEXT_USE_OWN_CARET 1
#else
#define wxRICHTEXT_USE_OWN_CARET 0
#endif
// Switch off for binary compatibility, on for faster drawing
// Note: this seems to be buggy (overzealous use of extents) so

View File

@ -26,6 +26,7 @@
#include "wx/settings.h"
#endif
#include "wx/timer.h"
#include "wx/textfile.h"
#include "wx/ffile.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.
*/
class wxRichTextCaret;
class wxRichTextCaretTimer: public wxTimer
{
public:
wxRichTextCaretTimer(wxRichTextCaret* caret)
{
m_caret = caret;
}
virtual void Notify();
wxRichTextCaret* m_caret;
};
class wxRichTextCaret: public wxCaret
{
public:
// ctors
// -----
// default - use Create()
wxRichTextCaret() { Init(); }
wxRichTextCaret(): m_timer(this) { Init(); }
// creates a block caret associated with the given window
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)
: wxCaret(window, size) { Init(); m_richTextCtrl = window; }
: wxCaret(window, size), m_timer(this) { Init(); m_richTextCtrl = window; }
virtual ~wxRichTextCaret();
@ -99,6 +112,8 @@ public:
bool GetNeedsUpdate() const { return m_needsUpdate; }
void SetNeedsUpdate(bool needsUpdate = true ) { m_needsUpdate = needsUpdate; }
void Notify();
protected:
virtual void DoShow();
virtual void DoHide();
@ -115,7 +130,8 @@ private:
m_yOld;
bool m_hasFocus; // true => our window has focus
bool m_needsUpdate; // must be repositioned
bool m_flashOn;
wxRichTextCaretTimer m_timer;
wxRichTextCtrl* m_richTextCtrl;
};
#endif
@ -3480,10 +3496,13 @@ void wxRichTextCaret::Init()
m_yOld = -1;
m_richTextCtrl = NULL;
m_needsUpdate = false;
m_flashOn = true;
}
wxRichTextCaret::~wxRichTextCaret()
{
if (m_timer.IsRunning())
m_timer.Stop();
}
// ----------------------------------------------------------------------------
@ -3492,11 +3511,19 @@ wxRichTextCaret::~wxRichTextCaret()
void wxRichTextCaret::DoShow()
{
m_flashOn = true;
if (!m_timer.IsRunning())
m_timer.Start(GetBlinkTime());
Refresh();
}
void wxRichTextCaret::DoHide()
{
if (m_timer.IsRunning())
m_timer.Stop();
Refresh();
}
@ -3573,17 +3600,25 @@ void wxRichTextCaret::DoDraw(wxDC *dc)
dc->SetBrush(*(m_hasFocus ? wxBLACK_BRUSH : wxTRANSPARENT_BRUSH));
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);
if (m_richTextCtrl)
{
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
// wxRICHTEXT_USE_OWN_CARET