]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/richtext/richtextctrl.h
added support for wxCAL_SHOW_WEEK_NUMBERS to generic version of wxCalendarCtrl (...
[wxWidgets.git] / include / wx / richtext / richtextctrl.h
index a1e9c69772b713b5cf0f9e8945334f7f0aaeeb9f..3785428c7dff7c6faca845e4d7d25feeadcae1ef 100644 (file)
 #ifndef _WX_RICHTEXTCTRL_H_
 #define _WX_RICHTEXTCTRL_H_
 
-#include "wx/textctrl.h"
+#include "wx/richtext/richtextbuffer.h"
 
 #if wxUSE_RICHTEXT
 
 #include "wx/scrolwin.h"
 #include "wx/caret.h"
 
-#include "wx/richtext/richtextbuffer.h"
+#include "wx/textctrl.h"
 
-#if wxCHECK_VERSION(2,7,0)
-#define wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE 0
+#if !defined(__WXGTK__) && !defined(__WXMAC__)
+#define wxRICHTEXT_BUFFERED_PAINTING 1
 #else
-#define wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE 0
+#define wxRICHTEXT_BUFFERED_PAINTING 0
 #endif
 
+class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextStyleDefinition;
+
 /*!
  * Styles and flags
  */
@@ -36,6 +38,8 @@
 
 #define wxRE_READONLY          0x0010
 #define wxRE_MULTILINE         0x0020
+#define wxRE_CENTRE_CARET      0x8000
+#define wxRE_CENTER_CARET      wxRE_CENTRE_CARET
 
 /* Flags
  */
 #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
 
 /*!
  * Forward declarations
  * wxRichTextCtrl class declaration
  */
 
-class WXDLLIMPEXP_ADV wxRichTextCtrl:
-#if wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE
- public wxTextCtrlBase, wxScrollHelper
-#else
- public wxScrolledWindow
-#endif
+class WXDLLIMPEXP_RICHTEXT wxRichTextCtrl : public wxControl,
+                                            public wxTextCtrlIface,
+                                            public wxScrollHelper
 {
     DECLARE_CLASS( wxRichTextCtrl )
     DECLARE_EVENT_TABLE()
@@ -92,15 +97,16 @@ public:
 // Constructors
 
     wxRichTextCtrl( );
-    wxRichTextCtrl( wxWindow* parent, wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
-        long style = wxRE_MULTILINE );
-    ~wxRichTextCtrl( );
+    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);
+
+    virtual ~wxRichTextCtrl( );
 
 // Operations
 
     /// Creation
-    bool Create( wxWindow* parent, wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
-        long style = wxRE_MULTILINE );
+    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 );
 
     /// Member initialisation
     void Init();
@@ -110,7 +116,6 @@ public:
 // Accessors
 
     virtual wxString GetValue() const;
-    virtual void SetValue(const wxString& value);
 
     virtual wxString GetRange(long from, long to) const;
 
@@ -136,6 +141,24 @@ public:
     /// Set filename
     void SetFilename(const wxString& filename) { m_filename = filename; }
 
+    /// Set the threshold in character positions for doing layout optimization during sizing
+    void SetDelayedLayoutThreshold(long threshold) { m_delayedLayoutThreshold = threshold; }
+
+    /// Get the threshold in character positions for doing layout optimization during sizing
+    long GetDelayedLayoutThreshold() const { return m_delayedLayoutThreshold; }
+
+    /// Set text cursor
+    void SetTextCursor(const wxCursor& cursor ) { m_textCursor = cursor; }
+
+    /// Get text cursor
+    wxCursor GetTextCursor() const { return m_textCursor; }
+
+    /// Set URL cursor
+    void SetURLCursor(const wxCursor& cursor ) { m_urlCursor = cursor; }
+
+    /// Get URL cursor
+    wxCursor GetURLCursor() const { return m_urlCursor; }
+
 // Operations
 
     // editing
@@ -144,8 +167,15 @@ public:
     virtual void Remove(long from, long to);
 
     // load/save the controls contents from/to the file
