X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/32423dd8248d13625e8eedd10298601e5313a393..e733c4ce1e24cf7e4b0b0d8362fc59aaa7a7641c:/interface/wx/richtext/richtextbuffer.h diff --git a/interface/wx/richtext/richtextbuffer.h b/interface/wx/richtext/richtextbuffer.h index 4f821125f8..7857043e98 100644 --- a/interface/wx/richtext/richtextbuffer.h +++ b/interface/wx/richtext/richtextbuffer.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 2005-09-30 -// RCS-ID: $Id$ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -13,7 +12,7 @@ The line break character that can be embedded in content. */ -extern WXDLLIMPEXP_RICHTEXT const wxChar wxRichTextLineBreakChar; +extern const wxChar wxRichTextLineBreakChar; /** File types in wxRichText context. @@ -233,7 +232,7 @@ enum wxTextBoxAttrPosition @see wxRichTextAttr, wxRichTextCtrl, wxTextAttrDimensions */ -class WXDLLIMPEXP_RICHTEXT wxTextAttrDimension +class wxTextAttrDimension { public: /** @@ -362,7 +361,7 @@ public: @see wxRichTextAttr, wxRichTextCtrl, wxTextAttrDimension */ -class WXDLLIMPEXP_RICHTEXT wxTextAttrDimensions +class wxTextAttrDimensions { public: /** @@ -456,7 +455,7 @@ public: @see wxRichTextAttr, wxRichTextCtrl, wxTextAttrDimension */ -class WXDLLIMPEXP_RICHTEXT wxTextAttrSize +class wxTextAttrSize { public: /** @@ -559,7 +558,7 @@ public: @see wxRichTextAttr, wxRichTextCtrl, wxTextAttrDimension */ -class WXDLLIMPEXP_RICHTEXT wxTextAttrDimensionConverter +class wxTextAttrDimensionConverter { public: /** @@ -680,7 +679,7 @@ enum wxTextBoxAttrVerticalAlignment @see wxRichTextAttr, wxRichTextCtrl, wxRichTextAttrBorders */ -class WXDLLIMPEXP_RICHTEXT wxTextAttrBorder +class wxTextAttrBorder { public: /** @@ -834,7 +833,7 @@ public: @see wxRichTextAttr, wxRichTextCtrl, wxRichTextAttrBorder */ -class WXDLLIMPEXP_RICHTEXT wxTextAttrBorders +class wxTextAttrBorders { public: /** @@ -948,7 +947,7 @@ public: @see wxRichTextAttr, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxTextBoxAttr +class wxTextBoxAttr { public: /** @@ -1349,7 +1348,7 @@ public: @see wxRichTextAttr, wxTextBoxAttr, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextAttr: public wxTextAttr +class wxRichTextAttr: public wxTextAttr { public: /** @@ -1424,10 +1423,16 @@ public: */ void SetTextBoxAttr(const wxTextBoxAttr& attr) { m_textBoxAttr = attr; } + /** + Returns @true if no attributes are set. + */ + bool IsDefault() const { return (GetFlags() == 0) && m_textBoxAttr.IsDefault(); } + wxTextBoxAttr m_textBoxAttr; }; -WX_DECLARE_USER_EXPORTED_OBJARRAY(wxVariant, wxRichTextVariantArray, WXDLLIMPEXP_RICHTEXT); +class wxRichTextAttrArray; +class wxRichTextVariantArray; /** @class wxRichTextProperties @@ -1440,9 +1445,8 @@ WX_DECLARE_USER_EXPORTED_OBJARRAY(wxVariant, wxRichTextVariantArray, WXDLLIMPEXP @see wxRichTextBuffer, wxRichTextObject, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextProperties: public wxObject +class wxRichTextProperties: public wxObject { -DECLARE_DYNAMIC_CLASS(wxRichTextProperties) public: /** @@ -1610,7 +1614,7 @@ protected: @see wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextFontTable: public wxObject +class wxRichTextFontTable: public wxObject { public: /** @@ -1662,8 +1666,6 @@ public: protected: double m_fontScale; - - DECLARE_DYNAMIC_CLASS(wxRichTextFontTable) }; /** @@ -1677,7 +1679,7 @@ protected: @see wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextRange +class wxRichTextRange { public: // Constructors @@ -1799,7 +1801,7 @@ protected: long m_end; }; -WX_DECLARE_USER_EXPORTED_OBJARRAY(wxRichTextRange, wxRichTextRangeArray, WXDLLIMPEXP_RICHTEXT); +class wxRichTextRangeArray; #define wxRICHTEXT_ALL wxRichTextRange(-2, -2) #define wxRICHTEXT_NONE wxRichTextRange(-1, -1) @@ -1822,7 +1824,7 @@ WX_DECLARE_USER_EXPORTED_OBJARRAY(wxRichTextRange, wxRichTextRangeArray, WXDLLIM @see wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextSelection +class wxRichTextSelection { public: /** @@ -1978,18 +1980,17 @@ public: @see wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextDrawingContext: public wxObject +class wxRichTextDrawingContext: public wxObject { - DECLARE_CLASS(wxRichTextDrawingContext) public: /** Pass the buffer to the context so the context can retrieve information such as virtual attributes. */ - wxRichTextDrawingContext(wxRichTextBuffer* buffer) { Init(); m_buffer = buffer; } + wxRichTextDrawingContext(wxRichTextBuffer* buffer); - void Init() { m_buffer = NULL; } + void Init(); /** Does this object have virtual attributes? @@ -2010,6 +2011,44 @@ public: */ bool ApplyVirtualAttributes(wxRichTextAttr& attr, wxRichTextObject* obj) const; + /** + Gets the count for mixed virtual attributes for individual positions within the object. + For example, individual characters within a text object may require special highlighting. + */ + int GetVirtualSubobjectAttributesCount(wxRichTextObject* obj) const; + + /** + Gets the mixed virtual attributes for individual positions within the object. + For example, individual characters within a text object may require special highlighting. + The function is passed the count returned by GetVirtualSubobjectAttributesCount. + */ + int GetVirtualSubobjectAttributes(wxRichTextObject* obj, wxArrayInt& positions, + wxRichTextAttrArray& attributes) const; + + /** + Do we have virtual text for this object? Virtual text allows an application + to replace characters in an object for editing and display purposes, for example + for highlighting special characters. + */ + bool HasVirtualText(const wxRichTextPlainText* obj) const; + + /** + Gets the virtual text for this object. + */ + bool GetVirtualText(const wxRichTextPlainText* obj, wxString& text) const; + + /** + Enables virtual attribute processing. + */ + + void EnableVirtualAttributes(bool b); + + /** + Returns @true if virtual attribute processing is enabled. + */ + + bool GetVirtualAttributesEnabled() const; + wxRichTextBuffer* m_buffer; }; @@ -2024,9 +2063,8 @@ public: @see wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextObject: public wxObject +class wxRichTextObject: public wxObject { - DECLARE_CLASS(wxRichTextObject) public: /** Constructor, taking an optional parent pointer. @@ -2041,15 +2079,17 @@ public: Draw the item, within the given range. Some objects may ignore the range (for example paragraphs) while others must obey it (lines, to implement wrapping) */ - virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style) = 0; + virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, + const wxRichTextSelection& selection, const wxRect& rect, int descent, int style) = 0; /** Lay the item out at the specified position with the given size constraint. - Layout must set the cached size. @rect is the available space for the object, + Layout must set the cached size. @a rect is the available space for the object, and @a parentRect is the container that is used to determine a relative size or position (for example if a text box must be 50% of the parent text box). */ - virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style) = 0; + virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, + const wxRect& parentRect, int style) = 0; /** Hit-testing: returns a flag indicating hit test details, plus @@ -2064,78 +2104,97 @@ public: @return One of the ::wxRichTextHitTestFlags values. */ - virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0); + virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, + long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, + int flags = 0); /** Finds the absolute position and row height for the given character position. */ - virtual bool FindPosition(wxDC& WXUNUSED(dc), wxRichTextDrawingContext& WXUNUSED(context), long WXUNUSED(index), wxPoint& WXUNUSED(pt), int* WXUNUSED(height), bool WXUNUSED(forceLineStart)) { return false; } + virtual bool FindPosition(wxDC& dc, wxRichTextDrawingContext& context, long index, + wxPoint& pt, int* height, bool forceLineStart); /** - Returns the best size, i.e. the ideal starting size for this object irrespective + Returns the best size, i.e.\ the ideal starting size for this object irrespective of available space. For a short text string, it will be the size that exactly encloses the text. For a longer string, it might use the parent width for example. */ - virtual wxSize GetBestSize() const { return m_size; } + virtual wxSize GetBestSize() const; /** Returns the object size for the given range. Returns @false if the range is invalid for this object. */ - virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const = 0; + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, + wxDC& dc, wxRichTextDrawingContext& context, int flags, + const wxPoint& position = wxPoint(0,0), + const wxSize& parentSize = wxDefaultSize, + wxArrayInt* partialExtents = NULL) const = 0; /** Do a split from @a pos, returning an object containing the second part, and setting the first part in 'this'. */ - virtual wxRichTextObject* DoSplit(long WXUNUSED(pos)) { return NULL; } + virtual wxRichTextObject* DoSplit(long pos); /** Calculates the range of the object. By default, guess that the object is 1 unit long. */ - virtual void CalculateRange(long start, long& end) { end = start ; m_range.SetRange(start, end); } + virtual void CalculateRange(long start, long& end); /** Deletes the given range. */ - virtual bool DeleteRange(const wxRichTextRange& WXUNUSED(range)) { return false; } + virtual bool DeleteRange(const wxRichTextRange& range); /** Returns @true if the object is empty. */ - virtual bool IsEmpty() const { return false; } + virtual bool IsEmpty() const; /** Returns @true if this class of object is floatable. */ - virtual bool IsFloatable() const { return false; } + virtual bool IsFloatable() const; /** Returns @true if this object is currently floating. */ - virtual bool IsFloating() const { return GetAttributes().GetTextBoxAttr().IsFloating(); } + virtual bool IsFloating() const; /** Returns the floating direction. */ - virtual int GetFloatDirection() const { return GetAttributes().GetTextBoxAttr().GetFloatMode(); } + virtual int GetFloatDirection() const; /** Returns any text in this object for the given range. */ - virtual wxString GetTextForRange(const wxRichTextRange& WXUNUSED(range)) const { return wxEmptyString; } + virtual wxString GetTextForRange(const wxRichTextRange& range) const; /** Returns @true if this object can merge itself with the given one. */ - virtual bool CanMerge(wxRichTextObject* WXUNUSED(object)) const { return false; } + virtual bool CanMerge(wxRichTextObject* object, wxRichTextDrawingContext& context) const; /** Returns @true if this object merged itself with the given one. The calling code will then delete the given object. */ - virtual bool Merge(wxRichTextObject* WXUNUSED(object)) { return false; } + virtual bool Merge(wxRichTextObject* object, wxRichTextDrawingContext& context); + + /** + Returns @true if this object can potentially be split, by virtue of having + different virtual attributes for individual sub-objects. + */ + virtual bool CanSplit(wxRichTextDrawingContext& context) const; + + /** + Returns the final object in the split objects if this object was split due to differences between sub-object virtual attributes. + Returns itself if it was not split. + */ + virtual wxRichTextObject* Split(wxRichTextDrawingContext& context); /** Dump object data to the given output stream for debugging. @@ -2145,31 +2204,29 @@ public: /** Returns @true if we can edit the object's properties via a GUI. */ - virtual bool CanEditProperties() const { return false; } + virtual bool CanEditProperties() const; /** Edits the object's properties via a GUI. */ - virtual bool EditProperties(wxWindow* WXUNUSED(parent), wxRichTextBuffer* WXUNUSED(buffer)) { return false; } + virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer); /** Returns the label to be used for the properties context menu item. */ - virtual wxString GetPropertiesMenuLabel() const { return wxEmptyString; } + virtual wxString GetPropertiesMenuLabel() const; /** - Returns @true if objects of this class can accept the focus, i.e. a call to SetFocusObject + Returns @true if objects of this class can accept the focus, i.e.\ a call to SetFocusObject is possible. For example, containers supporting text, such as a text box object, can accept the focus, but a table can't (set the focus to individual cells instead). */ - virtual bool AcceptsFocus() const { return false; } + virtual bool AcceptsFocus() const; -#if wxUSE_XML /** Imports this object from XML. */ virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse); -#endif #if wxRICHTEXT_HAVE_DIRECT_OUTPUT /** @@ -2194,12 +2251,12 @@ public: /** Returns @true if this object takes note of paragraph attributes (text and image objects don't). */ - virtual bool UsesParagraphAttributes() const { return true; } + virtual bool UsesParagraphAttributes() const; /** Returns the XML node name of this object. This must be overridden for wxXmlNode-base XML export to work. */ - virtual wxString GetXMLNodeName() const { return wxT("unknown"); } + virtual wxString GetXMLNodeName() const; /** Invalidates the object at the given range. With no argument, invalidates the whole object. @@ -2210,65 +2267,65 @@ public: Returns @true if this object can handle the selections of its children, fOr example a table. Required for composite selection handling to work. */ - virtual bool HandlesChildSelections() const { return false; } + virtual bool HandlesChildSelections() const; /** Returns a selection object specifying the selections between start and end character positions. For example, a table would deduce what cells (of range length 1) are selected when dragging across the table. */ - virtual wxRichTextSelection GetSelection(long WXUNUSED(start), long WXUNUSED(end)) const { return wxRichTextSelection(); } + virtual wxRichTextSelection GetSelection(long start, long end) const; // Accessors /** Gets the cached object size as calculated by Layout. */ - virtual wxSize GetCachedSize() const { return m_size; } + virtual wxSize GetCachedSize() const; /** Sets the cached object size as calculated by Layout. */ - virtual void SetCachedSize(const wxSize& sz) { m_size = sz; } + virtual void SetCachedSize(const wxSize& sz); /** Gets the maximum object size as calculated by Layout. This allows us to fit an object to its contents or allocate extra space if required. */ - virtual wxSize GetMaxSize() const { return m_maxSize; } + virtual wxSize GetMaxSize() const; /** Sets the maximum object size as calculated by Layout. This allows us to fit an object to its contents or allocate extra space if required. */ - virtual void SetMaxSize(const wxSize& sz) { m_maxSize = sz; } + virtual void SetMaxSize(const wxSize& sz); /** Gets the minimum object size as calculated by Layout. This allows us to constrain an object to its absolute minimum size if necessary. */ - virtual wxSize GetMinSize() const { return m_minSize; } + virtual wxSize GetMinSize() const; /** Sets the minimum object size as calculated by Layout. This allows us to constrain an object to its absolute minimum size if necessary. */ - virtual void SetMinSize(const wxSize& sz) { m_minSize = sz; } + virtual void SetMinSize(const wxSize& sz); /** Gets the 'natural' size for an object. For an image, it would be the image size. */ - virtual wxTextAttrSize GetNaturalSize() const { return wxTextAttrSize(); } + virtual wxTextAttrSize GetNaturalSize() const; /** Returns the object position in pixels. */ - virtual wxPoint GetPosition() const { return m_pos; } + virtual wxPoint GetPosition() const; /** Sets the object position in pixels. */ - virtual void SetPosition(const wxPoint& pos) { m_pos = pos; } + virtual void SetPosition(const wxPoint& pos); /** Returns the absolute object position, by traversing up the child/parent hierarchy. @@ -2280,63 +2337,63 @@ public: /** Returns the rectangle enclosing the object. */ - virtual wxRect GetRect() const { return wxRect(GetPosition(), GetCachedSize()); } + virtual wxRect GetRect() const; /** Sets the object's range within its container. */ - void SetRange(const wxRichTextRange& range) { m_range = range; } + void SetRange(const wxRichTextRange& range); /** Returns the object's range. */ - const wxRichTextRange& GetRange() const { return m_range; } + const wxRichTextRange& GetRange() const; /** Returns the object's range. */ - wxRichTextRange& GetRange() { return m_range; } + wxRichTextRange& GetRange(); /** Set the object's own range, for a top-level object with its own position space. */ - void SetOwnRange(const wxRichTextRange& range) { m_ownRange = range; } + void SetOwnRange(const wxRichTextRange& range); /** Returns the object's own range (valid if top-level). */ - const wxRichTextRange& GetOwnRange() const { return m_ownRange; } + const wxRichTextRange& GetOwnRange() const; /** Returns the object's own range (valid if top-level). */ - wxRichTextRange& GetOwnRange() { return m_ownRange; } + wxRichTextRange& GetOwnRange(); /** Returns the object's own range only if a top-level object. */ - wxRichTextRange GetOwnRangeIfTopLevel() const { return IsTopLevel() ? m_ownRange : m_range; } + wxRichTextRange GetOwnRangeIfTopLevel() const; /** Returns @true if this object is composite. */ - virtual bool IsComposite() const { return false; } + virtual bool IsComposite() const; /** Returns @true if no user editing can be done inside the object. This returns @true for simple objects, @false for most composite objects, but @true for fields, which if composite, should not be user-edited. */ - virtual bool IsAtomic() const { return true; } + virtual bool IsAtomic() const; /** Returns a pointer to the parent object. */ - virtual wxRichTextObject* GetParent() const { return m_parent; } + virtual wxRichTextObject* GetParent() const; /** Sets the pointer to the parent object. */ - virtual void SetParent(wxRichTextObject* parent) { m_parent = parent; } + virtual void SetParent(wxRichTextObject* parent); /** Returns the top-level container of this object. @@ -2349,7 +2406,7 @@ public: Returns the top-level container of this object. Returns a different container than itself, unless there's no parent, in which case it will return NULL. */ - virtual wxRichTextParagraphLayoutBox* GetParentContainer() const { return GetParent() ? GetParent()->GetContainer() : GetContainer(); } + virtual wxRichTextParagraphLayoutBox* GetParentContainer() const; /** Set the margin around the object, in pixels. @@ -2402,42 +2459,42 @@ public: /** Sets the object's attributes. */ - void SetAttributes(const wxRichTextAttr& attr) { m_attributes = attr; } + void SetAttributes(const wxRichTextAttr& attr); /** Returns the object's attributes. */ - const wxRichTextAttr& GetAttributes() const { return m_attributes; } + const wxRichTextAttr& GetAttributes() const; /** Returns the object's attributes. */ - wxRichTextAttr& GetAttributes() { return m_attributes; } + wxRichTextAttr& GetAttributes(); /** Returns the object's properties. */ - wxRichTextProperties& GetProperties() { return m_properties; } + wxRichTextProperties& GetProperties(); /** Returns the object's properties. */ - const wxRichTextProperties& GetProperties() const { return m_properties; } + const wxRichTextProperties& GetProperties() const; /** Sets the object's properties. */ - void SetProperties(const wxRichTextProperties& props) { m_properties = props; } + void SetProperties(const wxRichTextProperties& props); /** Sets the stored descent value. */ - void SetDescent(int descent) { m_descent = descent; } + void SetDescent(int descent); /** Returns the stored descent value. */ - int GetDescent() const { return m_descent; } + int GetDescent() const; /** Returns the containing buffer. @@ -2447,22 +2504,22 @@ public: /** Sets the identifying name for this object as a property using the "name" key. */ - void SetName(const wxString& name) { m_properties.SetProperty(wxT("name"), name); } + void SetName(const wxString& name); /** Returns the identifying name for this object from the properties, using the "name" key. */ - wxString GetName() const { return m_properties.GetPropertyString(wxT("name")); } + wxString GetName() const; /** - Returns @true if this object is top-level, i.e. contains its own paragraphs, such as a text box. + Returns @true if this object is top-level, i.e.\ contains its own paragraphs, such as a text box. */ - virtual bool IsTopLevel() const { return false; } + virtual bool IsTopLevel() const; /** Returns @true if the object will be shown, @false otherwise. */ - bool IsShown() const { return m_show; } + bool IsShown() const; // Operations @@ -2470,12 +2527,12 @@ public: Call to show or hide this object. This function does not cause the content to be laid out or redrawn. */ - virtual void Show(bool show) { m_show = show; } + virtual void Show(bool show); /** Clones the object. */ - virtual wxRichTextObject* Clone() const { return NULL; } + virtual wxRichTextObject* Clone() const; /** Copies the object. @@ -2487,7 +2544,7 @@ public: lists (not yet used). */ - void Reference() { m_refCount ++; } + void Reference(); /** Reference-counting allows us to use the same object in multiple @@ -2524,7 +2581,7 @@ public: Draws the borders and background for the given rectangle and attributes. @a boxRect is taken to be the outer margin box, not the box around the content. */ - static bool DrawBoxAttributes(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, const wxRect& boxRect, int flags = 0); + static bool DrawBoxAttributes(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, const wxRect& boxRect, int flags = 0, wxRichTextObject* obj = NULL); /** Draws a border. @@ -2537,13 +2594,15 @@ public: Note that the outline doesn't affect the position of the rectangle, it's drawn in whatever space is available. */ - static bool GetBoxRects(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, wxRect& marginRect, wxRect& borderRect, wxRect& contentRect, wxRect& paddingRect, wxRect& outlineRect); + static bool GetBoxRects(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, + wxRect& marginRect, wxRect& borderRect, wxRect& contentRect, + wxRect& paddingRect, wxRect& outlineRect); /** Returns the total margin for the object in pixels, taking into account margin, padding and border size. */ - static bool GetTotalMargin(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, int& leftMargin, int& rightMargin, - int& topMargin, int& bottomMargin); + static bool GetTotalMargin(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, + int& leftMargin, int& rightMargin, int& topMargin, int& bottomMargin); /** Returns the rectangle which the child has available to it given restrictions specified in the @@ -2551,8 +2610,9 @@ public: availableContainerSpace might be a parent that the cell has to compute its width relative to. E.g. a cell that's 50% of its parent. */ - static wxRect AdjustAvailableSpace(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& parentAttr, const wxRichTextAttr& childAttr, - const wxRect& availableParentSpace, const wxRect& availableContainerSpace); + static wxRect AdjustAvailableSpace(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& parentAttr, + const wxRichTextAttr& childAttr, const wxRect& availableParentSpace, + const wxRect& availableContainerSpace); protected: wxSize m_size; @@ -2577,7 +2637,7 @@ protected: wxRichTextProperties m_properties; }; -WX_DECLARE_LIST_WITH_DECL( wxRichTextObject, wxRichTextObjectList, class WXDLLIMPEXP_RICHTEXT ); +class wxRichTextObjectList; /** @class wxRichTextCompositeObject @@ -2590,9 +2650,8 @@ WX_DECLARE_LIST_WITH_DECL( wxRichTextObject, wxRichTextObjectList, class WXDLLIM @see wxRichTextObject, wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextCompositeObject: public wxRichTextObject +class wxRichTextCompositeObject: public wxRichTextObject { - DECLARE_CLASS(wxRichTextCompositeObject) public: // Constructors @@ -2601,9 +2660,12 @@ public: // Overridables - virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0); + virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, + long& textPosition, wxRichTextObject** obj, + wxRichTextObject** contextObj, int flags = 0); - virtual bool FindPosition(wxDC& dc, wxRichTextDrawingContext& context, long index, wxPoint& pt, int* height, bool forceLineStart); + virtual bool FindPosition(wxDC& dc, wxRichTextDrawingContext& context, long index, + wxPoint& pt, int* height, bool forceLineStart); virtual void CalculateRange(long start, long& end); @@ -2611,7 +2673,11 @@ public: virtual wxString GetTextForRange(const wxRichTextRange& range) const; - virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const; + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, + wxDC& dc, wxRichTextDrawingContext& context, int flags, + const wxPoint& position = wxPoint(0,0), + const wxSize& parentSize = wxDefaultSize, + wxArrayInt* partialExtents = NULL) const; virtual void Dump(wxTextOutputStream& stream); @@ -2622,11 +2688,11 @@ public: /** Returns the children. */ - wxRichTextObjectList& GetChildren() { return m_children; } + wxRichTextObjectList& GetChildren(); /** Returns the children. */ - const wxRichTextObjectList& GetChildren() const { return m_children; } + const wxRichTextObjectList& GetChildren() const; /** Returns the number of children. @@ -2641,18 +2707,18 @@ public: /** Returns @true if this object is composite. */ - virtual bool IsComposite() const { return true; } + virtual bool IsComposite() const; /** Returns @true if no user editing can be done inside the object. This returns @true for simple objects, @false for most composite objects, but @true for fields, which if composite, should not be user-edited. */ - virtual bool IsAtomic() const { return false; } + virtual bool IsAtomic() const; /** Returns true if the buffer is empty. */ - virtual bool IsEmpty() const { return GetChildCount() == 0; } + virtual bool IsEmpty() const; /** Returns the child object at the given character position. @@ -2663,7 +2729,7 @@ public: void Copy(const wxRichTextCompositeObject& obj); - void operator= (const wxRichTextCompositeObject& obj) { Copy(obj); } + void operator= (const wxRichTextCompositeObject& obj); /** Appends a child, returning the position. @@ -2688,7 +2754,7 @@ public: /** Recursively merges all pieces that can be merged. */ - bool Defragment(const wxRichTextRange& range = wxRICHTEXT_ALL); + bool Defragment(wxRichTextDrawingContext& context, const wxRichTextRange& range = wxRICHTEXT_ALL); /** Moves the object recursively, by adding the offset from old to new. @@ -2710,9 +2776,8 @@ protected: @see wxRichTextCompositeObject, wxRichTextObject, wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextParagraphLayoutBox: public wxRichTextCompositeObject +class wxRichTextParagraphLayoutBox: public wxRichTextCompositeObject { - DECLARE_DYNAMIC_CLASS(wxRichTextParagraphLayoutBox) public: // Constructors @@ -2728,15 +2793,13 @@ public: virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style); - virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const; + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const; virtual bool DeleteRange(const wxRichTextRange& range); virtual wxString GetTextForRange(const wxRichTextRange& range) const; -#if wxUSE_XML virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse); -#endif #if wxRICHTEXT_HAVE_DIRECT_OUTPUT virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler); @@ -3147,6 +3210,11 @@ public: */ virtual bool SetProperties(const wxRichTextRange& range, const wxRichTextProperties& properties, int flags = wxRICHTEXT_SETPROPERTIES_WITH_UNDO); + /** + Sets with undo the properties for the given object. + */ + virtual bool SetObjectPropertiesWithUndo(wxRichTextObject& obj, const wxRichTextProperties& properties, wxRichTextObject* objToSet = NULL); + /** Test if this whole range has character attributes of the specified kind. If any of the attributes are different within the range, the test fails. You @@ -3311,9 +3379,8 @@ protected: @see wxRichTextParagraphLayoutBox, wxRichTextObject, wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextBox: public wxRichTextParagraphLayoutBox +class wxRichTextBox: public wxRichTextParagraphLayoutBox { - DECLARE_DYNAMIC_CLASS(wxRichTextBox) public: // Constructors @@ -3381,8 +3448,8 @@ protected: covers common needs especially for simple, static fields using text or a bitmap. Register field types on application initialisation with the static function - wxRichTextParagraphLayoutBox::AddFieldType. They will be deleted automatically - on application exit. + wxRichTextBuffer::AddFieldType. They will be deleted automatically on + application exit. An application can write a field to a control with wxRichTextCtrl::WriteField, taking a field type, the properties for the field, and optional attributes. @@ -3393,9 +3460,8 @@ protected: @see wxRichTextFieldTypeStandard, wxRichTextFieldType, wxRichTextParagraphLayoutBox, wxRichTextProperties, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextField: public wxRichTextParagraphLayoutBox +class wxRichTextField: public wxRichTextParagraphLayoutBox { - DECLARE_DYNAMIC_CLASS(wxRichTextField) public: // Constructors @@ -3417,7 +3483,7 @@ public: virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style); - virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const; + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const; virtual wxString GetXMLNodeName() const { return wxT("field"); } @@ -3468,8 +3534,8 @@ protected: property editing functionality for a field. Register field types on application initialisation with the static function - wxRichTextParagraphLayoutBox::AddFieldType. They will be deleted automatically - on application exit. + wxRichTextBuffer::AddFieldType. They will be deleted automatically on + application exit. @library{wxrichtext} @category{richtext} @@ -3477,9 +3543,8 @@ protected: @see wxRichTextFieldTypeStandard, wxRichTextField, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextFieldType: public wxObject +class wxRichTextFieldType: public wxObject { - DECLARE_CLASS(wxRichTextFieldType) public: /** Creates a field type definition. @@ -3503,7 +3568,7 @@ public: /** Lay the item out at the specified position with the given size constraint. - Layout must set the cached size. @rect is the available space for the object, + Layout must set the cached size. @a rect is the available space for the object, and @a parentRect is the container that is used to determine a relative size or position (for example if a text box must be 50% of the parent text box). */ @@ -3513,22 +3578,22 @@ public: Returns the object size for the given range. Returns @false if the range is invalid for this object. */ - virtual bool GetRangeSize(wxRichTextField* obj, const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const = 0; + virtual bool GetRangeSize(wxRichTextField* obj, const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const = 0; /** Returns @true if we can edit the object's properties via a GUI. */ - virtual bool CanEditProperties(wxRichTextField* WXUNUSED(obj)) const { return false; } + virtual bool CanEditProperties(wxRichTextField* obj) const { return false; } /** Edits the object's properties via a GUI. */ - virtual bool EditProperties(wxRichTextField* WXUNUSED(obj), wxWindow* WXUNUSED(parent), wxRichTextBuffer* WXUNUSED(buffer)) { return false; } + virtual bool EditProperties(wxRichTextField* obj, wxWindow* parent, wxRichTextBuffer* buffer) { return false; } /** Returns the label to be used for the properties context menu item. */ - virtual wxString GetPropertiesMenuLabel(wxRichTextField* WXUNUSED(obj)) const { return wxEmptyString; } + virtual wxString GetPropertiesMenuLabel(wxRichTextField* obj) const { return wxEmptyString; } /** Update the field. This would typically expand the field to its value, @@ -3537,9 +3602,9 @@ public: virtual bool UpdateField(wxRichTextBuffer* buffer, wxRichTextField* obj) { return false; } /** - Returns @true if this object is top-level, i.e. contains its own paragraphs, such as a text box. + Returns @true if this object is top-level, i.e.\ contains its own paragraphs, such as a text box. */ - virtual bool IsTopLevel(wxRichTextField* WXUNUSED(obj)) const { return true; } + virtual bool IsTopLevel(wxRichTextField* obj) const { return true; } /** Sets the field type name. There should be a unique name per field type object. @@ -3556,7 +3621,7 @@ protected: wxString m_name; }; -WX_DECLARE_STRING_HASH_MAP(wxRichTextFieldType*, wxRichTextFieldTypeHashMap); +class wxRichTextFieldTypeHashMap; /** @class wxRichTextFieldTypeStandard @@ -3589,9 +3654,8 @@ WX_DECLARE_STRING_HASH_MAP(wxRichTextFieldType*, wxRichTextFieldTypeHashMap); @see wxRichTextFieldType, wxRichTextField, wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextFieldTypeStandard: public wxRichTextFieldType +class wxRichTextFieldTypeStandard: public wxRichTextFieldType { - DECLARE_CLASS(wxRichTextFieldTypeStandard) public: // Display style types @@ -3605,7 +3669,7 @@ public: /** Constructor, creating a field type definition with a text label. - @param parent + @param name The name of the type definition. This must be unique, and is the type name used when adding a field to a control. @param label @@ -3621,10 +3685,10 @@ public: /** Constructor, creating a field type definition with a bitmap label. - @param parent + @param name The name of the type definition. This must be unique, and is the type name used when adding a field to a control. - @param label + @param bitmap The bitmap label to be shown on the field. @param displayStyle The display style: one of wxRICHTEXT_FIELD_STYLE_RECTANGLE, @@ -3669,7 +3733,7 @@ public: /** Lay the item out at the specified position with the given size constraint. - Layout must set the cached size. @rect is the available space for the object, + Layout must set the cached size. @a rect is the available space for the object, and @a parentRect is the container that is used to determine a relative size or position (for example if a text box must be 50% of the parent text box). */ @@ -3679,7 +3743,7 @@ public: Returns the object size for the given range. Returns @false if the range is invalid for this object. */ - virtual bool GetRangeSize(wxRichTextField* obj, const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const; + virtual bool GetRangeSize(wxRichTextField* obj, const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const; /** Get the size of the field, given the label, font size, and so on. @@ -3689,7 +3753,7 @@ public: /** Returns @true if the display type is wxRICHTEXT_FIELD_STYLE_COMPOSITE, @false otherwise. */ - virtual bool IsTopLevel(wxRichTextField* WXUNUSED(obj)) const { return (GetDisplayStyle() & wxRICHTEXT_FIELD_STYLE_COMPOSITE) != 0; } + virtual bool IsTopLevel(wxRichTextField* obj) const { return (GetDisplayStyle() & wxRICHTEXT_FIELD_STYLE_COMPOSITE) != 0; } /** Sets the text label for fields of this type. @@ -3829,7 +3893,7 @@ protected: @see wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextLine +class wxRichTextLine { public: // Constructors @@ -3950,7 +4014,7 @@ protected: #endif }; -WX_DECLARE_LIST_WITH_DECL( wxRichTextLine, wxRichTextLineList , class WXDLLIMPEXP_RICHTEXT ); +class wxRichTextLineList; /** @class wxRichTextParagraph @@ -3963,9 +4027,8 @@ WX_DECLARE_LIST_WITH_DECL( wxRichTextLine, wxRichTextLineList , class WXDLLIMPEX @see wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextParagraph: public wxRichTextCompositeObject +class wxRichTextParagraph: public wxRichTextCompositeObject { - DECLARE_DYNAMIC_CLASS(wxRichTextParagraph) public: // Constructors @@ -3986,7 +4049,7 @@ public: virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style); - virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const; + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const; virtual bool FindPosition(wxDC& dc, wxRichTextDrawingContext& context, long index, wxPoint& pt, int* height, bool forceLineStart); @@ -4111,7 +4174,7 @@ public: /** Lays out the floating objects. */ - void LayoutFloat(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, int style, wxRichTextFloatCollector* floatCollector); + void LayoutFloat(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style, wxRichTextFloatCollector* floatCollector); protected: @@ -4135,9 +4198,8 @@ friend class wxRichTextFloatCollector; @see wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextPlainText: public wxRichTextObject +class wxRichTextPlainText: public wxRichTextObject { - DECLARE_DYNAMIC_CLASS(wxRichTextPlainText) public: // Constructors @@ -4157,7 +4219,7 @@ public: virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style); - virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const; + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const; virtual wxString GetTextForRange(const wxRichTextRange& range) const; @@ -4169,9 +4231,13 @@ public: virtual bool IsEmpty() const { return m_text.empty(); } - virtual bool CanMerge(wxRichTextObject* object) const; + virtual bool CanMerge(wxRichTextObject* object, wxRichTextDrawingContext& context) const; + + virtual bool Merge(wxRichTextObject* object, wxRichTextDrawingContext& context); - virtual bool Merge(wxRichTextObject* object); + virtual bool CanSplit(wxRichTextDrawingContext& context) const; + + virtual wxRichTextObject* Split(wxRichTextDrawingContext& context); virtual void Dump(wxTextOutputStream& stream); @@ -4183,9 +4249,7 @@ public: /// Does this object take note of paragraph attributes? Text and image objects don't. virtual bool UsesParagraphAttributes() const { return false; } -#if wxUSE_XML virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse); -#endif #if wxRICHTEXT_HAVE_DIRECT_OUTPUT virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler); @@ -4235,7 +4299,7 @@ protected: @see wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextImageBlock: public wxObject +class wxRichTextImageBlock: public wxObject { public: /** @@ -4401,9 +4465,8 @@ protected: @see wxRichTextBuffer, wxRichTextCtrl, wxRichTextImageBlock */ -class WXDLLIMPEXP_RICHTEXT wxRichTextImage: public wxRichTextObject +class wxRichTextImage: public wxRichTextObject { - DECLARE_DYNAMIC_CLASS(wxRichTextImage) public: // Constructors @@ -4433,7 +4496,7 @@ public: virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style); - virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const; + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const; /** Returns the 'natural' size for this object - the image size. @@ -4450,9 +4513,7 @@ public: virtual bool UsesParagraphAttributes() const { return false; } -#if wxUSE_XML virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse); -#endif #if wxRICHTEXT_HAVE_DIRECT_OUTPUT virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler); @@ -4514,15 +4575,15 @@ public: /** Creates a cached image at the required size. */ - virtual bool LoadImageCache(wxDC& dc, bool resetCache = false); + virtual bool LoadImageCache(wxDC& dc, bool resetCache = false, const wxSize& parentSize = wxDefaultSize); protected: wxRichTextImageBlock m_imageBlock; wxBitmap m_imageCache; }; -class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextCommand; -class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextAction; +class wxRichTextCommand; +class wxRichTextAction; /** @class wxRichTextBuffer @@ -4535,9 +4596,8 @@ class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextAction; @see wxRichTextParagraphLayoutBox, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextBuffer: public wxRichTextParagraphLayoutBox +class wxRichTextBuffer: public wxRichTextParagraphLayoutBox { - DECLARE_DYNAMIC_CLASS(wxRichTextBuffer) public: // Constructors @@ -5244,6 +5304,19 @@ public: */ void SetScale(double scale) { m_scale = scale; } + /** + Returns the floating layout mode. The default is @true, where objects + are laid out according to their floating status. + */ + static bool GetFloatingLayoutMode(); + + /** + Sets the floating layout mode. Pass @false to speed up editing by not performing + floating layout. This setting affects all buffers. + + */ + static void SetFloatingLayoutMode(bool mode); + protected: /// Command processor @@ -5304,12 +5377,18 @@ protected: /** @class wxRichTextCell - wxRichTextCell is the cell in a table. + wxRichTextCell is the cell in a table, in which the user can type. As well as + text, it can also contain objects e.g. an image, or even another wxRichTextTable. + + A cell's appearance can be changed via its associated wxRichTextAttr; for example + its size altered or its background colour set. It also has the properties of + column- and row-span. By default these are 1, meaning that the cell only spans + itself, but can be increased using the SetColspan() and SetRowspan() methods. + Attempts to set too large a span are silently truncated to the table edge. */ -class WXDLLIMPEXP_RICHTEXT wxRichTextCell: public wxRichTextBox +class wxRichTextCell: public wxRichTextBox { - DECLARE_DYNAMIC_CLASS(wxRichTextCell) public: // Constructors @@ -5329,6 +5408,8 @@ public: virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style); + virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0); + virtual wxString GetXMLNodeName() const { return wxT("cell"); } virtual bool CanEditProperties() const { return true; } @@ -5339,6 +5420,52 @@ public: // Accessors + /** + Returns the number of columns spanned by the cell. + + By default a cell doesn't span extra columns, so this function returns 1. + + @since 2.9.5 + + @see SetColspan(), GetRowspan() + */ + int GetColspan() const; + + /** + Set the number of columns spanned by the cell. + + By default colspan is 1 i.e. a cell doesn't span extra columns. Pass a value >1 + to change this. Attempting to set a colspan <1 will assert and be ignored. + + @since 2.9.5 + + @see GetColspan(), SetRowspan() + */ + void SetColspan(long span); + + /** + Returns the number of rows spanned by the cell. + + By default a cell doesn't span extra rows, so this function returns 1. + + @since 2.9.5 + + @see SetRowspan(), GetColspan() + */ + int GetRowspan() const; + + /** + Set the number of rows spanned by the cell. + + By default colspan is 1 i.e. a cell doesn't span extra rows. Pass a value >1 + to change this. Attempting to set a rowspan <1 will assert and be ignored. + + @since 2.9.5 + + @see GetRowspan(), SetColspan() + */ + void SetRowspan(long span); + // Operations virtual wxRichTextObject* Clone() const { return new wxRichTextCell(*this); } @@ -5354,12 +5481,11 @@ protected: wxRichTextTable represents a table with arbitrary columns and rows. */ -WX_DEFINE_ARRAY_PTR(wxRichTextObject*, wxRichTextObjectPtrArray); -WX_DECLARE_OBJARRAY(wxRichTextObjectPtrArray, wxRichTextObjectPtrArrayArray); +class wxRichTextObjectPtrArray; +class wxRichTextObjectPtrArrayArray; -class WXDLLIMPEXP_RICHTEXT wxRichTextTable: public wxRichTextBox +class wxRichTextTable: public wxRichTextBox { - DECLARE_DYNAMIC_CLASS(wxRichTextTable) public: // Constructors @@ -5380,19 +5506,19 @@ public: virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style); + virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0); + virtual wxString GetXMLNodeName() const { return wxT("table"); } virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style); - virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const; + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const; virtual bool DeleteRange(const wxRichTextRange& range); virtual wxString GetTextForRange(const wxRichTextRange& range) const; -#if wxUSE_XML virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse); -#endif #if wxRICHTEXT_HAVE_DIRECT_OUTPUT virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler); @@ -5461,6 +5587,11 @@ public: */ virtual bool GetCellRowColumnPosition(long pos, int& row, int& col) const; + /** + Returns the coordinates of the cell with keyboard focus, or (-1,-1) if none. + */ + virtual wxPosition GetFocusedCell() const; + // Operations /** @@ -5528,6 +5659,55 @@ protected: wxRichTextObjectPtrArrayArray m_cells; }; +/** @class wxRichTextTableBlock + + Stores the coordinates for a block of cells. + */ + +class wxRichTextTableBlock +{ +public: + wxRichTextTableBlock() { Init(); } + wxRichTextTableBlock(int colStart, int colEnd, int rowStart, int rowEnd) + { Init(); m_colStart = colStart; m_colEnd = colEnd; m_rowStart = rowStart; m_rowEnd = rowEnd; } + wxRichTextTableBlock(const wxRichTextTableBlock& block) { Copy(block); } + + void Init() { m_colStart = 0; m_colEnd = 0; m_rowStart = 0; m_rowEnd = 0; } + + void Copy(const wxRichTextTableBlock& block) + { + m_colStart = block.m_colStart; m_colEnd = block.m_colEnd; m_rowStart = block.m_rowStart; m_rowEnd = block.m_rowEnd; + } + void operator=(const wxRichTextTableBlock& block) { Copy(block); } + bool operator==(const wxRichTextTableBlock& block) + { return m_colStart == block.m_colStart && m_colEnd == block.m_colEnd && m_rowStart == block.m_rowStart && m_rowEnd == block.m_rowEnd; } + + /// Computes the block given a table (perhaps about to be edited) and a rich text control + /// that may have a selection. If no selection, the whole table is used. If just the whole content + /// of one cell is selected, this cell only is used. If the cell contents is not selected and + /// requireCellSelection is @false, the focused cell will count as a selected cell. + bool ComputeBlockForSelection(wxRichTextTable* table, wxRichTextCtrl* ctrl, bool requireCellSelection = true); + + /// Does this block represent the whole table? + bool IsWholeTable(wxRichTextTable* table) const; + + /// Returns the cell focused in the table, if any + static wxRichTextCell* GetFocusedCell(wxRichTextCtrl* ctrl); + + int& ColStart() { return m_colStart; } + int ColStart() const { return m_colStart; } + + int& ColEnd() { return m_colEnd; } + int ColEnd() const { return m_colEnd; } + + int& RowStart() { return m_rowStart; } + int RowStart() const { return m_rowStart; } + + int& RowEnd() { return m_rowEnd; } + int RowEnd() const { return m_rowEnd; } + + int m_colStart, m_colEnd, m_rowStart, m_rowEnd; +}; /** The command identifiers for Do/Undo. @@ -5556,7 +5736,7 @@ enum wxRichTextCommandId @see wxRichTextCommand */ -class WXDLLIMPEXP_RICHTEXT wxRichTextObjectAddress +class wxRichTextObjectAddress { public: /** @@ -5612,7 +5792,7 @@ protected: wxArrayInt m_address; }; -class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextAction; +class wxRichTextAction; /** @class wxRichTextCommand @@ -5626,7 +5806,7 @@ class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextAction; @see wxRichTextAction */ -class WXDLLIMPEXP_RICHTEXT wxRichTextCommand: public wxCommand +class wxRichTextCommand: public wxCommand { public: /** @@ -5683,7 +5863,7 @@ protected: @see wxRichTextCommand */ -class WXDLLIMPEXP_RICHTEXT wxRichTextAction: public wxObject +class wxRichTextAction: public wxObject { public: /** @@ -5738,6 +5918,14 @@ public: */ wxRichTextObject* GetObject() const { return m_object; } + /** + Stores the object to replace the one at the position defined by the container address + without making an address for it + + @see SetObject(), MakeObject()). + */ + void StoreObject(wxRichTextObject* obj) { m_object = obj; } + /** Sets the object to replace the one at the position defined by the container address and the action's range start position. @@ -5749,6 +5937,11 @@ public: */ void MakeObject(wxRichTextObject* obj) { m_objectAddress.Create(m_buffer, obj); } + /** + Sets the existing and new objects, for use with wxRICHTEXT_CHANGE_OBJECT. + */ + void SetOldAndNewObjects(wxRichTextObject* oldObj, wxRichTextObject* newObj); + /** Calculate arrays for refresh optimization. */ @@ -5804,6 +5997,16 @@ public: */ const wxString& GetName() const { return m_name; } + /** + Instructs the first Do() command should be skipped as it's already been applied. + */ + void SetIgnoreFirstTime(bool b); + + /** + Returns true if the first Do() command should be skipped as it's already been applied. + */ + bool GetIgnoreFirstTime() const; + protected: // Action name wxString m_name; @@ -5886,9 +6089,8 @@ protected: @see wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextFileHandler: public wxObject +class wxRichTextFileHandler: public wxObject { - DECLARE_CLASS(wxRichTextFileHandler) public: /** Creates a file handler object. @@ -5897,7 +6099,6 @@ public: : m_name(name), m_extension(ext), m_type(type), m_flags(0), m_visible(true) { } -#if wxUSE_STREAMS /** Loads the buffer from a stream. Not all handlers will implement file loading. @@ -5911,9 +6112,7 @@ public: */ bool SaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream) { return DoSaveFile(buffer, stream); } -#endif -#if wxUSE_FFILE && wxUSE_STREAMS /** Loads the buffer from a file. */ @@ -5923,7 +6122,6 @@ public: Saves the buffer to a file. */ virtual bool SaveFile(wxRichTextBuffer *buffer, const wxString& filename); -#endif // wxUSE_STREAMS && wxUSE_STREAMS /** Returns @true if we handle this filename (if using files). By default, checks the extension. @@ -6010,7 +6208,6 @@ public: protected: -#if wxUSE_STREAMS /** Override to load content from @a stream into @a buffer. */ @@ -6020,7 +6217,6 @@ protected: Override to save content to @a stream from @a buffer. */ virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream) = 0; -#endif wxString m_name; wxString m_encoding; @@ -6041,12 +6237,11 @@ protected: @see wxRichTextFileHandler, wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextPlainTextHandler: public wxRichTextFileHandler +class wxRichTextPlainTextHandler: public wxRichTextFileHandler { - DECLARE_CLASS(wxRichTextPlainTextHandler) public: - wxRichTextPlainTextHandler(const wxString& name = wxT("Text"), - const wxString& ext = wxT("txt"), + wxRichTextPlainTextHandler(const wxString& name = "Text", + const wxString& ext = "txt", wxRichTextFileType type = wxRICHTEXT_TYPE_TEXT) : wxRichTextFileHandler(name, ext, type) { } @@ -6059,10 +6254,8 @@ public: protected: -#if wxUSE_STREAMS virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream); virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream); -#endif }; @@ -6078,9 +6271,8 @@ protected: @see wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextDrawingHandler: public wxObject +class wxRichTextDrawingHandler: public wxObject { - DECLARE_CLASS(wxRichTextDrawingHandler) public: /** Creates a drawing handler object. @@ -6099,6 +6291,31 @@ public: */ virtual bool GetVirtualAttributes(wxRichTextAttr& attr, wxRichTextObject* obj) const = 0; + /** + Gets the count for mixed virtual attributes for individual positions within the object. + For example, individual characters within a text object may require special highlighting. + */ + virtual int GetVirtualSubobjectAttributesCount(wxRichTextObject* obj) const = 0; + + /** + Gets the mixed virtual attributes for individual positions within the object. + For example, individual characters within a text object may require special highlighting. + Returns the number of virtual attributes found. + */ + virtual int GetVirtualSubobjectAttributes(wxRichTextObject* obj, wxArrayInt& positions, wxRichTextAttrArray& attributes) const = 0; + + /** + Do we have virtual text for this object? Virtual text allows an application + to replace characters in an object for editing and display purposes, for example + for highlighting special characters. + */ + virtual bool HasVirtualText(const wxRichTextPlainText* obj) const = 0; + + /** + Gets the virtual text for this object. + */ + virtual bool GetVirtualText(const wxRichTextPlainText* obj, wxString& text) const = 0; + /** Sets the name of the handler. */ @@ -6114,7 +6331,6 @@ protected: wxString m_name; }; -#if wxUSE_DATAOBJ /** @class wxRichTextBufferDataObject @@ -6127,7 +6343,7 @@ protected: @see wxDataObjectSimple, wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextBufferDataObject: public wxDataObjectSimple +class wxRichTextBufferDataObject: public wxDataObjectSimple { public: /** @@ -6167,7 +6383,6 @@ private: static const wxChar* ms_richTextBufferFormatId; // our format id }; -#endif /** @class wxRichTextRenderer @@ -6180,7 +6395,7 @@ private: @see wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextRenderer: public wxObject +class wxRichTextRenderer: public wxObject { public: /** @@ -6221,7 +6436,7 @@ public: @see wxRichTextRenderer, wxRichTextBuffer, wxRichTextCtrl */ -class WXDLLIMPEXP_RICHTEXT wxRichTextStdRenderer: public wxRichTextRenderer +class wxRichTextStdRenderer: public wxRichTextRenderer { public: /** @@ -6253,32 +6468,32 @@ inline bool wxRichTextHasStyle(int flags, int style) } /// Compare two attribute objects -WXDLLIMPEXP_RICHTEXT bool wxTextAttrEq(const wxRichTextAttr& attr1, const wxRichTextAttr& attr2); -WXDLLIMPEXP_RICHTEXT bool wxTextAttrEq(const wxRichTextAttr& attr1, const wxRichTextAttr& attr2); +bool wxTextAttrEq(const wxRichTextAttr& attr1, const wxRichTextAttr& attr2); +bool wxTextAttrEq(const wxRichTextAttr& attr1, const wxRichTextAttr& attr2); /// Apply one style to another -WXDLLIMPEXP_RICHTEXT bool wxRichTextApplyStyle(wxRichTextAttr& destStyle, const wxRichTextAttr& style, wxRichTextAttr* compareWith = NULL); +bool wxRichTextApplyStyle(wxRichTextAttr& destStyle, const wxRichTextAttr& style, wxRichTextAttr* compareWith = NULL); // Remove attributes -WXDLLIMPEXP_RICHTEXT bool wxRichTextRemoveStyle(wxRichTextAttr& destStyle, const wxRichTextAttr& style); +bool wxRichTextRemoveStyle(wxRichTextAttr& destStyle, const wxRichTextAttr& style); /// Combine two bitlists -WXDLLIMPEXP_RICHTEXT bool wxRichTextCombineBitlists(int& valueA, int valueB, int& flagsA, int flagsB); +bool wxRichTextCombineBitlists(int& valueA, int valueB, int& flagsA, int flagsB); /// Compare two bitlists -WXDLLIMPEXP_RICHTEXT bool wxRichTextBitlistsEqPartial(int valueA, int valueB, int flags); +bool wxRichTextBitlistsEqPartial(int valueA, int valueB, int flags); /// Split into paragraph and character styles -WXDLLIMPEXP_RICHTEXT bool wxRichTextSplitParaCharStyles(const wxRichTextAttr& style, wxRichTextAttr& parStyle, wxRichTextAttr& charStyle); +bool wxRichTextSplitParaCharStyles(const wxRichTextAttr& style, wxRichTextAttr& parStyle, wxRichTextAttr& charStyle); /// Compare tabs -WXDLLIMPEXP_RICHTEXT bool wxRichTextTabsEq(const wxArrayInt& tabs1, const wxArrayInt& tabs2); +bool wxRichTextTabsEq(const wxArrayInt& tabs1, const wxArrayInt& tabs2); /// Convert a decimal to Roman numerals -WXDLLIMPEXP_RICHTEXT wxString wxRichTextDecimalToRoman(long n); +wxString wxRichTextDecimalToRoman(long n); // Collects the attributes that are common to a range of content, building up a note of // which attributes are absent in some objects and which clash in some objects. -WXDLLIMPEXP_RICHTEXT void wxTextAttrCollectCommonAttributes(wxTextAttr& currentStyle, const wxTextAttr& attr, wxTextAttr& clashingAttr, wxTextAttr& absentAttr); +void wxTextAttrCollectCommonAttributes(wxTextAttr& currentStyle, const wxTextAttr& attr, wxTextAttr& clashingAttr, wxTextAttr& absentAttr); -WXDLLIMPEXP_RICHTEXT void wxRichTextModuleInit(); +void wxRichTextModuleInit();