/////////////////////////////////////////////////////////////////////////////
-// 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
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"
#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
*/
~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); }
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.
*/
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
wxTextAttrEx m_attributes;
};
-WX_DECLARE_EXPORTED_LIST( wxRichTextObject, wxRichTextObjectList );
+WX_DECLARE_LIST_WITH_DECL( wxRichTextObject, wxRichTextObjectList, class WXDLLIMPEXP_ADV );
/*!
* wxRichTextCompositeObject class declaration
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;
/// Copy
void Copy(const wxRichTextParagraphLayoutBox& obj);
- /// Clone
- virtual wxRichTextObject* Clone() { return new wxRichTextParagraphLayoutBox(*this); }
-
/// Calculate ranges
virtual void UpdateRanges() { long end; CalculateRange(0, end); }
/// 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;
};
/*!
void Copy(const wxRichTextFragment& obj);
/// Clone
- virtual wxRichTextObject* Clone() { return new wxRichTextFragment(*this); }
+ virtual wxRichTextObject* Clone() const { return new wxRichTextFragment(*this); }
protected:
// Constructors
wxRichTextLine(wxRichTextParagraph* parent);
- wxRichTextLine(const wxRichTextLine& obj) { Init(); Copy(obj); }
+ wxRichTextLine(const wxRichTextLine& obj) { Init( NULL); Copy(obj); }
virtual ~wxRichTextLine() {}
// Overrideables
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; }
// Operations
/// Initialisation
- void Init();
+ void Init(wxRichTextParagraph* parent);
/// Copy
void Copy(const wxRichTextLine& obj);
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
wxRichTextParagraph* m_parent;
};
-WX_DECLARE_EXPORTED_LIST( wxRichTextLine, wxRichTextLineList );
+WX_DECLARE_LIST_WITH_DECL( wxRichTextLine, wxRichTextLineList , class WXDLLIMPEXP_ADV );
/*!
* wxRichTextParagraph class declaration
/// 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;
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;
// 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.
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();
/// 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();
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);
{
public:
wxRichTextAction(wxRichTextCommand* cmd, const wxString& name, wxRichTextCommandId id, wxRichTextBuffer* buffer,
- wxRichTextCtrl* ctrl, bool ignoreFirstTime = FALSE);
+ wxRichTextCtrl* ctrl, bool ignoreFirstTime = false);
~wxRichTextAction();
{ }
#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;
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;
: 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; }
protected:
+#if wxUSE_STREAMS
+ virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream);
+ virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream);
+#endif
+
};
/*!
#endif
// _WX_RICHTEXTBUFFER_H_
-