-    virtual bool LoadFile(const wxString& file, int type = wxRICHTEXT_TYPE_ANY);
-    virtual bool SaveFile(const wxString& file = wxEmptyString, int type = wxRICHTEXT_TYPE_ANY);
+    virtual bool DoLoadFile(const wxString& file, int fileType);
+    virtual bool DoSaveFile(const wxString& file = wxEmptyString,
+                            int fileType = wxRICHTEXT_TYPE_ANY);
+
+    /// Set the handler flags, controlling loading and saving
+    void SetHandlerFlags(int flags) { GetBuffer().SetHandlerFlags(flags); }
+
+    /// Get the handler flags, controlling loading and saving
+    int GetHandlerFlags() const { return GetBuffer().GetHandlerFlags(); }
 
     // sets/clears the dirty flag
     virtual void MarkDirty();
@@ -163,14 +193,45 @@ public:
     // text control under some platforms supports the text styles: these
     // methods allow to apply the given text style to the given selection or to
     // set/get the style which will be used for all appended text
-    virtual bool SetStyle(long start, long end, const wxTextAttrEx& style);
-    virtual bool SetStyle(const wxRichTextRange& range, const wxRichTextAttr& style);
-    virtual bool GetStyle(long position, wxTextAttrEx& style) const;
-    virtual bool GetStyle(long position, wxRichTextAttr& style) const;
-    virtual bool SetDefaultStyle(const wxTextAttrEx& style);
+    virtual bool SetStyle(long start, long end, const wxTextAttr& style);
+    virtual bool SetStyle(const wxRichTextRange& range, const wxTextAttr& style);
+    virtual bool GetStyle(long position, wxTextAttr& style);
+
+    // get the common set of styles for the range
+    virtual bool GetStyleForRange(const wxRichTextRange& range, wxTextAttr& style);
+    // extended style setting operation with flags including:
+    // wxRICHTEXT_SETSTYLE_WITH_UNDO, wxRICHTEXT_SETSTYLE_OPTIMIZE, wxRICHTEXT_SETSTYLE_PARAGRAPHS_ONLY, wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY
+    // see richtextbuffer.h for more details.
+    virtual bool SetStyleEx(const wxRichTextRange& range, const wxTextAttr& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
+
+    /// Get the content (uncombined) attributes for this position.
+    virtual bool GetUncombinedStyle(long position, wxTextAttr& style);
+
+    virtual bool SetDefaultStyle(const wxTextAttr& style);
+
+    virtual const wxTextAttr& GetDefaultStyleEx() const { return GetDefaultStyle(); }
+
+    virtual const wxTextAttr& GetDefaultStyle() const;
+
+    /// Set list style
+    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);
+
+    /// Clear list for given range
+    virtual bool ClearListStyle(const wxRichTextRange& range, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
 
-    // TODO: change to GetDefaultStyle if we merge wxTextAttr and wxTextAttrEx
-    virtual const wxTextAttrEx& GetDefaultStyleEx() const;
+    /// Number/renumber any list elements in the given range
+    /// def/defName can be NULL/empty to indicate that the existing list style should be used.
+    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);
+
+    /// Promote the list items within the given range. promoteBy can be a positive or negative number, e.g. 1 or -1
+    /// def/defName can be NULL/empty to indicate that the existing list style should be used.
+    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 in the given range
+    virtual bool Delete(const wxRichTextRange& range);
 
     // translate between the position (which is just an index in the text ctrl
     // considering all its contents as a single strings) and (x, y) coordinates
@@ -217,29 +278,20 @@ public:
     virtual void SelectAll();
     virtual void SetEditable(bool editable);
 
-    /// Call Freeze to prevent refresh
-    virtual void Freeze();
-
-    /// Call Thaw to refresh
-    virtual void Thaw(bool refresh = true);
-
-    /// Call Thaw to refresh
-    virtual bool IsFrozen() const { return m_freezeCount > 0; }
-
     virtual bool HasSelection() const;
 
 ///// Functionality specific to wxRichTextCtrl
 
     /// Write an image at the current insertion point. Supply optional type to use
     /// for internal and file storage of the raw data.
-    virtual bool WriteImage(const wxImage& image, int bitmapType = wxBITMAP_TYPE_PNG);
+    virtual bool WriteImage(const wxImage& image, wxBitmapType bitmapType = wxBITMAP_TYPE_PNG);
 
     /// Write a bitmap at the current insertion point. Supply optional type to use
     /// for internal and file storage of the raw data.
