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

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@61095 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2009-06-17 21:09:42 +00:00
parent eb10b04a3a
commit 4931fa77fa
2 changed files with 46 additions and 10 deletions

View File

@@ -70,7 +70,7 @@
#include "wx/dataobj.h"
#endif
// 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.
#if defined(wxMAC_USE_CORE_GRAPHICS) && wxMAC_USE_CORE_GRAPHICS

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"
@@ -63,6 +64,18 @@ DEFINE_EVENT_TYPE(wxEVT_COMMAND_RICHTEXT_BUFFER_RESET)
#if wxRICHTEXT_USE_OWN_CARET
class wxRichTextCaret;
class wxRichTextCaretTimer: public wxTimer
{
public:
wxRichTextCaretTimer(wxRichTextCaret* caret)
{
m_caret = caret;
}
virtual void Notify();
wxRichTextCaret* m_caret;
};
/*!
* wxRichTextCaret
*
@@ -77,12 +90,12 @@ 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();
@@ -103,6 +116,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();
@@ -119,7 +134,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
@@ -3528,10 +3544,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();
}
// ----------------------------------------------------------------------------
@@ -3540,11 +3559,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();
}
@@ -3621,18 +3648,27 @@ 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
#endif