]> git.saurik.com Git - wxWidgets.git/blobdiff - interface/wx/richtext/richtextctrl.h
Add new sample project files.
[wxWidgets.git] / interface / wx / richtext / richtextctrl.h
index 86c3f0a144fdc25feecf92f6b1c7ce47861d14a6..baf58d29a6456117c5ceded43263cb94a0ce3780 100644 (file)
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        richtext/richtextctrl.h
-// Purpose:     interface of wxRichTextCtrl and wxRichTextEvent
-// Author:      wxWidgets team
+// Name:        wx/richtext/richtextctrl.h
+// Purpose:     A rich edit control
+// Author:      Julian Smart
+// Modified by:
+// Created:     2005-09-30
 // RCS-ID:      $Id$
 // RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
+/*
+ * Styles and flags
+ */
+
 /**
 /**
-    @class wxRichTextEvent
+    Styles
+*/
 
 
-    This is the event class for wxRichTextCtrl notifications.
+#define wxRE_READONLY          0x0010
+#define wxRE_MULTILINE         0x0020
+#define wxRE_CENTRE_CARET      0x8000
+#define wxRE_CENTER_CARET      wxRE_CENTRE_CARET
 
 
-    @beginEventTable{wxRichTextEvent}
-    @event{EVT_RICHTEXT_CHARACTER(id, func)}
-        Process a @c wxEVT_COMMAND_RICHTEXT_CHARACTER event, generated when the user
-        presses a character key. Valid event functions: GetFlags, GetPosition, GetCharacter.
-    @event{EVT_RICHTEXT_DELETE(id, func)}
-        Process a @c wxEVT_COMMAND_RICHTEXT_DELETE event, generated when the user
-        presses the backspace or delete key. Valid event functions: GetFlags, GetPosition.
-    @event{EVT_RICHTEXT_RETURN(id, func)}
-        Process a @c wxEVT_COMMAND_RICHTEXT_RETURN event, generated when the user
-        presses the return key. Valid event functions: GetFlags, GetPosition.
-    @event{EVT_RICHTEXT_STYLE_CHANGED(id, func)}
-        Process a @c wxEVT_COMMAND_RICHTEXT_STYLE_CHANGED event, generated when
-        styling has been applied to the control. Valid event functions: GetPosition, GetRange.
-    @event{EVT_RICHTEXT_STYLESHEET_CHANGED(id, func)}
-        Process a @c wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING event, generated
-        when the control's stylesheet has changed, for example the user added,
-        edited or deleted a style. Valid event functions: GetRange, GetPosition.
-    @event{EVT_RICHTEXT_STYLESHEET_REPLACING(id, func)}
-        Process a @c wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACING event, generated
-        when the control's stylesheet is about to be replaced, for example when
-        a file is loaded into the control.
-        Valid event functions: Veto, GetOldStyleSheet, GetNewStyleSheet.
-    @event{EVT_RICHTEXT_STYLESHEET_REPLACED(id, func)}
-        Process a @c wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACED event, generated
-        when the control's stylesheet has been replaced, for example when a file
-        is loaded into the control.
-        Valid event functions: GetOldStyleSheet, GetNewStyleSheet.
-    @event{EVT_RICHTEXT_CONTENT_INSERTED(id, func)}
-        Process a @c wxEVT_COMMAND_RICHTEXT_CONTENT_INSERTED event, generated when
-        content has been inserted into the control.
-        Valid event functions: GetPosition, GetRange.
-    @event{EVT_RICHTEXT_CONTENT_DELETED(id, func)}
-        Process a @c wxEVT_COMMAND_RICHTEXT_CONTENT_DELETED event, generated when
-        content has been deleted from the control.
-        Valid event functions: GetPosition, GetRange.
-    @event{EVT_RICHTEXT_BUFFER_RESET(id, func)}
-        Process a @c wxEVT_COMMAND_RICHTEXT_BUFFER_RESET event, generated when the
-        buffer has been reset by deleting all content.
-        You can use this to set a default style for the first new paragraph.
-    @endEventTable
+/**
+    Flags
+*/
 
 
-    @library{wxrichtext}
-    @category{events,richtext}
+#define wxRICHTEXT_SHIFT_DOWN  0x01
+#define wxRICHTEXT_CTRL_DOWN   0x02
+#define wxRICHTEXT_ALT_DOWN    0x04
+
+/**
+    Extra flags
+*/
+
+// Don't draw guide lines around boxes and tables
+#define wxRICHTEXT_EX_NO_GUIDELINES 0x00000100
+
+
+/*
+    Defaults
 */
 */