-    virtual bool WriteImage(const wxBitmap& bitmap, int bitmapType = wxBITMAP_TYPE_PNG);
+    virtual bool WriteImage(const wxBitmap& bitmap, wxBitmapType bitmapType = wxBITMAP_TYPE_PNG);
 
     /// Load an image from file and write at the current insertion point.
-    virtual bool WriteImage(const wxString& filename, int bitmapType);
+    virtual bool WriteImage(const wxString& filename, wxBitmapType bitmapType);
 
     /// Write an image block at the current insertion point.
     virtual bool WriteImage(const wxRichTextImageBlock& imageBlock);
@@ -247,15 +299,16 @@ public:
     /// Insert a newline (actually paragraph) at the current insertion point.
     virtual bool Newline();
 
+    /// Insert a line break at the current insertion point.
+    virtual bool LineBreak();
+
     /// Set basic (overall) style
-    virtual void SetBasicStyle(const wxTextAttrEx& style) { GetBuffer().SetBasicStyle(style); }
-    virtual void SetBasicStyle(const wxRichTextAttr& style) { GetBuffer().SetBasicStyle(style); }
+    virtual void SetBasicStyle(const wxTextAttr& style) { GetBuffer().SetBasicStyle(style); }
 
     /// Get basic (overall) style
-    virtual const wxTextAttrEx& GetBasicStyle() const { return GetBuffer().GetBasicStyle(); }
+    virtual const wxTextAttr& GetBasicStyle() const { return GetBuffer().GetBasicStyle(); }
 
-    /// Begin using a style
-    virtual bool BeginStyle(const wxTextAttrEx& style) { return GetBuffer().BeginStyle(style); }
+    virtual bool BeginStyle(const wxTextAttr& style) { return GetBuffer().BeginStyle(style); }
 
     /// End the style
     virtual bool EndStyle() { return GetBuffer().EndStyle(); }
@@ -337,12 +390,19 @@ public:
     bool EndNumberedBullet() { return GetBuffer().EndNumberedBullet(); }
 
     /// Begin symbol bullet
-    bool BeginSymbolBullet(wxChar symbol, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_SYMBOL)
+    bool BeginSymbolBullet(const wxString& symbol, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_SYMBOL)
     { return GetBuffer().BeginSymbolBullet(symbol, leftIndent, leftSubIndent, bulletStyle); }
 
     /// End symbol bullet
     bool EndSymbolBullet() { return GetBuffer().EndSymbolBullet(); }
 
+    /// Begin standard bullet
+    bool BeginStandardBullet(const wxString& bulletName, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_STANDARD)
+    { return GetBuffer().BeginStandardBullet(bulletName, leftIndent, leftSubIndent, bulletStyle); }
+
+    /// End standard bullet
+    bool EndStandardBullet() { return GetBuffer().EndStandardBullet(); }
+
     /// Begin named character style
     bool BeginCharacterStyle(const wxString& characterStyle) { return GetBuffer().BeginCharacterStyle(characterStyle); }
 
@@ -355,15 +415,38 @@ public:
     /// End named character style
     bool EndParagraphStyle() { return GetBuffer().EndParagraphStyle(); }
 
+    /// Begin named list style
+    bool BeginListStyle(const wxString& listStyle, int level = 1, int number = 1) { return GetBuffer().BeginListStyle(listStyle, level, number); }
+
+    /// End named character style
+    bool EndListStyle() { return GetBuffer().EndListStyle(); }
+
+    /// Begin URL
+    bool BeginURL(const wxString& url, const wxString& characterStyle = wxEmptyString) { return GetBuffer().BeginURL(url, characterStyle); }
+
+    /// End URL
+    bool EndURL() { return GetBuffer().EndURL(); }
+
     /// Sets the default style to the style under the cursor
     bool SetDefaultStyleToCursorStyle();
 
     /// Clear the selection
     virtual void SelectNone();
 
+    /// Select the word at the given character position
+    virtual bool SelectWord(long position);
+
     /// Get/set the selection range in character positions. -1, -1 means no selection.
