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:
@@ -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
|
||||||
|
@@ -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,18 +3600,26 @@ 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);
|
||||||
}
|
}
|
||||||
|
if (IsVisible() && m_flashOn)
|
||||||
dc->DrawRectangle(pt.x, pt.y, m_width, m_height);
|
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
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user