-class wxRichTextEvent : public wxNotifyEvent
+
+#define wxRICHTEXT_DEFAULT_OVERALL_SIZE wxSize(-1, -1)
+#define wxRICHTEXT_DEFAULT_IMAGE_SIZE wxSize(80, 80)
+#define wxRICHTEXT_DEFAULT_SPACING 3
+#define wxRICHTEXT_DEFAULT_MARGIN 3
+#define wxRICHTEXT_DEFAULT_UNFOCUSSED_BACKGROUND wxColour(175, 175, 175)
+#define wxRICHTEXT_DEFAULT_FOCUSSED_BACKGROUND wxColour(140, 140, 140)
+#define wxRICHTEXT_DEFAULT_UNSELECTED_BACKGROUND wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)
+#define wxRICHTEXT_DEFAULT_TYPE_COLOUR wxColour(0, 0, 200)
+#define wxRICHTEXT_DEFAULT_FOCUS_RECT_COLOUR wxColour(100, 80, 80)
+#define wxRICHTEXT_DEFAULT_CARET_WIDTH 2
+// Minimum buffer size before delayed layout kicks in
+#define wxRICHTEXT_DEFAULT_DELAYED_LAYOUT_THRESHOLD 20000
+// Milliseconds before layout occurs after resize
+#define wxRICHTEXT_DEFAULT_LAYOUT_INTERVAL 50
+
+/* Identifiers
+ */
+#define wxID_RICHTEXT_PROPERTIES1   (wxID_HIGHEST + 1)
+#define wxID_RICHTEXT_PROPERTIES2   (wxID_HIGHEST + 2)
+#define wxID_RICHTEXT_PROPERTIES3   (wxID_HIGHEST + 3)
+
+/*
+    Normal selection occurs initially and as user drags within one container.
+    Common ancestor selection occurs when the user starts dragging across containers
+    that have a common ancestor, for example the cells in a table.
+ */
+
+enum wxRichTextCtrlSelectionState
 {
 {
-public:
-    /**
-        Copy constructor.
-    */
-    wxRichTextEvent(const wxRichTextEvent& event);
+    wxRichTextCtrlSelectionState_Normal,
+    wxRichTextCtrlSelectionState_CommonAncestor
+};
 
 
+/**
+    @class wxRichTextContextMenuPropertiesInfo
+
+    wxRichTextContextMenuPropertiesInfo keeps track of objects that appear in the context menu,
+    whose properties are available to be edited.
+ */
+
+class WXDLLIMPEXP_RICHTEXT wxRichTextContextMenuPropertiesInfo
+{
+public:
     /**
         Constructor.
     /**
         Constructor.
-
-        @param commandType
-            The type of the event.
-        @param id
-            Window identifier. The value @c wxID_ANY indicates a default value.
     */
     */
-    wxRichTextEvent(wxEventType commandType = wxEVT_NULL, int id = 0);
+    wxRichTextContextMenuPropertiesInfo() { Init(); }
+
+// Operations
 
     /**
 
     /**
-        Returns the character pressed, within a @c wxEVT_COMMAND_RICHTEXT_CHARACTER event.
+        Initialisation.
     */
     */
-    wxChar GetCharacter() const;
+    void Init() {}
 
     /**
 
     /**
-        Returns flags indicating modifier keys pressed.
-
-        Possible values are @c wxRICHTEXT_CTRL_DOWN, @c wxRICHTEXT_SHIFT_DOWN, and @c wxRICHTEXT_ALT_DOWN.
+        Adds an item.
     */
     */
-    int GetFlags() const;
+    bool AddItem(const wxString& label, wxRichTextObject* obj);
 
     /**
 
     /**
-        Returns the new style sheet.
-
-        Can be used in a @c wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING or
-        @c wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGED event handler.
+        Returns the number of menu items that were added.
     */
     */
-    wxRichTextStyleSheet* GetNewStyleSheet() const;
+    int AddMenuItems(wxMenu* menu, int startCmd = wxID_RICHTEXT_PROPERTIES1) const;
 
     /**
 
     /**
-        Returns the old style sheet.
-
-        Can be used in a @c wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING or
-        @c wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGED event handler.
+        Adds appropriate menu items for the current container and clicked on object
+        (and container's parent, if appropriate).
     */
     */
-    wxRichTextStyleSheet* GetOldStyleSheet() const;
+    int AddItems(wxRichTextObject* container, wxRichTextObject* obj);
 
     /**
 
     /**
-        Returns the buffer position at which the event occured.
+        Clears the items.
     */
     */
-    long GetPosition() const;
+    void Clear() { m_objects.Clear(); m_labels.Clear(); }
+
+// Accessors
 
     /**
 
     /**
-        Gets the range for the current operation.
+        Returns the nth label.
     */
     */
-    const wxRichTextRange& GetRange() const;
+    wxString GetLabel(int n) const { return m_labels[n]; }
 
     /**
 
     /**
-        Sets the character variable.
+        Returns the nth object.
     */
     */
-    void SetCharacter(wxChar ch);
+    wxRichTextObject* GetObject(int n) const { return m_objects[n]; }
 
     /**
 
     /**
-        Sets flags indicating modifier keys pressed.
-
-        Possible values are @c wxRICHTEXT_CTRL_DOWN, @c wxRICHTEXT_SHIFT_DOWN, and @c wxRICHTEXT_ALT_DOWN.
+        Returns the array of objects.
     */
     */
-    void SetFlags(int flags);
+    wxRichTextObjectPtrArray& GetObjects() { return m_objects; }
 
     /**
 
     /**
-        Sets the new style sheet variable.
+        Returns the array of objects.
     */
     */
-    void SetNewStyleSheet(wxRichTextStyleSheet* sheet);
+    const wxRichTextObjectPtrArray& GetObjects() const { return m_objects; }
 
     /**
 
     /**
-        Sets the old style sheet variable.
+        Returns the array of labels.
     */
     */
-    void SetOldStyleSheet(wxRichTextStyleSheet* sheet);
+    wxArrayString& GetLabels() { return m_labels; }
 
     /**
 
     /**
-        Sets the buffer position variable.
+        Returns the array of labels.
     */
     */
-    void SetPosition(long pos);
+    const wxArrayString& GetLabels() const { return m_labels; }
 
     /**
 
     /**
-        Sets the range variable.
+        Returns the number of items.
     */
     */
-    void SetRange(const wxRichTextRange& range);
-};
-
+    int GetCount() const { return m_objects.GetCount(); }
 
 
+    wxRichTextObjectPtrArray    m_objects;
+    wxArrayString               m_labels;
+};
 
 /**
     @class wxRichTextCtrl
 
 /**
     @class wxRichTextCtrl
@@ -154,8 +167,8 @@ public:
 
     wxRichTextCtrl sends notification events: see wxRichTextEvent.
 
 
     wxRichTextCtrl sends notification events: see wxRichTextEvent.
 
-    It also sends the standard wxTextCtrl events wxEVT_COMMAND_TEXT_ENTER and
-    wxEVT_COMMAND_TEXT_UPDATED, and wxTextUrlEvent when URL content is clicked.
+    It also sends the standard wxTextCtrl events @c wxEVT_COMMAND_TEXT_ENTER and
+    @c wxEVT_COMMAND_TEXT_UPDATED, and wxTextUrlEvent when URL content is clicked.
 
     For more information, see the @ref overview_richtextctrl.
 
 
     For more information, see the @ref overview_richtextctrl.
 
@@ -172,14 +185,23 @@ public:
     @library{wxrichtext}
     @category{richtext}
     @appearance{richtextctrl.png}
     @library{wxrichtext}
     @category{richtext}
     @appearance{richtextctrl.png}
-*/
-class wxRichTextCtrl
+
+ */
+
+class WXDLLIMPEXP_RICHTEXT wxRichTextCtrl : public wxControl,
+                                            public wxTextCtrlIface,
+                                            public wxScrollHelper
 {
 {
+    DECLARE_CLASS( wxRichTextCtrl )
+    DECLARE_EVENT_TABLE()
+
 public:
 public:
+// Constructors
+
     /**
     /**
-        Default Constructor.
+        Default constructor.
     */
     */
-    wxRichTextCtrl();
+    wxRichTextCtrl( );
 
     /**
         Constructor, creating and showing a rich text control.
 
     /**
         Constructor, creating and showing a rich text control.
@@ -203,311 +225,613 @@ public:
 
         @see Create(), wxValidator
     */
 
         @see Create(), wxValidator
     */
-    wxRichTextCtrl(wxWindow* parent, wxWindowID id = wxID_ANY,
-                   const wxString& value = wxEmptyString,
-                   const wxPoint& pos = wxDefaultPosition,
-                   const wxSize& size = wxDefaultSize,
-                   long style = wxRE_MULTILINE,
-                   const wxValidator& validator = wxDefaultValidator,
-                   const wxString& name = wxTextCtrlNameStr);
+    wxRichTextCtrl( wxWindow* parent, wxWindowID id = -1, const wxString& value = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
+        long style = wxRE_MULTILINE, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxTextCtrlNameStr);
 
     /**
         Destructor.
     */
 
     /**
         Destructor.
     */
-    virtual ~wxRichTextCtrl();
+    virtual ~wxRichTextCtrl( );
+
+// Operations
 
     /**
 
     /**
-        Adds an image to the control's buffer.
+        Creates the underlying window.
     */
     */
-    virtual wxRichTextRange AddImage(const wxImage& image);
+    bool Create( wxWindow* parent, wxWindowID id = -1, const wxString& value = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
+        long style = wxRE_MULTILINE, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxTextCtrlNameStr );
 
     /**
 
     /**
-        Adds a new paragraph of text to the end of the buffer.
+        Initialises the members of the control.
     */
     */
-    virtual wxRichTextRange AddParagraph(const wxString& text);
+    void Init();
+
+// Accessors
 
     /**
 
     /**
-        Sets the insertion point to the end of the buffer and writes the text.
+        Gets the text for the given range.
+        The end point of range is specified as the last character position of
+        the span of text, plus one.
     */
     */
-    virtual void AppendText(const wxString& text);
+    virtual wxString GetRange(long from, long to) const;
 
     /**
 
     /**
-        Applies the given alignment to the selection (undoable).
-        For alignment values, see wxTextAttr.
+        Returns the length of the specified line in characters.
     */
     */
-    virtual bool ApplyAlignmentToSelection(wxTextAttrAlignment alignment);
+    virtual int GetLineLength(long lineNo) const ;
 
     /**
 
     /**
-        Apples bold to the selection (undoable).
+        Returns the text for the given line.
     */
     */
-    virtual bool ApplyBoldToSelection();
+    virtual wxString GetLineText(long lineNo) const ;
 
     /**
 
     /**
-        Applies italic to the selection (undoable).
+        Returns the number of lines in the buffer.
     */
     */
-    virtual bool ApplyItalicToSelection();
+    virtual int GetNumberOfLines() const ;
 
     /**
 
     /**
-        Applies the given style to the selection.
+        Returns @true if the buffer has been modified.
     */
     */
-    virtual bool ApplyStyle(wxRichTextStyleDefinition* def);
+    virtual bool IsModified() const ;
 
     /**
 
     /**
-        Applies the style sheet to the buffer, matching paragraph styles in the sheet
-        against named styles in the buffer.
-
-        This might be useful if the styles have changed.
-        If @a sheet is @NULL, the sheet set with SetStyleSheet() is used.
-        Currently this applies paragraph styles only.
+        Returns @true if the control is editable.
     */
     */
-    bool ApplyStyleSheet(wxRichTextStyleSheet* sheet = NULL);
+    virtual bool IsEditable() const ;
 
     /**
 
     /**
-        Applies underline to the selection (undoable).
+        Returns @true if the control is single-line.
+        Currently wxRichTextCtrl does not support single-line editing.
     */
     */
-    virtual bool ApplyUnderlineToSelection();
+    bool IsSingleLine() const { return !HasFlag(wxRE_MULTILINE); }
 
     /**
 
     /**
-        Returns @true if undo commands are being batched.
+        Returns @true if the control is multiline.
     */
     */
-    virtual bool BatchingUndo() const;
+    bool IsMultiLine() const { return !IsSingleLine(); }
 
 
+    //@{
     /**
     /**
-        Begins using alignment.
-        For alignment values, see wxTextAttr.
+        Returns the range of the current selection.
+        The end point of range is specified as the last character position of the span
+        of text, plus one.
+        If the return values @a from and @a to are the same, there is no selection.
     */
     */
-    bool BeginAlignment(wxTextAttrAlignment alignment);
+    virtual void GetSelection(long* from, long* to) const;
+    const wxRichTextSelection& GetSelection() const { return m_selection; }
+    wxRichTextSelection& GetSelection() { return m_selection; }
+    //@}
 
     /**
 
     /**
-        Starts batching undo history for commands.
+        Returns the text within the current selection range, if any.
     */
     */
-    virtual bool BeginBatchUndo(const wxString& cmdName);
+    virtual wxString GetStringSelection() const;
 
     /**
 
     /**
-        Begins using bold.
+        Gets the current filename associated with the control.
     */
     */
-    bool BeginBold();
+    wxString GetFilename() const { return m_filename; }
 
     /**
 
     /**
-        Begins using the named character style.
+        Sets the current filename.
     */
     */
-    bool BeginCharacterStyle(const wxString& characterStyle);
+    void SetFilename(const wxString& filename) { m_filename = filename; }
 
     /**
 
     /**
-        Begins using this font.
+        Sets the size of the buffer beyond which layout is delayed during resizing.
+        This optimizes sizing for large buffers. The default is 20000.
     */
     */
-    bool BeginFont(const wxFont& font);
+    void SetDelayedLayoutThreshold(long threshold) { m_delayedLayoutThreshold = threshold; }
 
     /**
 
     /**
-        Begins using the given point size.
+        Gets the size of the buffer beyond which layout is delayed during resizing.
+        This optimizes sizing for large buffers. The default is 20000.
     */
     */
-    bool BeginFontSize(int pointSize);
+    long GetDelayedLayoutThreshold() const { return m_delayedLayoutThreshold; }
 
     /**
 
     /**
-        Begins using italic.
     */
     */
-    bool BeginItalic();
+    bool GetFullLayoutRequired() const { return m_fullLayoutRequired; }
 
     /**
 
     /**
-        Begins applying a left indent and subindent in tenths of a millimetre.
-        The subindent is an offset from the left edge of the paragraph, and is
-        used for all but the first line in a paragraph. A positive value will
-        cause the first line to appear to the left of the subsequent lines, and
-        a negative value will cause the first line to be indented to the right
-        of the subsequent lines.
-
-        wxRichTextBuffer uses indentation to render a bulleted item. The
-        content of the paragraph, including the first line, starts at the
-        @a leftIndent plus the @a leftSubIndent.
-
-        @param leftIndent
-            The distance between the margin and the bullet.
-        @param leftSubIndent
-             The distance between the left edge of the bullet and the left edge
-             of the actual paragraph.
     */
     */
-    bool BeginLeftIndent(int leftIndent, int leftSubIndent = 0);
+    void SetFullLayoutRequired(bool b) { m_fullLayoutRequired = b; }
 
     /**
 
     /**
-        Begins appling line spacing. @e spacing is a multiple, where 10 means
-        single-spacing, 15 means 1.5 spacing, and 20 means double spacing.
-
-        The ::wxTextAttrLineSpacing constants are defined for convenience.
     */
     */
-    bool BeginLineSpacing(int lineSpacing);
+    wxLongLong GetFullLayoutTime() const { return m_fullLayoutTime; }
 
     /**
 
     /**
-        Begins using a specified list style.
-        Optionally, you can also pass a level and a number.
     */
     */
-    bool BeginListStyle(const wxString& listStyle, int level = 1,
-                        int number = 1);
+    void SetFullLayoutTime(wxLongLong t) { m_fullLayoutTime = t; }
 
     /**
 
     /**
-        Begins a numbered bullet.
-
-        This call will be needed for each item in the list, and the
-        application should take care of incrementing the numbering.
-
-        @a bulletNumber is a number, usually starting with 1.
-        @a leftIndent and @a leftSubIndent are values in tenths of a millimetre.
-        @a bulletStyle is a bitlist of the  ::wxTextAttrBulletStyle values.
-
-        wxRichTextBuffer uses indentation to render a bulleted item.
-        The left indent is the distance between the margin and the bullet.
-        The content of the paragraph, including the first line, starts
-        at leftMargin + leftSubIndent.
-        So the distance between the left edge of the bullet and the
-        left of the actual paragraph is leftSubIndent.
     */
     */
-    bool BeginNumberedBullet(int bulletNumber, int leftIndent,
-                             int leftSubIndent,
-                             int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC|wxTEXT_ATTR_BULLET_STYLE_PERIOD);
+    long GetFullLayoutSavedPosition() const { return m_fullLayoutSavedPosition; }
 
     /**
 
     /**
-        Begins paragraph spacing; pass the before-paragraph and after-paragraph spacing
-        in tenths of a millimetre.
     */
     */
-    bool BeginParagraphSpacing(int before, int after);
+    void SetFullLayoutSavedPosition(long p) { m_fullLayoutSavedPosition = p; }
 
 
+    // Force any pending layout due to large buffer
     /**
     /**
-        Begins applying the named paragraph style.
     */
     */
-    bool BeginParagraphStyle(const wxString& paragraphStyle);
+    void ForceDelayedLayout();
 
     /**
 
     /**
-        Begins a right indent, specified in tenths of a millimetre.
+        Sets the text (normal) cursor.
     */
     */
-    bool BeginRightIndent(int rightIndent);
+    void SetTextCursor(const wxCursor& cursor ) { m_textCursor = cursor; }
 
     /**
 
     /**
-        Begins applying a style.
+        Returns the text (normal) cursor.
     */
     */
-    virtual bool BeginStyle(const wxTextAttr& style);
+    wxCursor GetTextCursor() const { return m_textCursor; }
 
     /**
 
     /**
-        Starts suppressing undo history for commands.
+        Sets the cursor to be used over URLs.
     */
     */
-    virtual bool BeginSuppressUndo();
+    void SetURLCursor(const wxCursor& cursor ) { m_urlCursor = cursor; }
 
     /**
 
     /**
-        Begins applying a symbol bullet, using a character from the current font.
-        See BeginNumberedBullet() for an explanation of how indentation is used
-        to render the bulleted paragraph.
+        Returns the cursor to be used over URLs.
     */
     */
-    bool BeginSymbolBullet(const wxString& symbol, int leftIndent,
-                           int leftSubIndent,
-                           int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_SYMBOL);
+    wxCursor GetURLCursor() const { return m_urlCursor; }
 
     /**
 
     /**
-        Begins using this colour.
+        Returns @true if we are showing the caret position at the start of a line
+        instead of at the end of the previous one.
     */
     */
-    bool BeginTextColour(const wxColour& colour);
+    bool GetCaretAtLineStart() const { return m_caretAtLineStart; }
 
     /**
 
     /**
-        Begins applying wxTEXT_ATTR_URL to the content.
-
-        Pass a URL and optionally, a character style to apply, since it is common
-        to mark a URL with a familiar style such as blue text with underlining.
+        Sets a flag to remember that we are showing the caret position at the start of a line
+        instead of at the end of the previous one.
     */
     */
-    bool BeginURL(const wxString& url,
-                  const wxString& characterStyle = wxEmptyString);
+    void SetCaretAtLineStart(bool atStart) { m_caretAtLineStart = atStart; }
 
     /**
 
     /**
-        Begins using underlining.
+        Returns @true if we are dragging a selection.
     */
     */
-    bool BeginUnderline();
+    bool GetDragging() const { return m_dragging; }
 
     /**
 
     /**
-        Returns @true if selected content can be copied to the clipboard.
+        Sets a flag to remember if we are dragging a selection.
     */
     */
-    virtual bool CanCopy() const;
+    void SetDragging(bool dragging) { m_dragging = dragging; }
 
     /**
 
     /**
-        Returns @true if selected content can be copied to the clipboard and deleted.
+        Returns the drag start position.
     */
     */
-    virtual bool CanCut() const;
+    const wxPoint& GetDragStart() const { return m_dragStart; }
 
     /**
 
     /**
-        Returns @true if selected content can be deleted.
+        Sets the drag start position.
     */
     */
-    virtual bool CanDeleteSelection() const;
+    void SetDragStart(const wxPoint& pt) { m_dragStart = pt; }
 
 
+#if wxRICHTEXT_BUFFERED_PAINTING
+    //@{
     /**
     /**
-        Returns @true if the clipboard content can be pasted to the buffer.
+        Returns the buffer bitmap if using buffered painting.
     */
     */
-    virtual bool CanPaste() const;
+    const wxBitmap& GetBufferBitmap() const { return m_bufferBitmap; }
+    wxBitmap& GetBufferBitmap() { return m_bufferBitmap; }
+    //@}
+#endif
 
     /**
 
     /**
-        Returns @true if there is a command in the command history that can be redone.
+        Returns the current context menu.
     */
     */
-    virtual bool CanRedo() const;
+    wxMenu* GetContextMenu() const { return m_contextMenu; }
 
     /**
 
     /**
-        Returns @true if there is a command in the command history that can be undone.
+        Sets the current context menu.
     */
     */
-    virtual bool CanUndo() const;
+    void SetContextMenu(wxMenu* menu);
 
     /**
 
     /**
-        Clears the buffer content, leaving a single empty paragraph. Cannot be undone.
+        Returns an anchor so we know how to extend the selection.
+        It's a caret position since it's between two characters.
     */
     */
-    virtual void Clear();
+    long GetSelectionAnchor() const { return m_selectionAnchor; }
 
     /**
 
     /**
-        Clears the list style from the given range, clearing list-related attributes
-        and applying any named paragraph style associated with each paragraph.
+        Sets an anchor so we know how to extend the selection.
+        It's a caret position since it's between two characters.
+    */
+    void SetSelectionAnchor(long anchor) { m_selectionAnchor = anchor; }
 
 
-        @a flags is a bit list of the following:
-        - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable.
+    /**
+        Returns the anchor object if selecting multiple containers.
+    */
+    wxRichTextObject* GetSelectionAnchorObject() const { return m_selectionAnchorObject; }
 
 
-        @see SetListStyle(), PromoteList(), NumberList().
+    /**
+        Sets the anchor object if selecting multiple containers.
     */
     */
-    virtual bool ClearListStyle(const wxRichTextRange& range,
-                        int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
+    void SetSelectionAnchorObject(wxRichTextObject* anchor) { m_selectionAnchorObject = anchor; }
 
 
+    //@{
     /**
     /**
-        Sends the event to the control.
+        Returns an object that stores information about context menu property item(s),
+        in order to communicate between the context menu event handler and the code
+        that responds to it. The wxRichTextContextMenuPropertiesInfo stores one
+        item for each object that could respond to a property-editing event. If
+        objects are nested, several might be editable.
     */
     */
-    virtual void Command(wxCommandEvent& event);
+    wxRichTextContextMenuPropertiesInfo& GetContextMenuPropertiesInfo() { return m_contextMenuPropertiesInfo; }
+    const wxRichTextContextMenuPropertiesInfo& GetContextMenuPropertiesInfo() const { return m_contextMenuPropertiesInfo; }
+    //@}
 
     /**
 
     /**
-        Copies the selected content (if any) to the clipboard.
+        Returns the wxRichTextObject object that currently has the editing focus.
+        If there are no composite objects, this will be the top-level buffer.
     */
     */
-    virtual void Copy();
+    wxRichTextParagraphLayoutBox* GetFocusObject() const { return m_focusObject; }
 
     /**
 
     /**
-        Creates the underlying window.
+        Sets the wxRichTextObject object that currently has the editing focus.
     */
     */
-    bool Create(wxWindow* parent, wxWindowID id = wxID_ANY,
-                const wxString& value = wxEmptyString,
-                const wxPoint& pos = wxDefaultPosition,
-                const wxSize& size = wxDefaultSize,
-                long style = wxRE_MULTILINE,
-                const wxValidator& validator = wxDefaultValidator,
-                const wxString& name = wxTextCtrlNameStr);
+    bool SetFocusObject(wxRichTextParagraphLayoutBox* obj, bool setCaretPosition = true);
+
+// Operations
 
     /**
 
     /**
-        Copies the selected content (if any) to the clipboard and deletes the selection.
-        This is undoable.
+        Invalidates the whole buffer to trigger painting later.
     */
     */
-    virtual void Cut();
+    void Invalidate() { GetBuffer().Invalidate(wxRICHTEXT_ALL); }
 
     /**
 
     /**
-        Deletes the content within the given range.
+        Clears the buffer content, leaving a single empty paragraph. Cannot be undone.
     */
     */
-    virtual bool Delete(const wxRichTextRange& range);
+    virtual void Clear();
 
     /**
 
     /**
-        Deletes content if there is a selection, e.g. when pressing a key.
-        Returns the new caret position in @e newPos, or leaves it if there
-        was no action. This is undoable.
+        Replaces the content in the specified range with the string specified by
+        @a value.
+    */
+    virtual void Replace(long from, long to, const wxString& value);
+
+    /**
+        Removes the content in the specified range.
+    */
+    virtual void Remove(long from, long to);
+
+#ifdef DOXYGEN
+    /**
+        Loads content into the control's buffer using the given type.
+
+        If the specified type is wxRICHTEXT_TYPE_ANY, the type is deduced from
+        the filename extension.
+
+        This function looks for a suitable wxRichTextFileHandler object.
+    */
+    bool LoadFile(const wxString& file,
+                  int type = wxRICHTEXT_TYPE_ANY);
+#endif
+
+    /**
+        Helper function for LoadFile(). Loads content into the control's buffer using the given type.
+
+        If the specified type is wxRICHTEXT_TYPE_ANY, the type is deduced from
+        the filename extension.
+
+        This function looks for a suitable wxRichTextFileHandler object.
+    */
+    virtual bool DoLoadFile(const wxString& file, int fileType);
+
+#ifdef DOXYGEN
+    /**
+        Saves the buffer content using the given type.
+
+        If the specified type is wxRICHTEXT_TYPE_ANY, the type is deduced from
+        the filename extension.
+
+        This function looks for a suitable wxRichTextFileHandler object.
+    */
+    bool SaveFile(const wxString& file = wxEmptyString,
+                  int type = wxRICHTEXT_TYPE_ANY);
+#endif
+
+    /**
+        Helper function for SaveFile(). Saves the buffer content using the given type.
+
+        If the specified type is wxRICHTEXT_TYPE_ANY, the type is deduced from
+        the filename extension.
+
+        This function looks for a suitable wxRichTextFileHandler object.
+    */
+    virtual bool DoSaveFile(const wxString& file = wxEmptyString,
+                            int fileType = wxRICHTEXT_TYPE_ANY);
+
+    /**
+        Sets flags that change the behaviour of loading or saving.
+
+        See the documentation for each handler class to see what flags are
+        relevant for each handler.
+    */
+    void SetHandlerFlags(int flags) { GetBuffer().SetHandlerFlags(flags); }
+
+    /**
+        Returns flags that change the behaviour of loading or saving.
+        See the documentation for each handler class to see what flags are
+        relevant for each handler.
+    */
+    int GetHandlerFlags() const { return GetBuffer().GetHandlerFlags(); }
+
+    /**
+        Marks the buffer as modified.
+    */
+    virtual void MarkDirty();
+
+    /**
+        Sets the buffer's modified status to @false, and clears the buffer's command
+        history.
+    */
+    virtual void DiscardEdits();
+
+    /**
+        Sets the maximum number of characters that may be entered in a single line
+        text control. For compatibility only; currently does nothing.
+    */
+    virtual void SetMaxLength(unsigned long WXUNUSED(len)) { }
+
+    /**
+        Writes text at the current position.
+    */
+    virtual void WriteText(const wxString& text);
+
+    /**
+        Sets the insertion point to the end of the buffer and writes the text.
+    */
+    virtual void AppendText(const wxString& text);
+
+    //@{
+    /**
+        Gets the attributes at the given position.
+        This function gets the combined style - that is, the style you see on the
+        screen as a result of combining base style, paragraph style and character
+        style attributes.
+
+        To get the character or paragraph style alone, use GetUncombinedStyle().
+
+        @beginWxPerlOnly
+        In wxPerl this method is implemented as GetStyle(@a position)
+        returning a 2-element list (ok, attr).
+        @endWxPerlOnly
+    */
+    virtual bool GetStyle(long position, wxTextAttr& style);
+    virtual bool GetStyle(long position, wxRichTextAttr& style);
+    virtual bool GetStyle(long position, wxRichTextAttr& style, wxRichTextParagraphLayoutBox* container);
+    //@}
+
+    //@{
+    /**
+        Sets the attributes for the given range.
+        The end point of range is specified as the last character position of the span
+        of text, plus one.
+
+        So, for example, to set the style for a character at position 5, use the range
+        (5,6).
+    */
+    virtual bool SetStyle(long start, long end, const wxTextAttr& style);
+    virtual bool SetStyle(long start, long end, const wxRichTextAttr& style);
+    virtual bool SetStyle(const wxRichTextRange& range, const wxTextAttr& style);
+    virtual bool SetStyle(const wxRichTextRange& range, const wxRichTextAttr& style);
+    //@}
+
+    /**
+        Sets the attributes for a single object
+    */
+    virtual void SetStyle(wxRichTextObject *obj, const wxRichTextAttr& textAttr);
+
+    //@{
+    /**
+        Gets the attributes common to the specified range.
+        Attributes that differ in value within the range will not be included
+        in @a style flags.
+
+        @beginWxPerlOnly
+        In wxPerl this method is implemented as GetStyleForRange(@a position)
+        returning a 2-element list (ok, attr).
+        @endWxPerlOnly
+    */
+    virtual bool GetStyleForRange(const wxRichTextRange& range, wxTextAttr& style);
+    virtual bool GetStyleForRange(const wxRichTextRange& range, wxRichTextAttr& style);
+    virtual bool GetStyleForRange(const wxRichTextRange& range, wxRichTextAttr& style, wxRichTextParagraphLayoutBox* container);
+    //@}
+
+    /**
+        Sets the attributes for the given range, passing flags to determine how the
+        attributes are set.
+
+        The end point of range is specified as the last character position of the span
+        of text, plus one. So, for example, to set the style for a character at
+        position 5, use the range (5,6).
+
+        @a flags may contain a bit list of the following values:
+        - wxRICHTEXT_SETSTYLE_NONE: no style flag.
+        - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this operation should be
+          undoable.
+        - wxRICHTEXT_SETSTYLE_OPTIMIZE: specifies that the style should not be applied
+          if the combined style at this point is already the style in question.
+        - wxRICHTEXT_SETSTYLE_PARAGRAPHS_ONLY: specifies that the style should only be
+          applied to paragraphs, and not the content.
+          This allows content styling to be preserved independently from that
+          of e.g. a named paragraph style.
+        - wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY: specifies that the style should only be
+          applied to characters, and not the paragraph.
+          This allows content styling to be preserved independently from that
+          of e.g. a named paragraph style.
+        - wxRICHTEXT_SETSTYLE_RESET: resets (clears) the existing style before applying
+          the new style.
+        - wxRICHTEXT_SETSTYLE_REMOVE: removes the specified style. Only the style flags
+          are used in this operation.
+    */
+    virtual bool SetStyleEx(const wxRichTextRange& range, const wxRichTextAttr& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
+
+    //@{
+    /**
+        Gets the attributes at the given position.
+        This function gets the @e uncombined style - that is, the attributes associated
+        with the paragraph or character content, and not necessarily the combined
+        attributes you see on the screen.
+        To get the combined attributes, use GetStyle().
+
+        If you specify (any) paragraph attribute in @e style's flags, this function
+        will fetch the paragraph attributes.
+        Otherwise, it will return the character attributes.
+
+        @beginWxPerlOnly
+        In wxPerl this method is implemented as GetUncombinedStyle(@a position)
+        returning a 2-element list (ok, attr).
+        @endWxPerlOnly
+    */
+    virtual bool GetUncombinedStyle(long position, wxRichTextAttr& style);
+    virtual bool GetUncombinedStyle(long position, wxRichTextAttr& style, wxRichTextParagraphLayoutBox* container);
+    //@}
+
+    //@{
+    /**
+        Sets the current default style, which can be used to change how subsequently
+        inserted text is displayed.
+    */
+    virtual bool SetDefaultStyle(const wxTextAttr& style);
+    virtual bool SetDefaultStyle(const wxRichTextAttr& style);
+    //@}
+
+    /**
+        Returns the current default style, which can be used to change how subsequently
+        inserted text is displayed.
+    */
+    virtual const wxRichTextAttr& GetDefaultStyleEx() const;
+
+    //virtual const wxTextAttr& GetDefaultStyle() const;
+
+    //@{
+    /**
+        Sets the list attributes for the given range, passing flags to determine how
+        the attributes are set.
+
+        Either the style definition or the name of the style definition (in the current
+        sheet) can be passed.
+        @a flags is a bit list of the following:
+        - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable.
+        - wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from
+          @a startFrom, otherwise existing attributes are used.
+        - wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used
+          as the level for all paragraphs, otherwise the current indentation will be used.
+
+        @see NumberList(), PromoteList(), ClearListStyle().
+    */
+    virtual bool SetListStyle(const wxRichTextRange& range, wxRichTextListStyleDefinition* def, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
+    virtual bool SetListStyle(const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
+    //@}
+
+    /**
+        Clears the list style from the given range, clearing list-related attributes
+        and applying any named paragraph style associated with each paragraph.
+
+        @a flags is a bit list of the following:
+        - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable.
+
+        @see SetListStyle(), PromoteList(), NumberList().
+    */
+    virtual bool ClearListStyle(const wxRichTextRange& range, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
+
+    //@{
+    /**
+        Numbers the paragraphs in the given range.
+        Pass flags to determine how the attributes are set.
+
+        Either the style definition or the name of the style definition (in the current
+        sheet) can be passed.
+
+        @a flags is a bit list of the following:
+        - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable.
+        - wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from
+          @a startFrom, otherwise existing attributes are used.
+        - wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used
+          as the level for all paragraphs, otherwise the current indentation will be used.
+
+        @see SetListStyle(), PromoteList(), ClearListStyle().
+    */
+    virtual bool NumberList(const wxRichTextRange& range, wxRichTextListStyleDefinition* def = NULL, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
+    virtual bool NumberList(const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
+    //@}
+
+    //@{
+    /**
+        Promotes or demotes the paragraphs in the given range.
+        A positive @a promoteBy produces a smaller indent, and a negative number
+        produces a larger indent. Pass flags to determine how the attributes are set.
+        Either the style definition or the name of the style definition (in the current
+        sheet) can be passed.
+
+        @a flags is a bit list of the following:
+        - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable.
+        - wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from
+          @a startFrom, otherwise existing attributes are used.
+        - wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used
+        as the level for all paragraphs, otherwise the current indentation will be used.
+
+        @see SetListStyle(), @see SetListStyle(), ClearListStyle().
+    */
+    virtual bool PromoteList(int promoteBy, const wxRichTextRange& range, wxRichTextListStyleDefinition* def = NULL, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int specifiedLevel = -1);
+    virtual bool PromoteList(int promoteBy, const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int specifiedLevel = -1);
+    //@}
+
+    /**
+        Deletes the content within the given range.
+    */
+    virtual bool Delete(const wxRichTextRange& range);
+
+    /**
+        Translates from column and line number to position.
+    */
+    virtual long XYToPosition(long x, long y) const;
+
+    /**
+        Converts a text position to zero-based column and line numbers.
+    */
+    virtual bool PositionToXY(long pos, long *x, long *y) const;
+
+    /**
+        Scrolls the buffer so that the given position is in view.
+    */
+    virtual void ShowPosition(long pos);
+
+    //@{
+    /**
+        Finds the character at the given position in pixels.
+        @a pt is in device coords (not adjusted for the client area origin nor for
+        scrolling).
+    */
+    virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const;
+    virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt,
+                                            wxTextCoord *col,
+                                            wxTextCoord *row) const;
+    //@}
 
 
-        @beginWxPerlOnly
-        In wxPerl this method takes no arguments and returns a 2-element
-        list (ok, newPos).
-        @endWxPerlOnly
+// Clipboard operations
+
+    /**
+        Copies the selected content (if any) to the clipboard.
+    */
+    virtual void Copy();
+
+    /**
+        Copies the selected content (if any) to the clipboard and deletes the selection.
+        This is undoable.
+    */
+    virtual void Cut();
+
+    /**
+        Pastes content from the clipboard to the buffer.
     */
     */
-    bool DeleteSelectedContent(long* newPos = NULL);
+    virtual void Paste();
 
     /**
         Deletes the content in the selection, if any. This is undoable.
 
     /**
         Deletes the content in the selection, if any. This is undoable.
@@ -515,133 +839,161 @@ public:
     virtual void DeleteSelection();
 
     /**
     virtual void DeleteSelection();
 
     /**
-        Sets the buffer's modified status to @false, and clears the buffer's command
-        history.
+        Returns @true if selected content can be copied to the clipboard.
     */
     */
-    virtual void DiscardEdits();
+    virtual bool CanCopy() const;
 
     /**
 
     /**
-        Ends alignment.
+        Returns @true if selected content can be copied to the clipboard and deleted.
     */
     */
-    bool EndAlignment();
+    virtual bool CanCut() const;
 
     /**
 
     /**
-        Ends application of all styles in the current style stack.
+        Returns @true if the clipboard content can be pasted to the buffer.
     */
     */
-    virtual bool EndAllStyles();
+    virtual bool CanPaste() const;
 
     /**
 
     /**
-        Ends batching undo command history.
+        Returns @true if selected content can be deleted.
     */
     */
-    virtual bool EndBatchUndo();
+    virtual bool CanDeleteSelection() const;
 
     /**
 
     /**
-        Ends using bold.
+        Undoes the command at the top of the command history, if there is one.
     */
     */
-    bool EndBold();
+    virtual void Undo();
 
     /**
 
     /**
-        Ends application of a named character style.
+        Redoes the current command.
     */
     */
-    bool EndCharacterStyle();
+    virtual void Redo();
 
     /**
 
     /**
-        Ends using a font.
+        Returns @true if there is a command in the command history that can be undone.
     */
     */
-    bool EndFont();
+    virtual bool CanUndo() const;
 
     /**
 
     /**
-        Ends using a point size.
+        Returns @true if there is a command in the command history that can be redone.
     */
     */
-    bool EndFontSize();
+    virtual bool CanRedo() const;
 
     /**
 
     /**
-        Ends using italic.
+        Sets the insertion point and causes the current editing style to be taken from
+        the new position (unlike wxRichTextCtrl::SetCaretPosition).
     */
     */
-    bool EndItalic();
+    virtual void SetInsertionPoint(long pos);
 
     /**
 
     /**
-        Ends left indent.
+        Sets the insertion point to the end of the text control.
     */
     */
-    bool EndLeftIndent();
+    virtual void SetInsertionPointEnd();
 
     /**
 
     /**
-        Ends line spacing.
+        Returns the current insertion point.
     */
     */
-    bool EndLineSpacing();
+    virtual long GetInsertionPoint() const;
 
     /**
 
     /**
-        Ends using a specified list style.
+        Returns the last position in the buffer.
     */
     */
-    bool EndListStyle();
+    virtual wxTextPos GetLastPosition() const;
 
 
+    //@{
     /**
     /**
-        Ends application of a numbered bullet.
+        Sets the selection to the given range.
+        The end point of range is specified as the last character position of the span
+        of text, plus one.
+
+        So, for example, to set the selection for a character at position 5, use the
+        range (5,6).
     */
     */
-    bool EndNumberedBullet();
+    virtual void SetSelection(long from, long to);
+    void SetSelection(const wxRichTextSelection& sel) { m_selection = sel; }
+    //@}
+
 
     /**
 
     /**
-        Ends paragraph spacing.
+        Selects all the text in the buffer.
     */
     */
-    bool EndParagraphSpacing();
+    virtual void SelectAll();
 
     /**
 
     /**
-        Ends application of a named character style.
+        Makes the control editable, or not.
     */
     */
-    bool EndParagraphStyle();
+    virtual void SetEditable(bool editable);
 
     /**
 
     /**
-        Ends right indent.
+        Returns @true if there is a selection and the object containing the selection
+        was the same as the current focus object.
     */
     */
-    bool EndRightIndent();
+    virtual bool HasSelection() const;
 
     /**
 
     /**
-        Ends the current style.
+        Returns @true if there was a selection, whether or not the current focus object
+        is the same as the selection's container object.
     */
     */
-    virtual bool EndStyle();
+    virtual bool HasUnfocusedSelection() const;
 
 
+    //@{
     /**
     /**
-        Ends suppressing undo command history.
+        Write a bitmap or image at the current insertion point.
+        Supply an optional type to use for internal and file storage of the raw data.
     */
     */
-    virtual bool EndSuppressUndo();
+    virtual bool WriteImage(const wxImage& image, wxBitmapType bitmapType = wxBITMAP_TYPE_PNG,
+                            const wxRichTextAttr& textAttr = wxRichTextAttr());
+
+    virtual bool WriteImage(const wxBitmap& bitmap, wxBitmapType bitmapType = wxBITMAP_TYPE_PNG,
+                            const wxRichTextAttr& textAttr = wxRichTextAttr());
+    //@}
 
     /**
 
     /**
-        Ends applying a symbol bullet.
+        Loads an image from a file and writes it at the current insertion point.
     */
     */
-    bool EndSymbolBullet();
+    virtual bool WriteImage(const wxString& filename, wxBitmapType bitmapType,
+                            const wxRichTextAttr& textAttr = wxRichTextAttr());
 
     /**
 
     /**
-        Ends applying a text colour.
+        Writes an image block at the current insertion point.
     */
     */
-    bool EndTextColour();
+    virtual bool WriteImage(const wxRichTextImageBlock& imageBlock,
+                            const wxRichTextAttr& textAttr = wxRichTextAttr());
 
     /**
 
     /**
-        Ends applying a URL.
+        Write a text box at the current insertion point, returning the text box.
+        You can then call SetFocusObject() to set the focus to the new object.
     */
     */
-    bool EndURL();
+    virtual wxRichTextBox* WriteTextBox(const wxRichTextAttr& textAttr = wxRichTextAttr());
 
     /**
 
     /**
-        End applying underlining.
+        Write a table at the current insertion point, returning the table.
+        You can then call SetFocusObject() to set the focus to the new object.
     */
     */
-    bool EndUnderline();
+    virtual wxRichTextTable* WriteTable(int rows, int cols, const wxRichTextAttr& tableAttr = wxRichTextAttr(), const wxRichTextAttr& cellAttr = wxRichTextAttr());
 
     /**
 
     /**
-        Helper function for extending the selection, returning @true if the selection
-        was changed. Selections are in caret positions.
+        Inserts a new paragraph at the current insertion point. @see LineBreak().
     */
     */
-    virtual bool ExtendSelection(long oldPosition, long newPosition, int flags);
+    virtual bool Newline();
 
     /**
 
     /**
-        Helper function for finding the caret position for the next word.
-        Direction is 1 (forward) or -1 (backwards).
+        Inserts a line break at the current insertion point.
+
+        A line break forces wrapping within a paragraph, and can be introduced by
+        using this function, by appending the wxChar value @b  wxRichTextLineBreakChar
+        to text content, or by typing Shift-Return.
     */
     */
-    virtual long FindNextWordPosition(int direction = 1) const;
+    virtual bool LineBreak();
 
     /**
 
     /**
-        Call this function to prevent refresh and allow fast updates, and then Thaw() to
-        refresh the control.
+        Sets the basic (overall) style.
+
+        This is the style of the whole buffer before further styles are applied,
+        unlike the default style, which only affects the style currently being
+        applied (for example, setting the default style to bold will cause
+        subsequently inserted text to be bold).
     */
     */
-    void Freeze();
+    virtual void SetBasicStyle(const wxRichTextAttr& style) { GetBuffer().SetBasicStyle(style); }
 
     /**
         Gets the basic (overall) style.
 
     /**
         Gets the basic (overall) style.
@@ -651,453 +1003,543 @@ public:
         applied (for example, setting the default style to bold will cause
         subsequently inserted text to be bold).
     */
         applied (for example, setting the default style to bold will cause
         subsequently inserted text to be bold).
     */
-    virtual const wxTextAttr& GetBasicStyle() const;
+    virtual const wxRichTextAttr& GetBasicStyle() const { return GetBuffer().GetBasicStyle(); }
+
+    /**
+        Begins applying a style.
+    */
+    virtual bool BeginStyle(const wxRichTextAttr& style) { return GetBuffer().BeginStyle(style); }
+
+    /**
+        Ends the current style.
+    */
+    virtual bool EndStyle() { return GetBuffer().EndStyle(); }
+
+    /**
+        Ends application of all styles in the current style stack.
+    */
+    virtual bool EndAllStyles() { return GetBuffer().EndAllStyles(); }
+
+    /**
+        Begins using bold.
+    */
+    bool BeginBold() { return GetBuffer().BeginBold(); }
+
+    /**
+        Ends using bold.
+    */
+    bool EndBold()  { return GetBuffer().EndBold(); }
+
+    /**
+        Begins using italic.
+    */
+    bool BeginItalic() { return GetBuffer().BeginItalic(); }
+
+    /**
+        Ends using italic.
+    */
+    bool EndItalic() { return GetBuffer().EndItalic(); }
+
+    /**
+        Begins using underlining.
+    */
+    bool BeginUnderline() { return GetBuffer().BeginUnderline(); }
+
+    /**
+        End applying underlining.
+    */
+    bool EndUnderline() { return GetBuffer().EndUnderline(); }
+
+    /**
+        Begins using the given point size.
+    */
+    bool BeginFontSize(int pointSize) { return GetBuffer().BeginFontSize(pointSize); }
+
+    /**
+        Ends using a point size.
+    */
+    bool EndFontSize() { return GetBuffer().EndFontSize(); }
+
+    /**
+        Begins using this font.
+    */
+    bool BeginFont(const wxFont& font) { return GetBuffer().BeginFont(font); }
+
+    /**
+        Ends using a font.
+    */
+    bool EndFont() { return GetBuffer().EndFont(); }
+
+    /**
+        Begins using this colour.
+    */
+    bool BeginTextColour(const wxColour& colour) { return GetBuffer().BeginTextColour(colour); }
+
+    /**
+        Ends applying a text colour.
+    */
+    bool EndTextColour() { return GetBuffer().EndTextColour(); }
+
+    /**
+        Begins using alignment.
+        For alignment values, see wxTextAttr.
+    */
+    bool BeginAlignment(wxTextAttrAlignment alignment) { return GetBuffer().BeginAlignment(alignment); }
+
+    /**
+        Ends alignment.
+    */
+    bool EndAlignment() { return GetBuffer().EndAlignment(); }
+
+    /**
+        Begins applying a left indent and subindent in tenths of a millimetre.
+        The subindent is an offset from the left edge of the paragraph, and is
+        used for all but the first line in a paragraph. A positive value will
+        cause the first line to appear to the left of the subsequent lines, and
+        a negative value will cause the first line to be indented to the right
+        of the subsequent lines.
+
+        wxRichTextBuffer uses indentation to render a bulleted item. The
+        content of the paragraph, including the first line, starts at the
+        @a leftIndent plus the @a leftSubIndent.
+
+        @param leftIndent
+            The distance between the margin and the bullet.
+        @param leftSubIndent
+             The distance between the left edge of the bullet and the left edge
+             of the actual paragraph.
+    */
+    bool BeginLeftIndent(int leftIndent, int leftSubIndent = 0) { return GetBuffer().BeginLeftIndent(leftIndent, leftSubIndent); }
+
+    /**
+        Ends left indent.
+    */
+    bool EndLeftIndent() { return GetBuffer().EndLeftIndent(); }
+
+    /**
+        Begins a right indent, specified in tenths of a millimetre.
+    */
+    bool BeginRightIndent(int rightIndent) { return GetBuffer().BeginRightIndent(rightIndent); }
+
+    /**
+        Ends right indent.
+    */
+    bool EndRightIndent() { return GetBuffer().EndRightIndent(); }
+
+    /**
+        Begins paragraph spacing; pass the before-paragraph and after-paragraph spacing
+        in tenths of a millimetre.
+    */
+    bool BeginParagraphSpacing(int before, int after) { return GetBuffer().BeginParagraphSpacing(before, after); }
+
+    /**
+        Ends paragraph spacing.
+    */
+    bool EndParagraphSpacing() { return GetBuffer().EndParagraphSpacing(); }
+
+    /**
+        Begins appling line spacing. @e spacing is a multiple, where 10 means
+        single-spacing, 15 means 1.5 spacing, and 20 means double spacing.
+
+        The ::wxTextAttrLineSpacing constants are defined for convenience.
+    */
+    bool BeginLineSpacing(int lineSpacing) { return GetBuffer().BeginLineSpacing(lineSpacing); }
+
+    /**
+        Ends line spacing.
+    */
+    bool EndLineSpacing() { return GetBuffer().EndLineSpacing(); }
+
+    /**
+        Begins a numbered bullet.
+
+        This call will be needed for each item in the list, and the
+        application should take care of incrementing the numbering.
+
+        @a bulletNumber is a number, usually starting with 1.
+        @a leftIndent and @a leftSubIndent are values in tenths of a millimetre.
+        @a bulletStyle is a bitlist of the  ::wxTextAttrBulletStyle values.
+
+        wxRichTextBuffer uses indentation to render a bulleted item.
+        The left indent is the distance between the margin and the bullet.
+        The content of the paragraph, including the first line, starts
+        at leftMargin + leftSubIndent.
+        So the distance between the left edge of the bullet and the
+        left of the actual paragraph is leftSubIndent.
+    */
+    bool BeginNumberedBullet(int bulletNumber, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC|wxTEXT_ATTR_BULLET_STYLE_PERIOD)
+    { return GetBuffer().BeginNumberedBullet(bulletNumber, leftIndent, leftSubIndent, bulletStyle); }
 
 
-    //@{
     /**
     /**
-        Returns the buffer associated with the control.
+        Ends application of a numbered bullet.
     */
     */
-    const wxRichTextBuffer GetBuffer();
-    const wxRichTextBuffer&  GetBuffer();
-    //@}
+    bool EndNumberedBullet() { return GetBuffer().EndNumberedBullet(); }
 
     /**
 
     /**
-        Returns the current caret position.
+        Begins applying a symbol bullet, using a character from the current font.
+        See BeginNumberedBullet() for an explanation of how indentation is used
+        to render the bulleted paragraph.
     */
     */
-    long GetCaretPosition() const;
+    bool BeginSymbolBullet(const wxString& symbol, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_SYMBOL)
+    { return GetBuffer().BeginSymbolBullet(symbol, leftIndent, leftSubIndent, bulletStyle); }
 
     /**
 
     /**
-        Returns the caret height and position for the given character position.
-
-        @beginWxPerlOnly
-        In wxPerl this method is implemented as
-        GetCaretPositionForIndex(@a position) returning a
-        2-element list (ok, rect).
-        @endWxPerlOnly
+        Ends applying a symbol bullet.
     */
     */
-    bool GetCaretPositionForIndex(long position, wxRect& rect);
+    bool EndSymbolBullet() { return GetBuffer().EndSymbolBullet(); }
 
     /**
 
     /**
-        Gets the command processor associated with the control's buffer.
+        Begins applying a symbol bullet.
     */
     */
-    wxCommandProcessor* GetCommandProcessor() const;
+    bool BeginStandardBullet(const wxString& bulletName, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_STANDARD)
+    { return GetBuffer().BeginStandardBullet(bulletName, leftIndent, leftSubIndent, bulletStyle); }
 
     /**
 
     /**
-        Returns the current default style, which can be used to change how subsequently
-        inserted text is displayed.
+        Begins applying a standard bullet.
     */
     */
-    virtual const wxTextAttr& GetDefaultStyle() const;
+    bool EndStandardBullet() { return GetBuffer().EndStandardBullet(); }
 
     /**
 
     /**
-        Gets the size of the buffer beyond which layout is delayed during resizing.
-        This optimizes sizing for large buffers. The default is 20000.
+        Begins using the named character style.
     */
     */
-    long GetDelayedLayoutThreshold() const;
+    bool BeginCharacterStyle(const wxString& characterStyle) { return GetBuffer().BeginCharacterStyle(characterStyle); }
 
     /**
 
     /**
-        Gets the current filename associated with the control.
+        Ends application of a named character style.
     */
     */
-    wxString GetFilename() const;
+    bool EndCharacterStyle() { return GetBuffer().EndCharacterStyle(); }
 
     /**
 
     /**
-        Returns the first visible position in the current view.
+        Begins applying the named paragraph style.
     */
     */
-    long GetFirstVisiblePosition() const;
+    bool BeginParagraphStyle(const wxString& paragraphStyle) { return GetBuffer().BeginParagraphStyle(paragraphStyle); }
 
     /**
 
     /**
-        Returns flags that change the behaviour of loading or saving.
-        See the documentation for each handler class to see what flags are
-        relevant for each handler.
+        Ends application of a named paragraph style.
     */
     */
-    int GetHandlerFlags() const;
+    bool EndParagraphStyle() { return GetBuffer().EndParagraphStyle(); }
 
     /**
 
     /**
-        Returns the current insertion point.
+        Begins using a specified list style.
+        Optionally, you can also pass a level and a number.
     */
     */
-    virtual long GetInsertionPoint() const;
+    bool BeginListStyle(const wxString& listStyle, int level = 1, int number = 1) { return GetBuffer().BeginListStyle(listStyle, level, number); }
 
     /**
 
     /**
-        Returns the last position in the buffer.
+        Ends using a specified list style.
     */
     */
-    virtual wxTextPos GetLastPosition() const;
+    bool EndListStyle() { return GetBuffer().EndListStyle(); }
 
     /**
 
     /**
-        Returns the length of the specified line in characters.
+        Begins applying wxTEXT_ATTR_URL to the content.
+
+        Pass a URL and optionally, a character style to apply, since it is common
+        to mark a URL with a familiar style such as blue text with underlining.
     */
     */
-    virtual int GetLineLength(long lineNo) const;
+    bool BeginURL(const wxString& url, const wxString& characterStyle = wxEmptyString) { return GetBuffer().BeginURL(url, characterStyle); }
 
     /**
 
     /**
-        Returns the text for the given line.
+        Ends applying a URL.
     */
     */
-    virtual wxString GetLineText(long lineNo) const;
+    bool EndURL() { return GetBuffer().EndURL(); }
 
     /**
 
     /**
-        Transforms physical window position to logical (unscrolled) position.
+        Sets the default style to the style under the cursor.
     */
     */
-    wxPoint GetLogicalPoint(const wxPoint& ptPhysical) const;
+    bool SetDefaultStyleToCursorStyle();
 
     /**
 
     /**
-        Returns the number of lines in the buffer.
+        Cancels any selection.
     */
     */
-    virtual int GetNumberOfLines() const;
+    virtual void SelectNone();
 
     /**
 
     /**
-        Transforms logical (unscrolled) position to physical window position.
+        Selects the word at the given character position.
     */
     */
-    wxPoint GetPhysicalPoint(const wxPoint& ptLogical) const;
+    virtual bool SelectWord(long position);
 
     /**
 
     /**
-        Gets the text for the given range.
-        The end point of range is specified as the last character position of
-        the span of text, plus one.
+        Returns the selection range in character positions. -1, -1 means no selection.
+
+        The range is in API convention, i.e. a single character selection is denoted
+        by (n, n+1)
     */
     */
-    virtual wxString GetRange(long from, long to) const;
+    wxRichTextRange GetSelectionRange() const;
 
     /**
 
     /**
-        Returns the range of the current selection.
+        Sets the selection to the given range.
         The end point of range is specified as the last character position of the span
         of text, plus one.
         The end point of range is specified as the last character position of the span
         of text, plus one.
-        If the return values @a from and @a to are the same, there is no selection.
-    */
-    virtual void GetSelection(long* from, long* to) const;
 
 
-    /**
-        Returns the selection range in character positions. -1, -1 means no selection.
+        So, for example, to set the selection for a character at position 5, use the
+        range (5,6).
     */
     */
-    wxRichTextRange GetSelectionRange() const;
+    void SetSelectionRange(const wxRichTextRange& range);
 
     /**
 
     /**
-        Returns the text within the current selection range, if any.
+        Returns the selection range in character positions. -2, -2 means no selection
+        -1, -1 means select everything.
+        The range is in internal format, i.e. a single character selection is denoted
+        by (n, n)
     */
     */
-    virtual wxString GetStringSelection() const;
+    wxRichTextRange GetInternalSelectionRange() const { return m_selection.GetRange(); }
 
     /**
 
     /**
-        Gets the attributes at the given position.
-        This function gets the combined style - that is, the style you see on the
-        screen as a result of combining base style, paragraph style and character
-        style attributes.
-
-        To get the character or paragraph style alone, use GetUncombinedStyle().
-
-        @beginWxPerlOnly
-        In wxPerl this method is implemented as GetStyle(@a position)
-        returning a 2-element list (ok, attr).
-        @endWxPerlOnly
+        Sets the selection range in character positions. -2, -2 means no selection
+        -1, -1 means select everything.
+        The range is in internal format, i.e. a single character selection is denoted
+        by (n, n)
     */
     */
-    virtual bool GetStyle(long position, wxTextAttr& style);
+    void SetInternalSelectionRange(const wxRichTextRange& range) { m_selection.Set(range, GetFocusObject()); }
 
     /**
 
     /**
-        Gets the attributes common to the specified range.
-        Attributes that differ in value within the range will not be included
-        in @a style flags.
-
-        @beginWxPerlOnly
-        In wxPerl this method is implemented as GetStyleForRange(@a position)
-        returning a 2-element list (ok, attr).
-        @endWxPerlOnly
+        Adds a new paragraph of text to the end of the buffer.
     */
     */
-    virtual bool GetStyleForRange(const wxRichTextRange& range,
-                                  wxTextAttr& style);
+    virtual wxRichTextRange AddParagraph(const wxString& text);
 
     /**
 
     /**
-        Returns the style sheet associated with the control, if any.
-        A style sheet allows named character and paragraph styles to be applied.
+        Adds an image to the control's buffer.
     */
     */
-    wxRichTextStyleSheet* GetStyleSheet() const;
+    virtual wxRichTextRange AddImage(const wxImage& image);
 
     /**
 
     /**
-        Gets the attributes at the given position.
-        This function gets the @e uncombined style - that is, the attributes associated
-        with the paragraph or character content, and not necessarily the combined
-        attributes you see on the screen.
-        To get the combined attributes, use GetStyle().
-
-        If you specify (any) paragraph attribute in @e style's flags, this function
-        will fetch the paragraph attributes.
-        Otherwise, it will return the character attributes.
-
-        @beginWxPerlOnly
-        In wxPerl this method is implemented as GetUncombinedStyle(@a position)
-        returning a 2-element list (ok, attr).
-        @endWxPerlOnly
+        Lays out the buffer, which must be done before certain operations, such as
+        setting the caret position.
+        This function should not normally be required by the application.
     */
     */
-    virtual bool GetUncombinedStyle(long position, wxTextAttr& style);
+    virtual bool LayoutContent(bool onlyVisibleRect = false);
 
     /**
 
     /**
-        Returns the content of the entire control as a string.
-    */
-    virtual wxString GetValue() const;
+        Move the caret to the given character position.
 
 
-    /**
-        Internal helper function returning the line for the visible caret position.
-        If the caret is shown at the very end of the line, it means the next character
-        is actually on the following line.
-        So this function gets the line we're expecting to find if this is the case.
+        Please note that this does not update the current editing style
+        from the new position; to do that, call wxRichTextCtrl::SetInsertionPoint instead.
     */
     */
-    wxRichTextLine* GetVisibleLineForCaretPosition(long caretPosition) const;
+    virtual bool MoveCaret(long pos, bool showAtLineStart = false, wxRichTextParagraphLayoutBox* container = NULL);
 
     /**
 
     /**
-        Test if this whole range has character attributes of the specified kind.
-        If any of the attributes are different within the range, the test fails.
-
-        You can use this to implement, for example, bold button updating.
-        @a style must have flags indicating which attributes are of interest.
+        Moves right.
     */
     */
-    virtual bool HasCharacterAttributes(const wxRichTextRange& range,
-                                        const wxTextAttr& style) const;
+    virtual bool MoveRight(int noPositions = 1, int flags = 0);
 
     /**
 
     /**
-        Test if this whole range has paragraph attributes of the specified kind.
-        If any of the attributes are different within the range, the test fails.
-        You can use this to implement, for example, centering button updating.
-        @a style must have flags indicating which attributes are of interest.
+        Moves left.
     */
     */
-    virtual bool HasParagraphAttributes(const wxRichTextRange& range,
-                                        const wxTextAttr& style) const;
+    virtual bool MoveLeft(int noPositions = 1, int flags = 0);
 
     /**
 
     /**
-        Returns @true if there is a selection.
+        Moves to the start of the paragraph.
     */
     */
-    virtual bool HasSelection() const;
+    virtual bool MoveUp(int noLines = 1, int flags = 0);
 
 
-    //@{
     /**
     /**
-        Finds the character at the given position in pixels.
-        @a pt is in device coords (not adjusted for the client area origin nor for
-        scrolling).
+        Moves the caret down.
     */
     */
-    wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long* pos) const;
-    const wxTextCtrlHitTestResult HitTest(const wxPoint& pt,
-                                          wxTextCoord* col,
-                                          wxTextCoord* row) const;
-    //@}
+    virtual bool MoveDown(int noLines = 1, int flags = 0);
 
     /**
 
     /**
-        Initialises the members of the control.
+        Moves to the end of the line.
     */
     */
-    void Init();
+    virtual bool MoveToLineEnd(int flags = 0);
 
     /**
 
     /**
-        Returns @true if the user has recently set the default style without moving
-        the caret, and therefore the UI needs to reflect the default style and not
-        the style at the caret.
-
-        Below is an example of code that uses this function to determine whether the UI
-        should show that the current style is bold.
-
-        @see SetAndShowDefaultStyle().
+        Moves to the start of the line.
     */
     */
-    bool IsDefaultStyleShowing() const;
+    virtual bool MoveToLineStart(int flags = 0);
 
     /**
 
     /**
-        Returns @true if the control is editable.
+        Moves to the end of the paragraph.
     */
     */
-    virtual bool IsEditable() const;
+    virtual bool MoveToParagraphEnd(int flags = 0);
 
     /**
 
     /**
-        Returns @true if Freeze has been called without a Thaw.
+        Moves to the start of the paragraph.
     */
     */
-    bool IsFrozen() const;
+    virtual bool MoveToParagraphStart(int flags = 0);
 
     /**
 
     /**
-        Returns @true if the buffer has been modified.
+        Moves to the start of the buffer.
     */
     */
-    virtual bool IsModified() const;
+    virtual bool MoveHome(int flags = 0);
 
     /**
 
     /**
-        Returns @true if the control is multiline.
+        Moves to the end of the buffer.
     */
     */
-    bool IsMultiLine() const;
+    virtual bool MoveEnd(int flags = 0);
 
     /**
 
     /**
-        Returns @true if the given position is visible on the screen.
+        Moves one or more pages up.
     */
     */
-    bool IsPositionVisible(long pos) const;
+    virtual bool PageUp(int noPages = 1, int flags = 0);
 
     /**
 
     /**
-        Returns @true if all of the selection is aligned according to the specified flag.
+        Moves one or more pages down.
     */
     */
-    virtual bool IsSelectionAligned(wxTextAttrAlignment alignment);
+    virtual bool PageDown(int noPages = 1, int flags = 0);
 
     /**
 
     /**
-        Returns @true if all of the selection is bold.
+        Moves a number of words to the left.
     */
     */
-    virtual bool IsSelectionBold();
+    virtual bool WordLeft(int noPages = 1, int flags = 0);
 
     /**
 
     /**
-        Returns @true if all of the selection is italic.
+        Move a nuber of words to the right.
     */
     */
-    virtual bool IsSelectionItalics();
+    virtual bool WordRight(int noPages = 1, int flags = 0);
 
 
+    //@{
     /**
     /**
-        Returns @true if all of the selection is underlined.
+        Returns the buffer associated with the control.
     */
     */
-    virtual bool IsSelectionUnderlined();
+    wxRichTextBuffer& GetBuffer() { return m_buffer; }
+    const wxRichTextBuffer& GetBuffer() const { return m_buffer; }
+    //@}
 
     /**
 
     /**
-        Returns @true if the control is single-line.
-        Currently wxRichTextCtrl does not support single-line editing.
+        Starts batching undo history for commands.
     */
     */
-    bool IsSingleLine() const;
+    virtual bool BeginBatchUndo(const wxString& cmdName) { return m_buffer.BeginBatchUndo(cmdName); }
 
     /**
 
     /**
-        Helper function implementing keyboard navigation.
+        Ends batching undo command history.
     */
     */
-    virtual bool KeyboardNavigate(int keyCode, int flags);
+    virtual bool EndBatchUndo() { return m_buffer.EndBatchUndo(); }
 
     /**
 
     /**
-        Lays out the buffer, which must be done before certain operations, such as
-        setting the caret position.
-        This function should not normally be required by the application.
+        Returns @true if undo commands are being batched.
     */
     */
-    virtual bool LayoutContent(bool onlyVisibleRect = false);
+    virtual bool BatchingUndo() const { return m_buffer.BatchingUndo(); }
 
     /**
 
     /**
-        Inserts a line break at the current insertion point.
-
-        A line break forces wrapping within a paragraph, and can be introduced by
-        using this function, by appending the wxChar value @b  wxRichTextLineBreakChar
-        to text content, or by typing Shift-Return.
+        Starts suppressing undo history for commands.
     */
     */
-    virtual bool LineBreak();
+    virtual bool BeginSuppressUndo() { return m_buffer.BeginSuppressUndo(); }
 
     /**
 
     /**
-        Loads content into the control's buffer using the given type.
-
-        If the specified type is wxRICHTEXT_TYPE_ANY, the type is deduced from
-        the filename extension.
-
-        This function looks for a suitable wxRichTextFileHandler object.
+        Ends suppressing undo command history.
     */
     */
-    bool LoadFile(const wxString& file,
-                  int type = wxRICHTEXT_TYPE_ANY);
+    virtual bool EndSuppressUndo() { return m_buffer.EndSuppressUndo(); }
 
     /**
 
     /**
-        Marks the buffer as modified.
+        Returns @true if undo history suppression is on.
     */
     */
-    virtual void MarkDirty();
+    virtual bool SuppressingUndo() const { return m_buffer.SuppressingUndo(); }
 
     /**
 
     /**
-        Move the caret to the given character position.
+        Test if this whole range has character attributes of the specified kind.
+        If any of the attributes are different within the range, the test fails.
 
 
-        Please note that this does not update the current editing style
-        from the new position; to do that, call wxRichTextCtrl::SetInsertionPoint instead.
+        You can use this to implement, for example, bold button updating.
+        @a style must have flags indicating which attributes are of interest.
     */
     */
-    virtual bool MoveCaret(long pos, bool showAtLineStart = false);
+    virtual bool HasCharacterAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const
+    {
+        return GetBuffer().HasCharacterAttributes(range.ToInternal(), style);
+    }
 
     /**
 
     /**
-        Move the caret one visual step forward: this may mean setting a flag
-        and keeping the same position if we're going from the end of one line
-        to the start of the next, which may be the exact same caret position.
+        Test if this whole range has paragraph attributes of the specified kind.
+        If any of the attributes are different within the range, the test fails.
+        You can use this to implement, for example, centering button updating.
+        @a style must have flags indicating which attributes are of interest.
     */
     */
-    void MoveCaretBack(long oldPosition);
+    virtual bool HasParagraphAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const
+    {
+        return GetBuffer().HasParagraphAttributes(range.ToInternal(), style);
+    }
 
     /**
 
     /**
-        Move the caret one visual step forward: this may mean setting a flag
-        and keeping the same position if we're going from the end of one line
-        to the start of the next, which may be the exact same caret position.
+        Returns @true if all of the selection is bold.
     */
     */
-    void MoveCaretForward(long oldPosition);
+    virtual bool IsSelectionBold();
 
     /**
 
     /**
-        Moves the caret down.
+        Returns @true if all of the selection is italic.
     */
     */
-    virtual bool MoveDown(int noLines = 1, int flags = 0);
+    virtual bool IsSelectionItalics();
 
     /**
 
     /**
-        Moves to the end of the buffer.
+        Returns @true if all of the selection is underlined.
     */
     */
-    virtual bool MoveEnd(int flags = 0);
+    virtual bool IsSelectionUnderlined();
 
     /**
 
     /**
-        Moves to the start of the buffer.
+        Returns @true if all of the selection is aligned according to the specified flag.
     */
     */
-    virtual bool MoveHome(int flags = 0);
+    virtual bool IsSelectionAligned(wxTextAttrAlignment alignment);
 
     /**
 
     /**
-        Moves left.
+        Apples bold to the selection (undoable).
     */
     */
-    virtual bool MoveLeft(int noPositions = 1, int flags = 0);
+    virtual bool ApplyBoldToSelection();
 
     /**
 
     /**
-        Moves right.
+        Applies italic to the selection (undoable).
     */
     */
-    virtual bool MoveRight(int noPositions = 1, int flags = 0);
+    virtual bool ApplyItalicToSelection();
 
     /**
 
     /**
-        Moves to the end of the line.
+        Applies underline to the selection (undoable).
     */
     */
-    virtual bool MoveToLineEnd(int flags = 0);
+    virtual bool ApplyUnderlineToSelection();
 
     /**
 
     /**
-        Moves to the start of the line.
+        Applies the given alignment to the selection (undoable).
+        For alignment values, see wxTextAttr.
     */
     */
-    virtual bool MoveToLineStart(int flags = 0);
+    virtual bool ApplyAlignmentToSelection(wxTextAttrAlignment alignment);
 
     /**
 
     /**
-        Moves to the end of the paragraph.
+        Applies the style sheet to the buffer, matching paragraph styles in the sheet
+        against named styles in the buffer.
+
+        This might be useful if the styles have changed.
+        If @a sheet is @NULL, the sheet set with SetStyleSheet() is used.
+        Currently this applies paragraph styles only.
     */
     */
-    virtual bool MoveToParagraphEnd(int flags = 0);
+    virtual bool ApplyStyle(wxRichTextStyleDefinition* def);
 
     /**
 
     /**
-        Moves to the start of the paragraph.
+        Sets the style sheet associated with the control.
+        A style sheet allows named character and paragraph styles to be applied.
     */
     */
-    virtual bool MoveToParagraphStart(int flags = 0);
+    void SetStyleSheet(wxRichTextStyleSheet* styleSheet) { GetBuffer().SetStyleSheet(styleSheet); }
 
     /**
 
     /**
-        Moves up.
+        Returns the style sheet associated with the control, if any.
+        A style sheet allows named character and paragraph styles to be applied.
     */
     */
-    virtual bool MoveUp(int noLines = 1, int flags = 0);
+    wxRichTextStyleSheet* GetStyleSheet() const { return GetBuffer().GetStyleSheet(); }
 
     /**
 
     /**
-        Inserts a new paragraph at the current insertion point. @see LineBreak().
+        Push the style sheet to top of stack.
     */
     */
-    virtual bool Newline();
+    bool PushStyleSheet(wxRichTextStyleSheet* styleSheet) { return GetBuffer().PushStyleSheet(styleSheet); }
 
 
-    //@{
     /**
     /**
-        Numbers the paragraphs in the given range.
-        Pass flags to determine how the attributes are set.
-
-        Either the style definition or the name of the style definition (in the current
-        sheet) can be passed.
-
-        @a flags is a bit list of the following:
-        - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable.
-        - wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from
-          @a startFrom, otherwise existing attributes are used.
-        - wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used
-          as the level for all paragraphs, otherwise the current indentation will be used.
-
-        @see SetListStyle(), PromoteList(), ClearListStyle().
+        Pops the style sheet from top of stack.
     */
     */
-    bool NumberList(const wxRichTextRange& range,
-                    const wxRichTextListStyleDefinition* style,
-                    int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO,
-                    int startFrom = -1,
-                    int listLevel = -1);
-    bool Number(const wxRichTextRange& range,
-                const wxString& styleName,
-                int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO,
-                int startFrom = -1,
-                int listLevel = -1);
-    //@}
+    wxRichTextStyleSheet* PopStyleSheet() { return GetBuffer().PopStyleSheet(); }
 
     /**
 
     /**
-        Standard handler for the wxID_CLEAR command.
+        Applies the style sheet to the buffer, for example if the styles have changed.
     */
     */
-    void OnClear(wxCommandEvent& event);
+    bool ApplyStyleSheet(wxRichTextStyleSheet* styleSheet = NULL);
+
+// Command handlers
 
     /**
 
     /**
-        Shows a standard context menu with undo, redo, cut, copy, paste, clear, and
-        select all commands.
+        Sends the event to the control.
     */
     */
-    void OnContextMenu(wxContextMenuEvent& event);
+    void Command(wxCommandEvent& event);
 
     /**
 
     /**
-        Standard handler for the wxID_COPY command.
+        Loads the first dropped file.
     */
     */
-    void OnCopy(wxCommandEvent& event);
+    void OnDropFiles(wxDropFilesEvent& event);
+
+    void OnCaptureLost(wxMouseCaptureLostEvent& event);
+    void OnSysColourChanged(wxSysColourChangedEvent& event);
 
     /**
         Standard handler for the wxID_CUT command.
 
     /**
         Standard handler for the wxID_CUT command.
@@ -1105,15 +1547,20 @@ public:
     void OnCut(wxCommandEvent& event);
 
     /**
     void OnCut(wxCommandEvent& event);
 
     /**
-        Loads the first dropped file.
+        Standard handler for the wxID_COPY command.
     */
     */
-    void OnDropFiles(wxDropFilesEvent& event);
+    void OnCopy(wxCommandEvent& event);
 
     /**
         Standard handler for the wxID_PASTE command.
     */
     void OnPaste(wxCommandEvent& event);
 
 
     /**
         Standard handler for the wxID_PASTE command.
     */
     void OnPaste(wxCommandEvent& event);
 
+    /**
+        Standard handler for the wxID_UNDO command.
+    */
+    void OnUndo(wxCommandEvent& event);
+
     /**
         Standard handler for the wxID_REDO command.
     */
     /**
         Standard handler for the wxID_REDO command.
     */
@@ -1125,30 +1572,35 @@ public:
     void OnSelectAll(wxCommandEvent& event);
 
     /**
     void OnSelectAll(wxCommandEvent& event);
 
     /**
-        Standard handler for the wxID_UNDO command.
+        Standard handler for property commands.
     */
     */
-    void OnUndo(wxCommandEvent& event);
+    void OnProperties(wxCommandEvent& event);
 
     /**
 
     /**
-        Standard update handler for the wxID_CLEAR command.
+        Standard handler for the wxID_CLEAR command.
     */
     */
-    void OnUpdateClear(wxUpdateUIEvent& event);
+    void OnClear(wxCommandEvent& event);
 
     /**
 
     /**
-        Standard update handler for the wxID_COPY command.
+        Standard update handler for the wxID_CUT command.
     */
     */
-    void OnUpdateCopy(wxUpdateUIEvent& event);
+    void OnUpdateCut(wxUpdateUIEvent& event);
 
     /**
 
     /**
-        Standard update handler for the wxID_CUT command.
+        Standard update handler for the wxID_COPY command.
     */
     */
-    void OnUpdateCut(wxUpdateUIEvent& event);
+    void OnUpdateCopy(wxUpdateUIEvent& event);
 
     /**
         Standard update handler for the wxID_PASTE command.
     */
     void OnUpdatePaste(wxUpdateUIEvent& event);
 
 
     /**
         Standard update handler for the wxID_PASTE command.
     */
     void OnUpdatePaste(wxUpdateUIEvent& event);
 
+    /**
+        Standard update handler for the wxID_UNDO command.
+    */
+    void OnUpdateUndo(wxUpdateUIEvent& event);
+
     /**
         Standard update handler for the wxID_REDO command.
     */
     /**
         Standard update handler for the wxID_REDO command.
     */
@@ -1160,19 +1612,77 @@ public:
     void OnUpdateSelectAll(wxUpdateUIEvent& event);
 
     /**
     void OnUpdateSelectAll(wxUpdateUIEvent& event);
 
     /**
-        Standard update handler for the wxID_UNDO command.
+        Standard update handler for property commands.
     */
     */
-    void OnUpdateUndo(wxUpdateUIEvent& event);
+
+    void OnUpdateProperties(wxUpdateUIEvent& event);
 
     /**
 
     /**
-        Moves one or more pages down.
+        Standard update handler for the wxID_CLEAR command.
     */
     */
-    virtual bool PageDown(int noPages = 1, int flags = 0);
+    void OnUpdateClear(wxUpdateUIEvent& event);
 
     /**
 
     /**
-        Moves one or more pages up.
+        Shows a standard context menu with undo, redo, cut, copy, paste, clear, and
+        select all commands.
     */
     */
-    virtual bool PageUp(int noPages = 1, int flags = 0);
+    void OnContextMenu(wxContextMenuEvent& event);
+
+// Event handlers
+
+    // Painting
+    void OnPaint(wxPaintEvent& event);
+    void OnEraseBackground(wxEraseEvent& event);
+
+    // Left-click
+    void OnLeftClick(wxMouseEvent& event);
+
+    // Left-up
+    void OnLeftUp(wxMouseEvent& event);
+
+    // Motion
+    void OnMoveMouse(wxMouseEvent& event);
+
+    // Left-double-click
+    void OnLeftDClick(wxMouseEvent& event);
+
+    // Middle-click
+    void OnMiddleClick(wxMouseEvent& event);
+
+    // Right-click
+    void OnRightClick(wxMouseEvent& event);
+
+    // Key press
+    void OnChar(wxKeyEvent& event);
+
+    // Sizing
+    void OnSize(wxSizeEvent& event);
+
+    // Setting/losing focus
+    void OnSetFocus(wxFocusEvent& event);
+    void OnKillFocus(wxFocusEvent& event);
+
+    // Idle-time processing
+    void OnIdle(wxIdleEvent& event);
+
+    // Scrolling
+    void OnScroll(wxScrollWinEvent& event);
+
+    /**
+        Sets the font, and also the basic and default attributes
+        (see wxRichTextCtrl::SetDefaultStyle).
+    */
+    virtual bool SetFont(const wxFont& font);
+
+    /**
+        A helper function setting up scrollbars, for example after a resize.
+    */
+    virtual void SetupScrollbars(bool atTop = false);
+
+    /**
+        Helper function implementing keyboard navigation.
+    */
+    virtual bool KeyboardNavigate(int keyCode, int flags);
 
     /**
         Paints the background.
 
     /**
         Paints the background.
@@ -1184,92 +1694,167 @@ public:
 
         @since 2.9.1
     */
 
         @since 2.9.1
     */
-    virtual void PaintAboveContent(wxDC& dc);
+    virtual void PaintAboveContent(wxDC& WXUNUSED(dc)) {}
 
 
+#if wxRICHTEXT_BUFFERED_PAINTING
     /**
     /**
-        Pastes content from the clipboard to the buffer.
+        Recreates the buffer bitmap if necessary.
     */
     */
-    virtual void Paste();
+    virtual bool RecreateBuffer(const wxSize& size = wxDefaultSize);
+#endif
+
+    // Write text
+    virtual void DoWriteText(const wxString& value, int flags = 0);
+
+    // Should we inherit colours?
+    virtual bool ShouldInheritColours() const { return false; }
 
     /**
         Internal function to position the visible caret according to the current caret
         position.
     */
 
     /**
         Internal function to position the visible caret according to the current caret
         position.
     */
-    virtual void PositionCaret();
+    virtual void PositionCaret(wxRichTextParagraphLayoutBox* container = NULL);
 
     /**
 
     /**
-        Converts a text position to zero-based column and line numbers.
+        Helper function for extending the selection, returning @true if the selection
+        was changed. Selections are in caret positions.
     */
     */
-    virtual bool PositionToXY(long pos, long* x, long* y) const;
+    virtual bool ExtendSelection(long oldPosition, long newPosition, int flags);
 
 
-    //@{
     /**
     /**
-        Promotes or demotes the paragraphs in the given range.
-        A positive @a promoteBy produces a smaller indent, and a negative number
-        produces a larger indent. Pass flags to determine how the attributes are set.
-        Either the style definition or the name of the style definition (in the current
-        sheet) can be passed.
+        Scrolls @a position into view. This function takes a caret position.
+    */
+    virtual bool ScrollIntoView(long position, int keyCode);
 
 
-        @a flags is a bit list of the following:
-        - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable.
-        - wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from
-          @a startFrom, otherwise existing attributes are used.
-        - wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used
-        as the level for all paragraphs, otherwise the current indentation will be used.
+    /**
+        Refreshes the area affected by a selection change.
+    */
+    bool RefreshForSelectionChange(const wxRichTextSelection& oldSelection, const wxRichTextSelection& newSelection);
 
 
-        @see SetListStyle(), @see SetListStyle(), ClearListStyle().
+    /**
+        Sets the caret position.
+
+        The caret position is the character position just before the caret.
+        A value of -1 means the caret is at the start of the buffer.
+        Please note that this does not update the current editing style
+        from the new position or cause the actual caret to be refreshed; to do that,
+        call wxRichTextCtrl::SetInsertionPoint instead.
     */
     */
-    bool PromoteList(int promoteBy, const wxRichTextRange& range,
-                     const wxRichTextListStyleDefinition* style,
-                     int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO,
-                     int listLevel = -1);
-    bool PromoteList(int promoteBy, const wxRichTextRange& range,
-                     const wxString& styleName,
-                     int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO,
-                     int listLevel = -1);
-    //@}
+    void SetCaretPosition(long position, bool showAtLineStart = false) ;
 
     /**
 
     /**
-        Redoes the current command.
+        Returns the current caret position.
     */
     */
-    virtual void Redo();
+    long GetCaretPosition() const { return m_caretPosition; }
 
     /**
 
     /**
-        Removes the content in the specified range.
+        The adjusted caret position is the character position adjusted to take
+        into account whether we're at the start of a paragraph, in which case
+        style information should be taken from the next position, not current one.
     */
     */
-    virtual void Remove(long from, long to);
+    long GetAdjustedCaretPosition(long caretPos) const;
 
     /**
 
     /**
-        Replaces the content in the specified range with the string specified by
-        @a value.
+        Move the caret one visual step forward: this may mean setting a flag
+        and keeping the same position if we're going from the end of one line
+        to the start of the next, which may be the exact same caret position.
     */
     */
-    virtual void Replace(long from, long to, const wxString& value);
+    void MoveCaretForward(long oldPosition) ;
 
     /**
 
     /**
-        Saves the buffer content using the given type.
+        Move the caret one visual step forward: this may mean setting a flag
+        and keeping the same position if we're going from the end of one line
+        to the start of the next, which may be the exact same caret position.
+    */
+    void MoveCaretBack(long oldPosition) ;
 
 
-        If the specified type is wxRICHTEXT_TYPE_ANY, the type is deduced from
-        the filename extension.
+    /**
+        Returns the caret height and position for the given character position.
+        If container is null, the current focus object will be used.
 
 
-        This function looks for a suitable wxRichTextFileHandler object.
+        @beginWxPerlOnly
+        In wxPerl this method is implemented as
+        GetCaretPositionForIndex(@a position) returning a
+        2-element list (ok, rect).
+        @endWxPerlOnly
     */
     */
-    bool SaveFile(const wxString& file = wxEmptyString,
-                  int type = wxRICHTEXT_TYPE_ANY);
+    bool GetCaretPositionForIndex(long position, wxRect& rect, wxRichTextParagraphLayoutBox* container = NULL);
 
     /**
 
     /**
-        Scrolls @a position into view. This function takes a caret position.
+        Internal helper function returning the line for the visible caret position.
+        If the caret is shown at the very end of the line, it means the next character
+        is actually on the following line.
+        So this function gets the line we're expecting to find if this is the case.
     */
     */
-    virtual bool ScrollIntoView(long position, int keyCode);
+    wxRichTextLine* GetVisibleLineForCaretPosition(long caretPosition) const;
 
     /**
 
     /**
-        Selects all the text in the buffer.
+        Gets the command processor associated with the control's buffer.
     */
     */
-    virtual void SelectAll();
+    wxCommandProcessor* GetCommandProcessor() const { return GetBuffer().GetCommandProcessor(); }
+
+    /**
+        Deletes content if there is a selection, e.g. when pressing a key.
+        Returns the new caret position in @e newPos, or leaves it if there
+        was no action. This is undoable.
+
+        @beginWxPerlOnly
+        In wxPerl this method takes no arguments and returns a 2-element
+        list (ok, newPos).
+        @endWxPerlOnly
+    */
+    bool DeleteSelectedContent(long* newPos= NULL);
+
+    /**
+        Transforms logical (unscrolled) position to physical window position.
+    */
+    wxPoint GetPhysicalPoint(const wxPoint& ptLogical) const;
+
+    /**
+        Transforms physical window position to logical (unscrolled) position.
+    */
+    wxPoint GetLogicalPoint(const wxPoint& ptPhysical) const;
+
+    /**
+        Helper function for finding the caret position for the next word.
+        Direction is 1 (forward) or -1 (backwards).
+    */
+    virtual long FindNextWordPosition(int direction = 1) const;
+
+    /**
+        Returns @true if the given position is visible on the screen.
+    */
+    bool IsPositionVisible(long pos) const;
+
+    /**
+        Returns the first visible position in the current view.
+    */
+    long GetFirstVisiblePosition() const;
+
+    /**
+        Returns the caret position since the default formatting was changed. As
+        soon as this position changes, we no longer reflect the default style
+        in the UI. A value of -2 means that we should only reflect the style of the
+        content under the caret.
+    */
+    long GetCaretPositionForDefaultStyle() const { return m_caretPositionForDefaultStyle; }
+
+    /**
+        Set the caret position for the default style that the user is selecting.
+    */
+    void SetCaretPositionForDefaultStyle(long pos) { m_caretPositionForDefaultStyle = pos; }
+
+    /**
+        Returns @true if the user has recently set the default style without moving
+        the caret, and therefore the UI needs to reflect the default style and not
+        the style at the caret.
 
 
-    /**
-        Cancels any selection.
+        Below is an example of code that uses this function to determine whether the UI
+        should show that the current style is bold.
+
+        @see SetAndShowDefaultStyle().
     */
     */
-    virtual void SelectNone();
+    bool IsDefaultStyleShowing() const { return m_caretPositionForDefaultStyle != -2; }
 
     /**
         Sets @a attr as the default style and tells the control that the UI should
 
     /**
         Sets @a attr as the default style and tells the control that the UI should
@@ -1277,262 +1862,378 @@ public:
 
         @see IsDefaultStyleShowing().
     */
 
         @see IsDefaultStyleShowing().
     */
-    void SetAndShowDefaultStyle(const wxTextAttr& attr);
+    void SetAndShowDefaultStyle(const wxRichTextAttr& attr)
+    {
+        SetDefaultStyle(attr);
+        SetCaretPositionForDefaultStyle(GetCaretPosition());
+    }
 
     /**
 
     /**
-        Sets the basic (overall) style.
-
-        This is the style of the whole buffer before further styles are applied,
-        unlike the default style, which only affects the style currently being
-        applied (for example, setting the default style to bold will cause
-        subsequently inserted text to be bold).
+        Returns the first visible point in the window.
     */
     */
-    virtual void SetBasicStyle(const wxTextAttr& style);
+    wxPoint GetFirstVisiblePoint() const;
 
 
+#ifdef DOXYGEN
     /**
     /**
-        Sets the caret position.
-
-        The caret position is the character position just before the caret.
-        A value of -1 means the caret is at the start of the buffer.
-        Please note that this does not update the current editing style
-        from the new position or cause the actual caret to be refreshed; to do that,
-        call wxRichTextCtrl::SetInsertionPoint instead.
+        Returns the content of the entire control as a string.
     */
     */
-    void SetCaretPosition(long position,
-                          bool showAtLineStart = false);
+    virtual wxString GetValue() const;
 
     /**
 
     /**
-        Sets the current default style, which can be used to change how subsequently
-        inserted text is displayed.
+        Replaces existing content with the given text.
     */
     */
-    virtual bool SetDefaultStyle(const wxTextAttr& style);
+    virtual void SetValue(const wxString& value);
 
     /**
 
     /**
-        Sets the default style to the style under the cursor.
+        Call this function to prevent refresh and allow fast updates, and then Thaw() to
+        refresh the control.
     */
     */
-    bool SetDefaultStyleToCursorStyle();
+    void Freeze();
 
     /**
 
     /**
-        Sets the size of the buffer beyond which layout is delayed during resizing.
-        This optimizes sizing for large buffers. The default is 20000.
+        Call this function to end a Freeze and refresh the display.
     */
     */
-    void SetDelayedLayoutThreshold(long threshold);
+    void Thaw();
 
     /**
 
     /**
-        Makes the control editable, or not.
+        Returns @true if Freeze has been called without a Thaw.
     */
     */
-    virtual void SetEditable(bool editable);
+    bool IsFrozen() const;
+
+#endif
+
+// Implementation
 
     /**
 
     /**
-        Sets the current filename.
+        Sets up the caret for the given position and container, after a mouse click.
     */
     */
-    void SetFilename(const wxString& filename);
+    bool SetCaretPositionAfterClick(wxRichTextParagraphLayoutBox* container, long position, int hitTestFlags, bool extendSelection = false);
 
     /**
 
     /**
-        Sets the font, and also the basic and default attributes
-        (see wxRichTextCtrl::SetDefaultStyle).
+        Find the caret position for the combination of hit-test flags and character position.
+        Returns the caret position and also an indication of where to place the caret (caretLineStart)
+        since this is ambiguous (same position used for end of line and start of next).
     */
     */
-    virtual bool SetFont(const wxFont& font);
+    long FindCaretPositionForCharacterPosition(long position, int hitTestFlags, wxRichTextParagraphLayoutBox* container,
+                                                   bool& caretLineStart);
 
     /**
 
     /**
-        Sets flags that change the behaviour of loading or saving.
-
-        See the documentation for each handler class to see what flags are
-        relevant for each handler.
+        Font names take a long time to retrieve, so cache them (on demand).
     */
     */
-    void SetHandlerFlags(int flags);
+    static const wxArrayString& GetAvailableFontNames();
 
     /**
 
     /**
-        Sets the insertion point and causes the current editing style to be taken from
-        the new position (unlike wxRichTextCtrl::SetCaretPosition).
+        Clears the cache of available font names.
     */
     */
-    virtual void SetInsertionPoint(long pos);
+    static void ClearAvailableFontNames();
+
+    WX_FORWARD_TO_SCROLL_HELPER()
+
+    // implement wxTextEntry methods
+    virtual wxString DoGetValue() const;
+
+protected:
+    // implement the wxTextEntry pure virtual method
+    virtual wxWindow *GetEditableWindow() { return this; }
+
+    // margins functions
+    virtual bool DoSetMargins(const wxPoint& pt);
+    virtual wxPoint DoGetMargins() const;
+
+     // FIXME: this does not work, it allows this code to compile but will fail
+     //        during run-time
+#ifndef __WXUNIVERSAL__
+#ifdef __WXMSW__
+    virtual WXHWND GetEditHWND() const { return GetHWND(); }
+#endif
+#ifdef __WXMOTIF__
+    virtual WXWidget GetTextWidget() const { return NULL; }
+#endif
+#ifdef __WXGTK20__
+    virtual GtkEditable *GetEditable() const { return NULL; }
+    virtual GtkEntry *GetEntry() const { return NULL; }
+#endif
+#endif // !__WXUNIVERSAL__
+
+// Overrides
+protected:
 
     /**
 
     /**
-        Sets the insertion point to the end of the text control.
+        Currently this simply returns @c wxSize(10, 10).
     */
     */
-    virtual void SetInsertionPointEnd();
+    virtual wxSize DoGetBestSize() const ;
 
 
-    //@{
-    /**
-        Sets the list attributes for the given range, passing flags to determine how
-        the attributes are set.
+    virtual void DoSetValue(const wxString& value, int flags = 0);
 
 
-        Either the style definition or the name of the style definition (in the current
-        sheet) can be passed.
-        @a flags is a bit list of the following:
-        - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable.
-        - wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from
-          @a startFrom, otherwise existing attributes are used.
-        - wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used
-          as the level for all paragraphs, otherwise the current indentation will be used.
+    virtual void DoThaw();
 
 
-        @see NumberList(), PromoteList(), ClearListStyle().
-    */
-    bool SetListStyle(const wxRichTextRange& range,
-                      const wxRichTextListStyleDefinition* style,
-                      int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO,
-                      int startFrom = -1,
-                      int listLevel = -1);
-    bool SetListStyle(const wxRichTextRange& range,
-                      const wxString& styleName,
-                      int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO,
-                      int startFrom = -1,
-                      int listLevel = -1);
-    //@}
 
 
-    /**
-        Sets the selection to the given range.
-        The end point of range is specified as the last character position of the span
-        of text, plus one.
+// Data members
+private:
+#if wxRICHTEXT_BUFFERED_PAINTING
+    /// Buffer bitmap
+    wxBitmap                m_bufferBitmap;
+#endif
 
 
-        So, for example, to set the selection for a character at position 5, use the
-        range (5,6).
-    */
-    virtual void SetSelection(long from, long to);
+    /// Text buffer
+    wxRichTextBuffer        m_buffer;
 
 
-    /**
-        Sets the selection to the given range.
-        The end point of range is specified as the last character position of the span
-        of text, plus one.
+    wxMenu*                 m_contextMenu;
 
 
-        So, for example, to set the selection for a character at position 5, use the
-        range (5,6).
-    */
-    void SetSelectionRange(const wxRichTextRange& range);
+    /// Caret position (1 less than the character position, so -1 is the
+    /// first caret position).
+    long                    m_caretPosition;
 
 
-    //@{
-    /**
-        Sets the attributes for the given range.
-        The end point of range is specified as the last character position of the span
-        of text, plus one.
+    /// Caret position when the default formatting has been changed. As
+    /// soon as this position changes, we no longer reflect the default style
+    /// in the UI.
+    long                    m_caretPositionForDefaultStyle;
 
 
-        So, for example, to set the style for a character at position 5, use the range
-        (5,6).
-    */
-    bool SetStyle(const wxRichTextRange& range,
-                  const wxTextAttr& style);
-    bool SetStyle(long start, long end, const wxTextAttr& style);
-    //@}
+    /// Selection range in character positions. -2, -2 means no selection.
+    wxRichTextSelection     m_selection;
 
 
-    /**
-        Sets the attributes for the given range, passing flags to determine how the
-        attributes are set.
+    wxRichTextCtrlSelectionState m_selectionState;
 
 
-        The end point of range is specified as the last character position of the span
-        of text, plus one. So, for example, to set the style for a character at
-        position 5, use the range (5,6).
+    /// Anchor so we know how to extend the selection
+    /// It's a caret position since it's between two characters.
+    long                    m_selectionAnchor;
 
 
-        @a flags may contain a bit list of the following values:
-        - wxRICHTEXT_SETSTYLE_NONE: no style flag.
-        - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this operation should be
-          undoable.
-        - wxRICHTEXT_SETSTYLE_OPTIMIZE: specifies that the style should not be applied
-          if the combined style at this point is already the style in question.
-        - wxRICHTEXT_SETSTYLE_PARAGRAPHS_ONLY: specifies that the style should only be
-          applied to paragraphs, and not the content.
-          This allows content styling to be preserved independently from that
-          of e.g. a named paragraph style.
-        - wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY: specifies that the style should only be
-          applied to characters, and not the paragraph.
-          This allows content styling to be preserved independently from that
-          of e.g. a named paragraph style.
-        - wxRICHTEXT_SETSTYLE_RESET: resets (clears) the existing style before applying
-          the new style.
-        - wxRICHTEXT_SETSTYLE_REMOVE: removes the specified style. Only the style flags
-          are used in this operation.
+    /// Anchor object if selecting multiple container objects, such as grid cells.
+    wxRichTextObject*       m_selectionAnchorObject;
+
+    /// Are we editable?
+    bool                    m_editable;
+
+    /// Are we showing the caret position at the start of a line
+    /// instead of at the end of the previous one?
+    bool                    m_caretAtLineStart;
+
+    /// Are we dragging a selection?
+    bool                    m_dragging;
+
+    /// Start position for drag
+    wxPoint                 m_dragStart;
+
+    /// Do we need full layout in idle?
+    bool                    m_fullLayoutRequired;
+    wxLongLong              m_fullLayoutTime;
+    long                    m_fullLayoutSavedPosition;
+
+    /// Threshold for doing delayed layout
+    long                    m_delayedLayoutThreshold;
+
+    /// Cursors
+    wxCursor                m_textCursor;
+    wxCursor                m_urlCursor;
+
+    static wxArrayString    sm_availableFontNames;
+
+    wxRichTextContextMenuPropertiesInfo m_contextMenuPropertiesInfo;
+
+    /// The object that currently has the editing focus
+    wxRichTextParagraphLayoutBox* m_focusObject;
+};
+
+/**
+    @class wxRichTextEvent
+
+    This is the event class for wxRichTextCtrl notifications.
+
+    @beginEventTable{wxRichTextEvent}
+    @event{EVT_RICHTEXT_LEFT_CLICK(id, func)}
+        Process a @c wxEVT_COMMAND_RICHTEXT_LEFT_CLICK event, generated when the user
+        releases the left mouse button over an object.
+    @event{EVT_RICHTEXT_RIGHT_CLICK(id, func)}
+        Process a @c wxEVT_COMMAND_RICHTEXT_RIGHT_CLICK event, generated when the user
+        releases the right mouse button over an object.
+    @event{EVT_RICHTEXT_MIDDLE_CLICK(id, func)}
+        Process a @c wxEVT_COMMAND_RICHTEXT_MIDDLE_CLICK event, generated when the user
+        releases the middle mouse button over an object.
+    @event{EVT_RICHTEXT_LEFT_DCLICK(id, func)}
+        Process a @c wxEVT_COMMAND_RICHTEXT_DLEFT_CLICK event, generated when the user
+        double-clicks an object.
+    @event{EVT_RICHTEXT_RETURN(id, func)}
+        Process a @c wxEVT_COMMAND_RICHTEXT_RETURN event, generated when the user
+        presses the return key. Valid event functions: GetFlags, GetPosition.
+    @event{EVT_RICHTEXT_CHARACTER(id, func)}
+        Process a @c wxEVT_COMMAND_RICHTEXT_CHARACTER event, generated when the user
+        presses a character key. Valid event functions: GetFlags, GetPosition, GetCharacter.
+    @event{EVT_RICHTEXT_DELETE(id, func)}
+        Process a @c wxEVT_COMMAND_RICHTEXT_DELETE event, generated when the user
+        presses the backspace or delete key. Valid event functions: GetFlags, GetPosition.
+    @event{EVT_RICHTEXT_RETURN(id, func)}
+        Process a @c wxEVT_COMMAND_RICHTEXT_RETURN event, generated when the user
+        presses the return key. Valid event functions: GetFlags, GetPosition.
+    @event{EVT_RICHTEXT_STYLE_CHANGED(id, func)}
+        Process a @c wxEVT_COMMAND_RICHTEXT_STYLE_CHANGED event, generated when
+        styling has been applied to the control. Valid event functions: GetPosition, GetRange.
+    @event{EVT_RICHTEXT_STYLESHEET_CHANGED(id, func)}
+        Process a @c wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING event, generated
+        when the control's stylesheet has changed, for example the user added,
+        edited or deleted a style. Valid event functions: GetRange, GetPosition.
+    @event{EVT_RICHTEXT_STYLESHEET_REPLACING(id, func)}
+        Process a @c wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACING event, generated
+        when the control's stylesheet is about to be replaced, for example when
+        a file is loaded into the control.
+        Valid event functions: Veto, GetOldStyleSheet, GetNewStyleSheet.
+    @event{EVT_RICHTEXT_STYLESHEET_REPLACED(id, func)}
+        Process a @c wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACED event, generated
+        when the control's stylesheet has been replaced, for example when a file
+        is loaded into the control.
+        Valid event functions: GetOldStyleSheet, GetNewStyleSheet.
+    @event{EVT_RICHTEXT_CONTENT_INSERTED(id, func)}
+        Process a @c wxEVT_COMMAND_RICHTEXT_CONTENT_INSERTED event, generated when
+        content has been inserted into the control.
+        Valid event functions: GetPosition, GetRange.
+    @event{EVT_RICHTEXT_CONTENT_DELETED(id, func)}
+        Process a @c wxEVT_COMMAND_RICHTEXT_CONTENT_DELETED event, generated when
+        content has been deleted from the control.
+        Valid event functions: GetPosition, GetRange.
+    @event{EVT_RICHTEXT_BUFFER_RESET(id, func)}
+        Process a @c wxEVT_COMMAND_RICHTEXT_BUFFER_RESET event, generated when the
+        buffer has been reset by deleting all content.
+        You can use this to set a default style for the first new paragraph.
+    @event{EVT_RICHTEXT_SELECTION_CHANGED(id, func)}
+        Process a @c wxEVT_COMMAND_RICHTEXT_SELECTION_CHANGED event, generated when the
+        selection range has changed.
+    @event{EVT_RICHTEXT_FOCUS_OBJECT_CHANGED(id, func)}
+        Process a @c wxEVT_COMMAND_RICHTEXT_FOCUS_OBJECT_CHANGED event, generated when the
+        current focus object has changed.
+    @endEventTable
+
+    @library{wxrichtext}
+    @category{events,richtext}
+*/
+
+class WXDLLIMPEXP_RICHTEXT wxRichTextEvent : public wxNotifyEvent
+{
+public:
+    /**
+        Constructor.
+
+        @param commandType
+            The type of the event.
+        @param id
+            Window identifier. The value @c wxID_ANY indicates a default value.
     */
     */
-    virtual bool SetStyleEx(const wxRichTextRange& range,
-                    const wxTextAttr& style,
-                    int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
+    wxRichTextEvent(wxEventType commandType = wxEVT_NULL, int winid = 0)
+        : wxNotifyEvent(commandType, winid),
+        m_flags(0), m_position(-1), m_oldStyleSheet(NULL), m_newStyleSheet(NULL),
+        m_char((wxChar) 0), m_container(NULL), m_oldContainer(NULL)
+        { }
 
     /**
 
     /**
-        Sets the style sheet associated with the control.
-        A style sheet allows named character and paragraph styles to be applied.
+        Copy constructor.
     */
     */
-    void SetStyleSheet(wxRichTextStyleSheet* styleSheet);
+    wxRichTextEvent(const wxRichTextEvent& event)
+        : wxNotifyEvent(event),
+        m_flags(event.m_flags), m_position(-1),
+        m_oldStyleSheet(event.m_oldStyleSheet), m_newStyleSheet(event.m_newStyleSheet),
+        m_char((wxChar) 0), m_container(event.m_container), m_oldContainer(event.m_oldContainer)
+        { }
 
     /**
 
     /**
-        Replaces existing content with the given text.
+        Returns the buffer position at which the event occured.
     */
     */
-    virtual void SetValue(const wxString& value);
+    long GetPosition() const { return m_position; }
 
     /**
 
     /**
-        A helper function setting up scrollbars, for example after a resize.
+        Sets the buffer position variable.
     */
     */
-    virtual void SetupScrollbars(bool atTop = false);
+    void SetPosition(long pos) { m_position = pos; }
 
     /**
 
     /**
-        Scrolls the buffer so that the given position is in view.
+        Returns flags indicating modifier keys pressed.
+
+        Possible values are @c wxRICHTEXT_CTRL_DOWN, @c wxRICHTEXT_SHIFT_DOWN, and @c wxRICHTEXT_ALT_DOWN.
     */
     */
-    virtual void ShowPosition(long pos);
+    int GetFlags() const { return m_flags; }
 
     /**
 
     /**
-        Returns @true if undo history suppression is on.
+        Sets flags indicating modifier keys pressed.
+
+        Possible values are @c wxRICHTEXT_CTRL_DOWN, @c wxRICHTEXT_SHIFT_DOWN, and @c wxRICHTEXT_ALT_DOWN.
     */
     */
-    virtual bool SuppressingUndo() const;
+    void SetFlags(int flags) { m_flags = flags; }
 
     /**
 
     /**
-        Call this function to end a Freeze and refresh the display.
+        Returns the old style sheet.
+
+        Can be used in a @c wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING or
+        @c wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGED event handler.
     */
     */
-    void Thaw();
+    wxRichTextStyleSheet* GetOldStyleSheet() const { return m_oldStyleSheet; }
 
     /**
 
     /**
-        Undoes the command at the top of the command history, if there is one.
+        Sets the old style sheet variable.
     */
     */
-    virtual void Undo();
+    void SetOldStyleSheet(wxRichTextStyleSheet* sheet) { m_oldStyleSheet = sheet; }
 
     /**
 
     /**
-        Moves a number of words to the left.
+        Returns the new style sheet.
+
+        Can be used in a @c wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING or
+        @c wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGED event handler.
     */
     */
-    virtual bool WordLeft(int noWords = 1, int flags = 0);
+    wxRichTextStyleSheet* GetNewStyleSheet() const { return m_newStyleSheet; }
 
     /**
 
     /**
-        Move a nuber of words to the right.
+        Sets the new style sheet variable.
     */
     */
-    virtual bool WordRight(int noWords = 1, int flags = 0);
+    void SetNewStyleSheet(wxRichTextStyleSheet* sheet) { m_newStyleSheet = sheet; }
 
     /**
 
     /**
-        Loads an image from a file and writes it at the current insertion point.
+        Gets the range for the current operation.
     */
     */
-    virtual bool WriteImage(const wxString& filename, wxBitmapType bitmapType);
+    const wxRichTextRange& GetRange() const { return m_range; }
 
     /**
 
     /**
-        Writes an image block at the current insertion point.
+        Sets the range variable.
     */
     */
-    virtual bool WriteImage(const wxRichTextImageBlock& imageBlock);
+    void SetRange(const wxRichTextRange& range) { m_range = range; }
 
 
-    //@{
     /**
     /**
-        Write a bitmap or image at the current insertion point.
-        Supply an optional type to use for internal and file storage of the raw data.
+        Returns the character pressed, within a @c wxEVT_COMMAND_RICHTEXT_CHARACTER event.
     */
     */
-    bool WriteImage(const wxBitmap& bitmap,
-                    int bitmapType = wxBITMAP_TYPE_PNG);
-    bool WriteImage(const wxImage& image,
-                    int bitmapType = wxBITMAP_TYPE_PNG);
-    //@}
+    wxChar GetCharacter() const { return m_char; }
 
     /**
 
     /**
-        Writes text at the current position.
+        Sets the character variable.
     */
     */
-    virtual void WriteText(const wxString& text);
+    void SetCharacter(wxChar ch) { m_char = ch; }
 
     /**
 
     /**
-        Translates from column and line number to position.
+        Returns the container for which the event is relevant.
     */
     */
-    virtual long XYToPosition(long x, long y) const;
+    wxRichTextParagraphLayoutBox* GetContainer() const { return m_container; }
 
 
-protected:
+    /**
+        Sets the container for which the event is relevant.
+    */
+    void SetContainer(wxRichTextParagraphLayoutBox* container) { m_container = container; }
 
     /**
 
     /**
-        Currently this simply returns @c wxSize(10, 10).
+        Returns the old container, for a focus change event.
     */
     */
-    virtual wxSize DoGetBestSize() const;
+    wxRichTextParagraphLayoutBox* GetOldContainer() const { return m_oldContainer; }
 
     /**
 
     /**
-        Initialises the command event.
+        Sets the old container, for a focus change event.
     */
     */
-    void InitCommandEvent(wxCommandEvent& event) const;
-};
+    void SetOldContainer(wxRichTextParagraphLayoutBox* container) { m_oldContainer = container; }
+
+    virtual wxEvent *Clone() const { return new wxRichTextEvent(*this); }
 
 
+protected:
+    int                             m_flags;
+    long                            m_position;
+    wxRichTextStyleSheet*           m_oldStyleSheet;
+    wxRichTextStyleSheet*           m_newStyleSheet;
+    wxRichTextRange                 m_range;
+    wxChar                          m_char;
+    wxRichTextParagraphLayoutBox*   m_container;
+    wxRichTextParagraphLayoutBox*   m_oldContainer;
+
+private:
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxRichTextEvent)
+};