-    const wxRichTextRange& GetSelectionRange() const { return m_selectionRange; }
-    void SetSelectionRange(const wxRichTextRange& range) { m_selectionRange = range; }
+    /// The range is in API convention, i.e. a single character selection is denoted
+    /// by (n, n+1)
+    wxRichTextRange GetSelectionRange() const;
+    void SetSelectionRange(const wxRichTextRange& range);
+
+    /// Get/set the selection range in character positions. -1, -1 means no selection.
+    /// The range is in internal format, i.e. a single character selection is denoted
+    /// by (n, n)
+    const wxRichTextRange& GetInternalSelectionRange() const { return m_selectionRange; }
+    void SetInternalSelectionRange(const wxRichTextRange& range) { m_selectionRange = range; }
 
     /// Add a new paragraph of text to the end of the buffer
     virtual wxRichTextRange AddParagraph(const wxString& text);
@@ -373,7 +456,7 @@ public:
 
     /// Layout the buffer: which we must do before certain operations, such as
     /// setting the caret position.
-    virtual bool Layout();
+    virtual bool LayoutContent(bool onlyVisibleRect = false);
 
     /// Move the caret to the given character position
     virtual bool MoveCaret(long pos, bool showAtLineStart = false);
@@ -446,39 +529,31 @@ public:
     /// of the attributes are different within the range, the test fails. You
     /// can use this to implement, for example, bold button updating. style must have
     /// flags indicating which attributes are of interest.
-    virtual bool HasCharacterAttributes(const wxRichTextRange& range, const wxTextAttrEx& style) const
+    virtual bool HasCharacterAttributes(const wxRichTextRange& range, const wxTextAttr& style) const
     {
-        return GetBuffer().HasCharacterAttributes(range, style);
-    }
-    virtual bool HasCharacterAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const
-    {
-        return GetBuffer().HasCharacterAttributes(range, style);
+        return GetBuffer().HasCharacterAttributes(range.ToInternal(), style);
     }
 
     /// 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. style must have
     /// flags indicating which attributes are of interest.
-    virtual bool HasParagraphAttributes(const wxRichTextRange& range, const wxTextAttrEx& style) const
-    {
-        return GetBuffer().HasParagraphAttributes(range, style);
-    }
-    virtual bool HasParagraphAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const
+    virtual bool HasParagraphAttributes(const wxRichTextRange& range, const wxTextAttr& style) const
     {
-        return GetBuffer().HasParagraphAttributes(range, style);
+        return GetBuffer().HasParagraphAttributes(range.ToInternal(), style);
     }
 
     /// Is all of the selection bold?
-    virtual bool IsSelectionBold() const;
+    virtual bool IsSelectionBold();
 
     /// Is all of the selection italics?
-    virtual bool IsSelectionItalics() const;
+    virtual bool IsSelectionItalics();
 
     /// Is all of the selection underlined?
-    virtual bool IsSelectionUnderlined() const;
+    virtual bool IsSelectionUnderlined();
 
     /// Is all of the selection aligned according to the specified flag?
-    virtual bool IsSelectionAligned(wxTextAttrAlignment alignment) const;
+    virtual bool IsSelectionAligned(wxTextAttrAlignment alignment);
 
     /// Apply bold to the selection
     virtual bool ApplyBoldToSelection();
@@ -492,14 +567,28 @@ public:
     /// Apply alignment to the selection
     virtual bool ApplyAlignmentToSelection(wxTextAttrAlignment alignment);
 
-    /// Set style sheet, if any.
+    /// Apply a named style to the selection
+    virtual bool ApplyStyle(wxRichTextStyleDefinition* def);
+
+    /// Set style sheet, if any
     void SetStyleSheet(wxRichTextStyleSheet* styleSheet) { GetBuffer().SetStyleSheet(styleSheet); }
     wxRichTextStyleSheet* GetStyleSheet() const { return GetBuffer().GetStyleSheet(); }
 
+    /// Push style sheet to top of stack
+    bool PushStyleSheet(wxRichTextStyleSheet* styleSheet) { return GetBuffer().PushStyleSheet(styleSheet); }
+
+    /// Pop style sheet from top of stack
+    wxRichTextStyleSheet* PopStyleSheet() { return GetBuffer().PopStyleSheet(); }
+
+    /// Apply the style sheet to the buffer, for example if the styles have changed.
+    bool ApplyStyleSheet(wxRichTextStyleSheet* styleSheet = NULL);
+
 // Command handlers
 
-    void Command(wxCommandEvent & event);
+    void Command(wxCommandEvent& event);
     void OnDropFiles(wxDropFilesEvent& event);
