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:
parent
209bf72273
commit
a188ac2988
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user