X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/805c8d92b92fc29beec5e226ecd48799a70aa005..b5a9b87e1620e52f1f13d2619b4677f2b365c93f:/src/richtext/richtextctrl.cpp diff --git a/src/richtext/richtextctrl.cpp b/src/richtext/richtextctrl.cpp index 68fd792f2c..d51fffcc73 100644 --- a/src/richtext/richtextctrl.cpp +++ b/src/richtext/richtextctrl.cpp @@ -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 @@ -196,6 +212,8 @@ wxRichTextCtrl::wxRichTextCtrl(wxWindow* parent, bool wxRichTextCtrl::Create( wxWindow* parent, wxWindowID id, const wxString& value, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) { + style |= wxVSCROLL; + if (!wxTextCtrlBase::Create(parent, id, pos, size, style|wxFULL_REPAINT_ON_RESIZE, validator, name)) @@ -992,7 +1010,8 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event) #ifdef __WXMAC__ if (event.CmdDown()) #else - if (event.CmdDown() || event.AltDown()) + // Fixes AltGr+key with European input languages on Windows + if ((event.CmdDown() && !event.AltDown()) || (event.AltDown() && !event.CmdDown())) #endif { event.Skip(); @@ -2561,11 +2580,6 @@ void wxRichTextCtrl::SetSelection(long from, long to) to = GetLastPosition()+1; } - DoSetSelection(from, to); -} - -void wxRichTextCtrl::DoSetSelection(long from, long to, bool WXUNUSED(scrollCaret)) -{ if (from == to) { SelectNone(); @@ -3482,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(); } // ---------------------------------------------------------------------------- @@ -3494,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(); } @@ -3575,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