/////////////////////////////////////////////////////////////////////////////
-// Name: richtextctrl.h
+// Name: wx/richtext/richtextctrl.h
// Purpose: A rich edit control
// Author: Julian Smart
-// Modified by:
+// Modified by:
// Created: 2005-09-30
-// RCS-ID:
+// RCS-ID: $Id$
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#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
*/
#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 wxTextCtrlBase,
+ public wxScrollHelper
+{
DECLARE_CLASS( wxRichTextCtrl )
DECLARE_EVENT_TABLE()
// 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();
// Accessors
- virtual wxString GetValue() const;
- virtual void SetValue(const wxString& value);
-
virtual wxString GetRange(long from, long to) const;
virtual int GetLineLength(long lineNo) const ;
/// 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; }
+
+ /// Are we showing the caret position at the start of a line
+ /// instead of at the end of the previous one?
+ bool GetCaretAtLineStart() const { return m_caretAtLineStart; }
+ void SetCaretAtLineStart(bool atStart) { m_caretAtLineStart = atStart; }
+
+ /// Are we dragging a selection?
+ bool GetDragging() const { return m_dragging; }
+ void SetDragging(bool dragging) { m_dragging = dragging; }
+
+ /// Get/set drag start position
+ const wxPoint& GetDragStart() const { return m_dragStart; }
+ void SetDragStart(const wxPoint& pt) { m_dragStart = pt; }
+
+#if wxRICHTEXT_BUFFERED_PAINTING
+ /// Get the buffer bitmap
+ const wxBitmap& GetBufferBitmap() const { return m_bufferBitmap; }
+ wxBitmap& GetBufferBitmap() { return m_bufferBitmap; }
+#endif
+
+ /// Get/set context menu
+ wxMenu* GetContextMenu() const { return m_contextMenu; }
+ void SetContextMenu(wxMenu* menu);
+
+ /// Anchor so we know how to extend the selection
+ /// It's a caret position since it's between two characters.
+ long GetSelectionAnchor() const { return m_selectionAnchor; }
+ void SetSelectionAnchor(long anchor) { m_selectionAnchor = anchor; }
+
// Operations
// editing
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();
// 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);
- // TODO: change to GetDefaultStyle if we merge wxTextAttr and wxTextAttrEx
- virtual const wxTextAttrEx& GetDefaultStyleEx() const;
+ /// 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);
+
+ /// 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
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);
/// 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(); }
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.
+ /// 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.
- const wxRichTextRange& GetSelectionRange() const { return m_selectionRange; }
- void SetSelectionRange(const wxRichTextRange& range) { m_selectionRange = range; }
+ /// 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);
/// 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);
/// 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();
/// 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);
// Show a context menu for Rich Edit controls (the standard
// EDIT control has one already)
void OnContextMenu(wxContextMenuEvent& event);
-
+
// Event handlers
/// Painting
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);
-
+
+ /// Other user defined painting after everything else (i.e. all text) is painted
+ virtual void PaintAboveContent(wxDC& WXUNUSED(dc)) {}
+
+#if wxRICHTEXT_BUFFERED_PAINTING
/// Recreate buffer bitmap if necessary
virtual bool RecreateBuffer(const wxSize& size = wxDefaultSize);
-
- /// Set the selection
- virtual void DoSetSelection(long from, long to, bool scrollCaret = true);
+#endif
/// 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; }
/// 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.
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 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()
+
+ // implement wxTextEntry methods
+ virtual wxString DoGetValue() const;
+
+protected:
+ // 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 wxWindow *GetEditableWindow() { return this; }
+ virtual GtkEditable *GetEditable() const { return NULL; }
+ virtual GtkEntry *GetEntry() const { return NULL; }
+#endif
+#endif // !__WXUNIVERSAL__
+
// 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;
/// 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) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_LEFT_CLICK, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_RIGHT_CLICK(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_RIGHT_CLICK, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_MIDDLE_CLICK(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_MIDDLE_CLICK, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_LEFT_DCLICK(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_LEFT_DCLICK, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_RETURN(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_RETURN, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_CHARACTER(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_CHARACTER, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_DELETE(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_DELETE, id, -1, wxRichTextEventHandler( fn ), NULL ),
+
+#define EVT_RICHTEXT_STYLESHEET_CHANGING(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_STYLESHEET_CHANGED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGED, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_STYLESHEET_REPLACING(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACING, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_STYLESHEET_REPLACED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACED, id, -1, wxRichTextEventHandler( fn ), NULL ),
+
+#define EVT_RICHTEXT_CONTENT_INSERTED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_CONTENT_INSERTED, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_CONTENT_DELETED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_CONTENT_DELETED, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_STYLE_CHANGED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLE_CHANGED, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_SELECTION_CHANGED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_SELECTION_CHANGED, id, -1, wxRichTextEventHandler( fn ), NULL ),
+#define EVT_RICHTEXT_BUFFER_RESET(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_BUFFER_RESET, id, -1, wxRichTextEventHandler( fn ), NULL ),
#endif
// wxUSE_RICHTEXT
#endif
// _WX_RICHTEXTCTRL_H_
-