]> git.saurik.com Git - wxWidgets.git/blobdiff - interface/wx/richtext/richtextctrl.h
Corrected the name of EVT_WEB_VIEW_ERROR event table macro.
[wxWidgets.git] / interface / wx / richtext / richtextctrl.h
index 0ceec9748b7e5b2bb5ce78cccc653cf93d5a5099..74a0af4f77f95934ab5441e3839f894dbdad2716 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$
-// Licence:     wxWindows license
+// Copyright:   (c) Julian Smart
+// 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 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 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 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 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 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 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 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 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 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 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
 */
 */
-class wxRichTextEvent : public wxNotifyEvent
+
+// Don't draw guide lines around boxes and tables
+#define wxRICHTEXT_EX_NO_GUIDELINES 0x00000100
+
+
+/*
+    Defaults
+*/
+
+#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 wxEVT_COMMAND_RICHTEXT_CHARACTER event.
+        Initialisation.
     */
     */
-    wxChar GetCharacter() const;
+    void Init() {}
 
     /**
 
     /**
-        Returns flags indicating modifier keys pressed.
-
-        Possible values are wxRICHTEXT_CTRL_DOWN, wxRICHTEXT_SHIFT_DOWN, and 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 wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING or
-        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 wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING or
-        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 wxRICHTEXT_CTRL_DOWN, wxRICHTEXT_SHIFT_DOWN, and 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,901 +225,1332 @@ 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( );
 
 
-    /**
-        Adds an image to the control's buffer.
-    */
-    virtual wxRichTextRange AddImage(const wxImage& image);
+// Operations
 
     /**
 
     /**
-        Adds a new paragraph of text to the end of the buffer.
+        Creates the underlying window.
     */
     */
-    virtual wxRichTextRange AddParagraph(const wxString& text);
+    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 );
 
     /**
 
     /**
-        Sets the insertion point to the end of the buffer and writes the text.
+        Initialises the members of the control.
     */
     */
-    virtual void AppendText(const wxString& text);
+    void Init();
 
 
-    /**
-        Applies the given alignment to the selection (undoable).
-        For alignment values, see wxTextAttr.
-    */
-    virtual bool ApplyAlignmentToSelection(wxTextAttrAlignment alignment);
+// Accessors
 
     /**
 
     /**
-        Apples bold to the selection (undoable).
+        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 bool ApplyBoldToSelection();
+    virtual wxString GetRange(long from, long to) const;
 
     /**
 
     /**
-        Applies italic to the selection (undoable).
+        Returns the length of the specified line in characters.
     */
     */
-    virtual bool ApplyItalicToSelection();
+    virtual int GetLineLength(long lineNo) const ;
 
     /**
 
     /**
-        Applies the given style to the selection.
+        Returns the text for the given line.
     */
     */
-    virtual bool ApplyStyle(wxRichTextStyleDefinition* def);
+    virtual wxString GetLineText(long lineNo) 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 the number of lines in the buffer.
     */
     */
-    bool ApplyStyleSheet(wxRichTextStyleSheet* sheet = NULL);
+    virtual int GetNumberOfLines() const ;
 
     /**
 
     /**
-        Applies underline to the selection (undoable).
+        Returns @true if the buffer has been modified.
     */
     */
-    virtual bool ApplyUnderlineToSelection();
+    virtual bool IsModified() const ;
 
     /**
 
     /**
-        Returns @true if undo commands are being batched.
+        Returns @true if the control is editable.
     */
     */
-    virtual bool BatchingUndo() const;
+    virtual bool IsEditable() const ;
 
     /**
 
     /**
-        Begins using alignment.
-        For alignment values, see wxTextAttr.
+        Returns @true if the control is single-line.
+        Currently wxRichTextCtrl does not support single-line editing.
     */
     */
-    bool BeginAlignment(wxTextAttrAlignment alignment);
+    bool IsSingleLine() const { return !HasFlag(wxRE_MULTILINE); }
 
     /**
 
     /**
-        Starts batching undo history for commands.
+        Returns @true if the control is multiline.
     */
     */
-    virtual bool BeginBatchUndo(const wxString& cmdName);
+    bool IsMultiLine() const { return !IsSingleLine(); }
 
 
+    //@{
     /**
     /**
-        Begins using bold.
+        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 BeginBold();
+    virtual void GetSelection(long* from, long* to) const;
+    const wxRichTextSelection& GetSelection() const { return m_selection; }
+    wxRichTextSelection& GetSelection() { return m_selection; }
+    //@}
 
     /**
 
     /**
-        Begins using the named character style.
+        Returns the text within the current selection range, if any.
     */
     */
