#include "wx/scrolwin.h"
#include "wx/caret.h"
-#if wxCHECK_VERSION(2,7,0)
-#define wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE 1
-#else
-#define wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE 0
-#endif
-
-#if wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE
#include "wx/textctrl.h"
+
+#if !defined(__WXGTK__) && !defined(__WXMAC__)
+#define wxRICHTEXT_BUFFERED_PAINTING 1
+#else
+#define wxRICHTEXT_BUFFERED_PAINTING 0
#endif
class WXDLLIMPEXP_RICHTEXT wxRichTextStyleDefinition;
* wxRichTextCtrl class declaration
*/
-class WXDLLIMPEXP_RICHTEXT wxRichTextCtrl:
-#if wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE
- public wxTextCtrlBase, wxScrollHelper
-#else
- public wxScrolledWindow
-#endif
+class WXDLLIMPEXP_RICHTEXT wxRichTextCtrl : public wxTextCtrlBase,
+ public wxScrollHelper
{
DECLARE_CLASS( wxRichTextCtrl )
DECLARE_EVENT_TABLE()
// Accessors
virtual wxString GetValue() const;
- virtual void SetValue(const wxString& value);
virtual wxString GetRange(long from, long to) const;
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();
virtual bool SetStyle(long start, long end, const wxTextAttr& style);
virtual bool SetStyle(long start, long end, const wxTextAttrEx& style);
virtual bool SetStyle(const wxRichTextRange& range, const wxRichTextAttr& style);
- virtual bool GetStyle(long position, wxTextAttr& style) const;
- virtual bool GetStyle(long position, wxTextAttrEx& style) const;
- virtual bool GetStyle(long position, wxRichTextAttr& style) const;
+ virtual bool GetStyle(long position, wxTextAttr& style);
+ virtual bool GetStyle(long position, wxTextAttrEx& style);
+ virtual bool GetStyle(long position, wxRichTextAttr& 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(long start, long end, const wxTextAttrEx& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
+ virtual bool SetStyleEx(const wxRichTextRange& range, const wxTextAttrEx& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
+ virtual bool SetStyleEx(const wxRichTextRange& range, const wxRichTextAttr& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
+
+ /// Get the content (uncombined) attributes for this position.
+ virtual bool GetUncombinedStyle(long position, wxTextAttr& style);
+ virtual bool GetUncombinedStyle(long position, wxTextAttrEx& style);
+ virtual bool GetUncombinedStyle(long position, wxRichTextAttr& style);
+
virtual bool SetDefaultStyle(const wxTextAttrEx& style);
virtual bool SetDefaultStyle(const wxTextAttr& style);
virtual const wxTextAttrEx& GetDefaultStyleEx() const;
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);
+
+ /// 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);
+
// 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
// which represent column and line.
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); }
/// 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);
}
/// 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();
virtual bool ApplyAlignmentToSelection(wxTextAttrAlignment alignment);
/// Apply a named style to the selection
- virtual void ApplyStyle(wxRichTextStyleDefinition* def);
+ virtual bool ApplyStyle(wxRichTextStyleDefinition* def);
- /// Set style sheet, if any.
+ /// 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);
/// Scrolling
void OnScroll(wxScrollWinEvent& event);
-// Implementation
-
/// Set font, and also default attributes
virtual bool SetFont(const wxFont& font);
/// 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
- // (duplicated code from wxTextCtrlBase)
-#if !wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE
- virtual void DoUpdateWindowUI(wxUpdateUIEvent& event);
-#endif
+ virtual void DoWriteText(const wxString& value, int flags = 0);
/// Should we inherit colours?
virtual bool ShouldInheritColours() const { return false; }
SetCaretPositionForDefaultStyle(GetCaretPosition());
}
-#if wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE
+// 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()
-#endif
// Overrides
protected:
virtual wxSize DoGetBestSize() const ;
+ virtual void DoSetValue(const wxString& value, int flags = 0);
+
+
// Data members
private:
/// Allows nested Freeze/Thaw
int m_freezeCount;
+#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
/// Threshold for doing delayed layout
long m_delayedLayoutThreshold;
+
+ /// Cursors
+ wxCursor m_textCursor;
+ wxCursor m_urlCursor;
+
+ static wxArrayString sm_availableFontNames;
};
/*!
public:
wxRichTextEvent(wxEventType commandType = wxEVT_NULL, int winid = 0)
: wxNotifyEvent(commandType, winid),
- m_itemIndex(-1), m_flags(0)
+ m_itemIndex(-1), m_flags(0), m_oldStyleSheet(NULL), m_newStyleSheet(NULL)
{ }
wxRichTextEvent(const wxRichTextEvent& event)
: wxNotifyEvent(event),
- m_itemIndex(event.m_itemIndex), m_flags(event.m_flags)
+ m_itemIndex(event.m_itemIndex), m_flags(event.m_flags),
+ m_oldStyleSheet(event.m_oldStyleSheet), m_newStyleSheet(event.m_newStyleSheet)
{ }
int GetIndex() const { return m_itemIndex; }
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; }
+
virtual wxEvent *Clone() const { return new wxRichTextEvent(*this); }
protected:
- int m_itemIndex;
- int m_flags;
+ int m_itemIndex;
+ int m_flags;
+ wxRichTextStyleSheet* m_oldStyleSheet;
+ wxRichTextStyleSheet* m_newStyleSheet;
private:
DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxRichTextEvent)
DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_MIDDLE_CLICK, 2604)
DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_LEFT_DCLICK, 2605)
DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_RETURN, 2606)
+
+ DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING, 2607)
+ DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGED, 2608)
+ DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACING, 2609)
+ DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACED, 2610)
END_DECLARE_EVENT_TYPES()
typedef void (wxEvtHandler::*wxRichTextEventFunction)(wxRichTextEvent&);
#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 EVT_RICHTEXT_STYLESHEET_CHANGING(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ),
+#define EVT_RICHTEXT_STYLESHEET_CHANGED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ),
+#define EVT_RICHTEXT_STYLESHEET_REPLACING(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACING, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ),
+#define EVT_RICHTEXT_STYLESHEET_REPLACED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ),
+
#endif
// wxUSE_RICHTEXT
#endif
// _WX_RICHTEXTCTRL_H_
-