+    void OnCaptureLost(wxMouseCaptureLostEvent& event);
+    void OnSysColourChanged(wxSysColourChangedEvent& event);
 
     void OnCut(wxCommandEvent& event);
     void OnCopy(wxCommandEvent& event);
@@ -555,37 +644,34 @@ public:
     void OnSetFocus(wxFocusEvent& event);
     void OnKillFocus(wxFocusEvent& event);
 
-// Implementation
+    /// Idle-time processing
+    void OnIdle(wxIdleEvent& event);
+
+    /// Scrolling
+    void OnScroll(wxScrollWinEvent& event);
 
     /// Set font, and also default attributes
     virtual bool SetFont(const wxFont& font);
 
     /// Set up scrollbars, e.g. after a resize
-    virtual void SetupScrollbars();
+    virtual void SetupScrollbars(bool atTop = false);
 
     /// Keyboard navigation
-    virtual bool Navigate(int keyCode, int flags);
+    virtual bool KeyboardNavigate(int keyCode, int flags);
 
     /// Paint the background
     virtual void PaintBackground(wxDC& dc);
 
+#if wxRICHTEXT_BUFFERED_PAINTING
     /// Recreate buffer bitmap if necessary
     virtual bool RecreateBuffer(const wxSize& size = wxDefaultSize);
+#endif
 
     /// Set the selection
     virtual void DoSetSelection(long from, long to, bool scrollCaret = true);
 
     /// Write text
-    virtual void DoWriteText(const wxString& value, bool selectionOnly = true);
-
-    /// Send an update event
-    virtual bool SendUpdateEvent();
-
-    /// Init command event
-    void InitCommandEvent(wxCommandEvent& event) const;
-
-    /// do the window-specific processing after processing the update event
-    virtual void DoUpdateWindowUI(wxUpdateUIEvent& event);
+    virtual void DoWriteText(const wxString& value, int flags = 0);
 
     /// Should we inherit colours?
     virtual bool ShouldInheritColours() const { return false; }
@@ -600,11 +686,19 @@ public:
     /// Scroll into view. This takes a _caret_ position.
     virtual bool ScrollIntoView(long position, int keyCode);
 
+    /// Refresh the area affected by a selection change
+    bool RefreshForSelectionChange(const wxRichTextRange& oldSelection, const wxRichTextRange& newSelection);
+
     /// 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.
     void SetCaretPosition(long position, bool showAtLineStart = false) ;
     long GetCaretPosition() const { return m_caretPosition; }
 
+    /// 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.
+    long GetAdjustedCaretPosition(long caretPos) const;
+
     /// Move 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.
@@ -633,10 +727,10 @@ public:
     bool DeleteSelectedContent(long* newPos= NULL);
 
     /// Transform logical to physical
-    wxPoint GetPhysicalPoint(const wxPoint& ptLogical);
+    wxPoint GetPhysicalPoint(const wxPoint& ptLogical) const;
 
     /// Transform physical to logical
-    wxPoint GetLogicalPoint(const wxPoint& ptPhysical);
+    wxPoint GetLogicalPoint(const wxPoint& ptPhysical) const;
 
     /// Finds the caret position for the next word. Direction
     /// is 1 (forward) or -1 (backwards).
@@ -645,31 +739,72 @@ public:
     /// Is the given position visible on the screen?
     bool IsPositionVisible(long pos) const;
 
+    /// Returns the first visible position in the current view
+    long GetFirstVisiblePosition() const;
+
+    /// Returns the caret position since the default formatting was changed. As
+    /// soon as this position changes, we no longer reflect the default style
+    /// in the UI. A value of -2 means that we should only reflect the style of the
+    /// content under the caret.
+    long GetCaretPositionForDefaultStyle() const { return m_caretPositionForDefaultStyle; }
+
+    /// Set the caret position for the default style that the user is selecting.
+    void SetCaretPositionForDefaultStyle(long pos) { m_caretPositionForDefaultStyle = pos; }
+
+    /// Should the UI reflect the default style chosen by the user, rather than the style under
+    /// the caret?
+    bool IsDefaultStyleShowing() const { return m_caretPositionForDefaultStyle != -2; }
+
+    /// Convenience function that tells the control to start reflecting the default
+    /// style, since the user is changing it.
+    void SetAndShowDefaultStyle(const wxTextAttr& attr)
+    {
+        SetDefaultStyle(attr);
+        SetCaretPositionForDefaultStyle(GetCaretPosition());
+    }
+
+    /// Get the first visible point in the window
+    wxPoint GetFirstVisiblePoint() const;
+
+// Implementation
+
+     /// Font names take a long time to retrieve, so cache them (on demand)
+     static const wxArrayString& GetAvailableFontNames();
+     static void ClearAvailableFontNames();
+
+     WX_FORWARD_TO_SCROLL_HELPER()
+
 // Overrides