-    bool BeginCharacterStyle(const wxString& characterStyle);
+    virtual wxString GetStringSelection() const;
 
     /**
 
     /**
-        Begins using this font.
+        Gets the current filename associated with the control.
     */
     */
-    bool BeginFont(const wxFont& font);
+    wxString GetFilename() const { return m_filename; }
 
     /**
 
     /**
-        Begins using the given point size.
+        Sets the current filename.
     */
     */
-    bool BeginFontSize(int pointSize);
+    void SetFilename(const wxString& filename) { m_filename = filename; }
 
     /**
 
     /**
-        Begins using italic.
+        Sets the size of the buffer beyond which layout is delayed during resizing.
+        This optimizes sizing for large buffers. The default is 20000.
     */
     */
-    bool BeginItalic();
+    void SetDelayedLayoutThreshold(long threshold) { m_delayedLayoutThreshold = threshold; }
 
     /**
 
     /**
-        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.
+        Gets the size of the buffer beyond which layout is delayed during resizing.
+        This optimizes sizing for large buffers. The default is 20000.
     */
     */
-    bool BeginLeftIndent(int leftIndent, int leftSubIndent = 0);
+    long GetDelayedLayoutThreshold() const { return m_delayedLayoutThreshold; }
 
     /**
 
     /**
-        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);
+    bool GetFullLayoutRequired() const { return m_fullLayoutRequired; }
 
     /**
 
     /**
-        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 SetFullLayoutRequired(bool b) { m_fullLayoutRequired = b; }
 
     /**
 
     /**
-        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);
+    wxLongLong GetFullLayoutTime() const { return m_fullLayoutTime; }
 
     /**
 
     /**
-        Begins paragraph spacing; pass the before-paragraph and after-paragraph spacing
-        in tenths of a millimetre.
     */
     */
-    bool BeginParagraphSpacing(int before, int after);
+    void SetFullLayoutTime(wxLongLong t) { m_fullLayoutTime = t; }
 
     /**
 
     /**
-        Begins applying the named paragraph style.
     */
     */
-    bool BeginParagraphStyle(const wxString& paragraphStyle);
+    long GetFullLayoutSavedPosition() const { return m_fullLayoutSavedPosition; }
 
     /**
 
     /**
-        Begins a right indent, specified in tenths of a millimetre.
     */
     */
-    bool BeginRightIndent(int rightIndent);
+    void SetFullLayoutSavedPosition(long p) { m_fullLayoutSavedPosition = p; }
 
 
+    // Force any pending layout due to large buffer
     /**
     /**
-        Begins applying a style.
     */
     */
-    virtual bool BeginStyle(const wxTextAttr& style);
+    void ForceDelayedLayout();
 
     /**
 
     /**
-        Starts suppressing undo history for commands.
+        Sets the text (normal) cursor.
     */
     */
