#include "wx/caret.h"
#if wxCHECK_VERSION(2,7,0)
-#define wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE 0
+#define wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE 1
#else
#define wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE 0
#endif
#include "wx/textctrl.h"
#endif
+class WXDLLIMPEXP_RICHTEXT wxRichTextStyleDefinition;
+
/*!
* Styles and flags
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextCtrl:
#if wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE
- public wxTextCtrlBase, wxScrollHelper
+ public wxTextCtrlBase, public wxScrollHelper
#else
public wxScrolledWindow
#endif
// Constructors
wxRichTextCtrl( );
- wxRichTextCtrl( wxWindow* parent, wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
+ wxRichTextCtrl( wxWindow* parent, wxWindowID id = -1, const wxString& value = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
long style = wxRE_MULTILINE );
- ~wxRichTextCtrl( );
+ virtual ~wxRichTextCtrl( );
// Operations
/// Creation
- bool Create( wxWindow* parent, wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
+ bool Create( wxWindow* parent, wxWindowID id = -1, const wxString& value = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
long style = wxRE_MULTILINE );
/// Member initialisation
virtual void Replace(long from, long to, const wxString& value);
virtual void Remove(long from, long to);
+#if !wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE
+ bool LoadFile(const wxString& file, int fileType = wxRICHTEXT_TYPE_ANY);
+ bool SaveFile(const wxString& file = wxEmptyString, int fileType = wxRICHTEXT_TYPE_ANY);
+#endif
+
// 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);
// sets/clears the dirty flag
virtual void MarkDirty();
// 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 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, 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);
virtual bool SetDefaultStyle(const wxTextAttrEx& style);
+ virtual bool SetDefaultStyle(const wxTextAttr& style);
// TODO: change to GetDefaultStyle if we merge wxTextAttr and wxTextAttrEx
virtual const wxTextAttrEx& GetDefaultStyleEx() const;
+ virtual const wxTextAttr& GetDefaultStyle() const;
// 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
virtual void SelectNone();
/// 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();
/// Apply alignment to the selection
virtual bool ApplyAlignmentToSelection(wxTextAttrAlignment alignment);
+ /// Apply a named style to the selection
+ virtual void ApplyStyle(wxRichTextStyleDefinition* def);
+
/// Set style sheet, if any.
void SetStyleSheet(wxRichTextStyleSheet* styleSheet) { GetBuffer().SetStyleSheet(styleSheet); }
wxRichTextStyleSheet* GetStyleSheet() const { return GetBuffer().GetStyleSheet(); }
// Implementation
-#if wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE
- WX_FORWARD_TO_SCROLL_HELPER()
-#endif
-
/// Set font, and also default attributes
virtual bool SetFont(const wxFont& font);
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.
/// 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 wxRichTextAttr& attr)
+ {
+ SetDefaultStyle(attr);
+ SetCaretPositionForDefaultStyle(GetCaretPosition());
+ }
+
+#if wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE
+ WX_FORWARD_TO_SCROLL_HELPER()
+#endif
+
// Overrides
protected:
/// Text buffer
wxRichTextBuffer m_buffer;
+#if !wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE
/// Filename
wxString m_filename;
+#endif
wxMenu* m_contextMenu;
/// 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;