+protected:
 
     virtual wxSize DoGetBestSize() const ;
 
-// Data members
-private:
+    virtual void DoSetValue(const wxString& value, int flags = 0);
 
-    /// Allows nested Freeze/Thaw
-    int                     m_freezeCount;
+    virtual void DoThaw();
 
+
+// Data members
+private:
+#if wxRICHTEXT_BUFFERED_PAINTING
     /// Buffer bitmap
     wxBitmap                m_bufferBitmap;
+#endif
 
     /// Text buffer
     wxRichTextBuffer        m_buffer;
 
-    /// Filename
-    wxString                m_filename;
-
     wxMenu*                 m_contextMenu;
 
     /// Caret position (1 less than the character position, so -1 is the
     /// first caret position).
     long                    m_caretPosition;
 
+    /// 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;
+
     /// Selection range in character positions. -2, -2 means no selection.
     wxRichTextRange         m_selectionRange;
 
@@ -689,68 +824,122 @@ private:
 
     /// 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;
 };
 
 /*!
  * wxRichTextEvent - the event class for wxRichTextCtrl notifications
  */
 
-class WXDLLIMPEXP_ADV wxRichTextEvent : public wxNotifyEvent
+class WXDLLIMPEXP_RICHTEXT wxRichTextEvent : public wxNotifyEvent
 {
 public:
     wxRichTextEvent(wxEventType commandType = wxEVT_NULL, int winid = 0)
         : wxNotifyEvent(commandType, winid),
-        m_itemIndex(-1), m_flags(0)
+        m_flags(0), m_position(-1), m_oldStyleSheet(NULL), m_newStyleSheet(NULL),
+        m_char((wxChar) 0)
         { }
 
     wxRichTextEvent(const wxRichTextEvent& event)
         : wxNotifyEvent(event),
-        m_itemIndex(event.m_itemIndex), m_flags(event.m_flags)
+        m_flags(event.m_flags), m_position(-1),
+        m_oldStyleSheet(event.m_oldStyleSheet), m_newStyleSheet(event.m_newStyleSheet),
+        m_char((wxChar) 0)
         { }
 
-    int GetIndex() const { return m_itemIndex; }
-    void SetIndex(int n) { m_itemIndex = n; }
+    long GetPosition() const { return m_position; }
+    void SetPosition(long pos) { m_position = pos; }
 
     int GetFlags() const { return m_flags; }
     void SetFlags(int flags) { m_flags = flags; }
 
+    wxRichTextStyleSheet* GetOldStyleSheet() const { return m_oldStyleSheet; }
+    void SetOldStyleSheet(wxRichTextStyleSheet* sheet) { m_oldStyleSheet = sheet; }
+
+    wxRichTextStyleSheet* GetNewStyleSheet() const { return m_newStyleSheet; }
+    void SetNewStyleSheet(wxRichTextStyleSheet* sheet) { m_newStyleSheet = sheet; }
+
+    const wxRichTextRange& GetRange() const { return m_range; }
+    void SetRange(const wxRichTextRange& range) { m_range = range; }
+
+    wxChar GetCharacter() const { return m_char; }
+    void SetCharacter(wxChar ch) { m_char = ch; }
+
     virtual wxEvent *Clone() const { return new wxRichTextEvent(*this); }
 
 protected:
-    int                 m_itemIndex;
-    int                 m_flags;
+    int                     m_flags;
+    long                    m_position;
+    wxRichTextStyleSheet*   m_oldStyleSheet;
+    wxRichTextStyleSheet*   m_newStyleSheet;
+    wxRichTextRange         m_range;
+    wxChar                  m_char;
 
 private:
     DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxRichTextEvent)
 };
 
 /*!
- * wxRichTextCtrl event macros
+ * wxRichTextCtrl events
  */