-    virtual bool BeginSuppressUndo();
+    void SetTextCursor(const wxCursor& cursor ) { m_textCursor = 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 text (normal) cursor.
     */
     */
-    bool BeginSymbolBullet(const wxString& symbol, int leftIndent,
-                           int leftSubIndent,
-                           int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_SYMBOL);
+    wxCursor GetTextCursor() const { return m_textCursor; }
 
     /**
 
     /**
-        Begins using this colour.
+        Sets the cursor to be used over URLs.
     */
     */
-    bool BeginTextColour(const wxColour& colour);
+    void SetURLCursor(const wxCursor& cursor ) { m_urlCursor = cursor; }
 
     /**
 
     /**
-        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.
+        Returns the cursor to be used over URLs.
     */
     */
-    bool BeginURL(const wxString& url,
-                  const wxString& characterStyle = wxEmptyString);
+    wxCursor GetURLCursor() const { return m_urlCursor; }
 
     /**
 
     /**
-        Begins using underlining.
+        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 BeginUnderline();
+    bool GetCaretAtLineStart() const { return m_caretAtLineStart; }
 
     /**
 
     /**
-        Returns @true if selected content can be copied to the clipboard.
+        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.
     */
     */
-    virtual bool CanCopy() const;
+    void SetCaretAtLineStart(bool atStart) { m_caretAtLineStart = atStart; }
 
     /**
 
     /**
-        Returns @true if selected content can be copied to the clipboard and deleted.
+        Returns @true if we are dragging a selection.
     */
     */
-    virtual bool CanCut() const;
+    bool GetDragging() const { return m_dragging; }
 
     /**
 
     /**
-        Returns @true if selected content can be deleted.
+        Sets a flag to remember if we are dragging a selection.
     */
     */
-    virtual bool CanDeleteSelection() const;
+    void SetDragging(bool dragging) { m_dragging = dragging; }
 
     /**
 
     /**
-        Returns @true if the clipboard content can be pasted to the buffer.
+        Returns the drag start position.
     */
     */
-    virtual bool CanPaste() const;
+    const wxPoint& GetDragStart() const { return m_dragStart; }
 
     /**
 
     /**
-        Returns @true if there is a command in the command history that can be redone.
+        Sets the drag start position.
     */
     */
-    virtual bool CanRedo() const;
+    void SetDragStart(const wxPoint& pt) { m_dragStart = pt; }
 
 
+#if wxRICHTEXT_BUFFERED_PAINTING
+    //@{
     /**
     /**
-        Returns @true if there is a command in the command history that can be undone.
+        Returns the buffer bitmap if using buffered painting.
     */
     */
-    virtual bool CanUndo() const;
+    const wxBitmap& GetBufferBitmap() const { return m_bufferBitmap; }
+    wxBitmap& GetBufferBitmap() { return m_bufferBitmap; }
+    //@}
+#endif
 
     /**
 
     /**
-        Clears the buffer content, leaving a single empty paragraph. Cannot be undone.
+        Returns the current context menu.
     */
     */
-    virtual void Clear();
+    wxMenu* GetContextMenu() const { return m_contextMenu; }
 
     /**
 
     /**
-        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().
+        Sets the current context menu.
     */
     */
-    virtual bool ClearListStyle(const wxRichTextRange& range,
-                        int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
+    void SetContextMenu(wxMenu* menu);
 
     /**
 
     /**
-        Sends the event to the control.
+        Returns an anchor so we know how to extend the selection.
+        It's a caret position since it's between two characters.
     */
     */
-    virtual void Command(wxCommandEvent& event);
+    long GetSelectionAnchor() const { return m_selectionAnchor; }
 
     /**
 
     /**
-        Copies the selected content (if any) to the clipboard.
+        Sets an anchor so we know how to extend the selection.
+        It's a caret position since it's between two characters.
     */
     */
-    virtual void Copy();
+    void SetSelectionAnchor(long anchor) { m_selectionAnchor = anchor; }
 
     /**
 
     /**
-        Creates the underlying window.
+        Returns the anchor object if selecting multiple containers.
     */
     */
-    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);
+    wxRichTextObject* GetSelectionAnchorObject() const { return m_selectionAnchorObject; }
 
     /**
 
     /**
-        Copies the selected content (if any) to the clipboard and deletes the selection.
-        This is undoable.
+        Sets the anchor object if selecting multiple containers.
     */
     */
-    virtual void Cut();
+    void SetSelectionAnchorObject(wxRichTextObject* anchor) { m_selectionAnchorObject = anchor; }
 
 
+    //@{
     /**
     /**
-        Deletes the content within the given range.
+        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 bool Delete(const wxRichTextRange& range);
+    wxRichTextContextMenuPropertiesInfo& GetContextMenuPropertiesInfo() { return m_contextMenuPropertiesInfo; }
+    const wxRichTextContextMenuPropertiesInfo& GetContextMenuPropertiesInfo() const { return m_contextMenuPropertiesInfo; }
+    //@}
 
     /**
 
     /**
-        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
+        Returns the wxRichTextObject object that currently has the editing focus.
+        If there are no composite objects, this will be the top-level buffer.
     */
     */
-    bool DeleteSelectedContent(long* newPos = NULL);
+    wxRichTextParagraphLayoutBox* GetFocusObject() const { return m_focusObject; }
 
     /**
 
     /**
-        Deletes the content in the selection, if any. This is undoable.
+        Sets the wxRichTextObject object that currently has the editing focus.
     */
     */
-    virtual void DeleteSelection();
+    bool SetFocusObject(wxRichTextParagraphLayoutBox* obj, bool setCaretPosition = true);
+
+// Operations
 
     /**
 
     /**
-        Sets the buffer's modified status to @false, and clears the buffer's command
-        history.
+        Invalidates the whole buffer to trigger painting later.
     */
     */
-    virtual void DiscardEdits();
+    void Invalidate() { GetBuffer().Invalidate(wxRICHTEXT_ALL); }
 
     /**
 
     /**
-        Ends alignment.
+        Clears the buffer content, leaving a single empty paragraph. Cannot be undone.
     */
     */
-    bool EndAlignment();
+    virtual void Clear();
 
     /**
 
     /**
-        Ends application of all styles in the current style stack.
+        Replaces the content in the specified range with the string specified by
+        @a value.
     */
     */
-    virtual bool EndAllStyles();
+    virtual void Replace(long from, long to, const wxString& value);
 
     /**
 
     /**
-        Ends batching undo command history.
+        Removes the content in the specified range.
     */
     */
-    virtual bool EndBatchUndo();
+    virtual void Remove(long from, long to);
 
 
+#ifdef DOXYGEN
     /**
     /**
-        Ends using bold.
+        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 EndBold();
+    bool LoadFile(const wxString& file,
+                  int type = wxRICHTEXT_TYPE_ANY);
+#endif
 
     /**
 
     /**
-        Ends application of a named character style.
+        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.
     */
     */
-    bool EndCharacterStyle();
+    virtual bool DoLoadFile(const wxString& file, int fileType);
 
 
+#ifdef DOXYGEN
     /**
     /**
-        Ends using a font.
+        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 EndFont();
+    bool SaveFile(const wxString& file = wxEmptyString,
+                  int type = wxRICHTEXT_TYPE_ANY);
+#endif
 
     /**
 
     /**
-        Ends using a point size.
+        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.
     */
     */
-    bool EndFontSize();
+    virtual bool DoSaveFile(const wxString& file = wxEmptyString,
+                            int fileType = wxRICHTEXT_TYPE_ANY);
 
     /**
 
     /**
-        Ends using italic.
+        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.
     */
     */
-    bool EndItalic();
+    void SetHandlerFlags(int flags) { GetBuffer().SetHandlerFlags(flags); }
 
     /**
 
     /**
-        Ends left indent.
+        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.
     */
     */
-    bool EndLeftIndent();
+    int GetHandlerFlags() const { return GetBuffer().GetHandlerFlags(); }
 
     /**
 
     /**
-        Ends line spacing.
+        Marks the buffer as modified.
     */
     */
-    bool EndLineSpacing();
+    virtual void MarkDirty();
 
     /**
 
     /**
-        Ends using a specified list style.
+        Sets the buffer's modified status to @false, and clears the buffer's command
+        history.
     */
     */
-    bool EndListStyle();
+    virtual void DiscardEdits();
 
     /**
 
     /**
-        Ends application of a numbered bullet.
+        Sets the maximum number of characters that may be entered in a single line
+        text control. For compatibility only; currently does nothing.
     */
     */
-    bool EndNumberedBullet();
+    virtual void SetMaxLength(unsigned long WXUNUSED(len)) { }
 
     /**
 
     /**
-        Ends paragraph spacing.
+        Writes text at the current position.
     */
     */
-    bool EndParagraphSpacing();
+    virtual void WriteText(const wxString& text);
 
     /**
 
     /**
-        Ends application of a named character style.
+        Sets the insertion point to the end of the buffer and writes the text.
     */
     */
-    bool EndParagraphStyle();
+    virtual void AppendText(const wxString& text);
 
 
+    //@{
     /**
     /**
-        Ends right indent.
+        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().
     */
     */
-    bool EndRightIndent();
+    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;
+    //@}
+
+// 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.
+    */
+    virtual void Paste();
+
+    /**
+        Deletes the content in the selection, if any. This is undoable.
+    */
+    virtual void DeleteSelection();
+
+    /**
+        Returns @true if selected content can be copied to the clipboard.
+    */
+    virtual bool CanCopy() const;
+
+    /**
+        Returns @true if selected content can be copied to the clipboard and deleted.
+    */
+    virtual bool CanCut() const;
+
+    /**
+        Returns @true if the clipboard content can be pasted to the buffer.
+    */
+    virtual bool CanPaste() const;
+
+    /**
+        Returns @true if selected content can be deleted.
+    */
+    virtual bool CanDeleteSelection() const;
+
+    /**
+        Undoes the command at the top of the command history, if there is one.
+    */
+    virtual void Undo();
+
+    /**
+        Redoes the current command.
+    */
+    virtual void Redo();
+
+    /**
+        Returns @true if there is a command in the command history that can be undone.
+    */
+    virtual bool CanUndo() const;
+
+    /**
+        Returns @true if there is a command in the command history that can be redone.
+    */
+    virtual bool CanRedo() const;
+
+    /**
+        Sets the insertion point and causes the current editing style to be taken from
+        the new position (unlike wxRichTextCtrl::SetCaretPosition).
+    */
+    virtual void SetInsertionPoint(long pos);
+
+    /**
+        Sets the insertion point to the end of the text control.
+    */
+    virtual void SetInsertionPointEnd();
+
+    /**
+        Returns the current insertion point.
+    */
+    virtual long GetInsertionPoint() const;
+
+    /**
+        Returns the last position in the buffer.
+    */
+    virtual wxTextPos GetLastPosition() const;
+
+    //@{
+    /**
+        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).
+    */
+    virtual void SetSelection(long from, long to);
+    void SetSelection(const wxRichTextSelection& sel) { m_selection = sel; }
+    //@}
+
+
+    /**
+        Selects all the text in the buffer.
+    */
+    virtual void SelectAll();
+
+    /**
+        Makes the control editable, or not.
+    */
+    virtual void SetEditable(bool editable);
+
+    /**
+        Returns @true if there is a selection and the object containing the selection
+        was the same as the current focus object.
+    */
+    virtual bool HasSelection() const;
+
+    /**
+        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 HasUnfocusedSelection() const;
+
+    //@{
+    /**
+        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 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());
+    //@}
+
+    /**
+        Loads an image from a file and writes it at the current insertion point.
+    */
+    virtual bool WriteImage(const wxString& filename, wxBitmapType bitmapType,
+                            const wxRichTextAttr& textAttr = wxRichTextAttr());
+
+    /**
+        Writes an image block at the current insertion point.
+    */
+    virtual bool WriteImage(const wxRichTextImageBlock& imageBlock,
+                            const wxRichTextAttr& textAttr = wxRichTextAttr());
+
+    /**
+        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.
+    */
+    virtual wxRichTextBox* WriteTextBox(const wxRichTextAttr& textAttr = wxRichTextAttr());
+
+    /**
+        Write a table at the current insertion point, returning the table.
+        You can then call SetFocusObject() to set the focus to the new object.
+    */
+    virtual wxRichTextTable* WriteTable(int rows, int cols, const wxRichTextAttr& tableAttr = wxRichTextAttr(), const wxRichTextAttr& cellAttr = wxRichTextAttr());
+
+    /**
+        Inserts a new paragraph at the current insertion point. @see LineBreak().
+    */
+    virtual bool Newline();
+
+    /**
+        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 bool LineBreak();
+
+    /**
+        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).
+    */
+    virtual void SetBasicStyle(const wxRichTextAttr& style) { GetBuffer().SetBasicStyle(style); }
+
+    /**
+        Gets 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).
+    */
+    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.
     */
 
     /**
         Ends the current style.
     */
-    virtual bool EndStyle();
+    virtual bool EndStyle() { return GetBuffer().EndStyle(); }
 
     /**
 
     /**
-        Ends suppressing undo command history.
+        Ends application of all styles in the current style stack.
     */
     */
-    virtual bool EndSuppressUndo();
+    virtual bool EndAllStyles() { return GetBuffer().EndAllStyles(); }
 
     /**
 
     /**
-        Ends applying a symbol bullet.
+        Begins using bold.
     */
     */
-    bool EndSymbolBullet();
+    bool BeginBold() { return GetBuffer().BeginBold(); }
 
     /**
 
     /**
-        Ends applying a text colour.
+        Ends using bold.
     */
     */
-    bool EndTextColour();
+    bool EndBold()  { return GetBuffer().EndBold(); }
 
     /**
 
     /**
-        Ends applying a URL.
+        Begins using italic.
     */
     */
-    bool EndURL();
+    bool BeginItalic() { return GetBuffer().BeginItalic(); }
+
+    /**
+        Ends using italic.
+    */
+    bool EndItalic() { return GetBuffer().EndItalic(); }
+
+    /**
+        Begins using underlining.
+    */
+    bool BeginUnderline() { return GetBuffer().BeginUnderline(); }
 
     /**
         End applying underlining.
     */
 
     /**
         End applying underlining.
     */
-    bool EndUnderline();
+    bool EndUnderline() { return GetBuffer().EndUnderline(); }
 
     /**
 
     /**
-        Helper function for extending the selection, returning @true if the selection
-        was changed. Selections are in caret positions.
+        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.
     */
     */
-    virtual bool ExtendSelection(long oldPosition, long newPosition, int flags);
+    bool EndParagraphSpacing() { return GetBuffer().EndParagraphSpacing(); }
 
     /**
 
     /**
-        Helper function for finding the caret position for the next word.
-        Direction is 1 (forward) or -1 (backwards).
+        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.
     */
     */
-    virtual long FindNextWordPosition(int direction = 1) const;
+    bool BeginLineSpacing(int lineSpacing) { return GetBuffer().BeginLineSpacing(lineSpacing); }
 
     /**
 
     /**
-        Call this function to prevent refresh and allow fast updates, and then Thaw() to
-        refresh the control.
+        Ends line spacing.
     */
     */
-    void Freeze();
+    bool EndLineSpacing() { return GetBuffer().EndLineSpacing(); }
 
     /**
 
     /**
-        Gets the basic (overall) style.
+        Begins a numbered bullet.
 
 
-        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).
+        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.
     */
     */
-    virtual const wxTextAttr& GetBasicStyle() const;
+    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.
+
+        So, for example, to set the selection for a character at position 5, use the
+        range (5,6).
     */
     */
-    virtual void GetSelection(long* from, long* to) const;
+    void SetSelectionRange(const wxRichTextRange& range);
 
     /**
 
     /**
-        Returns the selection range in character positions. -1, -1 means no selection.
+        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)
     */
     */
-    wxRichTextRange GetSelectionRange() const;
+    wxRichTextRange GetInternalSelectionRange() const { return m_selection.GetRange(); }
 
     /**
 
     /**
-        Returns the text within the current selection range, if any.
+        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 wxString GetStringSelection() const;
+    void SetInternalSelectionRange(const wxRichTextRange& range) { m_selection.Set(range, GetFocusObject()); }
 
     /**
 
     /**
-        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
+        Adds a new paragraph of text to the end of the buffer.
     */
     */
-    virtual bool GetStyle(long position, wxTextAttr& style);
+    virtual wxRichTextRange AddParagraph(const wxString& text);
 
     /**
 
     /**
-        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 an image to the control's buffer.
     */
     */
-    virtual bool GetStyleForRange(const wxRichTextRange& range,
-                                  wxTextAttr& style);
+    virtual wxRichTextRange AddImage(const wxImage& image);
 
     /**
 
     /**
-        Returns the style sheet associated with the control, if any.
-        A style sheet allows named character and paragraph styles to be applied.
+        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.
     */
     */
-    wxRichTextStyleSheet* GetStyleSheet() const;
+    virtual bool LayoutContent(bool onlyVisibleRect = false);
 
     /**
 
     /**
-        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.
+        Move the caret to the given character position.
 
 
-        @beginWxPerlOnly
-        In wxPerl this method is implemented as GetUncombinedStyle(@a position)
-        returning a 2-element list (ok, attr).
-        @endWxPerlOnly
+        Please note that this does not update the current editing style
+        from the new position; to do that, call wxRichTextCtrl::SetInsertionPoint instead.
     */
     */
-    virtual bool GetUncombinedStyle(long position, wxTextAttr& style);
+    virtual bool MoveCaret(long pos, bool showAtLineStart = false, wxRichTextParagraphLayoutBox* container = NULL);
 
     /**
 
     /**
-        Returns the content of the entire control as a string.
+        Moves right.
     */
     */
-    virtual wxString GetValue() const;
+    virtual bool MoveRight(int noPositions = 1, int flags = 0);
 
     /**
 
     /**
-        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.
+        Moves left.
     */
     */
-    wxRichTextLine* GetVisibleLineForCaretPosition(long caretPosition) const;
+    virtual bool MoveLeft(int noPositions = 1, int flags = 0);
 
     /**
 
     /**
-        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 to the start of the paragraph.
     */
     */
-    virtual bool HasCharacterAttributes(const wxRichTextRange& range,
-                                        const wxTextAttr& style) const;
+    virtual bool MoveUp(int noLines = 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 the caret down.
     */
     */
-    virtual bool HasParagraphAttributes(const wxRichTextRange& range,
-                                        const wxTextAttr& style) const;
+    virtual bool MoveDown(int noLines = 1, int flags = 0);
 
     /**
 
     /**
-        Returns @true if there is a selection.
+        Moves to the end of the line.
     */
     */
-    virtual bool HasSelection() const;
+    virtual bool MoveToLineEnd(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 to the start of the line.
     */
     */
-    wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long* pos) const;
-    const wxTextCtrlHitTestResult HitTest(const wxPoint& pt,
-                                          wxTextCoord* col,
-                                          wxTextCoord* row) const;
-    //@}
+    virtual bool MoveToLineStart(int flags = 0);
 
     /**
 
     /**
-        Initialises the members of the control.
+        Moves to the end of the paragraph.
     */
     */
-    void Init();
+    virtual bool MoveToParagraphEnd(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 paragraph.
     */
     */
-    bool IsDefaultStyleShowing() const;
+    virtual bool MoveToParagraphStart(int flags = 0);
 
     /**
 
     /**
-        Returns @true if the control is editable.
+        Moves to the start of the buffer.
     */
     */
-    virtual bool IsEditable() const;
+    virtual bool MoveHome(int flags = 0);
 
     /**
 
     /**
-        Returns @true if Freeze has been called without a Thaw.
+        Moves to the end of the buffer.
     */
     */
-    bool IsFrozen() const;
+    virtual bool MoveEnd(int flags = 0);
 
     /**
 
     /**
-        Returns @true if the buffer has been modified.
+        Moves one or more pages up.
     */
     */
-    virtual bool IsModified() const;
+    virtual bool PageUp(int noPages = 1, int flags = 0);
 
     /**
 
     /**
-        Returns @true if the control is multiline.
+        Moves one or more pages down.
     */
     */
-    bool IsMultiLine() const;
+    virtual bool PageDown(int noPages = 1, int flags = 0);
 
     /**
 
     /**
-        Returns @true if the given position is visible on the screen.
+        Moves a number of words to the left.
     */
     */
-    bool IsPositionVisible(long pos) const;
+    virtual bool WordLeft(int noPages = 1, int flags = 0);
 
     /**
 
     /**
-        Returns @true if all of the selection is aligned according to the specified flag.
+        Move a nuber of words to the right.
     */
     */
-    virtual bool IsSelectionAligned(wxTextAttrAlignment alignment);
+    virtual bool WordRight(int noPages = 1, int flags = 0);
 
 
+    //@{
     /**
     /**
-        Returns @true if all of the selection is bold.
+        Returns the buffer associated with the control.
     */
     */
-    virtual bool IsSelectionBold();
+    wxRichTextBuffer& GetBuffer() { return m_buffer; }
+    const wxRichTextBuffer& GetBuffer() const { return m_buffer; }
+    //@}
 
     /**
 
     /**
-        Returns @true if all of the selection is italic.
+        Starts batching undo history for commands.
     */
     */
-    virtual bool IsSelectionItalics();
+    virtual bool BeginBatchUndo(const wxString& cmdName) { return m_buffer.BeginBatchUndo(cmdName); }
 
     /**
 
     /**
-        Returns @true if all of the selection is underlined.
+        Ends batching undo command history.
     */
     */
-    virtual bool IsSelectionUnderlined();
+    virtual bool EndBatchUndo() { return m_buffer.EndBatchUndo(); }
 
     /**
 
     /**
-        Returns @true if the control is single-line.
-        Currently wxRichTextCtrl does not support single-line editing.
+        Returns @true if undo commands are being batched.
     */
     */
-    bool IsSingleLine() const;
+    virtual bool BatchingUndo() const { return m_buffer.BatchingUndo(); }
 
     /**
 
     /**
-        Helper function implementing keyboard navigation.
+        Starts suppressing undo history for commands.
     */
     */
-    virtual bool KeyboardNavigate(int keyCode, int flags);
+    virtual bool BeginSuppressUndo() { return m_buffer.BeginSuppressUndo(); }
 
     /**
 
     /**
-        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.
+        Ends suppressing undo command history.
     */
     */
-    virtual bool LayoutContent(bool onlyVisibleRect = false);
+    virtual bool EndSuppressUndo() { return m_buffer.EndSuppressUndo(); }
 
     /**
 
     /**
-        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.
+        Returns @true if undo history suppression is on.
     */
     */
-    virtual bool LineBreak();
+    virtual bool SuppressingUndo() const { return m_buffer.SuppressingUndo(); }
 
     /**
 
     /**
-        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.
+        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.
 
 
-        This function looks for a suitable wxRichTextFileHandler object.
+        You can use this to implement, for example, bold button updating.
+        @a style must have flags indicating which attributes are of interest.
     */
     */
-    bool LoadFile(const wxString& file,
-                  int type = wxRICHTEXT_TYPE_ANY);
+    virtual bool HasCharacterAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const
+    {
+        return GetBuffer().HasCharacterAttributes(range.ToInternal(), style);
+    }
 
     /**
 
     /**
-        Marks the buffer as modified.
+        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.
     */
     */
-    virtual void MarkDirty();
+    virtual bool HasParagraphAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const
+    {
+        return GetBuffer().HasParagraphAttributes(range.ToInternal(), style);
+    }
 
     /**
 
     /**
-        Move the caret to the given character position.
-
-        Please note that this does not update the current editing style
-        from the new position; to do that, call wxRichTextCtrl::SetInsertionPoint instead.
+        Returns @true if all of the selection, or the content at the caret position, is bold.
     */
     */
-    virtual bool MoveCaret(long pos, bool showAtLineStart = false);
+    virtual bool IsSelectionBold();
 
     /**
 
     /**
-        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, or the content at the caret position, is italic.
     */
     */
-    void MoveCaretBack(long oldPosition);
+    virtual bool IsSelectionItalics();
 
     /**
 
     /**
-        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, or the content at the caret position, is underlined.
     */
     */
-    void MoveCaretForward(long oldPosition);
+    virtual bool IsSelectionUnderlined();
 
     /**
 
     /**
-        Moves the caret down.
+        Returns @true if all of the selection, or the content at the current caret position, has the supplied wxTextAttrEffects flag(s).
     */
     */
-    virtual bool MoveDown(int noLines = 1, int flags = 0);
+    virtual bool DoesSelectionHaveTextEffectFlag(int flag);
 
     /**
 
     /**
-        Moves to the end of the buffer.
+        Returns @true if all of the selection is aligned according to the specified flag.
     */
     */
-    virtual bool MoveEnd(int flags = 0);
+    virtual bool IsSelectionAligned(wxTextAttrAlignment alignment);
 
     /**
 
     /**
-        Moves to the start of the buffer.
+        Apples bold to the selection or the default style (undoable).
     */
     */
-    virtual bool MoveHome(int flags = 0);
+    virtual bool ApplyBoldToSelection();
 
     /**
 
     /**
-        Moves left.
+        Applies italic to the selection or the default style (undoable).
     */
     */
-    virtual bool MoveLeft(int noPositions = 1, int flags = 0);
+    virtual bool ApplyItalicToSelection();
 
     /**
 
     /**
-        Moves right.
+        Applies underline to the selection or the default style (undoable).
     */
     */
-    virtual bool MoveRight(int noPositions = 1, int flags = 0);
+    virtual bool ApplyUnderlineToSelection();
 
     /**
 
     /**
-        Moves to the end of the line.
+        Applies one or more wxTextAttrEffects flags to the selection (undoable).
+        If there is no selection, it is applied to the default style.
     */
     */
-    virtual bool MoveToLineEnd(int flags = 0);
+    virtual bool ApplyTextEffectToSelection(int flags);
 
     /**
 
     /**
-        Moves to the start of the line.
+        Applies the given alignment to the selection or the default style (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 +1558,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 +1583,35 @@ public:
     void OnSelectAll(wxCommandEvent& event);
 
     /**
     void OnSelectAll(wxCommandEvent& event);
 
     /**
-        Standard handler for the wxID_PASTE 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 +1623,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 +1705,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 ExtendSelection(long oldPosition, long newPosition, int flags);
+
+    /**
+        Scrolls @a position into view. This function takes a caret position.
     */
     */
-    virtual bool PositionToXY(long pos, long* x, long* y) const;
+    virtual bool ScrollIntoView(long position, int keyCode);
 
 
-    //@{
     /**
     /**
-        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.
+        Refreshes the area affected by a selection change.
+    */
+    bool RefreshForSelectionChange(const wxRichTextSelection& oldSelection, const wxRichTextSelection& newSelection);
 
 
-        @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.
+    /**
+        Sets the caret position.
 
 
-        @see SetListStyle(), @see SetListStyle(), ClearListStyle().
+        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.
+    */
+    void MoveCaretForward(long oldPosition) ;
+
+    /**
+        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) ;
+
+    /**
+        Returns the caret height and position for the given character position.
+        If container is null, the current focus object will be used.
+
+        @beginWxPerlOnly
+        In wxPerl this method is implemented as
+        GetCaretPositionForIndex(@a position) returning a
+        2-element list (ok, rect).
+        @endWxPerlOnly
+    */
+    bool GetCaretPositionForIndex(long position, wxRect& rect, wxRichTextParagraphLayoutBox* container = NULL);
+
+    /**
+        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.
+    */
+    wxRichTextLine* GetVisibleLineForCaretPosition(long caretPosition) const;
+
+    /**
+        Gets the command processor associated with the control's buffer.
+    */
+    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.
     */
     */
-    virtual void Replace(long from, long to, const wxString& value);
+    bool IsPositionVisible(long pos) const;
 
     /**
 
     /**
-        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.
+        Returns the first visible position in the current view.
     */
     */
-    bool SaveFile(const wxString& file = wxEmptyString,
-                  int type = wxRICHTEXT_TYPE_ANY);
+    long GetFirstVisiblePosition() const;
 
     /**
 
     /**
-        Scrolls @a position into view. This function takes a caret position.
+        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.
     */
     */
-    virtual bool ScrollIntoView(long position, int keyCode);
+    long GetCaretPositionForDefaultStyle() const { return m_caretPositionForDefaultStyle; }
 
     /**
 
     /**
-        Selects all the text in the buffer.
+        Set the caret position for the default style that the user is selecting.
     */
     */
-    virtual void SelectAll();
+    void SetCaretPositionForDefaultStyle(long pos) { m_caretPositionForDefaultStyle = pos; }
 
     /**
 
     /**
-        Cancels any selection.
+        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().
     */
     */
-    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 +1873,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)
+};