X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5d7836c47de679f03b1b7e738c77164c11bd3689..2952b4b9e438896370163a0a7026ad446062b8e6:/include/wx/richtext/richtextbuffer.h diff --git a/include/wx/richtext/richtextbuffer.h b/include/wx/richtext/richtextbuffer.h index f0b9a90dac..e1633bc419 100644 --- a/include/wx/richtext/richtextbuffer.h +++ b/include/wx/richtext/richtextbuffer.h @@ -1,14 +1,17 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: richtextbuffer.h +// Name: wx/richtext/richtextbuffer.h // Purpose: Buffer for wxRichTextCtrl // 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_RICHTEXTBUFFER_H_ +#define _WX_RICHTEXTBUFFER_H_ + /* Data structures @@ -81,20 +84,20 @@ it can report a partial size, so that wrapping can be implemented, hit test calculations performed, etc. So GetRangeSize must be implemented for each object. - - */ -#ifndef _WX_RICHTEXTBUFFER_H_ -#define _WX_RICHTEXTBUFFER_H_ + */ /*! * Includes */ -#include "wx/list.h" +#include "wx/defs.h" #if wxUSE_RICHTEXT +#include "wx/list.h" +#include "wx/textctrl.h" +#include "wx/bitmap.h" #include "wx/image.h" #include "wx/cmdproc.h" #include "wx/txtstrm.h" @@ -134,6 +137,10 @@ class WXDLLIMPEXP_ADV wxTextAttrEx; #define wxRICHTEXT_VARIABLE_WIDTH 0x04 #define wxRICHTEXT_VARIABLE_HEIGHT 0x08 +// Only lay out the part of the buffer that lies within +// the rect passed to Layout. +#define wxRICHTEXT_LAYOUT_SPECIFIED_RECT 0x10 + /*! * Flags returned from hit-testing */ @@ -206,6 +213,7 @@ public: ~wxRichTextRange() {} void operator =(const wxRichTextRange& range) { m_start = range.m_start; m_end = range.m_end; } + bool operator ==(const wxRichTextRange& range) const { return (m_start == range.m_start && m_end == range.m_end); } wxRichTextRange operator -(const wxRichTextRange& range) const { return wxRichTextRange(m_start - range.m_start, m_end - range.m_end); } wxRichTextRange operator +(const wxRichTextRange& range) const { return wxRichTextRange(m_start + range.m_start, m_end + range.m_end); } @@ -243,6 +251,9 @@ protected: long m_end; }; +#define wxRICHTEXT_ALL wxRichTextRange(-2, -2) +#define wxRICHTEXT_NONE wxRichTextRange(-1, -1) + /*! * wxTextAttrEx is an extended version of wxTextAttr with more paragraph attributes. */ @@ -481,13 +492,13 @@ private: wxString m_paragraphStyleName; }; -#define wxTEXT_ATTR_CHARACTER (wxTEXT_ATTR_FONT) | wxTEXT_ATTR_BACKGROUND_COLOUR | wxTEXT_ATTR_TEXT_COLOUR +#define wxTEXT_ATTR_CHARACTER (wxTEXT_ATTR_FONT | wxTEXT_ATTR_BACKGROUND_COLOUR | wxTEXT_ATTR_TEXT_COLOUR) -#define wxTEXT_ATTR_PARAGRAPH wxTEXT_ATTR_ALIGNMENT|wxTEXT_ATTR_LEFT_INDENT|wxTEXT_ATTR_RIGHT_INDENT|wxTEXT_ATTR_TABS|\ +#define wxTEXT_ATTR_PARAGRAPH (wxTEXT_ATTR_ALIGNMENT|wxTEXT_ATTR_LEFT_INDENT|wxTEXT_ATTR_RIGHT_INDENT|wxTEXT_ATTR_TABS|\ wxTEXT_ATTR_PARA_SPACING_BEFORE|wxTEXT_ATTR_PARA_SPACING_AFTER|wxTEXT_ATTR_LINE_SPACING|\ - wxTEXT_ATTR_BULLET_STYLE|wxTEXT_ATTR_BULLET_NUMBER|wxTEXT_ATTR_BULLET_SYMBOL + wxTEXT_ATTR_BULLET_STYLE|wxTEXT_ATTR_BULLET_NUMBER|wxTEXT_ATTR_BULLET_SYMBOL) -#define wxTEXT_ATTR_ALL wxTEXT_ATTR_CHARACTER|wxTEXT_ATTR_PARAGRAPH +#define wxTEXT_ATTR_ALL (wxTEXT_ATTR_CHARACTER|wxTEXT_ATTR_PARAGRAPH) /*! * wxRichTextObject class declaration @@ -640,7 +651,7 @@ protected: wxTextAttrEx m_attributes; }; -WX_DECLARE_EXPORTED_LIST( wxRichTextObject, wxRichTextObjectList ); +WX_DECLARE_LIST_WITH_DECL( wxRichTextObject, wxRichTextObjectList, class WXDLLIMPEXP_ADV ); /*! * wxRichTextCompositeObject class declaration @@ -850,10 +861,10 @@ public: virtual wxRichTextObject* GetLeafObjectAtPosition(long position) const; /// Get the paragraph by number - virtual wxRichTextParagraph* GetParagraphAtLine(long paragraphNumber) const; + virtual wxRichTextParagraph* GetParagraphAtLine(long paragraphNumber) const; /// Get the paragraph for a given line - virtual wxRichTextParagraph* GetParagraphForLine(wxRichTextLine* line) const; + virtual wxRichTextParagraph* GetParagraphForLine(wxRichTextLine* line) const; /// Get the length of the paragraph virtual int GetParagraphLength(long paragraphNumber) const; @@ -909,9 +920,6 @@ public: /// Copy void Copy(const wxRichTextParagraphLayoutBox& obj); - /// Clone - virtual wxRichTextObject* Clone() { return new wxRichTextParagraphLayoutBox(*this); } - /// Calculate ranges virtual void UpdateRanges() { long end; CalculateRange(0, end); } @@ -932,9 +940,18 @@ public: /// Get basic (overall) style virtual const wxTextAttrEx& GetBasicStyle() const { return m_attributes; } + /// Invalidate the buffer. With no argument, invalidates whole buffer. + void Invalidate(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL); + + /// Get invalid range, rounding to entire paragraphs if argument is true. + wxRichTextRange GetInvalidRange(bool wholeParagraphs = false) const; + protected: wxRichTextCtrl* m_ctrl; wxTextAttrEx m_defaultAttributes; + + /// The invalidated range that will need full layout + wxRichTextRange m_invalidRange; }; /*! @@ -969,7 +986,7 @@ public: void Copy(const wxRichTextFragment& obj); /// Clone - virtual wxRichTextObject* Clone() { return new wxRichTextFragment(*this); } + virtual wxRichTextObject* Clone() const { return new wxRichTextFragment(*this); } protected: @@ -990,7 +1007,7 @@ public: // Constructors wxRichTextLine(wxRichTextParagraph* parent); - wxRichTextLine(const wxRichTextLine& obj) { Init(); Copy(obj); } + wxRichTextLine(const wxRichTextLine& obj) { Init( NULL); Copy(obj); } virtual ~wxRichTextLine() {} // Overrideables @@ -1008,6 +1025,9 @@ public: const wxRichTextRange& GetRange() const { return m_range; } wxRichTextRange& GetRange() { return m_range; } + /// Get the absolute range + wxRichTextRange GetAbsoluteRange() const; + /// Get/set the line size as calculated by Layout. virtual wxSize GetSize() const { return m_size; } virtual void SetSize(const wxSize& sz) { m_size = sz; } @@ -1029,7 +1049,7 @@ public: // Operations /// Initialisation - void Init(); + void Init(wxRichTextParagraph* parent); /// Copy void Copy(const wxRichTextLine& obj); @@ -1040,6 +1060,7 @@ public: protected: /// The range of the line (start position to end position) + /// This is relative to the parent paragraph. wxRichTextRange m_range; /// Size and position measured relative to top of paragraph @@ -1053,7 +1074,7 @@ protected: wxRichTextParagraph* m_parent; }; -WX_DECLARE_EXPORTED_LIST( wxRichTextLine, wxRichTextLineList ); +WX_DECLARE_LIST_WITH_DECL( wxRichTextLine, wxRichTextLineList , class WXDLLIMPEXP_ADV ); /*! * wxRichTextParagraph class declaration @@ -1141,6 +1162,12 @@ public: /// Get the bullet text for this paragraph. wxString GetBulletText(); + /// Allocate or reuse a line object + wxRichTextLine* AllocateLine(int pos); + + /// Clear remaining unused line objects, if any + bool ClearUnusedLines(int lineCount); + protected: /// The lines that make up the wrapped paragraph wxRichTextLineList m_cachedLines; @@ -1186,7 +1213,7 @@ public: virtual bool DeleteRange(const wxRichTextRange& range); /// Returns true if the object is empty - virtual bool IsEmpty() const { return m_text.IsEmpty(); } + virtual bool IsEmpty() const { return m_text.empty(); } /// Returns true if this object can merge itself with the given one. virtual bool CanMerge(wxRichTextObject* object) const; @@ -1240,7 +1267,7 @@ public: // to conserve space. // If it's not a JPEG we can make use of 'image', already scaled, so we don't have to // load the image a 2nd time. - virtual bool MakeImageBlock(const wxString& filename, int imageType, wxImage& image, bool convertToJPEG = TRUE); + virtual bool MakeImageBlock(const wxString& filename, int imageType, wxImage& image, bool convertToJPEG = true); // Make an image block from the wxImage in the given // format. @@ -1465,7 +1492,7 @@ public: virtual void ClearStyleStack(); /// Get the size of the style stack, for example to check correct nesting - virtual int GetStyleStackSize() const { return m_attributeStack.GetCount(); } + virtual size_t GetStyleStackSize() const { return m_attributeStack.GetCount(); } /// Begin using bold bool BeginBold(); @@ -1609,8 +1636,10 @@ public: /// Finds a handler by type static wxRichTextFileHandler *FindHandler(int imageType); - /// Gets a wildcard incorporating all visible handlers - static wxString GetExtWildcard(bool combine = false, bool save = false); + /// Gets a wildcard incorporating all visible handlers. If 'types' is present, + /// will be filled with the file type corresponding to each filter. This can be + /// used to determine the type to pass to LoadFile given a selected filter. + static wxString GetExtWildcard(bool combine = false, bool save = false, wxArrayInt* types = NULL); /// Clean up handlers static void CleanUpHandlers(); @@ -1671,7 +1700,7 @@ class WXDLLIMPEXP_ADV wxRichTextCommand: public wxCommand public: // Ctor for one action wxRichTextCommand(const wxString& name, wxRichTextCommandId id, wxRichTextBuffer* buffer, - wxRichTextCtrl* ctrl, bool ignoreFirstTime = FALSE); + wxRichTextCtrl* ctrl, bool ignoreFirstTime = false); // Ctor for multiple actions wxRichTextCommand(const wxString& name); @@ -1700,7 +1729,7 @@ class WXDLLIMPEXP_ADV wxRichTextAction: public wxObject { public: wxRichTextAction(wxRichTextCommand* cmd, const wxString& name, wxRichTextCommandId id, wxRichTextBuffer* buffer, - wxRichTextCtrl* ctrl, bool ignoreFirstTime = FALSE); + wxRichTextCtrl* ctrl, bool ignoreFirstTime = false); ~wxRichTextAction(); @@ -1771,12 +1800,14 @@ public: { } #if wxUSE_STREAMS - virtual bool LoadFile(wxRichTextBuffer *buffer, wxInputStream& stream) = 0; - virtual bool SaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream) = 0; + bool LoadFile(wxRichTextBuffer *buffer, wxInputStream& stream) + { return DoLoadFile(buffer, stream); } + bool SaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream) + { return DoSaveFile(buffer, stream); } #endif - virtual bool LoadFile(wxRichTextBuffer *buffer, const wxString& filename); - virtual bool SaveFile(wxRichTextBuffer *buffer, const wxString& filename); + bool LoadFile(wxRichTextBuffer *buffer, const wxString& filename); + bool SaveFile(wxRichTextBuffer *buffer, const wxString& filename); /// Can we handle this filename (if using files)? By default, checks the extension. virtual bool CanHandle(const wxString& filename) const; @@ -1791,18 +1822,31 @@ public: virtual bool IsVisible() const { return m_visible; } virtual void SetVisible(bool visible) { m_visible = visible; } + /// The name of the nandler void SetName(const wxString& name) { m_name = name; } wxString GetName() const { return m_name; } + /// The default extension to recognise void SetExtension(const wxString& ext) { m_extension = ext; } wxString GetExtension() const { return m_extension; } + /// The handler type void SetType(int type) { m_type = type; } int GetType() const { return m_type; } + /// Encoding to use when saving a file. If empty, a suitable encoding is chosen + void SetEncoding(const wxString& encoding) { m_encoding = encoding; } + const wxString& GetEncoding() const { return m_encoding; } + protected: +#if wxUSE_STREAMS + virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream) = 0; + virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream) = 0; +#endif + wxString m_name; + wxString m_encoding; wxString m_extension; int m_type; bool m_visible; @@ -1821,11 +1865,6 @@ public: : wxRichTextFileHandler(name, ext, type) { } -#if wxUSE_STREAMS - virtual bool LoadFile(wxRichTextBuffer *buffer, wxInputStream& stream); - virtual bool SaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream); -#endif - /// Can we save using this handler? virtual bool CanSave() const { return true; } @@ -1834,6 +1873,11 @@ public: protected: +#if wxUSE_STREAMS + virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream); + virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream); +#endif + }; /*! @@ -1865,4 +1909,3 @@ bool wxRichTextApplyStyle(wxTextAttrEx& destStyle, const wxRichTextAttr& style); #endif // _WX_RICHTEXTBUFFER_H_ -