-
-BEGIN_DECLARE_EVENT_TYPES()
-    DECLARE_EVENT_TYPE(wxEVT_COMMAND_RICHTEXT_ITEM_SELECTED, 2600)
-    DECLARE_EVENT_TYPE(wxEVT_COMMAND_RICHTEXT_ITEM_DESELECTED, 2601)
-    DECLARE_EVENT_TYPE(wxEVT_COMMAND_RICHTEXT_LEFT_CLICK, 2602)
-    DECLARE_EVENT_TYPE(wxEVT_COMMAND_RICHTEXT_RIGHT_CLICK, 2603)
-    DECLARE_EVENT_TYPE(wxEVT_COMMAND_RICHTEXT_MIDDLE_CLICK, 2604)
-    DECLARE_EVENT_TYPE(wxEVT_COMMAND_RICHTEXT_LEFT_DCLICK, 2605)
-    DECLARE_EVENT_TYPE(wxEVT_COMMAND_RICHTEXT_RETURN, 2606)
-END_DECLARE_EVENT_TYPES()
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_LEFT_CLICK, wxRichTextEvent )
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_RIGHT_CLICK, wxRichTextEvent )
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_MIDDLE_CLICK, wxRichTextEvent )
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_LEFT_DCLICK, wxRichTextEvent )
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_RETURN, wxRichTextEvent )
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_CHARACTER, wxRichTextEvent )
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_DELETE, wxRichTextEvent )
+
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING, wxRichTextEvent )
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGED, wxRichTextEvent )
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACING, wxRichTextEvent )
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACED, wxRichTextEvent )
+
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_CONTENT_INSERTED, wxRichTextEvent )
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_CONTENT_DELETED, wxRichTextEvent )
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_STYLE_CHANGED, wxRichTextEvent )
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_SELECTION_CHANGED, wxRichTextEvent )
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_BUFFER_RESET, wxRichTextEvent )
 
 typedef void (wxEvtHandler::*wxRichTextEventFunction)(wxRichTextEvent&);
 
-#define EVT_RICHTEXT_ITEM_SELECTED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_ITEM_SELECTED, id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ),
-#define EVT_RICHTEXT_ITEM_DESELECTED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_ITEM_DESELECTED, id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ),
-#define EVT_RICHTEXT_LEFT_CLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_LEFT_CLICK, id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ),
-#define EVT_RICHTEXT_RIGHT_CLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_RIGHT_CLICK, id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ),
-#define EVT_RICHTEXT_MIDDLE_CLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_MIDDLE_CLICK, id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ),
-#define EVT_RICHTEXT_LEFT_DCLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_LEFT_DCLICK, id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ),
-#define EVT_RICHTEXT_RETURN(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_RETURN, id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ),
+#define wxRichTextEventHandler(func) \
+    wxEVENT_HANDLER_CAST(wxRichTextEventFunction, func)
+
+#define EVT_RICHTEXT_LEFT_CLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_LEFT_CLICK, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_RIGHT_CLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_RIGHT_CLICK, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_MIDDLE_CLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_MIDDLE_CLICK, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_LEFT_DCLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_LEFT_DCLICK, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_RETURN(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_RETURN, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_CHARACTER(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_CHARACTER, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_DELETE(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_DELETE, id, -1, wxRichTextEventHandler( fn ), NULL ),
+
+#define EVT_RICHTEXT_STYLESHEET_CHANGING(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_STYLESHEET_CHANGED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGED, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_STYLESHEET_REPLACING(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACING, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_STYLESHEET_REPLACED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACED, id, -1, wxRichTextEventHandler( fn ), NULL ),
+
+#define EVT_RICHTEXT_CONTENT_INSERTED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_CONTENT_INSERTED, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_CONTENT_DELETED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_CONTENT_DELETED, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_STYLE_CHANGED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLE_CHANGED, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_SELECTION_CHANGED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_SELECTION_CHANGED, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_BUFFER_RESET(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_BUFFER_RESET, id, -1, wxRichTextEventHandler( fn ), NULL ),
 
 #endif
     // wxUSE_RICHTEXT
 
 #endif
     // _WX_RICHTEXTCTRL_H_
-