#include "wx/dcbuffer.h"
#include "wx/arrimpl.cpp"
#include "wx/fontenum.h"
+#include "wx/accel.h"
// DLL options compatibility check:
#include "wx/app.h"
DEFINE_EVENT_TYPE(wxEVT_COMMAND_RICHTEXT_SELECTION_CHANGED)
DEFINE_EVENT_TYPE(wxEVT_COMMAND_RICHTEXT_BUFFER_RESET)
+#if wxRICHTEXT_USE_OWN_CARET
+
+/*!
+ * wxRichTextCaret
+ *
+ * This implements a non-flashing cursor in case there
+ * are platform-specific problems with the generic caret.
+ * wxRICHTEXT_USE_OWN_CARET is set in richtextbuffer.h.
+ */
+
+class wxRichTextCaret: public wxCaret
+{
+public:
+ // ctors
+ // -----
+ // default - use Create()
+ wxRichTextCaret() { 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; }
+ wxRichTextCaret(wxRichTextCtrl *window, const wxSize& size)
+ : wxCaret(window, size) { Init(); m_richTextCtrl = window; }
+
+ virtual ~wxRichTextCaret();
+
+ // implementation
+ // --------------
+
+ // called by wxWindow (not using the event tables)
+ virtual void OnSetFocus();
+ virtual void OnKillFocus();
+
+ // draw the caret on the given DC
+ void DoDraw(wxDC *dc);
+
+ // get the visible count
+ int GetVisibleCount() const { return m_countVisible; }
+
+ // delay repositioning
+ bool GetNeedsUpdate() const { return m_needsUpdate; }
+ void SetNeedsUpdate(bool needsUpdate = true ) { m_needsUpdate = needsUpdate; }
+
+protected:
+ virtual void DoShow();
+ virtual void DoHide();
+ virtual void DoMove();
+ virtual void DoSize();
+
+ // refresh the caret
+ void Refresh();
+
+private:
+ void Init();
+
+ int m_xOld,
+ m_yOld;
+ bool m_hasFocus; // true => our window has focus
+ bool m_needsUpdate; // must be repositioned
+
+ wxRichTextCtrl* m_richTextCtrl;
+};
+#endif
+
IMPLEMENT_CLASS( wxRichTextCtrl, wxControl )
IMPLEMENT_CLASS( wxRichTextEvent, wxNotifyEvent )
attributes.SetLineSpacing(10);
attributes.SetParagraphSpacingAfter(10);
attributes.SetParagraphSpacingBefore(0);
- attributes.SetTextEffects(0);
- attributes.SetTextEffectFlags(wxTEXT_ATTR_EFFECT_STRIKETHROUGH|wxTEXT_ATTR_EFFECT_CAPITALS);
SetBasicStyle(attributes);
GetBuffer().Reset();
GetBuffer().SetRichTextCtrl(this);
+#if wxRICHTEXT_USE_OWN_CARET
+ SetCaret(new wxRichTextCaret(this, wxRICHTEXT_DEFAULT_CARET_WIDTH, 16));
+#else
SetCaret(new wxCaret(this, wxRICHTEXT_DEFAULT_CARET_WIDTH, 16));
- GetCaret()->Show();
+#endif
// Tell the sizers to use the given or best size
SetInitialSize(size);
GetBuffer().AddEventHandler(this);
+ // Accelerators
+ wxAcceleratorEntry entries[4];
+
+ entries[0].Set(wxACCEL_CMD, (int) 'C', wxID_COPY);
+ entries[1].Set(wxACCEL_CMD, (int) 'X', wxID_CUT);
+ entries[2].Set(wxACCEL_CMD, (int) 'V', wxID_PASTE);
+ entries[3].Set(wxACCEL_CMD, (int) 'A', wxID_SELECTALL);
+
+ wxAcceleratorTable accel(4, entries);
+ SetAcceleratorTable(accel);
+
return true;
}
/// Painting
void wxRichTextCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
{
- if (GetCaret() && GetCaret()->IsVisible())
+#if !wxRICHTEXT_USE_OWN_CARET
+ if (GetCaret() && !IsFrozen())
GetCaret()->Hide();
+#endif
{
#if wxRICHTEXT_BUFFERED_PAINTING
}
GetBuffer().Draw(dc, GetBuffer().GetRange(), GetInternalSelectionRange(), drawingArea, 0 /* descent */, 0 /* flags */);
+#if wxRICHTEXT_USE_OWN_CARET
+ if (GetCaret()->IsVisible())
+ {
+ ((wxRichTextCaret*) GetCaret())->DoDraw(& dc);
+ }
+#endif
}
- if (GetCaret() && !GetCaret()->IsVisible())
+#if !wxRICHTEXT_USE_OWN_CARET
+ if (GetCaret())
GetCaret()->Show();
-
PositionCaret();
+#endif
}
// Empty implementation, to prevent flicker
{
if (GetCaret())
{
- if (!GetCaret()->IsVisible())
- GetCaret()->Show();
+#if !wxRICHTEXT_USE_OWN_CARET
PositionCaret();
+#endif
+ GetCaret()->Show();
}
- // if (!IsFrozen())
- // Refresh(false);
+#if defined(__WXGTK__) && !wxRICHTEXT_USE_OWN_CARET
+ // Work around dropouts when control is focused
+ if (!IsFrozen())
+ {
+ Refresh(false);
+ }
+#endif
}
void wxRichTextCtrl::OnKillFocus(wxFocusEvent& WXUNUSED(event))
{
- if (GetCaret() && GetCaret()->IsVisible())
+ if (GetCaret())
GetCaret()->Hide();
- // if (!IsFrozen())
- // Refresh(false);
+#if defined(__WXGTK__) && !wxRICHTEXT_USE_OWN_CARET
+ // Work around dropouts when control is focused
+ if (!IsFrozen())
+ {
+ Refresh(false);
+ }
+#endif
}
void wxRichTextCtrl::OnCaptureLost(wxMouseCaptureLostEvent& WXUNUSED(event))
}
}
+#if !wxRICHTEXT_USE_OWN_CARET
if (scrolled)
+#endif
PositionCaret();
return scrolled;
/// Idle-time processing
void wxRichTextCtrl::OnIdle(wxIdleEvent& event)
{
+#if wxRICHTEXT_USE_OWN_CARET
+ if (((wxRichTextCaret*) GetCaret())->GetNeedsUpdate())
+ {
+ ((wxRichTextCaret*) GetCaret())->SetNeedsUpdate(false);
+ PositionCaret();
+ GetCaret()->Show();
+ }
+#endif
+
const int layoutInterval = wxRICHTEXT_DEFAULT_LAYOUT_INTERVAL;
if (m_fullLayoutRequired && (wxGetLocalTimeMillis() > (m_fullLayoutTime + layoutInterval)))
/// Scrolling
void wxRichTextCtrl::OnScroll(wxScrollWinEvent& event)
{
- // Not used
+#if wxRICHTEXT_USE_OWN_CARET
+ if (!((wxRichTextCaret*) GetCaret())->GetNeedsUpdate())
+ {
+ GetCaret()->Hide();
+ ((wxRichTextCaret*) GetCaret())->SetNeedsUpdate();
+ }
+#endif
+
event.Skip();
}
bool wxRichTextCtrl::DoLoadFile(const wxString& filename, int fileType)
{
- bool success = GetBuffer().LoadFile(filename, fileType);
+ bool success = GetBuffer().LoadFile(filename, (wxRichTextFileType)fileType);
if (success)
m_filename = filename;
bool wxRichTextCtrl::DoSaveFile(const wxString& filename, int fileType)
{
- if (GetBuffer().SaveFile(filename, fileType))
+ if (GetBuffer().SaveFile(filename, (wxRichTextFileType)fileType))
{
m_filename = filename;
}
/// Write an image at the current insertion point
-bool wxRichTextCtrl::WriteImage(const wxImage& image, int bitmapType)
+bool wxRichTextCtrl::WriteImage(const wxImage& image, wxBitmapType bitmapType)
{
wxRichTextImageBlock imageBlock;
return false;
}
-bool wxRichTextCtrl::WriteImage(const wxString& filename, int bitmapType)
+bool wxRichTextCtrl::WriteImage(const wxString& filename, wxBitmapType bitmapType)
{
wxRichTextImageBlock imageBlock;
return GetBuffer().InsertImageWithUndo(m_caretPosition+1, imageBlock, this);
}
-bool wxRichTextCtrl::WriteImage(const wxBitmap& bitmap, int bitmapType)
+bool wxRichTextCtrl::WriteImage(const wxBitmap& bitmap, wxBitmapType bitmapType)
{
if (bitmap.Ok())
{
}
DoSetSelection(from, to);
- SetDefaultStyleToCursorStyle();
}
void wxRichTextCtrl::DoSetSelection(long from, long to, bool WXUNUSED(scrollCaret))
wxPoint pt = GetPhysicalPoint(newPt);
if (GetCaret()->GetPosition() != pt || GetCaret()->GetSize() != newSz)
{
+ GetCaret()->Hide();
+ if (GetCaret()->GetSize() != newSz)
+ GetCaret()->SetSize(newSz);
GetCaret()->Move(pt);
- GetCaret()->SetSize(newSz);
+ GetCaret()->Show();
}
}
}
return true;
}
+#if wxRICHTEXT_USE_OWN_CARET
+
+// ----------------------------------------------------------------------------
+// initialization and destruction
+// ----------------------------------------------------------------------------
+
+void wxRichTextCaret::Init()
+{
+ m_hasFocus = true;
+
+ m_xOld =
+ m_yOld = -1;
+ m_richTextCtrl = NULL;
+ m_needsUpdate = false;
+}
+
+wxRichTextCaret::~wxRichTextCaret()
+{
+}
+
+// ----------------------------------------------------------------------------
+// showing/hiding/moving the caret (base class interface)
+// ----------------------------------------------------------------------------
+
+void wxRichTextCaret::DoShow()
+{
+ Refresh();
+}
+
+void wxRichTextCaret::DoHide()
+{
+ Refresh();
+}
+
+void wxRichTextCaret::DoMove()
+{
+ if (IsVisible())
+ {
+ Refresh();
+
+ if (m_xOld != -1 && m_yOld != -1)
+ {
+ if (m_richTextCtrl)
+ {
+ wxRect rect(GetPosition(), GetSize());
+ m_richTextCtrl->RefreshRect(rect, false);
+ }
+ }
+ }
+
+ m_xOld = m_x;
+ m_yOld = m_y;
+}
+
+void wxRichTextCaret::DoSize()
+{
+ int countVisible = m_countVisible;
+ if (countVisible > 0)
+ {
+ m_countVisible = 0;
+ DoHide();
+ }
+
+ if (countVisible > 0)
+ {
+ m_countVisible = countVisible;
+ DoShow();
+ }
+}
+
+// ----------------------------------------------------------------------------
+// handling the focus
+// ----------------------------------------------------------------------------
+
+void wxRichTextCaret::OnSetFocus()
+{
+ m_hasFocus = true;
+
+ if ( IsVisible() )
+ Refresh();
+}
+
+void wxRichTextCaret::OnKillFocus()
+{
+ m_hasFocus = false;
+}
+
+// ----------------------------------------------------------------------------
+// drawing the caret
+// ----------------------------------------------------------------------------
+
+void wxRichTextCaret::Refresh()
+{
+ if (m_richTextCtrl)
+ {
+ wxRect rect(GetPosition(), GetSize());
+ m_richTextCtrl->RefreshRect(rect, false);
+ }
+}
+
+void wxRichTextCaret::DoDraw(wxDC *dc)
+{
+ dc->SetPen( *wxBLACK_PEN );
+
+ 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);
+}
+#endif
+ // wxRICHTEXT_USE_OWN_CARET
+
#endif
// wxUSE_RICHTEXT