#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"
-
#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
+#if wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE
+#include "wx/textctrl.h"
+#endif
+
+class WXDLLIMPEXP_RICHTEXT wxRichTextStyleDefinition;
+
/*!
* Styles and 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:
+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
/// 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; }
+
// Operations
// editing
// 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, wxTextAttr& style) const;
virtual bool GetStyle(long position, wxTextAttrEx& style) const;
virtual bool GetStyle(long position, wxRichTextAttr& style) const;
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 Freeze();
/// Call Thaw to refresh
- virtual void Thaw(bool refresh = true);
+ virtual void Thaw();
/// Call Thaw to refresh
virtual bool IsFrozen() const { return m_freezeCount > 0; }
/// 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);
/// 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(); }
// Command handlers
- void Command(wxCommandEvent & event);
+ void Command(wxCommandEvent& event);
void OnDropFiles(wxDropFilesEvent& event);
void OnCut(wxCommandEvent& event);
void OnSetFocus(wxFocusEvent& event);
void OnKillFocus(wxFocusEvent& event);
+ /// Idle-time processing
+ void OnIdle(wxIdleEvent& event);
+
+ /// Scrolling
+ void OnScroll(wxScrollWinEvent& event);
+
// Implementation
/// 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);
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
/// Should we inherit colours?
virtual bool ShouldInheritColours() const { return false; }
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.
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).
/// 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 wxRichTextAttr& attr)
+ {
+ SetDefaultStyle(attr);
+ SetCaretPositionForDefaultStyle(GetCaretPosition());
+ }
+
+#if wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE
+ WX_FORWARD_TO_SCROLL_HELPER()
+#endif
+
// Overrides
+protected:
virtual wxSize DoGetBestSize() const ;
/// 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;
/// 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;
};
/*!
* 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)
*/
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)
+ DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_ITEM_SELECTED, 2600)
+ DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_ITEM_DESELECTED, 2601)
+ DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_LEFT_CLICK, 2602)
+ DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_RIGHT_CLICK, 2603)
+ 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)
END_DECLARE_EVENT_TYPES()
typedef void (wxEvtHandler::*wxRichTextEventFunction)(wxRichTextEvent&);