From 3f492c34a1e8a3919e17f99545daf5f487c75ade Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Sat, 2 Jun 2007 23:53:22 +0000 Subject: [PATCH] Richtext updates git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@46289 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- wxPython/demo/RichTextCtrl.py | 80 +- wxPython/setup.py | 7 +- wxPython/src/_richtextbuffer.i | 1968 ++++++++++++++++++++++++++++++++ wxPython/src/_richtextctrl.i | 1237 ++++++++++++++++++++ wxPython/src/_richtexthtml.i | 102 ++ wxPython/src/_richtextxml.i | 67 ++ wxPython/src/richtext.i | 1514 +----------------------- 7 files changed, 3457 insertions(+), 1518 deletions(-) create mode 100644 wxPython/src/_richtextbuffer.i create mode 100644 wxPython/src/_richtextctrl.i create mode 100644 wxPython/src/_richtexthtml.i create mode 100644 wxPython/src/_richtextxml.i diff --git a/wxPython/demo/RichTextCtrl.py b/wxPython/demo/RichTextCtrl.py index 5cf36b7f4d..a913bea699 100644 --- a/wxPython/demo/RichTextCtrl.py +++ b/wxPython/demo/RichTextCtrl.py @@ -176,15 +176,17 @@ class RichTextFrame(wx.Frame): def OnFileOpen(self, evt): - # TODO: Use RichTextBuffer.GetExtWildcard to get the wildcard string + # This gives us a string suitable for the file dialog based on + # the file handlers that are loaded + wildcard, types = rt.RichTextBuffer.GetExtWildcard(save=False) dlg = wx.FileDialog(self, "Choose a filename", - wildcard="All files (*.*)|*.*", + wildcard=wildcard, style=wx.OPEN) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() if path: - # TODO: use the filter index to determine what file type to use - self.rtc.LoadFile(path, rt.RICHTEXT_TYPE_TEXT) + fileType = types[dlg.GetFilterIndex()] + self.rtc.LoadFile(path, fileType) dlg.Destroy() @@ -193,20 +195,53 @@ class RichTextFrame(wx.Frame): self.OnFileSaveAs(evt) return self.rtc.SaveFile() + def OnFileSaveAs(self, evt): - # TODO: Use RichTextBuffer.GetExtWildcard to get the wildcard string + wildcard, types = rt.RichTextBuffer.GetExtWildcard(save=True) + dlg = wx.FileDialog(self, "Choose a filename", - wildcard="All files (*.*)|*.*", + wildcard=wildcard, style=wx.SAVE) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() if path: - self.rtc.SaveFile(path) + fileType = types[dlg.GetFilterIndex()] + ext = rt.RichTextBuffer.FindHandlerByType(fileType).GetExtension() + if not path.endswith(ext): + path += '.' + ext + self.rtc.SaveFile(path, fileType) dlg.Destroy() - def OnFileViewHTML(self, evt): pass + def OnFileViewHTML(self, evt): + # Get an instance of the html file handler, use it to save the + # document to a StringIO stream, and then display the + # resulting html text in a dialog with a HtmlWindow. + handler = rt.RichTextHTMLHandler() + handler.SetFlags(rt.RICHTEXT_HANDLER_SAVE_IMAGES_TO_MEMORY) + handler.SetFontSizeMapping([7,9,11,12,14,22,100]) + + import cStringIO + stream = cStringIO.StringIO() + if not handler.SaveStream(self.rtc.GetBuffer(), stream): + return + + import wx.html + dlg = wx.Dialog(self, title="HTML", style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER) + html = wx.html.HtmlWindow(dlg, size=(500,400), style=wx.BORDER_SUNKEN) + html.SetPage(stream.getvalue()) + btn = wx.Button(dlg, wx.ID_CANCEL) + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(html, 1, wx.ALL|wx.EXPAND, 5) + sizer.Add(btn, 0, wx.ALL|wx.CENTER, 10) + dlg.SetSizer(sizer) + sizer.Fit(dlg) + + dlg.ShowModal() + + handler.DeleteTemporaryImages() + def OnFileExit(self, evt): @@ -533,6 +568,7 @@ class RichTextFrame(wx.Frame): #---------------------------------------------------------------------- + class TestPanel(wx.Panel): def __init__(self, parent, log): self.log = log @@ -541,6 +577,30 @@ class TestPanel(wx.Panel): b = wx.Button(self, -1, "Show the RichTextCtrl sample", (50,50)) self.Bind(wx.EVT_BUTTON, self.OnButton, b) + self.AddRTCHandlers() + + + def AddRTCHandlers(self): + # make sure we haven't already added them. + if rt.RichTextBuffer.FindHandlerByType(rt.RICHTEXT_TYPE_HTML) is not None: + return + + # This would normally go in your app's OnInit method. I'm + # not sure why these file handlers are not loaded by + # default by the C++ richtext code, I guess it's so you + # can change the name or extension if you wanted... + rt.RichTextBuffer.AddHandler(rt.RichTextHTMLHandler()) + rt.RichTextBuffer.AddHandler(rt.RichTextXMLHandler()) + + # ...like this + rt.RichTextBuffer.AddHandler(rt.RichTextXMLHandler(name="Other XML", + ext="ox", + type=99)) + + # This is needed for the view as HTML option since we tell it + # to store the images in the memory file system. + wx.FileSystem.AddHandler(wx.MemoryFSHandler()) + def OnButton(self, evt): win = RichTextFrame(self, -1, "wx.richtext.RichTextCtrl", @@ -548,10 +608,12 @@ class TestPanel(wx.Panel): style = wx.DEFAULT_FRAME_STYLE) win.Show(True) - # give easy access to PyShell if it's running + # give easy access to the demo's PyShell if it's running self.rtfrm = win self.rtc = win.rtc + + #---------------------------------------------------------------------- def runTest(frame, nb, log): diff --git a/wxPython/setup.py b/wxPython/setup.py index 731c1cbfb7..5d85aceadd 100755 --- a/wxPython/setup.py +++ b/wxPython/setup.py @@ -482,7 +482,12 @@ wxpExtensions.append(ext) swig_sources = run_swig(['richtext.i'], 'src', GENDIR, PKGDIR, - USE_SWIG, swig_force, swig_args, swig_deps) + USE_SWIG, swig_force, swig_args, + swig_deps + [ 'src/_richtextbuffer.i', + 'src/_richtextctrl.i', + 'src/_richtexthtml.i', + 'src/_richtextxml.i', + ]) if not MONOLITHIC and findLib('richtext', libdirs): richLib = makeLibName('richtext') else: diff --git a/wxPython/src/_richtextbuffer.i b/wxPython/src/_richtextbuffer.i new file mode 100644 index 0000000000..b5f69bca1f --- /dev/null +++ b/wxPython/src/_richtextbuffer.i @@ -0,0 +1,1968 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: _richtextbuffer.i +// Purpose: wxRichTextAttr +// +// Author: Robin Dunn +// +// Created: 11-April-2006 +// RCS-ID: $Id$ +// Copyright: (c) 2006 by Total Control Software +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + +// Not a %module + + +//--------------------------------------------------------------------------- + +%{ +#include +#include "wx/wxPython/pyistream.h" +%} + +//--------------------------------------------------------------------------- +%newgroup + +enum { +/*! + * File types + */ + wxRICHTEXT_TYPE_ANY, + wxRICHTEXT_TYPE_TEXT, + wxRICHTEXT_TYPE_XML, + wxRICHTEXT_TYPE_HTML, + wxRICHTEXT_TYPE_RTF, + wxRICHTEXT_TYPE_PDF, + +/*! + * Flags determining the available space, passed to Layout + */ + wxRICHTEXT_FIXED_WIDTH, + wxRICHTEXT_FIXED_HEIGHT, + wxRICHTEXT_VARIABLE_WIDTH, + wxRICHTEXT_VARIABLE_HEIGHT, + + + wxRICHTEXT_LAYOUT_SPECIFIED_RECT, + wxRICHTEXT_DRAW_IGNORE_CACHE, + + +/*! + * Flags returned from hit-testing + */ + wxRICHTEXT_HITTEST_NONE, + wxRICHTEXT_HITTEST_BEFORE, + wxRICHTEXT_HITTEST_AFTER, + wxRICHTEXT_HITTEST_ON, + wxRICHTEXT_HITTEST_OUTSIDE, + +/*! + * Flags for GetRangeSize + */ + wxRICHTEXT_FORMATTED, + wxRICHTEXT_UNFORMATTED, + +/*! + * Flags for SetStyle/SetListStyle + */ + wxRICHTEXT_SETSTYLE_NONE, + wxRICHTEXT_SETSTYLE_WITH_UNDO, + wxRICHTEXT_SETSTYLE_OPTIMIZE, + wxRICHTEXT_SETSTYLE_PARAGRAPHS_ONLY, + wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY, + wxRICHTEXT_SETSTYLE_RENUMBER, + wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL, + wxRICHTEXT_SETSTYLE_RESET, + wxRICHTEXT_SETSTYLE_REMOVE, + +/*! + * Flags for text insertion + */ + wxRICHTEXT_INSERT_NONE, + wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE, + + + // TODO: Rename these to be wxRICHTEXT_* ?? + + wxTEXT_ATTR_TEXT_COLOUR, + wxTEXT_ATTR_BACKGROUND_COLOUR, + wxTEXT_ATTR_FONT_FACE, + wxTEXT_ATTR_FONT_SIZE, + wxTEXT_ATTR_FONT_WEIGHT, + wxTEXT_ATTR_FONT_ITALIC, + wxTEXT_ATTR_FONT_UNDERLINE, + wxTEXT_ATTR_FONT, + wxTEXT_ATTR_ALIGNMENT, + wxTEXT_ATTR_LEFT_INDENT, + wxTEXT_ATTR_RIGHT_INDENT, + wxTEXT_ATTR_TABS, + + wxTEXT_ATTR_PARA_SPACING_AFTER, + wxTEXT_ATTR_PARA_SPACING_BEFORE, + wxTEXT_ATTR_LINE_SPACING, + wxTEXT_ATTR_CHARACTER_STYLE_NAME, + wxTEXT_ATTR_PARAGRAPH_STYLE_NAME, + wxTEXT_ATTR_BULLET_STYLE, + wxTEXT_ATTR_BULLET_NUMBER, + wxTEXT_ATTR_BULLET_TEXT, + wxTEXT_ATTR_BULLET_NAME, + wxTEXT_ATTR_URL, + wxTEXT_ATTR_PAGE_BREAK, + wxTEXT_ATTR_EFFECTS, + wxTEXT_ATTR_OUTLINE_LEVEL, + +/*! + * Styles for wxTextAttrEx::SetBulletStyle + */ + wxTEXT_ATTR_BULLET_STYLE_NONE, + wxTEXT_ATTR_BULLET_STYLE_ARABIC, + wxTEXT_ATTR_BULLET_STYLE_LETTERS_UPPER, + wxTEXT_ATTR_BULLET_STYLE_LETTERS_LOWER, + wxTEXT_ATTR_BULLET_STYLE_ROMAN_UPPER, + wxTEXT_ATTR_BULLET_STYLE_ROMAN_LOWER, + wxTEXT_ATTR_BULLET_STYLE_SYMBOL, + wxTEXT_ATTR_BULLET_STYLE_BITMAP, + wxTEXT_ATTR_BULLET_STYLE_PARENTHESES, + wxTEXT_ATTR_BULLET_STYLE_PERIOD, + wxTEXT_ATTR_BULLET_STYLE_STANDARD, + wxTEXT_ATTR_BULLET_STYLE_RIGHT_PARENTHESIS, + wxTEXT_ATTR_BULLET_STYLE_OUTLINE, + + wxTEXT_ATTR_BULLET_STYLE_ALIGN_LEFT, + wxTEXT_ATTR_BULLET_STYLE_ALIGN_RIGHT, + wxTEXT_ATTR_BULLET_STYLE_ALIGN_CENTRE, + +/*! + * Styles for wxTextAttrEx::SetTextEffects + */ + wxTEXT_ATTR_EFFECT_NONE, + wxTEXT_ATTR_EFFECT_CAPITALS, + wxTEXT_ATTR_EFFECT_SMALL_CAPITALS, + wxTEXT_ATTR_EFFECT_STRIKETHROUGH, + wxTEXT_ATTR_EFFECT_DOUBLE_STRIKETHROUGH, + wxTEXT_ATTR_EFFECT_SHADOW, + wxTEXT_ATTR_EFFECT_EMBOSS, + wxTEXT_ATTR_EFFECT_OUTLINE, + wxTEXT_ATTR_EFFECT_ENGRAVE, + wxTEXT_ATTR_EFFECT_SUPERSCRIPT, + wxTEXT_ATTR_EFFECT_SUBSCRIPT, + +/*! + * Line spacing values + */ + wxTEXT_ATTR_LINE_SPACING_NORMAL, + wxTEXT_ATTR_LINE_SPACING_HALF, + wxTEXT_ATTR_LINE_SPACING_TWICE, + +/*! + * Character and paragraph combined styles + */ + wxTEXT_ATTR_CHARACTER, + wxTEXT_ATTR_PARAGRAPH, + wxTEXT_ATTR_ALL, + + }; + + +//--------------------------------------------------------------------------- +%newgroup + + + +%typemap(in) wxRichTextRange& (wxRichTextRange temp) { + $1 = &temp; + if ( ! wxRichTextRange_helper($input, &$1)) SWIG_fail; +} +%typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) wxRichTextRange& { + $1 = wxPySimple_typecheck($input, wxT("wxRichTextRange"), 2); +} + + +%{ +bool wxRichTextRange_helper(PyObject* source, wxRichTextRange** obj) +{ + if (source == Py_None) { + **obj = wxRICHTEXT_NONE; + return true; + } + return wxPyTwoIntItem_helper(source, obj, wxT("wxRichTextRange")); +} +%} + + + +DocStr(wxRichTextRange, +"RichTextRange is a data structure that represents a range of text +within a `RichTextCtrl`. It simply contains integer ``start`` and +``end`` properties and a few operations useful for dealing with +ranges. In most places in wxPython where a RichTextRange is expected a +2-tuple containing (start, end) can be used instead.", ""); + +// Turn off the generation of code that aquires the Global Interpreter Lock +%threadWrapperOff + +class wxRichTextRange +{ +public: + DocCtorStr( + wxRichTextRange(long start=0, long end=0), + "Creates a new range object.", ""); + + ~wxRichTextRange(); + + %extend { + DocStr(__eq__, "Test for equality of RichTextRange objects.", ""); + bool __eq__(PyObject* other) { + wxRichTextRange temp, *obj = &temp; + if ( other == Py_None ) return false; + if ( ! wxRichTextRange_helper(other, &obj) ) { + PyErr_Clear(); + return false; + } + return self->operator==(*obj); + } + } + + + DocDeclStr( + wxRichTextRange , operator -(const wxRichTextRange& range) const, + "", ""); + + DocDeclStr( + wxRichTextRange , operator +(const wxRichTextRange& range) const, + "", ""); + + + DocDeclStr( + void , SetRange(long start, long end), + "", ""); + + + DocDeclStr( + void , SetStart(long start), + "", ""); + DocDeclStr( + long , GetStart() const, + "", ""); + %pythoncode { start = property(GetStart, SetStart) } + + + DocDeclStr( + void , SetEnd(long end), + "", ""); + DocDeclStr( + long , GetEnd() const, + "", ""); + %pythoncode { end = property(GetEnd, SetEnd) } + + + DocDeclStr( + bool , IsOutside(const wxRichTextRange& range) const, + "Returns true if this range is completely outside 'range'", ""); + + + DocDeclStr( + bool , IsWithin(const wxRichTextRange& range) const, + "Returns true if this range is completely within 'range'", ""); + + + DocDeclStr( + bool , Contains(long pos) const, + "Returns true if the given position is within this range. Allow for the +possibility of an empty range - assume the position is within this +empty range.", ""); + + + DocDeclStr( + bool , LimitTo(const wxRichTextRange& range) , + "Limit this range to be within 'range'", ""); + + + DocDeclStr( + long , GetLength() const, + "Gets the length of the range", ""); + + + DocDeclStr( + void , Swap(), + "Swaps the start and end", ""); + + + DocDeclStr( + wxRichTextRange , ToInternal() const, + "Convert to internal form: (n, n) is the range of a single character.", ""); + + + DocDeclStr( + wxRichTextRange , FromInternal() const, + "Convert from internal to public API form: (n, n+1) is the range of a +single character.", ""); + + + %extend { + DocAStr(Get, + "Get() -> (start,end)", + "Returns the start and end properties as a tuple.", ""); + PyObject* Get() { + PyObject* tup = PyTuple_New(2); + PyTuple_SET_ITEM(tup, 0, PyInt_FromLong(self->GetStart())); + PyTuple_SET_ITEM(tup, 1, PyInt_FromLong(self->GetEnd())); + return tup; + } + } + %pythoncode { + def __str__(self): return str(self.Get()) + def __repr__(self): return 'RichTextRange'+str(self.Get()) + def __len__(self): return len(self.Get()) + def __getitem__(self, index): return self.Get()[index] + def __setitem__(self, index, val): + if index == 0: self.start = val + elif index == 1: self.end = val + else: raise IndexError + def __nonzero__(self): return self.Get() != (0,0) + __safe_for_unpickling__ = True + def __reduce__(self): return (RichTextRange, self.Get()) + } + + %property(End, GetEnd, SetEnd, doc="See `GetEnd` and `SetEnd`"); + %property(Length, GetLength, doc="See `GetLength`"); + %property(Start, GetStart, SetStart, doc="See `GetStart` and `SetStart`"); +}; + + + +%{ + wxRichTextRange wxPy_RTR_ALL(wxRICHTEXT_ALL); + wxRichTextRange wxPy_RTR_NONE(wxRICHTEXT_NONE); +%} + +%rename(RICHTEXT_ALL) wxPy_RTR_ALL; +%rename(RICHTEXT_NONE) wxPy_RTR_NONE; + +%immutable; +wxRichTextRange wxPy_RTR_ALL; +wxRichTextRange wxPy_RTR_NONE; +%mutable; + +// Turn back on the generation of code that aquires the Global Interpreter Lock +%threadWrapperOn + + + + +//--------------------------------------------------------------------------- +%newgroup + + +DocStr(wxRichTextAttr, +"The RichTextAttr class stores information about the various attributes +for a block of text, including font, colour, indents, alignments, and +etc.", ""); + +class wxRichTextAttr +{ +public: + + wxRichTextAttr(const wxColour& colText = wxNullColour, + const wxColour& colBack = wxNullColour, + wxTextAttrAlignment alignment = wxTEXT_ALIGNMENT_DEFAULT); + + ~wxRichTextAttr(); + +// // Making a wxTextAttrEx object. +// operator wxTextAttrEx () const ; + +// // Copy to a wxTextAttr +// void CopyTo(wxTextAttrEx& attr) const; + + + DocDeclStr( + void , Init(), + "Initialise this object.", ""); + + + DocDeclStr( + void , Copy(const wxRichTextAttr& attr), + "Copy from attr to self.", ""); + + + // Equality test + bool operator== (const wxRichTextAttr& attr) const; + + + + DocDeclStr( + wxFont , CreateFont() const, + "Create font from the font attributes in this attr object.", ""); + + + DocDeclStr( + bool , GetFontAttributes(const wxFont& font), + "Set our font attributes from the font.", ""); + + + %pythoncode { + def GetFont(self): + return self.CreateFont() + def SetFont(self, font): + return self.GetFontAttributes(font) + } + + // setters + void SetTextColour(const wxColour& colText); + void SetBackgroundColour(const wxColour& colBack); + void SetAlignment(wxTextAttrAlignment alignment); + void SetTabs(const wxArrayInt& tabs); + void SetLeftIndent(int indent, int subIndent = 0); + void SetRightIndent(int indent); + + void SetFontSize(int pointSize); + void SetFontStyle(int fontStyle); + void SetFontWeight(int fontWeight); + void SetFontFaceName(const wxString& faceName); + void SetFontUnderlined(bool underlined); + + void SetFlags(long flags); + + void SetCharacterStyleName(const wxString& name); + void SetParagraphStyleName(const wxString& name); + void SetListStyleName(const wxString& name); + void SetParagraphSpacingAfter(int spacing); + void SetParagraphSpacingBefore(int spacing); + void SetLineSpacing(int spacing); + void SetBulletStyle(int style); + void SetBulletNumber(int n); + void SetBulletText(wxChar symbol); + void SetBulletFont(const wxString& bulletFont); + void SetBulletName(const wxString& name); + void SetURL(const wxString& url); + void SetPageBreak(bool pageBreak = true); + void SetTextEffects(int effects); + void SetTextEffectFlags(int effects); + void SetOutlineLevel(int level); + + const wxColour& GetTextColour() const; + const wxColour& GetBackgroundColour() const; + wxTextAttrAlignment GetAlignment() const; + const wxArrayInt& GetTabs() const; + long GetLeftIndent() const; + long GetLeftSubIndent() const; + long GetRightIndent() const; + long GetFlags() const; + + int GetFontSize() const; + int GetFontStyle() const; + int GetFontWeight() const; + bool GetFontUnderlined() const; + const wxString& GetFontFaceName() const; + + const wxString& GetCharacterStyleName() const; + const wxString& GetParagraphStyleName() const; + const wxString& GetListStyleName() const; + int GetParagraphSpacingAfter() const; + int GetParagraphSpacingBefore() const; + int GetLineSpacing() const; + int GetBulletStyle() const; + int GetBulletNumber() const; + const wxString& GetBulletText() const; + const wxString& GetBulletFont() const; + const wxString& GetBulletName() const; + const wxString& GetURL() const; + int GetTextEffects() const; + int GetTextEffectFlags() const; + int GetOutlineLevel() const; + + // accessors + bool HasTextColour() const; + bool HasBackgroundColour() const; + bool HasAlignment() const; + bool HasTabs() const; + bool HasLeftIndent() const; + bool HasRightIndent() const; + bool HasFontWeight() const; + bool HasFontSize() const; + bool HasFontItalic() const; + bool HasFontUnderlined() const; + bool HasFontFaceName() const; + bool HasFont() const; + + bool HasParagraphSpacingAfter() const; + bool HasParagraphSpacingBefore() const; + bool HasLineSpacing() const; + bool HasCharacterStyleName() const; + bool HasParagraphStyleName() const; + bool HasListStyleName() const; + bool HasBulletStyle() const; + bool HasBulletNumber() const; + bool HasBulletText() const; + bool HasBulletName() const; + bool HasURL() const; + bool HasPageBreak() const; + bool HasTextEffects() const; + bool HasTextEffect(int effect) const; + bool HasOutlineLevel() const; + + bool HasFlag(long flag) const; + + bool IsCharacterStyle() const; + bool IsParagraphStyle() const; + + + DocDeclStr( + bool , IsDefault() const, + "Returns false if we have any attributes set, true otherwise", ""); + + + DocDeclStr( + bool , Apply(const wxRichTextAttr& style, const wxRichTextAttr* compareWith = NULL), + "Merges the given attributes. Does not affect self. If compareWith is +not None, then it will be used to mask out those attributes that are +the same in style and compareWith, for situations where we don't want +to explicitly set inherited attributes. +", ""); + + + DocDeclStr( + wxRichTextAttr , Combine(const wxRichTextAttr& style, const wxRichTextAttr* compareWith = NULL) const, + "Merges the given attributes and returns the result. Does not affect +self. If compareWith is not None, then it will be used to mask out +those attributes that are the same in style and compareWith, for +situations where we don't want to explicitly set inherited attributes. +", ""); + + + + %property(Alignment, GetAlignment, SetAlignment); + %property(BackgroundColour, GetBackgroundColour, SetBackgroundColour); + %property(BulletFont, GetBulletFont, SetBulletFont); + %property(BulletNumber, GetBulletNumber, SetBulletNumber); + %property(BulletStyle, GetBulletStyle, SetBulletStyle); + %property(BulletText, GetBulletText, SetBulletText); + %property(CharacterStyleName, GetCharacterStyleName, SetCharacterStyleName); + %property(Flags, GetFlags, SetFlags); + %property(Font, GetFont, SetFont); + %property(FontAttributes, GetFontAttributes); + %property(FontFaceName, GetFontFaceName, SetFontFaceName); + %property(FontSize, GetFontSize, SetFontSize); + %property(FontStyle, GetFontStyle, SetFontStyle); + %property(FontUnderlined, GetFontUnderlined, SetFontUnderlined); + %property(FontWeight, GetFontWeight, SetFontWeight); + %property(LeftIndent, GetLeftIndent, SetLeftIndent); + %property(LeftSubIndent, GetLeftSubIndent); + %property(LineSpacing, GetLineSpacing, SetLineSpacing); + %property(ParagraphSpacingAfter, GetParagraphSpacingAfter, SetParagraphSpacingAfter); + %property(ParagraphSpacingBefore, GetParagraphSpacingBefore, SetParagraphSpacingBefore); + %property(ParagraphStyleName, GetParagraphStyleName, SetParagraphStyleName); + %property(RightIndent, GetRightIndent, SetRightIndent); + %property(Tabs, GetTabs, SetTabs); + %property(TextColour, GetTextColour, SetTextColour); + + %property(ListStyleName, GetListStyleName, SetListStyleName); + %property(BulletName, GetBulletName, SetBulletName); + %property(URL, GetURL, SetURL); + %property(TextEffects, GetTextEffects, SetTextEffects); + %property(TextEffectFlags, GetTextEffectFlags, SetTextEffectFlags); + %property(OutlineLevel, GetOutlineLevel, SetOutlineLevel); +}; + + + +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + + +// TODO TODO TODO +// There's still lots to do for these classes... +// +// 1. Decide how to coalesce overloaded methods and ctors +// 2. correctly set disown flags and re-ownership as needed +// 3. Implement PyRichTextObject +// 4. Decide how to typemap and tweak the virtuals that pass back +// values in their parameters (yuck! damn C++) +// 5. better handling of streams +// 6. list-like wrapper for C++ wxLists +// 7. wrappers for wxTextAttrEx --> wxRichTextAttr (as needed) +// 8. Add more properties + + + +DocStr(wxRichTextObject, +"This is the base class for all drawable objects in a `RichTextCtrl`. + +The data displayed in a `RichTextCtrl` is handled by `RichTextBuffer`, +and a `RichTextCtrl` always has one such buffer. + +The content is represented by a hierarchy of objects, all derived from +`RichTextObject`. An object might be an image, a fragment of text, a +paragraph, or a whole buffer. Objects store a an attribute object +containing style information; a paragraph object can contain both +paragraph and character information, but content objects such as text +can only store character information. The final style displayed in the +control or in a printout is a combination of base style, paragraph +style and content (character) style. + +The top of the hierarchy is the buffer, a kind of +`RichTextParagraphLayoutBox`. containing further `RichTextParagraph` +objects, each of which can include text, images and potentially other +types of objects. + +Each object maintains a range (start and end position) measured from +the start of the main parent object. + +When Layout is called on an object, it is given a size which the +object must limit itself to, or one or more flexible directions +(vertical or horizontal). So, for example, a centred paragraph is +given the page width to play with (minus any margins), but can extend +indefinitely in the vertical direction. The implementation of Layout +caches the calculated size and position. + +When the buffer is modified, a range is invalidated (marked as +requiring layout), so that only the minimum amount of layout is +performed. + +A paragraph of pure text with the same style contains just one further +object, a `RichTextPlainText` object. When styling is applied to part +of this object, the object is decomposed into separate objects, one +object for each different character style. So each object within a +paragraph always has just one attribute object to denote its character +style. Of course, this can lead to fragmentation after a lot of edit +operations, potentially leading to several objects with the same style +where just one would do. So a Defragment function is called when +updating the control's display, to ensure that the minimum number of +objects is used. + +To implement your own RichTextObjects in Python you must derive a +class from `PyRichTextObject`, which has been instrumented to forward +the virtual C++ method calls to the Python methods in the derived +class. (This class hasn't been implemented yet!)", ""); + +// argout typemap for wxPoint +%typemap(in, numinputs=0, noblock=1) wxPoint& OUTPUT (wxPoint temp) { + $1 = &temp; +} +%typemap(argout, noblock=1) wxPoint& OUTPUT { + %append_output(SWIG_NewPointerObj((void*)new wxPoint(*$1), $1_descriptor, SWIG_POINTER_OWN)); +} + +// argout typemap for wxSize +%typemap(in, numinputs=0, noblock=1) wxSize& OUTPUT (wxSize temp) { + $1 = &temp; +} +%typemap(argout, noblock=1) wxSize& OUTPUT { + %append_output(SWIG_NewPointerObj((void*)new wxSize(*$1), $1_descriptor, SWIG_POINTER_OWN)); +} + + +class wxRichTextObject: public wxObject +{ +public: + // wxRichTextObject(wxRichTextObject* parent = NULL); // **** This is an ABC + virtual ~wxRichTextObject(); + + +// Overrideables + + /// 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, const wxRichTextRange& range, + const wxRichTextRange& selectionRange, const wxRect& rect, + int descent, int style); + + /// Lay the item out at the specified position with the given size constraint. + /// Layout must set the cached size. + virtual bool Layout(wxDC& dc, const wxRect& rect, int style); + + /// Hit-testing: returns a flag indicating hit test details, plus + /// information about position + virtual int HitTest(wxDC& dc, const wxPoint& pt, long& OUTPUT /*textPosition*/); + + /// Finds the absolute position and row height for the given character position + virtual bool FindPosition(wxDC& dc, long index, wxPoint& OUTPUT /*pt*/, + int* OUTPUT /*height*/, bool forceLineStart); + + + /// Get 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; + + /// Get the object size for the given range. Returns false if the range + /// is invalid for this object. + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& OUTPUT /*size*/, + int& OUTPUT /*descent*/, wxDC& dc, int flags, + wxPoint position = wxPoint(0,0)) const; + + /// Do a split, returning an object containing the second part, and setting + /// the first part in 'this'. + virtual wxRichTextObject* DoSplit(long pos); + + /// Calculate range. By default, guess that the object is 1 unit long. + virtual void CalculateRange(long start, long& OUTPUT /*end*/); + + /// Delete range + virtual bool DeleteRange(const wxRichTextRange& range); + + /// Returns true if the object is empty + virtual bool IsEmpty() const; + + /// Get any text in this object for the given range + virtual wxString GetTextForRange(const wxRichTextRange& range) const; + + /// Returns true if this object can merge itself with the given one. + virtual bool CanMerge(wxRichTextObject* object) 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* object); + + /// Dump to output stream for debugging + //virtual void Dump(wxTextOutputStream& stream); + %extend { + wxString Dump() { + wxStringOutputStream strstream; + wxTextOutputStream txtstream(strstream); + self->Dump(txtstream); + return strstream.GetString(); + } + } + +// Accessors + + /// Get/set the cached object size as calculated by Layout. + virtual wxSize GetCachedSize() const; + virtual void SetCachedSize(const wxSize& sz); + %property(CachedSize, GetCachedSize, SetCachedSize); + + /// Get/set the object position + virtual wxPoint GetPosition() const; + virtual void SetPosition(const wxPoint& pos); + %property(Position, GetPosition, SetPosition); + + /// Get the rectangle enclosing the object + virtual wxRect GetRect() const; + %property(Rect, GetRect); + + + /// Set the range + void SetRange(const wxRichTextRange& range); + /// Get the range + wxRichTextRange GetRange(); + %property(Range, GetRange, SetRange); + + + /// Get/set dirty flag (whether the object needs Layout to be called) + virtual bool GetDirty() const; + virtual void SetDirty(bool dirty); + %property(Dirty, GetDirty, SetDirty); + + + /// Is this composite? + virtual bool IsComposite() const; + + /// Get/set the parent. + virtual wxRichTextObject* GetParent() const; + virtual void SetParent(wxRichTextObject* parent); + %property(Parent, GetParent, SetParent); + + + // TODO: Morph these into SetLeftMargin and etc. for wxPython so + // there can be proper properties + + /// Set the margin around the object + %Rename(SetSameMargins, + virtual void , SetMargins(int margin)); + virtual void SetMargins(int leftMargin, int rightMargin, int topMargin, int bottomMargin); + virtual int GetLeftMargin() const; + virtual int GetRightMargin() const; + virtual int GetTopMargin() const; + virtual int GetBottomMargin() const; + + + /// Set attributes object + void SetAttributes(const wxRichTextAttr& attr); + wxRichTextAttr GetAttributes(); + %property(Attributes, GetAttributes, SetAttributes); + + /// Set/get stored descent + void SetDescent(int descent); + int GetDescent() const; + %property(Descent, GetDescent, SetDescent); + + /// Gets the containing buffer + wxRichTextBuffer* GetBuffer() const; + +// Operations + + /// Clone the object + virtual wxRichTextObject* Clone() const; + + /// Copy + void Copy(const wxRichTextObject& obj); + + /// Reference-counting allows us to use the same object in multiple + /// lists (not yet used) + void Reference(); + void Dereference(); + + /// Convert units in tenths of a millimetre to device units + %Rename(ConvertTenthsMMToPixelsDC, + int, ConvertTenthsMMToPixels(wxDC& dc, int units)); + static int ConvertTenthsMMToPixels(int ppi, int units); + +}; + + + + +wxLIST_WRAPPER(wxRichTextObjectList, wxRichTextObject); + + +DocStr(wxRichTextCompositeObject, + "Objects of this class can contain other rich text objects.", ""); + + +class wxRichTextCompositeObject: public wxRichTextObject +{ +public: + // wxRichTextCompositeObject(wxRichTextObject* parent = NULL); **** This is an ABC + virtual ~wxRichTextCompositeObject(); + +// Accessors + + /// Get the children + wxRichTextObjectList& GetChildren(); + + /// Get the child count + size_t GetChildCount() const ; + + /// Get the nth child + wxRichTextObject* GetChild(size_t n) const ; + +// Operations + + /// Copy + void Copy(const wxRichTextCompositeObject& obj); + + %disownarg(wxRichTextObject* child); + + /// Append a child, returning the position + size_t AppendChild(wxRichTextObject* child) ; + + /// Insert the child in front of the given object, or at the beginning + bool InsertChild(wxRichTextObject* child, wxRichTextObject* inFrontOf) ; + + %cleardisown(wxRichTextObject* child); + + + /// Delete the child + %feature("shadow") RemoveChild %{ + def RemoveChild(self, child, deleteChild=False): + val = _richtext.RichTextCompositeObject_RemoveChild(self, child, deleteChild) + self.this.own(not deleteChild) + return val + %} + bool RemoveChild(wxRichTextObject* child, bool deleteChild = false) ; + + /// Delete all children + bool DeleteChildren(); + + /// Recursively merge all pieces that can be merged. + bool Defragment(); +}; + + + + + + +DocStr(wxRichTextBox, + "This defines a 2D space to lay out objects.", ""); + +class wxRichTextBox: public wxRichTextCompositeObject +{ +public: + wxRichTextBox(wxRichTextObject* parent = NULL); + + virtual wxRichTextObject* Clone() const; + void Copy(const wxRichTextBox& obj); +}; + + + + + + +DocStr(wxRichTextParagraphBox, + "This box knows how to lay out paragraphs.", ""); + +class wxRichTextParagraphLayoutBox: public wxRichTextBox +{ +public: + + wxRichTextParagraphLayoutBox(wxRichTextObject* parent = NULL); + +// Accessors + + /// Associate a control with the buffer, for operations that for example require refreshing the window. + void SetRichTextCtrl(wxRichTextCtrl* ctrl); + + /// Get the associated control. + wxRichTextCtrl* GetRichTextCtrl() const; + + /// Get/set whether the last paragraph is partial or complete + void SetPartialParagraph(bool partialPara); + bool GetPartialParagraph() const; + + /// If this is a buffer, returns the current style sheet. The base layout box + /// class doesn't have an associated style sheet. + virtual wxRichTextStyleSheet* GetStyleSheet() const; + +// Operations + + /// Initialize the object. + void Init(); + + /// Clear all children + virtual void Clear(); + + /// Clear and initialize with one blank paragraph + virtual void Reset(); + + /// Convenience function to add a paragraph of text + virtual wxRichTextRange AddParagraph(const wxString& text, wxTextAttrEx* paraStyle = NULL); + + /// Convenience function to add an image + virtual wxRichTextRange AddImage(const wxImage& image, wxTextAttrEx* paraStyle = NULL); + + /// Adds multiple paragraphs, based on newlines. + virtual wxRichTextRange AddParagraphs(const wxString& text, wxTextAttrEx* paraStyle = NULL); + + /// Get the line at the given position. If caretPosition is true, the position is + /// a caret position, which is normally a smaller number. + virtual wxRichTextLine* GetLineAtPosition(long pos, bool caretPosition = false) const; + + /// Get the line at the given y pixel position, or the last line. + virtual wxRichTextLine* GetLineAtYPosition(int y) const; + + /// Get the paragraph at the given character or caret position + virtual wxRichTextParagraph* GetParagraphAtPosition(long pos, bool caretPosition = false) const; + + /// Get the line size at the given position + virtual wxSize GetLineSizeAtPosition(long pos, bool caretPosition = false) const; + + /// Given a position, get the number of the visible line (potentially many to a paragraph), + /// starting from zero at the start of the buffer. We also have to pass a bool (startOfLine) + /// that indicates whether the caret is being shown at the end of the previous line or at the start + /// of the next, since the caret can be shown at 2 visible positions for the same underlying + /// position. + virtual long GetVisibleLineNumber(long pos, bool caretPosition = false, bool startOfLine = false) const; + + /// Given a line number, get the corresponding wxRichTextLine object. + virtual wxRichTextLine* GetLineForVisibleLineNumber(long lineNumber) const; + + /// Get the leaf object in a paragraph at this position. + /// Given a line number, get the corresponding wxRichTextLine object. + virtual wxRichTextObject* GetLeafObjectAtPosition(long position) const; + + /// Get the paragraph by number + virtual wxRichTextParagraph* GetParagraphAtLine(long paragraphNumber) const; + + /// Get the paragraph for a given line + virtual wxRichTextParagraph* GetParagraphForLine(wxRichTextLine* line) const; + + /// Get the length of the paragraph + virtual int GetParagraphLength(long paragraphNumber) const; + + /// Get the number of paragraphs + virtual int GetParagraphCount() const { return GetChildCount(); } + + /// Get the number of visible lines + virtual int GetLineCount() const; + + /// Get the text of the paragraph + virtual wxString GetParagraphText(long paragraphNumber) const; + + /// Convert zero-based line column and paragraph number to a position. + virtual long XYToPosition(long x, long y) const; + + /// Convert zero-based position to line column and paragraph number + virtual bool PositionToXY(long pos, long* x, long* y) const; + + /// Set text attributes: character and/or paragraph styles. + virtual bool SetStyle(const wxRichTextRange& range, + const wxRichTextAttr& style, + int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); +// virtual bool SetStyle(const wxRichTextRange& range, +// const wxTextAttrEx& style, +// int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); + + /// Get the conbined text attributes for this position. +// virtual bool GetStyle(long position, wxTextAttrEx& style); + virtual bool GetStyle(long position, wxRichTextAttr& style); + + /// Get the content (uncombined) attributes for this position. +// virtual bool GetUncombinedStyle(long position, wxTextAttrEx& style); + virtual bool GetUncombinedStyle(long position, wxRichTextAttr& style); + +// /// Implementation helper for GetStyle. If combineStyles is true, combine base, paragraph and +// /// context attributes. +// virtual bool DoGetStyle(long position, wxTextAttrEx& style, bool combineStyles = true); + + /// Get the combined style for a range - if any attribute is different within the range, + /// that attribute is not present within the flags + virtual bool GetStyleForRange(const wxRichTextRange& range, wxTextAttrEx& style); + + /// Combines 'style' with 'currentStyle' for the purpose of summarising the attributes of a range of + /// content. + bool CollectStyle(wxTextAttrEx& currentStyle, const wxTextAttrEx& style, long& multipleStyleAttributes, int& multipleTextEffectAttributes); + + /// 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); + + /// 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); + + /// Helper for NumberList and PromoteList, that does renumbering and promotion simultaneously + /// def/defName can be NULL/empty to indicate that the existing list style should be used. + virtual bool DoNumberList(const wxRichTextRange& range, const wxRichTextRange& promotionRange, int promoteBy, wxRichTextListStyleDefinition* def, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + + /// Fills in the attributes for numbering a paragraph after previousParagraph. + virtual bool FindNextParagraphNumber(wxRichTextParagraph* previousParagraph, wxRichTextAttr& attr) const; + + /// 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 + /// 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 wxRichTextAttr& style) const; + + /// 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; + virtual bool HasParagraphAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const; + + /// Clone + virtual wxRichTextObject* Clone() const { return new wxRichTextParagraphLayoutBox(*this); } + + /// Insert fragment into this box at the given position. If partialParagraph is true, + /// it is assumed that the last (or only) paragraph is just a piece of data with no paragraph + /// marker. + virtual bool InsertFragment(long position, wxRichTextParagraphLayoutBox& fragment); + + /// Make a copy of the fragment corresponding to the given range, putting it in 'fragment'. + virtual bool CopyFragment(const wxRichTextRange& range, wxRichTextParagraphLayoutBox& fragment); + + /// Apply the style sheet to the buffer, for example if the styles have changed. + virtual bool ApplyStyleSheet(wxRichTextStyleSheet* styleSheet); + + /// Copy + void Copy(const wxRichTextParagraphLayoutBox& obj); + + /// Calculate ranges + virtual void UpdateRanges(); + + /// Get all the text + virtual wxString GetText() const; + + /// Set default style for new content. Setting it to a default attribute + /// makes new content take on the 'basic' style. + virtual bool SetDefaultStyle(const wxTextAttrEx& style); + + /// Get default style + virtual const wxTextAttrEx& GetDefaultStyle() const; + + /// Set basic (overall) style + //virtual void SetBasicStyle(const wxTextAttrEx& style); + virtual void SetBasicStyle(const wxRichTextAttr& style); + + /// Get basic (overall) style + virtual const wxTextAttrEx& GetBasicStyle() const; + + /// 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; + +}; + + + + + +DocStr(wxRichTextLine, + "This object represents a line in a paragraph, and stores offsets from +the start of the paragraph representing the start and end positions of +the line.", ""); + +class wxRichTextLine +{ +public: + wxRichTextLine(wxRichTextParagraph* parent); + virtual ~wxRichTextLine(); + + /// Set the range + void SetRange(const wxRichTextRange& range); + + /// Get the parent paragraph + wxRichTextParagraph* GetParent(); + + /// Get the range + wxRichTextRange GetRange(); + + /// Get the absolute range + wxRichTextRange GetAbsoluteRange() const; + + /// Get/set the line size as calculated by Layout. + virtual wxSize GetSize() const; + virtual void SetSize(const wxSize& sz); + + /// Get/set the object position relative to the parent + virtual wxPoint GetPosition() const; + virtual void SetPosition(const wxPoint& pos); + + /// Get the absolute object position + virtual wxPoint GetAbsolutePosition() const; + + /// Get the rectangle enclosing the line + virtual wxRect GetRect() const; + + /// Set/get stored descent + void SetDescent(int descent); + int GetDescent() const; + +// Operations + + /// Initialisation + void Init(wxRichTextParagraph* parent); + + /// Copy + void Copy(const wxRichTextLine& obj); + + /// Clone + virtual wxRichTextLine* Clone() const; +}; + + + + + + +DocStr(wxRichTextParagraph, + "This object represents a single paragraph (or in a straight text +editor, a line).", ""); + +class wxRichTextParagraph: public wxRichTextBox +{ +public: + %extend { + wxRichTextParagraph(const wxString& text = wxPyEmptyString, + wxRichTextObject* parent = NULL, + wxRichTextAttr* paraStyle = NULL, + wxRichTextAttr* charStyle = NULL) + { + wxTextAttrEx* psAttr = NULL; + wxTextAttrEx* csAttr = NULL; + wxTextAttrEx psAttr_v; + wxTextAttrEx csAttr_v; + if (paraStyle) { + psAttr_v = *paraStyle; + psAttr = &psAttr_v; + } + if (charStyle) { + csAttr_v = *charStyle; + csAttr = &csAttr_v; + } + return new wxRichTextParagraph(text, parent, psAttr, csAttr); + } + } + virtual ~wxRichTextParagraph(); + + +// Accessors + + /// Get the cached lines + wxRichTextLineList& GetLines(); + +// Operations + + /// Copy + void Copy(const wxRichTextParagraph& obj); + + /// Clone + virtual wxRichTextObject* Clone() const; + + /// Clear the cached lines + void ClearLines(); + +// Implementation + + /// Apply paragraph styles such as centering to the wrapped lines + virtual void ApplyParagraphStyle(const wxTextAttrEx& attr, const wxRect& rect); + + /// Insert text at the given position + virtual bool InsertText(long pos, const wxString& text); + + /// Split an object at this position if necessary, and return + /// the previous object, or NULL if inserting at beginning. + virtual wxRichTextObject* SplitAt(long pos, wxRichTextObject** previousObject = NULL); + + /// Move content to a list from this point + virtual void MoveToList(wxRichTextObject* obj, wxList& list); + + /// Add content back from list + virtual void MoveFromList(wxList& list); + + /// Get the plain text searching from the start or end of the range. + /// The resulting string may be shorter than the range given. + bool GetContiguousPlainText(wxString& text, const wxRichTextRange& range, bool fromStart = true); + + /// Find a suitable wrap position. wrapPosition is the last position in the line to the left + /// of the split. + bool FindWrapPosition(const wxRichTextRange& range, wxDC& dc, int availableSpace, long& wrapPosition); + + /// Find the object at the given position + wxRichTextObject* FindObjectAtPosition(long position); + + /// 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); + + /// Get combined attributes of the base style, paragraph style and character style. We use this to dynamically + /// retrieve the actual style. +// wxTextAttrEx GetCombinedAttributes(const wxTextAttrEx& contentStyle) const; + + /// Get combined attributes of the base style and paragraph style. + wxTextAttrEx GetCombinedAttributes() const; + + /// Get the first position from pos that has a line break character. + long GetFirstLineBreakPosition(long pos); + + /// Create default tabstop array + static void InitDefaultTabs(); + + /// Clear default tabstop array + static void ClearDefaultTabs(); + + /// Get default tabstop array + static const wxArrayInt& GetDefaultTabs() { return sm_defaultTabs; } +}; + + + + + + + +DocStr(wxRichTextPlainText, + "This object represents a single piece of text.", ""); + +class wxRichTextPlainText: public wxRichTextObject +{ +public: + wxRichTextPlainText(const wxString& text = wxEmptyString, wxRichTextObject* parent = NULL, wxTextAttrEx* style = NULL); + + /// Get the first position from pos that has a line break character. + long GetFirstLineBreakPosition(long pos); + + /// Get the text + const wxString& GetText() const; + + /// Set the text + void SetText(const wxString& text); + +// Operations + + /// Copy + void Copy(const wxRichTextPlainText& obj); + + /// Clone + virtual wxRichTextObject* Clone() const; + +}; + + + + + + +#if 0 +// TODO: we may not even need wrappers for this class. It looks to me +// like wxRichTextImage might be enough... +DocStr(wxRichTextImageBlock, + "Stores information about an image, in binary in-memory form.", ""); + +class wxRichTextImageBlock: public wxObject +{ +public: + wxRichTextImageBlock(); + virtual ~wxRichTextImageBlock(); + + void Init(); + void Clear(); + + // Load the original image into a memory block. + // If the image is not a JPEG, we must convert it into a JPEG + // 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); + + // Make an image block from the wxImage in the given + // format. + virtual bool MakeImageBlock(wxImage& image, int imageType, int quality = 80); + + // Write to a file + bool Write(const wxString& filename); + + // Write data in hex to a stream + bool WriteHex(wxOutputStream& stream); + + // Read data in hex from a stream + bool ReadHex(wxInputStream& stream, int length, int imageType); + + // Copy from 'block' + void Copy(const wxRichTextImageBlock& block); + + // Load a wxImage from the block + bool Load(wxImage& image); + + +//// Accessors + + unsigned char* GetData() const; + size_t GetDataSize() const; + int GetImageType() const; + + void SetData(unsigned char* image); + void SetDataSize(size_t size); + void SetImageType(int imageType); + + bool IsOk() const; + + // Gets the extension for the block's type + wxString GetExtension() const; + +/// Implementation + + // Allocate and read from stream as a block of memory + static unsigned char* ReadBlock(wxInputStream& stream, size_t size); + static unsigned char* ReadBlock(const wxString& filename, size_t size); + + // Write memory block to stream + static bool WriteBlock(wxOutputStream& stream, unsigned char* block, size_t size); + + // Write memory block to file + static bool WriteBlock(const wxString& filename, unsigned char* block, size_t size); +}; +#endif + + + + + + +DocStr(wxRichTextImage, + "This object represents an image.", ""); + +class wxRichTextImage: public wxRichTextObject +{ +public: + // TODO: Which of these constructors? + wxRichTextImage(wxRichTextObject* parent = NULL); + //wxRichTextImage(const wxImage& image, wxRichTextObject* parent = NULL, wxTextAttrEx* charStyle = NULL); + //wxRichTextImage(const wxRichTextImageBlock& imageBlock, wxRichTextObject* parent = NULL, wxTextAttrEx* charStyle = NULL); + + +// Accessors + + /// Get the image + const wxImage& GetImage() const; + + /// Set the image + void SetImage(const wxImage& image); + + /// Get the image block containing the raw data + wxRichTextImageBlock& GetImageBlock(); + +// Operations + + /// Copy + void Copy(const wxRichTextImage& obj); + + /// Clone + virtual wxRichTextObject* Clone() const; + + /// Load wxImage from the block + virtual bool LoadFromBlock(); + + /// Make block from the wxImage + virtual bool MakeBlock(); +}; + + + + + + +%typemap(out) wxRichTextFileHandler* { $result = wxPyMake_wxObject($1, (bool)$owner); } +wxUNTYPED_LIST_WRAPPER(wxRichTextFileHandlerList, wxRichTextFileHandler); + +DocStr(wxRichTextBuffer, + "This is a kind of box, used to represent the whole buffer.", ""); + +class wxRichTextCommand; +class wxRichTextAction; + +class wxRichTextBuffer: public wxRichTextParagraphLayoutBox +{ +public: + wxRichTextBuffer(); + virtual ~wxRichTextBuffer() ; + +// Accessors + + /// Gets the command processor + wxCommandProcessor* GetCommandProcessor() const; + + /// Set style sheet, if any. + void SetStyleSheet(wxRichTextStyleSheet* styleSheet); + virtual wxRichTextStyleSheet* GetStyleSheet() const; + + /// Set style sheet and notify of the change + bool SetStyleSheetAndNotify(wxRichTextStyleSheet* sheet); + + /// Push style sheet to top of stack + bool PushStyleSheet(wxRichTextStyleSheet* styleSheet); + + /// Pop style sheet from top of stack + wxRichTextStyleSheet* PopStyleSheet(); + +// Operations + + /// Initialisation + void Init(); + + /// Clears the buffer, adds an empty paragraph, and clears the command processor. + virtual void ResetAndClearCommands(); + + /// Load a file + virtual bool LoadFile(const wxString& filename, int type = wxRICHTEXT_TYPE_ANY); + + /// Save a file + virtual bool SaveFile(const wxString& filename, int type = wxRICHTEXT_TYPE_ANY); + + /// Load from a stream + %Rename(LoadStream, + virtual bool , LoadFile(wxInputStream& stream, int type = wxRICHTEXT_TYPE_ANY)); + + /// Save to a stream + %Rename(SaveStream, + virtual bool , SaveFile(wxOutputStream& stream, int type = wxRICHTEXT_TYPE_ANY)); + + /// Set the handler flags, controlling loading and saving + void SetHandlerFlags(int flags) { m_handlerFlags = flags; } + + /// Get the handler flags, controlling loading and saving + int GetHandlerFlags() const { return m_handlerFlags; } + + /// Convenience function to add a paragraph of text + virtual wxRichTextRange AddParagraph(const wxString& text, wxTextAttrEx* paraStyle = NULL) { Modify(); return wxRichTextParagraphLayoutBox::AddParagraph(text, paraStyle); } + + /// Begin collapsing undo/redo commands. Note that this may not work properly + /// if combining commands that delete or insert content, changing ranges for + /// subsequent actions. + virtual bool BeginBatchUndo(const wxString& cmdName); + + /// End collapsing undo/redo commands + virtual bool EndBatchUndo(); + + /// Collapsing commands? + virtual bool BatchingUndo() const; + + /// Submit immediately, or delay according to whether collapsing is on + virtual bool SubmitAction(wxRichTextAction* action); + + /// Get collapsed command + virtual wxRichTextCommand* GetBatchedCommand() const; + + /// Begin suppressing undo/redo commands. The way undo is suppressed may be implemented + /// differently by each command. If not dealt with by a command implementation, then + /// it will be implemented automatically by not storing the command in the undo history + /// when the action is submitted to the command processor. + virtual bool BeginSuppressUndo(); + + /// End suppressing undo/redo commands. + virtual bool EndSuppressUndo(); + + /// Collapsing commands? + virtual bool SuppressingUndo() const; + + /// Copy the range to the clipboard + virtual bool CopyToClipboard(const wxRichTextRange& range); + + /// Paste the clipboard content to the buffer + virtual bool PasteFromClipboard(long position); + + /// Can we paste from the clipboard? + virtual bool CanPasteFromClipboard() const; + + /// Begin using a style + virtual bool BeginStyle(const wxTextAttrEx& style); + + /// End the style + virtual bool EndStyle(); + + /// End all styles + virtual bool EndAllStyles(); + + /// Clear the style stack + virtual void ClearStyleStack(); + + /// Get the size of the style stack, for example to check correct nesting + virtual size_t GetStyleStackSize() const; + + /// Begin using bold + bool BeginBold(); + + /// End using bold + bool EndBold(); + + /// Begin using italic + bool BeginItalic(); + + /// End using italic + bool EndItalic(); + + /// Begin using underline + bool BeginUnderline(); + + /// End using underline + bool EndUnderline(); + + /// Begin using point size + bool BeginFontSize(int pointSize); + + /// End using point size + bool EndFontSize(); + + /// Begin using this font + bool BeginFont(const wxFont& font); + + /// End using a font + bool EndFont(); + + /// Begin using this colour + bool BeginTextColour(const wxColour& colour); + + /// End using a colour + bool EndTextColour(); + + /// Begin using alignment + bool BeginAlignment(wxTextAttrAlignment alignment); + + /// End alignment + bool EndAlignment(); + + /// Begin left indent + bool BeginLeftIndent(int leftIndent, int leftSubIndent = 0); + + /// End left indent + bool EndLeftIndent(); + + /// Begin right indent + bool BeginRightIndent(int rightIndent); + + /// End right indent + bool EndRightIndent(); + + /// Begin paragraph spacing + bool BeginParagraphSpacing(int before, int after); + + /// End paragraph spacing + bool EndParagraphSpacing(); + + /// Begin line spacing + bool BeginLineSpacing(int lineSpacing); + + /// End line spacing + bool EndLineSpacing(); + + /// Begin numbered bullet + bool BeginNumberedBullet(int bulletNumber, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC|wxTEXT_ATTR_BULLET_STYLE_PERIOD); + + /// End numbered bullet + bool EndNumberedBullet(); + + /// Begin symbol bullet + bool BeginSymbolBullet(const wxString& symbol, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_SYMBOL); + + /// End symbol bullet + bool EndSymbolBullet(); + + /// Begin standard bullet + bool BeginStandardBullet(const wxString& bulletName, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_STANDARD); + + /// End standard bullet + bool EndStandardBullet(); + + /// Begin named character style + bool BeginCharacterStyle(const wxString& characterStyle); + + /// End named character style + bool EndCharacterStyle(); + + /// Begin named paragraph style + bool BeginParagraphStyle(const wxString& paragraphStyle); + + /// End named character style + bool EndParagraphStyle(); + + /// Begin named list style + bool BeginListStyle(const wxString& listStyle, int level = 1, int number = 1); + + /// End named character style + bool EndListStyle(); + + /// Begin URL + bool BeginURL(const wxString& url, const wxString& characterStyle = wxEmptyString); + + /// End URL + bool EndURL(); + +// Event handling + + /// Add an event handler + bool AddEventHandler(wxEvtHandler* handler); + + /// Remove an event handler + bool RemoveEventHandler(wxEvtHandler* handler, bool deleteHandler = false); + + /// Clear event handlers + void ClearEventHandlers(); + + /// Send event to event handlers. If sendToAll is true, will send to all event handlers, + /// otherwise will stop at the first successful one. + bool SendEvent(wxEvent& event, bool sendToAll = true); + +// Implementation + + /// Copy + void Copy(const wxRichTextBuffer& obj); + + /// Clone + virtual wxRichTextObject* Clone() const; + + /// Submit command to insert paragraphs + bool InsertParagraphsWithUndo(long pos, const wxRichTextParagraphLayoutBox& paragraphs, wxRichTextCtrl* ctrl, int flags = 0); + + /// Submit command to insert the given text + bool InsertTextWithUndo(long pos, const wxString& text, wxRichTextCtrl* ctrl, int flags = 0); + + /// Submit command to insert a newline + bool InsertNewlineWithUndo(long pos, wxRichTextCtrl* ctrl, int flags = 0); + + /// Submit command to insert the given image + bool InsertImageWithUndo(long pos, const wxRichTextImageBlock& imageBlock, wxRichTextCtrl* ctrl, int flags = 0); + + /// Submit command to delete this range + bool DeleteRangeWithUndo(const wxRichTextRange& range, wxRichTextCtrl* ctrl); + + /// Mark modified + void Modify(bool modify = true); + bool IsModified() const; + + /// Get the style that is appropriate for a new paragraph at this position. + /// If the previous paragraph has a paragraph style name, look up the next-paragraph + /// style. + wxRichTextAttr GetStyleForNewParagraph(long pos, bool caretPosition = false, bool lookUpNewParaStyle=false) const; + + + /// Returns the file handlers + static wxRichTextFileHandlerList_t& GetHandlers(); + + %disownarg(wxRichTextFileHandler *handler); + + /// Adds a handler to the end + static void AddHandler(wxRichTextFileHandler *handler); + + /// Inserts a handler at the front + static void InsertHandler(wxRichTextFileHandler *handler); + + %cleardisown(wxRichTextFileHandler *handler); + + + /// Removes a handler + static bool RemoveHandler(const wxString& name); + + /// Finds a handler by name + %Rename(FindHandlerByName, + static wxRichTextFileHandler* , FindHandler(const wxString& name)); + + /// Finds a handler by extension and type + %Rename(FindHandlerByExtension, + static wxRichTextFileHandler*, FindHandler(const wxString& extension, int imageType)); + + /// Finds a handler by filename or, if supplied, type + %Rename(FindHandlerByFilename, + static wxRichTextFileHandler* , FindHandlerFilenameOrType(const wxString& filename, int imageType)); + + /// Finds a handler by type + %Rename(FindHandlerByType, + static wxRichTextFileHandler* , FindHandler(int imageType)); + + + // TODO: Handle returning the types array? + + /// 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); + %extend { + KeepGIL(GetExtWildcard); + DocAStr(GetExtWildcard, + "GetExtWildcard(self, bool combine=False, bool save=False) --> (wildcards, types)", + "Gets a wildcard string for the file dialog based on all the currently +loaded richtext file handlers, and a list that can be used to map +those filter types to the file handler type.", ""); + static PyObject* GetExtWildcard(bool combine = false, bool save = false) { + wxString wildcards; + wxArrayInt types; + wildcards = wxRichTextBuffer::GetExtWildcard(combine, save, &types); + PyObject* tup = PyTuple_New(2); + PyTuple_SET_ITEM(tup, 0, wx2PyString(wildcards)); + PyTuple_SET_ITEM(tup, 1, wxArrayInt2PyList_helper(types)); + return tup; + } + } + + /// Clean up handlers + static void CleanUpHandlers(); + + /// Initialise the standard handlers + static void InitStandardHandlers(); + + /// Get renderer + static wxRichTextRenderer* GetRenderer(); + + /// Set renderer, deleting old one + static void SetRenderer(wxRichTextRenderer* renderer); + + /// Minimum margin between bullet and paragraph in 10ths of a mm + static int GetBulletRightMargin(); + static void SetBulletRightMargin(int margin); + + /// Factor to multiply by character height to get a reasonable bullet size + static float GetBulletProportion(); + static void SetBulletProportion(float prop); + + /// Scale factor for calculating dimensions + double GetScale() const; + void SetScale(double scale); +}; + + + + + + +// TODO: Do we need wrappers for the command processor, undo/redo, etc.? +// +// enum wxRichTextCommandId +// { +// wxRICHTEXT_INSERT, +// wxRICHTEXT_DELETE, +// wxRICHTEXT_CHANGE_STYLE +// }; +// class WXDLLIMPEXP_RICHTEXT wxRichTextCommand: public wxCommand +// class WXDLLIMPEXP_RICHTEXT wxRichTextAction: public wxObject + + + + +//--------------------------------------------------------------------------- +%newgroup + + +/*! + * Handler flags + */ + +enum { + // Include style sheet when loading and saving + wxRICHTEXT_HANDLER_INCLUDE_STYLESHEET, + + // Save images to memory file system in HTML handler + wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_MEMORY, + + // Save images to files in HTML handler + wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_FILES, + + // Save images as inline base64 data in HTML handler + wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_BASE64, + + // Don't write header and footer (or BODY), so we can include the + // fragment in a larger document + wxRICHTEXT_HANDLER_NO_HEADER_FOOTER, +}; + + + + +DocStr(wxRichTextFileHandler, + "Base class for file handlers", ""); + +class wxRichTextFileHandler: public wxObject +{ +public: + //wxRichTextFileHandler(const wxString& name = wxEmptyString, **** This is an ABC + // const wxString& ext = wxEmptyString, + // int type = 0); + + ~wxRichTextFileHandler(); + + %Rename(LoadStream, + bool, LoadFile(wxRichTextBuffer *buffer, wxInputStream& stream)); + %Rename(SaveStream, + bool, SaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream)); + + 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; + + /// Can we save using this handler? + virtual bool CanSave() const; + + /// Can we load using this handler? + virtual bool CanLoad() const; + + /// Should this handler be visible to the user? + virtual bool IsVisible() const; + virtual void SetVisible(bool visible); + + /// The name of the nandler + void SetName(const wxString& name); + wxString GetName() const; + %property(Name, GetName, SetName) + + /// The default extension to recognise + void SetExtension(const wxString& ext); + wxString GetExtension() const; + %property(Extension, GetExtension, SetExtension) + + /// The handler type + void SetType(int type); + int GetType() const; + %property(Type, GetType, SetType) + + /// Flags controlling how loading and saving is done + void SetFlags(int flags); + int GetFlags() const; + %property(Flags, GetFlags, SetFlags) + + /// Encoding to use when saving a file. If empty, a suitable encoding is chosen + void SetEncoding(const wxString& encoding); + const wxString& GetEncoding() const; + %property(Encoding, GetEncoding, SetEncoding) +}; + + + +MAKE_CONST_WXSTRING2(TextName, wxT("Text")); +MAKE_CONST_WXSTRING2(TextExt, wxT("txt")); + +class wxRichTextPlainTextHandler: public wxRichTextFileHandler +{ +public: + wxRichTextPlainTextHandler(const wxString& name = wxPyTextName, + const wxString& ext = wxPyTextExt, + int type = wxRICHTEXT_TYPE_TEXT); +}; + + + + + +//--------------------------------------------------------------------------- +%newgroup + + +// TODO: Make a PyRichTextRenderer class + + +/*! + * wxRichTextRenderer isolates common drawing functionality + */ + +class wxRichTextRenderer: public wxObject +{ +public: + wxRichTextRenderer() {} + virtual ~wxRichTextRenderer() {} + + /// Draw a standard bullet, as specified by the value of GetBulletName + virtual bool DrawStandardBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxTextAttrEx& attr, const wxRect& rect) = 0; + + /// Draw a bullet that can be described by text, such as numbered or symbol bullets + virtual bool DrawTextBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxTextAttrEx& attr, const wxRect& rect, const wxString& text) = 0; + + /// Draw a bitmap bullet, where the bullet bitmap is specified by the value of GetBulletName + virtual bool DrawBitmapBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxTextAttrEx& attr, const wxRect& rect) = 0; + + /// Enumerate the standard bullet names currently supported + virtual bool EnumerateStandardBulletNames(wxArrayString& bulletNames) = 0; +}; + +/*! + * wxRichTextStdRenderer: standard renderer + */ + +class wxRichTextStdRenderer: public wxRichTextRenderer +{ +public: + wxRichTextStdRenderer() {} + + /// Draw a standard bullet, as specified by the value of GetBulletName + virtual bool DrawStandardBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxTextAttrEx& attr, const wxRect& rect); + + /// Draw a bullet that can be described by text, such as numbered or symbol bullets + virtual bool DrawTextBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxTextAttrEx& attr, const wxRect& rect, const wxString& text); + + /// Draw a bitmap bullet, where the bullet bitmap is specified by the value of GetBulletName + virtual bool DrawBitmapBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxTextAttrEx& attr, const wxRect& rect); + + /// Enumerate the standard bullet names currently supported + virtual bool EnumerateStandardBulletNames(wxArrayString& bulletNames); +}; + +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- diff --git a/wxPython/src/_richtextctrl.i b/wxPython/src/_richtextctrl.i new file mode 100644 index 0000000000..7313b46892 --- /dev/null +++ b/wxPython/src/_richtextctrl.i @@ -0,0 +1,1237 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: _richtextctrl.i +// Purpose: wxRichTextCtrl and related classes +// +// Author: Robin Dunn +// +// Created: 11-April-2006 +// RCS-ID: $Id$ +// Copyright: (c) 2006 by Total Control Software +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + +// Not a %module + + +//--------------------------------------------------------------------------- + +%{ +%} + +//--------------------------------------------------------------------------- +%newgroup + +enum { + wxRE_READONLY, + wxRE_MULTILINE, + + wxRICHTEXT_SHIFT_DOWN, + wxRICHTEXT_CTRL_DOWN, + wxRICHTEXT_ALT_DOWN, + + wxRICHTEXT_SELECTED, + wxRICHTEXT_TAGGED, + wxRICHTEXT_FOCUSSED, + wxRICHTEXT_IS_FOCUS, + +}; + + +//--------------------------------------------------------------------------- + +MAKE_CONST_WXSTRING2(RichTextCtrlNameStr, wxT("richText")); + +MustHaveApp(wxRichTextCtrl); + + +DocStr(wxRichTextCtrl, +"", ""); + + +class wxRichTextCtrl : public wxScrolledWindow +{ +public: + %pythonAppend wxRichTextCtrl "self._setOORInfo(self)" + %pythonAppend wxRichTextCtrl() "" + + wxRichTextCtrl( wxWindow* parent, + wxWindowID id = -1, + const wxString& value = wxPyEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxRE_MULTILINE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxPyRichTextCtrlNameStr ); + %RenameCtor(PreRichTextCtrl, wxRichTextCtrl()); + + + bool Create( wxWindow* parent, + wxWindowID id = -1, + const wxString& value = wxPyEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxRE_MULTILINE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxPyRichTextCtrlNameStr ); + + + DocDeclStr( + virtual wxString , GetValue() const, + "", ""); + + DocDeclStr( + virtual void , SetValue(const wxString& value), + "", ""); + + + DocDeclStr( + virtual wxString , GetRange(long from, long to) const, + "", ""); + + + DocDeclStr( + virtual int , GetLineLength(long lineNo) const , + "", ""); + + DocDeclStr( + virtual wxString , GetLineText(long lineNo) const , + "", ""); + + DocDeclStr( + virtual int , GetNumberOfLines() const , + "", ""); + + + DocDeclStr( + virtual bool , IsModified() const , + "", ""); + + DocDeclStr( + virtual bool , IsEditable() const , + "", ""); + + + // more readable flag testing methods + DocDeclStr( + bool , IsSingleLine() const, + "", ""); + + DocDeclStr( + bool , IsMultiLine() const, + "", ""); + + + DocDeclAStr( + virtual void , GetSelection(long* OUTPUT, long* OUTPUT) const, + "GetSelection() --> (start, end)", + "Returns the start and end positions of the current selection. If the +values are the same then there is no selection.", ""); + + + DocDeclStr( + virtual wxString , GetStringSelection() const, + "", ""); + + + DocDeclStr( + wxString , GetFilename() const, + "", ""); + + + DocDeclStr( + void , SetFilename(const wxString& filename), + "", ""); + + + DocDeclStr( + void , SetDelayedLayoutThreshold(long threshold), + "Set the threshold in character positions for doing layout optimization +during sizing.", ""); + + + DocDeclStr( + long , GetDelayedLayoutThreshold() const, + "Get the threshold in character positions for doing layout optimization +during sizing.", ""); + + + + DocDeclStr( + virtual void , Clear(), + "", ""); + + DocDeclStr( + virtual void , Replace(long from, long to, const wxString& value), + "", ""); + + DocDeclStr( + virtual void , Remove(long from, long to), + "", ""); + + + DocDeclStr( + virtual bool , LoadFile(const wxString& file, int type = wxRICHTEXT_TYPE_ANY), + "Load the contents of the document from the given filename.", ""); + + DocDeclStr( + virtual bool , SaveFile(const wxString& file = wxPyEmptyString, + int type = wxRICHTEXT_TYPE_ANY), + "Save the contents of the document to the given filename, or if the +empty string is passed then to the filename set with `SetFilename`.", ""); + + + DocDeclStr( + void , SetHandlerFlags(int flags), + "Set the handler flags, controlling loading and saving.", ""); + + DocDeclStr( + int , GetHandlerFlags() const, + "Get the handler flags, controlling loading and saving.", ""); + + // sets/clears the dirty flag + DocDeclStr( + virtual void , MarkDirty(), + "Sets the dirty flag, meaning that the contents of the control have +changed and need to be saved.", ""); + + DocDeclStr( + virtual void , DiscardEdits(), + "Clears the dirty flag. +:see: `MarkDirty`", ""); + + + DocDeclStr( + virtual void , SetMaxLength(unsigned long len), + "Set the max number of characters which may be entered in a single line +text control.", ""); + + + DocDeclStr( + virtual void , WriteText(const wxString& text), + "Insert text at the current position.", ""); + + DocDeclStr( + virtual void , AppendText(const wxString& text), + "Append text to the end of the document.", ""); + + + DocDeclStr( + virtual bool , SetStyle(const wxRichTextRange& range, const wxRichTextAttr& style), + "Set the style for the text in ``range`` to ``style``", ""); + + DocDeclStr( + virtual bool , GetStyle(long position, wxRichTextAttr& style), + "Retrieve the style used at the given position. Copies the style +values at ``position`` into the ``style`` parameter and returns ``True`` +if successful. Returns ``False`` otherwise.", ""); + + + DocDeclStr( + virtual bool , GetStyleForRange(const wxRichTextRange& range, wxRichTextAttr& style), + "Get the common set of styles for the range", ""); + + + DocDeclStr( + virtual bool , SetStyleEx(const wxRichTextRange& range, const wxRichTextAttr& style, + int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO), + "Extended style setting operation with flags including: +RICHTEXT_SETSTYLE_WITH_UNDO, RICHTEXT_SETSTYLE_OPTIMIZE, +RICHTEXT_SETSTYLE_PARAGRAPHS_ONLY, RICHTEXT_SETSTYLE_CHARACTERS_ONLY", ""); + + + + DocDeclStr( + virtual bool , GetUncombinedStyle(long position, wxRichTextAttr& style), + "Get the content (uncombined) attributes for this position. Copies the +style values at ``position`` into the ``style`` parameter and returns +``True`` if successful. Returns ``False`` otherwise.", ""); + + + DocDeclStr( + virtual bool , SetDefaultStyle(const wxRichTextAttr& style), + "Set the style used by default for the rich text document.", ""); + + + DocDeclStrName( + virtual const wxRichTextAttr , GetDefaultStyleEx() const, + "Retrieves a copy of the default style object.", "", + GetDefaultStyle); + + +// TODO: Select which of these to keep or rename + + /// 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); + + /// 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); + + + + + DocDeclStr( + virtual long , XYToPosition(long x, long y) const, + "Translate a col,row coordinants into a document position.", ""); + + DocDeclAStr( + virtual void , PositionToXY(long pos, long *OUTPUT, long *OUTPUT) const, + "PositionToXY(self, long pos) --> (x, y)", + "Retrieves the col,row for the given position within the document", ""); + + + DocDeclStr( + virtual void , ShowPosition(long position), + "Ensure that the given position in the document is visible.", ""); + + + DocDeclAStr( + virtual wxTextCtrlHitTestResult , HitTest(const wxPoint& pt, long *OUTPUT) const, + "HitTest(self, Point pt) --> (result, pos)", + "Returns the character position at the given point in pixels. Note +that ``pt`` should be given in device coordinates, and not be adjusted +for the client area origin nor for scrolling. The return value is a +tuple of the hit test result and the position.", " + +Possible result values are a bitmask of these flags: + + ========================= ==================================== + RICHTEXT_HITTEST_NONE The point was not on this object. + RICHTEXT_HITTEST_BEFORE The point was before the position + returned from HitTest. + RICHTEXT_HITTEST_AFTER The point was after the position + returned from HitTest. + RICHTEXT_HITTEST_ON The point was on the position + returned from HitTest + ========================= ==================================== +"); + + DocDeclAStrName( + virtual wxTextCtrlHitTestResult , HitTest(const wxPoint& pt, + wxTextCoord *OUTPUT, + wxTextCoord *OUTPUT) const, + "HitTestRC(self, Point pt) --> (result, col, row)", + "Returns the column and row of the given point in pixels. Note that +``pt`` should be given in device coordinates, and not be adjusted for +the client area origin nor for scrolling. The return value is a tuple +of the hit test result and the column and row values.", " +:see: `HitTest`", + HitTestXY); + + + // Clipboard operations + DocDeclStr( + virtual void , Copy(), + "Copies the selected text to the clipboard.", ""); + + DocDeclStr( + virtual void , Cut(), + "Copies the selected text to the clipboard and removes the selection.", ""); + + DocDeclStr( + virtual void , Paste(), + "Pastes text from the clipboard into the document at the current +insertion point.", ""); + + DocDeclStr( + virtual void , DeleteSelection(), + "Remove the current selection.", ""); + + + DocDeclStr( + virtual bool , CanCopy() const, + "Returns ``True`` if the selection can be copied to the clipboard.", ""); + + DocDeclStr( + virtual bool , CanCut() const, + "Returns ``True`` if the selection can be cut to the clipboard.", ""); + + DocDeclStr( + virtual bool , CanPaste() const, + "Returns ``True`` if the current contents of the clipboard can be +pasted into the document.", ""); + + DocDeclStr( + virtual bool , CanDeleteSelection() const, + "Returns ``True`` if the selection can be removed from the document.", ""); + + + // Undo/redo + DocDeclStr( + virtual void , Undo(), + "If the last operation can be undone, undoes the last operation.", ""); + + DocDeclStr( + virtual void , Redo(), + "If the last operation can be redone, redoes the last operation.", ""); + + + DocDeclStr( + virtual bool , CanUndo() const, + "Returns ``True`` if the last operation can be undone.", ""); + + DocDeclStr( + virtual bool , CanRedo() const, + "Returns ``True`` if the last operation can be redone.", ""); + + + // Insertion point + DocDeclStr( + virtual void , SetInsertionPoint(long pos), + "Sets the insertion point at the given position.", ""); + + DocDeclStr( + virtual void , SetInsertionPointEnd(), + "Moves the insertion point to the end of the document.", ""); + + DocDeclStr( + virtual long , GetInsertionPoint() const, + "Returns the insertion point. This is defined as the zero based index +of the character position to the right of the insertion point.", ""); + + DocDeclStr( + virtual long , GetLastPosition() const, + "Returns the zero based index of the last position in the document.", ""); + + + DocDeclStr( + virtual void , SetSelection(long from, long to), + "Selects the text starting at the first position up to (but not +including) the character at the last position. If both parameters are +equal to -1 then all text in the control is selected.", ""); + + DocDeclStr( + virtual void , SelectAll(), + "Select all text in the document.", ""); + + DocDeclStr( + virtual void , SetEditable(bool editable), + "Makes the document editable or read-only, overriding the RE_READONLY +flag.", ""); + + + DocDeclStr( + 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. + DocDeclStr( + virtual bool , WriteImage(const wxImage& image, int 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. + DocDeclStrName( + virtual bool , WriteImage(const wxBitmap& bitmap, int bitmapType = wxBITMAP_TYPE_PNG), + "", "", + WriteBitmap); + + + /// Load an image from file and write at the current insertion point. + DocDeclStrName( + virtual bool , WriteImage(const wxString& filename, int bitmapType), + "", "", + WriteImageFile); + + + /// Write an image block at the current insertion point. + DocDeclStrName( + virtual bool , WriteImage(const wxRichTextImageBlock& imageBlock), + "", "", + WriteImageBlock); + + + /// Insert a newline (actually paragraph) at the current insertion point. + DocDeclStr( + virtual bool , Newline(), + "", ""); + + + /// Insert a line break at the current insertion point. + virtual bool LineBreak(); + + + DocDeclStr( + virtual void , SetBasicStyle(const wxRichTextAttr& style), + "", ""); + + + /// Get basic (overall) style + DocDeclStr( + virtual const wxRichTextAttr , GetBasicStyle() const, + "", ""); + + + /// Begin using a style + DocDeclStr( + virtual bool , BeginStyle(const wxRichTextAttr& style), + "", ""); + + + /// End the style + DocDeclStr( + virtual bool , EndStyle(), + "", ""); + + + /// End all styles + DocDeclStr( + virtual bool , EndAllStyles(), + "", ""); + + + /// Begin using bold + DocDeclStr( + bool , BeginBold(), + "", ""); + + + /// End using bold + DocDeclStr( + bool , EndBold(), + "", ""); + + + /// Begin using italic + DocDeclStr( + bool , BeginItalic(), + "", ""); + + + /// End using italic + DocDeclStr( + bool , EndItalic(), + "", ""); + + + /// Begin using underline + DocDeclStr( + bool , BeginUnderline(), + "", ""); + + + /// End using underline + DocDeclStr( + bool , EndUnderline(), + "", ""); + + + /// Begin using point size + DocDeclStr( + bool , BeginFontSize(int pointSize), + "", ""); + + + /// End using point size + DocDeclStr( + bool , EndFontSize(), + "", ""); + + + /// Begin using this font + DocDeclStr( + bool , BeginFont(const wxFont& font), + "", ""); + + + /// End using a font + DocDeclStr( + bool , EndFont(), + "", ""); + + + /// Begin using this colour + DocDeclStr( + bool , BeginTextColour(const wxColour& colour), + "", ""); + + + /// End using a colour + DocDeclStr( + bool , EndTextColour(), + "", ""); + + + /// Begin using alignment + DocDeclStr( + bool , BeginAlignment(wxTextAttrAlignment alignment), + "", ""); + + + /// End alignment + DocDeclStr( + bool , EndAlignment(), + "", ""); + + + /// Begin left indent + DocDeclStr( + bool , BeginLeftIndent(int leftIndent, int leftSubIndent = 0), + "", ""); + + + /// End left indent + DocDeclStr( + bool , EndLeftIndent(), + "", ""); + + + /// Begin right indent + DocDeclStr( + bool , BeginRightIndent(int rightIndent), + "", ""); + + + /// End right indent + DocDeclStr( + bool , EndRightIndent(), + "", ""); + + + /// Begin paragraph spacing + DocDeclStr( + bool , BeginParagraphSpacing(int before, int after), + "", ""); + + + /// End paragraph spacing + DocDeclStr( + bool , EndParagraphSpacing(), + "", ""); + + + /// Begin line spacing + DocDeclStr( + bool , BeginLineSpacing(int lineSpacing), + "", ""); + + + /// End line spacing + DocDeclStr( + bool , EndLineSpacing(), + "", ""); + + + /// Begin numbered bullet + DocDeclStr( + bool , BeginNumberedBullet(int bulletNumber, + int leftIndent, + int leftSubIndent, + int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC|wxTEXT_ATTR_BULLET_STYLE_PERIOD), + "", ""); + + + /// End numbered bullet + DocDeclStr( + bool , EndNumberedBullet(), + "", ""); + + + /// Begin symbol bullet + DocDeclStr( + bool , BeginSymbolBullet(const wxString& symbol, + int leftIndent, + int leftSubIndent, + int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_SYMBOL), + "", ""); + + + /// End symbol bullet + DocDeclStr( + bool , EndSymbolBullet(), + "", ""); + + + /// Begin standard bullet + DocDeclStr( + bool , BeginStandardBullet(const wxString& bulletName, + int leftIndent, + int leftSubIndent, + int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_STANDARD), + "", ""); + + + + /// End standard bullet + DocDeclStr( + bool , EndStandardBullet(), + "", ""); + + + /// Begin named character style + DocDeclStr( + bool , BeginCharacterStyle(const wxString& characterStyle), + "", ""); + + + /// End named character style + DocDeclStr( + bool , EndCharacterStyle(), + "", ""); + + + /// Begin named paragraph style + DocDeclStr( + bool , BeginParagraphStyle(const wxString& paragraphStyle), + "", ""); + + + /// End named character style + DocDeclStr( + bool , EndParagraphStyle(), + "", ""); + + + DocDeclStr( + bool , BeginListStyle(const wxString& listStyle, int level = 1, int number = 1), + "Begin named list style.", ""); + + DocDeclStr( + bool , EndListStyle(), "End named list style.", ""); + + DocDeclStr( + bool , BeginURL(const wxString& url, const wxString& characterStyle = wxEmptyString), + "Begin URL.", ""); + + DocDeclStr( + bool , EndURL(), "End URL.", ""); + + /// Sets the default style to the style under the cursor + DocDeclStr( + bool , SetDefaultStyleToCursorStyle(), + "", ""); + + + /// Clear the selection + DocDeclStr( + virtual void , SelectNone(), + "", ""); + + /// Select the word at the given character position + DocDeclStr( + virtual bool , SelectWord(long position), + "", ""); + + + /// Get/set the selection range in character positions. -1, -1 means no selection. + DocDeclStr( + wxRichTextRange , GetSelectionRange() const, + "", ""); + + DocDeclStr( + void , SetSelectionRange(const wxRichTextRange& range), + "", ""); + + /// Get/set the selection range in character positions. -1, -1 means no selection. + /// The range is in internal format, i.e. a single character selection is denoted + /// by (n, n) + DocDeclStr( + const wxRichTextRange& , GetInternalSelectionRange() const, + "", ""); + + DocDeclStr( + void , SetInternalSelectionRange(const wxRichTextRange& range), + "", ""); + + + + /// Add a new paragraph of text to the end of the buffer + DocDeclStr( + virtual wxRichTextRange , AddParagraph(const wxString& text), + "", ""); + + + /// Add an image + DocDeclStr( + virtual wxRichTextRange , AddImage(const wxImage& image), + "", ""); + + + /// Layout the buffer: which we must do before certain operations, such as + /// setting the caret position. + DocDeclStr( + virtual bool , LayoutContent(bool onlyVisibleRect = false), + "", ""); + + + /// Move the caret to the given character position + DocDeclStr( + virtual bool , MoveCaret(long pos, bool showAtLineStart = false), + "", ""); + + + /// Move right + DocDeclStr( + virtual bool , MoveRight(int noPositions = 1, int flags = 0), + "", ""); + + + /// Move left + DocDeclStr( + virtual bool , MoveLeft(int noPositions = 1, int flags = 0), + "", ""); + + + /// Move up + DocDeclStr( + virtual bool , MoveUp(int noLines = 1, int flags = 0), + "", ""); + + + /// Move up + DocDeclStr( + virtual bool , MoveDown(int noLines = 1, int flags = 0), + "", ""); + + + /// Move to the end of the line + DocDeclStr( + virtual bool , MoveToLineEnd(int flags = 0), + "", ""); + + + /// Move to the start of the line + DocDeclStr( + virtual bool , MoveToLineStart(int flags = 0), + "", ""); + + + /// Move to the end of the paragraph + DocDeclStr( + virtual bool , MoveToParagraphEnd(int flags = 0), + "", ""); + + + /// Move to the start of the paragraph + DocDeclStr( + virtual bool , MoveToParagraphStart(int flags = 0), + "", ""); + + + /// Move to the start of the buffer + DocDeclStr( + virtual bool , MoveHome(int flags = 0), + "", ""); + + + /// Move to the end of the buffer + DocDeclStr( + virtual bool , MoveEnd(int flags = 0), + "", ""); + + + /// Move n pages up + DocDeclStr( + virtual bool , PageUp(int noPages = 1, int flags = 0), + "", ""); + + + /// Move n pages down + DocDeclStr( + virtual bool , PageDown(int noPages = 1, int flags = 0), + "", ""); + + + /// Move n words left + DocDeclStr( + virtual bool , WordLeft(int noPages = 1, int flags = 0), + "", ""); + + + /// Move n words right + DocDeclStr( + virtual bool , WordRight(int noPages = 1, int flags = 0), + "", ""); + + + /// Returns the buffer associated with the control. + DocDeclStr( + wxRichTextBuffer& , GetBuffer(), + "", ""); + + + /// Start batching undo history for commands. + DocDeclStr( + virtual bool , BeginBatchUndo(const wxString& cmdName), + "", ""); + + + /// End batching undo history for commands. + DocDeclStr( + virtual bool , EndBatchUndo(), + "", ""); + + + /// Are we batching undo history for commands? + DocDeclStr( + virtual bool , BatchingUndo() const, + "", ""); + + + /// Start suppressing undo history for commands. + DocDeclStr( + virtual bool , BeginSuppressUndo(), + "", ""); + + + /// End suppressing undo history for commands. + DocDeclStr( + virtual bool , EndSuppressUndo(), + "", ""); + + + /// Are we suppressing undo history for commands? + DocDeclStr( + virtual bool , SuppressingUndo() const, + "", ""); + + + /// 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 + /// can use this to implement, for example, bold button updating. style must have + /// flags indicating which attributes are of interest. + DocDeclStr( + virtual bool , HasCharacterAttributes(const wxRichTextRange& range, + const wxRichTextAttr& style) const, + "", ""); + + + + /// 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. + DocDeclStr( + virtual bool , HasParagraphAttributes(const wxRichTextRange& range, + const wxRichTextAttr& style) const, + "", ""); + + + + /// Is all of the selection bold? + DocDeclStr( + virtual bool , IsSelectionBold(), + "", ""); + + + /// Is all of the selection italics? + DocDeclStr( + virtual bool , IsSelectionItalics(), + "", ""); + + + /// Is all of the selection underlined? + DocDeclStr( + virtual bool , IsSelectionUnderlined(), + "", ""); + + + /// Is all of the selection aligned according to the specified flag? + DocDeclStr( + virtual bool , IsSelectionAligned(wxTextAttrAlignment alignment), + "", ""); + + + /// Apply bold to the selection + DocDeclStr( + virtual bool , ApplyBoldToSelection(), + "", ""); + + + /// Apply italic to the selection + DocDeclStr( + virtual bool , ApplyItalicToSelection(), + "", ""); + + + /// Apply underline to the selection + DocDeclStr( + virtual bool , ApplyUnderlineToSelection(), + "", ""); + + + /// Apply alignment to the selection + DocDeclStr( + virtual bool , ApplyAlignmentToSelection(wxTextAttrAlignment alignment), + "", ""); + + + /// Apply a named style to the selection + virtual bool ApplyStyle(wxRichTextStyleDefinition* def); + + /// Set style sheet, if any. + DocDeclStr( + void , SetStyleSheet(wxRichTextStyleSheet* styleSheet), + "", ""); + + DocDeclStr( + wxRichTextStyleSheet* , GetStyleSheet() const, + "", ""); + + + /// Push style sheet to top of stack + bool PushStyleSheet(wxRichTextStyleSheet* styleSheet); + + + /// Pop style sheet from top of stack + wxRichTextStyleSheet* PopStyleSheet(); + + + /// Apply the style sheet to the buffer, for example if the styles have changed. + DocDeclStr( + bool , ApplyStyleSheet(wxRichTextStyleSheet* styleSheet = NULL), + "", ""); + + + + %property(Buffer, GetBuffer, doc="See `GetBuffer`"); + %property(DefaultStyle, GetDefaultStyle, SetDefaultStyle, doc="See `GetDefaultStyle` and `SetDefaultStyle`"); + %property(DelayedLayoutThreshold, GetDelayedLayoutThreshold, SetDelayedLayoutThreshold, doc="See `GetDelayedLayoutThreshold` and `SetDelayedLayoutThreshold`"); + %property(Filename, GetFilename, SetFilename, doc="See `GetFilename` and `SetFilename`"); + %property(InsertionPoint, GetInsertionPoint, SetInsertionPoint, doc="See `GetInsertionPoint` and `SetInsertionPoint`"); + %property(InternalSelectionRange, GetInternalSelectionRange, SetInternalSelectionRange, doc="See `GetInternalSelectionRange` and `SetInternalSelectionRange`"); + %property(LastPosition, GetLastPosition, doc="See `GetLastPosition`"); + %property(NumberOfLines, GetNumberOfLines, doc="See `GetNumberOfLines`"); + %property(Selection, GetSelection, SetSelectionRange, doc="See `GetSelection` and `SetSelection`"); + %property(SelectionRange, GetSelectionRange, SetSelectionRange, doc="See `GetSelectionRange` and `SetSelectionRange`"); + %property(StringSelection, GetStringSelection, doc="See `GetStringSelection`"); + %property(StyleSheet, GetStyleSheet, SetStyleSheet, doc="See `GetStyleSheet` and `SetStyleSheet`"); + %property(Value, GetValue, SetValue, doc="See `GetValue` and `SetValue`"); + + + + // TODO: Some of these methods may be useful too... + + +// /// Set up scrollbars, e.g. after a resize +// virtual void SetupScrollbars(bool atTop = false); + +// /// Keyboard navigation +// virtual bool KeyboardNavigate(int keyCode, int flags); + +// /// Paint the background +// virtual void PaintBackground(wxDC& dc); + +// #if wxRICHTEXT_BUFFERED_PAINTING +// /// Recreate buffer bitmap if necessary +// virtual bool RecreateBuffer(const wxSize& size = wxDefaultSize); +// #endif + +// /// Set the selection +// virtual void DoSetSelection(long from, long to, bool scrollCaret = true); + +// /// Write text +// virtual void DoWriteText(const wxString& value, int flags = 0); + +// /// Should we inherit colours? +// virtual bool ShouldInheritColours() const { return false; } + +// /// Position the caret +// virtual void PositionCaret(); + +// /// Extend the selection, returning true if the selection was +// /// changed. Selections are in caret positions. +// virtual bool ExtendSelection(long oldPosition, long newPosition, int flags); + +// /// Scroll into view. This takes a _caret_ position. +// virtual bool ScrollIntoView(long position, int keyCode); + +// /// 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. +// void MoveCaretForward(long oldPosition) ; + +// /// 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. +// void MoveCaretBack(long oldPosition) ; + +// /// Get the caret height and position for the given character position +// bool GetCaretPositionForIndex(long position, wxRect& rect); + +// /// Gets the line for the visible caret position. If the caret is +// /// shown at the very end of the line, it means the next character is actually +// /// on the following line. So let's get the line we're expecting to find +// /// if this is the case. +// wxRichTextLine* GetVisibleLineForCaretPosition(long caretPosition) const; + +// /// Gets the command processor +// wxCommandProcessor* GetCommandProcessor() const { return GetBuffer().GetCommandProcessor(); } + +// /// Delete content if there is a selection, e.g. when pressing a key. +// /// Returns the new caret position in newPos, or leaves it if there +// /// was no action. +// bool DeleteSelectedContent(long* newPos= NULL); + +// /// Transform logical to physical +// wxPoint GetPhysicalPoint(const wxPoint& ptLogical) const; + +// /// Transform physical to logical +// wxPoint GetLogicalPoint(const wxPoint& ptPhysical) const; + +// /// Finds the caret position for the next word. Direction +// /// is 1 (forward) or -1 (backwards). +// virtual long FindNextWordPosition(int direction = 1) const; + +// /// Is the given position visible on the screen? +// bool IsPositionVisible(long pos) const; + +// /// Returns the first visible position in the current view +// long GetFirstVisiblePosition() const; + +// /// Returns the caret position since the default formatting was changed. As +// /// soon as this position changes, we no longer reflect the default style +// /// in the UI. A value of -2 means that we should only reflect the style of the +// /// content under the caret. +// long GetCaretPositionForDefaultStyle() const { return m_caretPositionForDefaultStyle; } + +// /// Set the caret position for the default style that the user is selecting. +// void SetCaretPositionForDefaultStyle(long pos) { m_caretPositionForDefaultStyle = pos; } + +// /// Should the UI reflect the default style chosen by the user, rather than the style under +// /// the caret? +// bool IsDefaultStyleShowing() const { return m_caretPositionForDefaultStyle != -2; } + +// /// Convenience function that tells the control to start reflecting the default +// /// style, since the user is changing it. +// void SetAndShowDefaultStyle(const wxRichTextAttr& attr) +// { +// SetDefaultStyle(attr); +// SetCaretPositionForDefaultStyle(GetCaretPosition()); +// } + +// /// 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(); + +}; + + +//--------------------------------------------------------------------------- +%newgroup + + +%constant wxEventType wxEVT_COMMAND_RICHTEXT_LEFT_CLICK; +%constant wxEventType wxEVT_COMMAND_RICHTEXT_RIGHT_CLICK; +%constant wxEventType wxEVT_COMMAND_RICHTEXT_MIDDLE_CLICK; +%constant wxEventType wxEVT_COMMAND_RICHTEXT_LEFT_DCLICK; +%constant wxEventType wxEVT_COMMAND_RICHTEXT_RETURN; +%constant wxEventType wxEVT_COMMAND_RICHTEXT_CHARACTER; +%constant wxEventType wxEVT_COMMAND_RICHTEXT_DELETE; + +%constant wxEventType wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING; +%constant wxEventType wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGED; +%constant wxEventType wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACING; +%constant wxEventType wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACED; + +%constant wxEventType wxEVT_COMMAND_RICHTEXT_CONTENT_INSERTED; +%constant wxEventType wxEVT_COMMAND_RICHTEXT_CONTENT_DELETED; +%constant wxEventType wxEVT_COMMAND_RICHTEXT_STYLE_CHANGED; +%constant wxEventType wxEVT_COMMAND_RICHTEXT_SELECTION_CHANGED; + +%pythoncode { +EVT_RICHTEXT_LEFT_CLICK = wx.PyEventBinder(wxEVT_COMMAND_RICHTEXT_LEFT_CLICK, 1) +EVT_RICHTEXT_RIGHT_CLICK = wx.PyEventBinder(wxEVT_COMMAND_RICHTEXT_RIGHT_CLICK, 1) +EVT_RICHTEXT_MIDDLE_CLICK = wx.PyEventBinder(wxEVT_COMMAND_RICHTEXT_MIDDLE_CLICK, 1) +EVT_RICHTEXT_LEFT_DCLICK = wx.PyEventBinder(wxEVT_COMMAND_RICHTEXT_LEFT_DCLICK, 1) +EVT_RICHTEXT_RETURN = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_RETURN, 1) +EVT_RICHTEXT_CHARACTER = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_CHARACTER, 1) +EVT_RICHTEXT_DELETE = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_DELETE, 1) + +EVT_RICHTEXT_STYLESHEET_CHANGING = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING, 1) +EVT_RICHTEXT_STYLESHEET_CHANGED = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGED, 1) +EVT_RICHTEXT_STYLESHEET_REPLACING = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACING, 1) +EVT_RICHTEXT_STYLESHEET_REPLACED = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACED, 1) + +EVT_RICHTEXT_CONTENT_INSERTED = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_CONTENT_INSERTED, 1) +EVT_RICHTEXT_CONTENT_DELETED = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_CONTENT_DELETED, 1) +EVT_RICHTEXT_STYLE_CHANGED = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_STYLE_CHANGED, 1) +EVT_RICHTEXT_SELECTION_CHANGED = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_SELECTION_CHANGED, 1) +} + + +class wxRichTextEvent : public wxNotifyEvent +{ +public: + wxRichTextEvent(wxEventType commandType = wxEVT_NULL, int winid = 0); + + int GetPosition() const; + void SetPosition(int n); + + int GetFlags() const; + void SetFlags(int flags); + + wxRichTextStyleSheet* GetOldStyleSheet() const; + void SetOldStyleSheet(wxRichTextStyleSheet* sheet); + + wxRichTextStyleSheet* GetNewStyleSheet() const; + void SetNewStyleSheet(wxRichTextStyleSheet* sheet); + + const wxRichTextRange& GetRange() const; + void SetRange(const wxRichTextRange& range); + + wxChar GetCharacter() const; + void SetCharacter(wxChar ch); + + + %property(Flags, GetFlags, SetFlags); + %property(Index, GetPosition, SetPosition); + %property(OldStyleSheet, GetOldStyleSheet, SetOldStyleSheet); + %property(NewStyleSheet, GetNewStyleSheet, SetNewStyleSheet); + %property(Range, GetRange, SetRange); + %property(Character, GetCharacter, SetCharacter); +}; + + +//--------------------------------------------------------------------------- diff --git a/wxPython/src/_richtexthtml.i b/wxPython/src/_richtexthtml.i new file mode 100644 index 0000000000..0cd93849bd --- /dev/null +++ b/wxPython/src/_richtexthtml.i @@ -0,0 +1,102 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: _richtexthtml +// Purpose: wxRichTextHTMLHandler +// +// Author: Robin Dunn +// +// Created: 18-May-2007 +// RCS-ID: $Id$ +// Copyright: (c) 2007 by Total Control Software +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + +// Not a %module + + +//--------------------------------------------------------------------------- + +%{ +#include +%} + +//--------------------------------------------------------------------------- +%newgroup + +MAKE_CONST_WXSTRING2(HtmlName, wxT("HTML")); +MAKE_CONST_WXSTRING2(HtmlExt, wxT("html")); + +class wxRichTextHTMLHandler: public wxRichTextFileHandler +{ +public: + wxRichTextHTMLHandler(const wxString& name = wxPyHtmlName, + const wxString& ext = wxPyHtmlExt, + int type = wxRICHTEXT_TYPE_HTML); + + DocDeclStr( + virtual bool , CanSave() const, + "Can we save using this handler?", ""); + DocDeclStr( + virtual bool , CanLoad() const, + "Can we load using this handler?", ""); + DocDeclStr( + virtual bool , CanHandle(const wxString& filename) const, + "Can we handle this filename (if using files)? By default, checks the +extension.", ""); + + + DocDeclStr( + void , SetTemporaryImageLocations(const wxArrayString& locations), + "Set the list of image locations generated by the last operation", ""); + DocDeclStr( + const wxArrayString& , GetTemporaryImageLocations() const, + "Get the list of image locations generated by the last operation", ""); + %property(TemporaryImageLocations, GetTemporaryImageLocations, SetTemporaryImageLocations); + + + + DocDeclStr( + void , ClearTemporaryImageLocations(), + "Clear the image locations generated by the last operation", ""); + DocDeclStr( + bool , DeleteTemporaryImages(), + "Delete the in-memory or temporary files generated by the last operation", ""); + + +// DocDeclStr( +// static bool , DeleteTemporaryImages(int flags, const wxArrayString& imageLocations), +// "Delete the in-memory or temporary files generated by the last operation. This +// is a static function that can be used to delete the saved locations from an +// earlier operation, for example after the user has viewed the HTML file.", ""); + + + DocDeclStr( + static void , SetFileCounter(int counter), + "Reset the file counter, in case, for example, the same names are required each +time", ""); + + + DocDeclStr( + void , SetTempDir(const wxString& tempDir), + "Set the directory for storing temporary files. If empty, the system temporary +directory will be used.", ""); + DocDeclStr( + const wxString& , GetTempDir() const, + "Get the directory for storing temporary files. If empty, the system temporary +directory will be used.", ""); + %property(TempDir, GetTempDir, SetTempDir); + + + DocDeclStr( + void , SetFontSizeMapping(const wxArrayInt& fontSizeMapping), + "Set mapping from point size to HTML font size. There should be 7 elements, one +for each HTML font size, each element specifying the maximum point size for +that HTML font size. E.g. 8, 10, 13, 17, 22, 29, 100 +", ""); + DocDeclStr( + wxArrayInt , GetFontSizeMapping() const, + "Get mapping deom point size to HTML font size.", ""); + %property(FontSizeMapping, GetFontSizeMapping, SetFontSizeMapping); + +}; + +//--------------------------------------------------------------------------- diff --git a/wxPython/src/_richtextxml.i b/wxPython/src/_richtextxml.i new file mode 100644 index 0000000000..2afb539ddb --- /dev/null +++ b/wxPython/src/_richtextxml.i @@ -0,0 +1,67 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: _richtextxml +// Purpose: wxRichTextXMLHandler +// +// Author: Robin Dunn +// +// Created: 18-May-2007 +// RCS-ID: $Id$ +// Copyright: (c) 2007 by Total Control Software +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + +// Not a %module + + +//--------------------------------------------------------------------------- + +%{ +#include +%} + +//--------------------------------------------------------------------------- +%newgroup + +MAKE_CONST_WXSTRING2(XmlName, wxT("XML")); +MAKE_CONST_WXSTRING2(XmlExt, wxT("xml")); + + +class wxRichTextXMLHandler: public wxRichTextFileHandler +{ +public: + wxRichTextXMLHandler(const wxString& name = wxPyXmlName, + const wxString& ext = wxPyXmlExt, + int type = wxRICHTEXT_TYPE_XML); + +// #if wxUSE_STREAMS +// /// Recursively export an object +// bool ExportXML(wxOutputStream& stream, wxMBConv* convMem, wxMBConv* convFile, wxRichTextObject& obj, int level); +// bool ExportStyleDefinition(wxOutputStream& stream, wxMBConv* convMem, wxMBConv* convFile, wxRichTextStyleDefinition* def, int level); + +// /// Recursively import an object +// bool ImportXML(wxRichTextBuffer* buffer, wxXmlNode* node); +// bool ImportStyleDefinition(wxRichTextStyleSheet* sheet, wxXmlNode* node); + +// /// Create style parameters +// wxString CreateStyle(const wxTextAttrEx& attr, bool isPara = false); + +// /// Get style parameters +// bool GetStyle(wxTextAttrEx& attr, wxXmlNode* node, bool isPara = false); +// #endif + + /// Can we save using this handler? + virtual bool CanSave() const { return true; } + + /// Can we load using this handler? + virtual bool CanLoad() const { return true; } + + +// bool HasParam(wxXmlNode* node, const wxString& param); +// wxXmlNode *GetParamNode(wxXmlNode* node, const wxString& param); +// wxString GetNodeContent(wxXmlNode *node); +// wxString GetParamValue(wxXmlNode *node, const wxString& param); +// wxString GetText(wxXmlNode *node, const wxString& param = wxEmptyString, bool translate = false); + +}; + +//--------------------------------------------------------------------------- diff --git a/wxPython/src/richtext.i b/wxPython/src/richtext.i index 87a22da1bd..3b3165b267 100644 --- a/wxPython/src/richtext.i +++ b/wxPython/src/richtext.i @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: richtext.i -// Purpose: Classes for wxRichTExtCtrl and support classes +// Purpose: Classes for wxRichTextCtrl and support classes // // Author: Robin Dunn // @@ -39,7 +39,6 @@ class wxPrinterDC; //---------------------------------------------------------------------- %import windows.i -// ?? %import gdi.i %pythoncode { wx = _core } %pythoncode { __docfilter__ = wx.__DocFilter(globals()) } @@ -48,91 +47,7 @@ MAKE_CONST_WXSTRING_NOSWIG(EmptyString); //---------------------------------------------------------------------- -enum { - wxRE_READONLY, - wxRE_MULTILINE, - - wxRICHTEXT_SHIFT_DOWN, - wxRICHTEXT_CTRL_DOWN, - wxRICHTEXT_ALT_DOWN, - - wxRICHTEXT_SELECTED, - wxRICHTEXT_TAGGED, - wxRICHTEXT_FOCUSSED, - wxRICHTEXT_IS_FOCUS, - - wxRICHTEXT_TYPE_ANY, - wxRICHTEXT_TYPE_TEXT, - wxRICHTEXT_TYPE_XML, - wxRICHTEXT_TYPE_HTML, - wxRICHTEXT_TYPE_RTF, - wxRICHTEXT_TYPE_PDF, - - wxRICHTEXT_FIXED_WIDTH, - wxRICHTEXT_FIXED_HEIGHT, - wxRICHTEXT_VARIABLE_WIDTH, - wxRICHTEXT_VARIABLE_HEIGHT, - - - wxRICHTEXT_HITTEST_NONE, - wxRICHTEXT_HITTEST_BEFORE, - wxRICHTEXT_HITTEST_AFTER, - wxRICHTEXT_HITTEST_ON, - - wxRICHTEXT_FORMATTED, - wxRICHTEXT_UNFORMATTED, - - wxRICHTEXT_SETSTYLE_NONE, - wxRICHTEXT_SETSTYLE_WITH_UNDO, - wxRICHTEXT_SETSTYLE_OPTIMIZE, - wxRICHTEXT_SETSTYLE_PARAGRAPHS_ONLY, - wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY, - - wxRICHTEXT_INSERT_NONE, - wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE, - - - - // TODO: Rename these to be wxRICHTEXT_* ?? - - wxTEXT_ATTR_TEXT_COLOUR, - wxTEXT_ATTR_BACKGROUND_COLOUR, - wxTEXT_ATTR_FONT_FACE, - wxTEXT_ATTR_FONT_SIZE, - wxTEXT_ATTR_FONT_WEIGHT, - wxTEXT_ATTR_FONT_ITALIC, - wxTEXT_ATTR_FONT_UNDERLINE, - wxTEXT_ATTR_FONT, - wxTEXT_ATTR_ALIGNMENT, - wxTEXT_ATTR_LEFT_INDENT, - wxTEXT_ATTR_RIGHT_INDENT, - wxTEXT_ATTR_TABS, - - wxTEXT_ATTR_PARA_SPACING_AFTER, - wxTEXT_ATTR_PARA_SPACING_BEFORE, - wxTEXT_ATTR_LINE_SPACING, - wxTEXT_ATTR_CHARACTER_STYLE_NAME, - wxTEXT_ATTR_PARAGRAPH_STYLE_NAME, - wxTEXT_ATTR_BULLET_STYLE, - wxTEXT_ATTR_BULLET_NUMBER, - - wxTEXT_ATTR_BULLET_STYLE_NONE, - wxTEXT_ATTR_BULLET_STYLE_ARABIC, - wxTEXT_ATTR_BULLET_STYLE_LETTERS_UPPER, - wxTEXT_ATTR_BULLET_STYLE_LETTERS_LOWER, - wxTEXT_ATTR_BULLET_STYLE_ROMAN_UPPER, - wxTEXT_ATTR_BULLET_STYLE_ROMAN_LOWER, - wxTEXT_ATTR_BULLET_STYLE_SYMBOL, - wxTEXT_ATTR_BULLET_STYLE_BITMAP, - wxTEXT_ATTR_BULLET_STYLE_PARENTHESES, - wxTEXT_ATTR_BULLET_STYLE_PERIOD, - - wxTEXT_ATTR_LINE_SPACING_NORMAL, - wxTEXT_ATTR_LINE_SPACING_HALF, - wxTEXT_ATTR_LINE_SPACING_TWICE, - -}; - +// TODO: These are already defined in _textctrl.i, do we really need them here? enum wxTextAttrAlignment { wxTEXT_ALIGNMENT_DEFAULT, @@ -145,1427 +60,10 @@ enum wxTextAttrAlignment //---------------------------------------------------------------------- -%typemap(in) wxRichTextRange& (wxRichTextRange temp) { - $1 = &temp; - if ( ! wxRichTextRange_helper($input, &$1)) SWIG_fail; -} -%typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) wxRichTextRange& { - $1 = wxPySimple_typecheck($input, wxT("wxRichTextRange"), 2); -} - - -%{ - -bool wxRichTextRange_helper(PyObject* source, wxRichTextRange** obj) -{ - if (source == Py_None) { - **obj = wxRICHTEXT_NONE; - return true; - } - return wxPyTwoIntItem_helper(source, obj, wxT("wxRichTextRange")); -} -%} - - - -DocStr(wxRichTextRange, -"RichTextRange is a data structure that represents a range of text -within a `RichTextCtrl`. It simply contains integer ``start`` and -``end`` properties and a few operations useful for dealing with -ranges. In most places in wxPython where a RichTextRange is expected a -2-tuple containing (start, end) can be used instead.", ""); - -class wxRichTextRange -{ -public: - DocCtorStr( - wxRichTextRange(long start=0, long end=0), - "Creates a new range object.", ""); - - ~wxRichTextRange(); - - %extend { - KeepGIL(__eq__); - DocStr(__eq__, "Test for equality of RichTextRange objects.", ""); - bool __eq__(PyObject* other) { - wxRichTextRange temp, *obj = &temp; - if ( other == Py_None ) return false; - if ( ! wxRichTextRange_helper(other, &obj) ) { - PyErr_Clear(); - return false; - } - return self->operator==(*obj); - } - } - - - DocDeclStr( - wxRichTextRange , operator -(const wxRichTextRange& range) const, - "", ""); - - DocDeclStr( - wxRichTextRange , operator +(const wxRichTextRange& range) const, - "", ""); - - - DocDeclStr( - void , SetRange(long start, long end), - "", ""); - - - DocDeclStr( - void , SetStart(long start), - "", ""); - - DocDeclStr( - long , GetStart() const, - "", ""); - - %pythoncode { start = property(GetStart, SetStart) } - - DocDeclStr( - void , SetEnd(long end), - "", ""); - - DocDeclStr( - long , GetEnd() const, - "", ""); - - %pythoncode { end = property(GetEnd, SetEnd) } - - - DocDeclStr( - bool , IsOutside(const wxRichTextRange& range) const, - "Returns true if this range is completely outside 'range'", ""); - - - DocDeclStr( - bool , IsWithin(const wxRichTextRange& range) const, - "Returns true if this range is completely within 'range'", ""); - - - DocDeclStr( - bool , Contains(long pos) const, - "Returns true if the given position is within this range. Allow for the -possibility of an empty range - assume the position is within this -empty range.", ""); - - - DocDeclStr( - bool , LimitTo(const wxRichTextRange& range) , - "Limit this range to be within 'range'", ""); - - - DocDeclStr( - long , GetLength() const, - "Gets the length of the range", ""); - - - DocDeclStr( - void , Swap(), - "Swaps the start and end", ""); - - - %extend { - DocAStr(Get, - "Get() -> (start,end)", - "Returns the start and end properties as a tuple.", ""); - PyObject* Get() { - wxPyBlock_t blocked = wxPyBeginBlockThreads(); - PyObject* tup = PyTuple_New(2); - PyTuple_SET_ITEM(tup, 0, PyInt_FromLong(self->GetStart())); - PyTuple_SET_ITEM(tup, 1, PyInt_FromLong(self->GetEnd())); - wxPyEndBlockThreads(blocked); - return tup; - } - } - %pythoncode { - def __str__(self): return str(self.Get()) - def __repr__(self): return 'RichTextRange'+str(self.Get()) - def __len__(self): return len(self.Get()) - def __getitem__(self, index): return self.Get()[index] - def __setitem__(self, index, val): - if index == 0: self.start = val - elif index == 1: self.end = val - else: raise IndexError - def __nonzero__(self): return self.Get() != (0,0) - __safe_for_unpickling__ = True - def __reduce__(self): return (RichTextRange, self.Get()) - } - - %property(End, GetEnd, SetEnd, doc="See `GetEnd` and `SetEnd`"); - %property(Length, GetLength, doc="See `GetLength`"); - %property(Start, GetStart, SetStart, doc="See `GetStart` and `SetStart`"); -}; - - - -%{ - wxRichTextRange wxPy_RTR_ALL(wxRICHTEXT_ALL); - wxRichTextRange wxPy_RTR_NONE(wxRICHTEXT_NONE); -%} - -%rename(RICHTEXT_ALL) wxPy_RTR_ALL; -%rename(RICHTEXT_NONE) wxPy_RTR_NONE; - -%immutable; -wxRichTextRange wxPy_RTR_ALL; -wxRichTextRange wxPy_RTR_NONE; -%mutable; - -//---------------------------------------------------------------------- - -DocStr(wxRichTextAttr, -"The RichTextAttr class stored information about the various attributes -for a block of text, including font, colour, indents, alignments, and -etc.", ""); - -class wxRichTextAttr -{ -public: - - wxRichTextAttr(const wxColour& colText = wxNullColour, - const wxColour& colBack = wxNullColour, - wxTextAttrAlignment alignment = wxTEXT_ALIGNMENT_DEFAULT); - - ~wxRichTextAttr(); - -// // Making a wxTextAttrEx object. -// operator wxTextAttrEx () const ; - -// // Copy to a wxTextAttr -// void CopyTo(wxTextAttrEx& attr) const; - - - - // Create font from font attributes. - DocDeclStr( - wxFont , CreateFont() const, - "", ""); - - - // Get attributes from font. - bool GetFontAttributes(const wxFont& font); - - %pythoncode { - def GetFont(self): - return self.CreateFont() - def SetFont(self, font): - return self.GetFontAttributes(font) - } - - // setters - void SetTextColour(const wxColour& colText); - void SetBackgroundColour(const wxColour& colBack); - void SetAlignment(wxTextAttrAlignment alignment); - void SetTabs(const wxArrayInt& tabs); - void SetLeftIndent(int indent, int subIndent = 0); - void SetRightIndent(int indent); - - void SetFontSize(int pointSize); - void SetFontStyle(int fontStyle); - void SetFontWeight(int fontWeight); - void SetFontFaceName(const wxString& faceName); - void SetFontUnderlined(bool underlined); - - void SetFlags(long flags); - - void SetCharacterStyleName(const wxString& name); - void SetParagraphStyleName(const wxString& name); - void SetParagraphSpacingAfter(int spacing); - void SetParagraphSpacingBefore(int spacing); - void SetLineSpacing(int spacing); - void SetBulletStyle(int style); - void SetBulletNumber(int n); - void SetBulletText(wxChar symbol); - void SetBulletFont(const wxString& bulletFont); - - const wxColour& GetTextColour() const; - const wxColour& GetBackgroundColour() const; - wxTextAttrAlignment GetAlignment() const; - const wxArrayInt& GetTabs() const; - long GetLeftIndent() const; - long GetLeftSubIndent() const; - long GetRightIndent() const; - long GetFlags() const; - - int GetFontSize() const; - int GetFontStyle() const; - int GetFontWeight() const; - bool GetFontUnderlined() const; - const wxString& GetFontFaceName() const; - - const wxString& GetCharacterStyleName() const; - const wxString& GetParagraphStyleName() const; - int GetParagraphSpacingAfter() const; - int GetParagraphSpacingBefore() const; - int GetLineSpacing() const; - int GetBulletStyle() const; - int GetBulletNumber() const; - const wxString& GetBulletText() const; - const wxString& GetBulletFont() const; - - // accessors - bool HasTextColour() const; - bool HasBackgroundColour() const; - bool HasAlignment() const; - bool HasTabs() const; - bool HasLeftIndent() const; - bool HasRightIndent() const; -// bool HasWeight() const; -// bool HasSize() const; -// bool HasItalic() const; -// bool HasUnderlined() const; -// bool HasFaceName() const; - bool HasFont() const; - - bool HasParagraphSpacingAfter() const; - bool HasParagraphSpacingBefore() const; - bool HasLineSpacing() const; - bool HasCharacterStyleName() const; - bool HasParagraphStyleName() const; - bool HasBulletStyle() const; - bool HasBulletNumber() const; - bool HasBulletText() const; - - bool HasFlag(long flag) const; - - // Is this a character style? - bool IsCharacterStyle() const; - bool IsParagraphStyle() const; - - // returns false if we have any attributes set, true otherwise - bool IsDefault() const; - - -// // return the attribute having the valid font and colours: it uses the -// // attributes set in attr and falls back first to attrDefault and then to -// // the text control font/colours for those attributes which are not set -// static wxRichTextAttr Combine(const wxRichTextAttr& attr, -// const wxRichTextAttr& attrDef, -// const wxTextCtrlBase *text); - - - %property(Alignment, GetAlignment, SetAlignment, doc="See `GetAlignment` and `SetAlignment`"); - %property(BackgroundColour, GetBackgroundColour, SetBackgroundColour, doc="See `GetBackgroundColour` and `SetBackgroundColour`"); - %property(BulletFont, GetBulletFont, SetBulletFont, doc="See `GetBulletFont` and `SetBulletFont`"); - %property(BulletNumber, GetBulletNumber, SetBulletNumber, doc="See `GetBulletNumber` and `SetBulletNumber`"); - %property(BulletStyle, GetBulletStyle, SetBulletStyle, doc="See `GetBulletStyle` and `SetBulletStyle`"); - %property(BulletText, GetBulletText, SetBulletText, doc="See `GetBulletText` and `SetBulletText`"); - %property(CharacterStyleName, GetCharacterStyleName, SetCharacterStyleName, doc="See `GetCharacterStyleName` and `SetCharacterStyleName`"); - %property(Flags, GetFlags, SetFlags, doc="See `GetFlags` and `SetFlags`"); - %property(Font, GetFont, SetFont, doc="See `GetFont` and `SetFont`"); - %property(FontAttributes, GetFontAttributes, doc="See `GetFontAttributes`"); - %property(FontFaceName, GetFontFaceName, SetFontFaceName, doc="See `GetFontFaceName` and `SetFontFaceName`"); - %property(FontSize, GetFontSize, SetFontSize, doc="See `GetFontSize` and `SetFontSize`"); - %property(FontStyle, GetFontStyle, SetFontStyle, doc="See `GetFontStyle` and `SetFontStyle`"); - %property(FontUnderlined, GetFontUnderlined, SetFontUnderlined, doc="See `GetFontUnderlined` and `SetFontUnderlined`"); - %property(FontWeight, GetFontWeight, SetFontWeight, doc="See `GetFontWeight` and `SetFontWeight`"); - %property(LeftIndent, GetLeftIndent, SetLeftIndent, doc="See `GetLeftIndent` and `SetLeftIndent`"); - %property(LeftSubIndent, GetLeftSubIndent, doc="See `GetLeftSubIndent`"); - %property(LineSpacing, GetLineSpacing, SetLineSpacing, doc="See `GetLineSpacing` and `SetLineSpacing`"); - %property(ParagraphSpacingAfter, GetParagraphSpacingAfter, SetParagraphSpacingAfter, doc="See `GetParagraphSpacingAfter` and `SetParagraphSpacingAfter`"); - %property(ParagraphSpacingBefore, GetParagraphSpacingBefore, SetParagraphSpacingBefore, doc="See `GetParagraphSpacingBefore` and `SetParagraphSpacingBefore`"); - %property(ParagraphStyleName, GetParagraphStyleName, SetParagraphStyleName, doc="See `GetParagraphStyleName` and `SetParagraphStyleName`"); - %property(RightIndent, GetRightIndent, SetRightIndent, doc="See `GetRightIndent` and `SetRightIndent`"); - %property(Tabs, GetTabs, SetTabs, doc="See `GetTabs` and `SetTabs`"); - %property(TextColour, GetTextColour, SetTextColour, doc="See `GetTextColour` and `SetTextColour`"); -}; - - -enum { - wxTEXT_ATTR_CHARACTER, - wxTEXT_ATTR_PARAGRAPH, - wxTEXT_ATTR_ALL -}; - - -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- - -MustHaveApp(wxRichTextCtrl); -DocStr(wxRichTextCtrl, -"", ""); - -class wxRichTextCtrl : public wxScrolledWindow -{ -public: - %pythonAppend wxRichTextCtrl "self._setOORInfo(self)" - %pythonAppend wxRichTextCtrl() "" - - wxRichTextCtrl( wxWindow* parent, - wxWindowID id = -1, - const wxString& value = wxPyEmptyString, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = wxRE_MULTILINE ); - %RenameCtor(PreRichTextCtrl, wxRichTextCtrl()); - - - bool Create( wxWindow* parent, - wxWindowID id = -1, - const wxString& value = wxPyEmptyString, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = wxRE_MULTILINE ); - - - DocDeclStr( - virtual wxString , GetValue() const, - "", ""); - - DocDeclStr( - virtual void , SetValue(const wxString& value), - "", ""); - - - DocDeclStr( - virtual wxString , GetRange(long from, long to) const, - "", ""); - - - DocDeclStr( - virtual int , GetLineLength(long lineNo) const , - "", ""); - - DocDeclStr( - virtual wxString , GetLineText(long lineNo) const , - "", ""); - - DocDeclStr( - virtual int , GetNumberOfLines() const , - "", ""); - - - DocDeclStr( - virtual bool , IsModified() const , - "", ""); - - DocDeclStr( - virtual bool , IsEditable() const , - "", ""); - - - // more readable flag testing methods - DocDeclStr( - bool , IsSingleLine() const, - "", ""); - - DocDeclStr( - bool , IsMultiLine() const, - "", ""); - - - DocDeclAStr( - virtual void , GetSelection(long* OUTPUT, long* OUTPUT) const, - "GetSelection() --> (start, end)", - "Returns the start and end positions of the current selection. If the -values are the same then there is no selection.", ""); - - - DocDeclStr( - virtual wxString , GetStringSelection() const, - "", ""); - - - DocDeclStr( - wxString , GetFilename() const, - "", ""); - - - DocDeclStr( - void , SetFilename(const wxString& filename), - "", ""); - - - DocDeclStr( - void , SetDelayedLayoutThreshold(long threshold), - "Set the threshold in character positions for doing layout optimization -during sizing.", ""); - - - DocDeclStr( - long , GetDelayedLayoutThreshold() const, - "Get the threshold in character positions for doing layout optimization -during sizing.", ""); - - - - DocDeclStr( - virtual void , Clear(), - "", ""); - - DocDeclStr( - virtual void , Replace(long from, long to, const wxString& value), - "", ""); - - DocDeclStr( - virtual void , Remove(long from, long to), - "", ""); - - - DocDeclStr( - virtual bool , LoadFile(const wxString& file, int type = wxRICHTEXT_TYPE_ANY), - "Load the contents of the document from the given filename.", ""); - - DocDeclStr( - virtual bool , SaveFile(const wxString& file = wxPyEmptyString, - int type = wxRICHTEXT_TYPE_ANY), - "Save the contents of the document to the given filename, or if the -empty string is passed then to the filename set with `SetFilename`.", ""); - - - DocDeclStr( - void , SetHandlerFlags(int flags), - "Set the handler flags, controlling loading and saving.", ""); - - DocDeclStr( - int , GetHandlerFlags() const, - "Get the handler flags, controlling loading and saving.", ""); - - // sets/clears the dirty flag - DocDeclStr( - virtual void , MarkDirty(), - "Sets the dirty flag, meaning that the contents of the control have -changed and need to be saved.", ""); - - DocDeclStr( - virtual void , DiscardEdits(), - "Clears the dirty flag. -:see: `MarkDirty`", ""); - - - DocDeclStr( - virtual void , SetMaxLength(unsigned long len), - "Set the max number of characters which may be entered in a single line -text control.", ""); - - - DocDeclStr( - virtual void , WriteText(const wxString& text), - "Insert text at the current position.", ""); - - DocDeclStr( - virtual void , AppendText(const wxString& text), - "Append text to the end of the document.", ""); - - - DocDeclStr( - virtual bool , SetStyle(const wxRichTextRange& range, const wxRichTextAttr& style), - "Set the style for the text in ``range`` to ``style``", ""); - - DocDeclStr( - virtual bool , SetStyleEx(const wxRichTextRange& range, const wxRichTextAttr& style, - int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO), - "Extended style setting operation with flags including: -RICHTEXT_SETSTYLE_WITH_UNDO, RICHTEXT_SETSTYLE_OPTIMIZE, -RICHTEXT_SETSTYLE_PARAGRAPHS_ONLY, RICHTEXT_SETSTYLE_CHARACTERS_ONLY", ""); - - - - DocDeclStr( - virtual bool , GetStyle(long position, wxRichTextAttr& style), - "Retrieve the style used at the given position. Copies the style -values at ``position`` into the ``style`` parameter and returns ``True`` -if successful. Returns ``False`` otherwise.", ""); - - DocDeclStr( - virtual bool , GetUncombinedStyle(long position, wxRichTextAttr& style), - "Get the content (uncombined) attributes for this position. Copies the -style values at ``position`` into the ``style`` parameter and returns -``True`` if successful. Returns ``False`` otherwise.", ""); - - - DocDeclStr( - virtual bool , SetDefaultStyle(const wxRichTextAttr& style), - "Set the style used by default for the rich text document.", ""); - - - DocDeclStrName( - virtual const wxRichTextAttr , GetDefaultStyleEx() const, - "Retrieves a copy of the default style object.", "", - GetDefaultStyle); - - - DocDeclStr( - virtual long , XYToPosition(long x, long y) const, - "Translate a col,row coordinants into a document position.", ""); - - DocDeclAStr( - virtual void , PositionToXY(long pos, long *OUTPUT, long *OUTPUT) const, - "PositionToXY(self, long pos) --> (x, y)", - "Retrieves the col,row for the given position within the document", ""); - - - DocDeclStr( - virtual void , ShowPosition(long position), - "Ensure that the given position in the document is visible.", ""); - - - DocDeclAStr( - virtual wxTextCtrlHitTestResult , HitTest(const wxPoint& pt, long *OUTPUT) const, - "HitTest(self, Point pt) --> (result, pos)", - "Returns the character position at the given point in pixels. Note -that ``pt`` should be given in device coordinates, and not be adjusted -for the client area origin nor for scrolling. The return value is a -tuple of the hit test result and the position.", " - -Possible result values are a bitmask of these flags: - - ========================= ==================================== - RICHTEXT_HITTEST_NONE The point was not on this object. - RICHTEXT_HITTEST_BEFORE The point was before the position - returned from HitTest. - RICHTEXT_HITTEST_AFTER The point was after the position - returned from HitTest. - RICHTEXT_HITTEST_ON The point was on the position - returned from HitTest - ========================= ==================================== -"); - - DocDeclAStrName( - virtual wxTextCtrlHitTestResult , HitTest(const wxPoint& pt, - wxTextCoord *OUTPUT, - wxTextCoord *OUTPUT) const, - "HitTestRC(self, Point pt) --> (result, col, row)", - "Returns the column and row of the given point in pixels. Note that -``pt`` should be given in device coordinates, and not be adjusted for -the client area origin nor for scrolling. The return value is a tuple -of the hit test result and the column and row values.", " -:see: `HitTest`", - HitTestXY); - - - // Clipboard operations - DocDeclStr( - virtual void , Copy(), - "Copies the selected text to the clipboard.", ""); - - DocDeclStr( - virtual void , Cut(), - "Copies the selected text to the clipboard and removes the selection.", ""); - - DocDeclStr( - virtual void , Paste(), - "Pastes text from the clipboard into the document at the current -insertion point.", ""); - - DocDeclStr( - virtual void , DeleteSelection(), - "Remove the current selection.", ""); - - - DocDeclStr( - virtual bool , CanCopy() const, - "Returns ``True`` if the selection can be copied to the clipboard.", ""); - - DocDeclStr( - virtual bool , CanCut() const, - "Returns ``True`` if the selection can be cut to the clipboard.", ""); - - DocDeclStr( - virtual bool , CanPaste() const, - "Returns ``True`` if the current contents of the clipboard can be -pasted into the document.", ""); - - DocDeclStr( - virtual bool , CanDeleteSelection() const, - "Returns ``True`` if the selection can be removed from the document.", ""); - - - // Undo/redo - DocDeclStr( - virtual void , Undo(), - "If the last operation can be undone, undoes the last operation.", ""); - - DocDeclStr( - virtual void , Redo(), - "If the last operation can be redone, redoes the last operation.", ""); - - - DocDeclStr( - virtual bool , CanUndo() const, - "Returns ``True`` if the last operation can be undone.", ""); - - DocDeclStr( - virtual bool , CanRedo() const, - "Returns ``True`` if the last operation can be redone.", ""); - - - // Insertion point - DocDeclStr( - virtual void , SetInsertionPoint(long pos), - "Sets the insertion point at the given position.", ""); - - DocDeclStr( - virtual void , SetInsertionPointEnd(), - "Moves the insertion point to the end of the document.", ""); - - DocDeclStr( - virtual long , GetInsertionPoint() const, - "Returns the insertion point. This is defined as the zero based index -of the character position to the right of the insertion point.", ""); - - DocDeclStr( - virtual long , GetLastPosition() const, - "Returns the zero based index of the last position in the document.", ""); - - - DocDeclStr( - virtual void , SetSelection(long from, long to), - "Selects the text starting at the first position up to (but not -including) the character at the last position. If both parameters are -equal to -1 then all text in the control is selected.", ""); - - DocDeclStr( - virtual void , SelectAll(), - "Select all text in the document.", ""); - - DocDeclStr( - virtual void , SetEditable(bool editable), - "Makes the document editable or read-only, overriding the RE_READONLY -flag.", ""); - - -// /// Call Freeze to prevent refresh -// virtual void Freeze(); - -// /// Call Thaw to refresh -// virtual void Thaw(); - -// /// Call Thaw to refresh -// DocDeclStr( -// virtual bool , IsFrozen() const, -// "", ""); - - - DocDeclStr( - 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. - DocDeclStr( - virtual bool , WriteImage(const wxImage& image, int 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. - DocDeclStrName( - virtual bool , WriteImage(const wxBitmap& bitmap, int bitmapType = wxBITMAP_TYPE_PNG), - "", "", - WriteBitmap); - - - /// Load an image from file and write at the current insertion point. - DocDeclStrName( - virtual bool , WriteImage(const wxString& filename, int bitmapType), - "", "", - WriteImageFile); - - - /// Write an image block at the current insertion point. - DocDeclStrName( - virtual bool , WriteImage(const wxRichTextImageBlock& imageBlock), - "", "", - WriteImageBlock); - - - /// Insert a newline (actually paragraph) at the current insertion point. - DocDeclStr( - virtual bool , Newline(), - "", ""); - - -#if USE_TEXTATTREX -/// Set basic (overall) style - DocDeclStr( - virtual void , SetBasicStyle(const wxTextAttrEx& style), - "", ""); -#endif - - DocDeclStr( - virtual void , SetBasicStyle(const wxRichTextAttr& style), - "", ""); - - -#if USE_TEXTATTREX - /// Get basic (overall) style - DocDeclStr( - virtual const wxTextAttrEx& , GetBasicStyle() const, - "", ""); - - - /// Begin using a style - DocDeclStr( - virtual bool , BeginStyle(const wxTextAttrEx& style), - "", ""); -#endif - - /// End the style - DocDeclStr( - virtual bool , EndStyle(), - "", ""); - - - /// End all styles - DocDeclStr( - virtual bool , EndAllStyles(), - "", ""); - - - /// Begin using bold - DocDeclStr( - bool , BeginBold(), - "", ""); - - - /// End using bold - DocDeclStr( - bool , EndBold(), - "", ""); - - - /// Begin using italic - DocDeclStr( - bool , BeginItalic(), - "", ""); - - - /// End using italic - DocDeclStr( - bool , EndItalic(), - "", ""); - - - /// Begin using underline - DocDeclStr( - bool , BeginUnderline(), - "", ""); - - - /// End using underline - DocDeclStr( - bool , EndUnderline(), - "", ""); - - - /// Begin using point size - DocDeclStr( - bool , BeginFontSize(int pointSize), - "", ""); - - - /// End using point size - DocDeclStr( - bool , EndFontSize(), - "", ""); - - - /// Begin using this font - DocDeclStr( - bool , BeginFont(const wxFont& font), - "", ""); - - - /// End using a font - DocDeclStr( - bool , EndFont(), - "", ""); - - - /// Begin using this colour - DocDeclStr( - bool , BeginTextColour(const wxColour& colour), - "", ""); - - - /// End using a colour - DocDeclStr( - bool , EndTextColour(), - "", ""); - - - /// Begin using alignment - DocDeclStr( - bool , BeginAlignment(wxTextAttrAlignment alignment), - "", ""); - - - /// End alignment - DocDeclStr( - bool , EndAlignment(), - "", ""); - - - /// Begin left indent - DocDeclStr( - bool , BeginLeftIndent(int leftIndent, int leftSubIndent = 0), - "", ""); - - - /// End left indent - DocDeclStr( - bool , EndLeftIndent(), - "", ""); - - - /// Begin right indent - DocDeclStr( - bool , BeginRightIndent(int rightIndent), - "", ""); - - - /// End right indent - DocDeclStr( - bool , EndRightIndent(), - "", ""); - - - /// Begin paragraph spacing - DocDeclStr( - bool , BeginParagraphSpacing(int before, int after), - "", ""); - - - /// End paragraph spacing - DocDeclStr( - bool , EndParagraphSpacing(), - "", ""); - - - /// Begin line spacing - DocDeclStr( - bool , BeginLineSpacing(int lineSpacing), - "", ""); - - - /// End line spacing - DocDeclStr( - bool , EndLineSpacing(), - "", ""); - - - /// Begin numbered bullet - DocDeclStr( - bool , BeginNumberedBullet(int bulletNumber, - int leftIndent, - int leftSubIndent, - int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC|wxTEXT_ATTR_BULLET_STYLE_PERIOD), - "", ""); - - - /// End numbered bullet - DocDeclStr( - bool , EndNumberedBullet(), - "", ""); - - - /// Begin symbol bullet - DocDeclStr( - bool , BeginSymbolBullet(const wxString& symbol, - int leftIndent, - int leftSubIndent, - int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_SYMBOL), - "", ""); - - - /// End symbol bullet - DocDeclStr( - bool , EndSymbolBullet(), - "", ""); - - - /// Begin named character style - DocDeclStr( - bool , BeginCharacterStyle(const wxString& characterStyle), - "", ""); - - - /// End named character style - DocDeclStr( - bool , EndCharacterStyle(), - "", ""); - - - /// Begin named paragraph style - DocDeclStr( - bool , BeginParagraphStyle(const wxString& paragraphStyle), - "", ""); - - - /// End named character style - DocDeclStr( - bool , EndParagraphStyle(), - "", ""); - - - DocDeclStr( - bool , BeginListStyle(const wxString& listStyle, int level = 1, int number = 1), - "Begin named list style.", ""); - - DocDeclStr( - bool , EndListStyle(), "End named list style.", ""); - - DocDeclStr( - bool , BeginURL(const wxString& url, const wxString& characterStyle = wxEmptyString), - "Begin URL.", ""); - - DocDeclStr( - bool , EndURL(), "End URL.", ""); - - /// Sets the default style to the style under the cursor - DocDeclStr( - bool , SetDefaultStyleToCursorStyle(), - "", ""); - - - /// Clear the selection - DocDeclStr( - virtual void , SelectNone(), - "", ""); - - /// Select the word at the given character position - DocDeclStr( - virtual bool , SelectWord(long position), - "", ""); - - - /// Get/set the selection range in character positions. -1, -1 means no selection. - DocDeclStr( - wxRichTextRange , GetSelectionRange() const, - "", ""); - - DocDeclStr( - void , SetSelectionRange(const wxRichTextRange& range), - "", ""); - - /// Get/set the selection range in character positions. -1, -1 means no selection. - /// The range is in internal format, i.e. a single character selection is denoted - /// by (n, n) - DocDeclStr( - const wxRichTextRange& , GetInternalSelectionRange() const, - "", ""); - - DocDeclStr( - void , SetInternalSelectionRange(const wxRichTextRange& range), - "", ""); - - - - /// Add a new paragraph of text to the end of the buffer - DocDeclStr( - virtual wxRichTextRange , AddParagraph(const wxString& text), - "", ""); - - - /// Add an image - DocDeclStr( - virtual wxRichTextRange , AddImage(const wxImage& image), - "", ""); - - - /// Layout the buffer: which we must do before certain operations, such as - /// setting the caret position. - DocDeclStr( - virtual bool , LayoutContent(bool onlyVisibleRect = false), - "", ""); - - - /// Move the caret to the given character position - DocDeclStr( - virtual bool , MoveCaret(long pos, bool showAtLineStart = false), - "", ""); - - - /// Move right - DocDeclStr( - virtual bool , MoveRight(int noPositions = 1, int flags = 0), - "", ""); - - - /// Move left - DocDeclStr( - virtual bool , MoveLeft(int noPositions = 1, int flags = 0), - "", ""); - - - /// Move up - DocDeclStr( - virtual bool , MoveUp(int noLines = 1, int flags = 0), - "", ""); - - - /// Move up - DocDeclStr( - virtual bool , MoveDown(int noLines = 1, int flags = 0), - "", ""); - - - /// Move to the end of the line - DocDeclStr( - virtual bool , MoveToLineEnd(int flags = 0), - "", ""); - - - /// Move to the start of the line - DocDeclStr( - virtual bool , MoveToLineStart(int flags = 0), - "", ""); - - - /// Move to the end of the paragraph - DocDeclStr( - virtual bool , MoveToParagraphEnd(int flags = 0), - "", ""); - - - /// Move to the start of the paragraph - DocDeclStr( - virtual bool , MoveToParagraphStart(int flags = 0), - "", ""); - - - /// Move to the start of the buffer - DocDeclStr( - virtual bool , MoveHome(int flags = 0), - "", ""); - - - /// Move to the end of the buffer - DocDeclStr( - virtual bool , MoveEnd(int flags = 0), - "", ""); - - - /// Move n pages up - DocDeclStr( - virtual bool , PageUp(int noPages = 1, int flags = 0), - "", ""); - - - /// Move n pages down - DocDeclStr( - virtual bool , PageDown(int noPages = 1, int flags = 0), - "", ""); - - - /// Move n words left - DocDeclStr( - virtual bool , WordLeft(int noPages = 1, int flags = 0), - "", ""); - - - /// Move n words right - DocDeclStr( - virtual bool , WordRight(int noPages = 1, int flags = 0), - "", ""); - - - /// Returns the buffer associated with the control. -// wxRichTextBuffer& GetBuffer(); - DocDeclStr( - const wxRichTextBuffer& , GetBuffer() const, - "", ""); - - - /// Start batching undo history for commands. - DocDeclStr( - virtual bool , BeginBatchUndo(const wxString& cmdName), - "", ""); - - - /// End batching undo history for commands. - DocDeclStr( - virtual bool , EndBatchUndo(), - "", ""); - - - /// Are we batching undo history for commands? - DocDeclStr( - virtual bool , BatchingUndo() const, - "", ""); - - - /// Start suppressing undo history for commands. - DocDeclStr( - virtual bool , BeginSuppressUndo(), - "", ""); - - - /// End suppressing undo history for commands. - DocDeclStr( - virtual bool , EndSuppressUndo(), - "", ""); - - - /// Are we suppressing undo history for commands? - DocDeclStr( - virtual bool , SuppressingUndo() const, - "", ""); - - - /// 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 - /// can use this to implement, for example, bold button updating. style must have - /// flags indicating which attributes are of interest. -#if USE_TEXTATTREX - DocDeclStr( - virtual bool , HasCharacterAttributes(const wxRichTextRange& range, - const wxTextAttrEx& style) const, - "", ""); -#endif - - DocDeclStr( - virtual bool , HasCharacterAttributes(const wxRichTextRange& range, - const wxRichTextAttr& style) const, - "", ""); - - - - /// 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. -#if USE_TEXTATTREX - DocDeclStr( - virtual bool , HasParagraphAttributes(const wxRichTextRange& range, - const wxTextAttrEx& style) const, - "", ""); -#endif - - DocDeclStr( - virtual bool , HasParagraphAttributes(const wxRichTextRange& range, - const wxRichTextAttr& style) const, - "", ""); - - - - /// Is all of the selection bold? - DocDeclStr( - virtual bool , IsSelectionBold(), - "", ""); - - - /// Is all of the selection italics? - DocDeclStr( - virtual bool , IsSelectionItalics(), - "", ""); - - - /// Is all of the selection underlined? - DocDeclStr( - virtual bool , IsSelectionUnderlined(), - "", ""); - - - /// Is all of the selection aligned according to the specified flag? - DocDeclStr( - virtual bool , IsSelectionAligned(wxTextAttrAlignment alignment), - "", ""); - - - /// Apply bold to the selection - DocDeclStr( - virtual bool , ApplyBoldToSelection(), - "", ""); - - - /// Apply italic to the selection - DocDeclStr( - virtual bool , ApplyItalicToSelection(), - "", ""); - - - /// Apply underline to the selection - DocDeclStr( - virtual bool , ApplyUnderlineToSelection(), - "", ""); - - - /// Apply alignment to the selection - DocDeclStr( - virtual bool , ApplyAlignmentToSelection(wxTextAttrAlignment alignment), - "", ""); - - - /// Set style sheet, if any. - DocDeclStr( - void , SetStyleSheet(wxRichTextStyleSheet* styleSheet), - "", ""); - - DocDeclStr( - wxRichTextStyleSheet* , GetStyleSheet() const, - "", ""); - - /// Apply the style sheet to the buffer, for example if the styles have changed. - DocDeclStr( - bool , ApplyStyleSheet(wxRichTextStyleSheet* styleSheet = NULL), - "", ""); - - - - %property(Buffer, GetBuffer, doc="See `GetBuffer`"); - %property(DefaultStyle, GetDefaultStyle, SetDefaultStyle, doc="See `GetDefaultStyle` and `SetDefaultStyle`"); - %property(DelayedLayoutThreshold, GetDelayedLayoutThreshold, SetDelayedLayoutThreshold, doc="See `GetDelayedLayoutThreshold` and `SetDelayedLayoutThreshold`"); - %property(Filename, GetFilename, SetFilename, doc="See `GetFilename` and `SetFilename`"); - %property(InsertionPoint, GetInsertionPoint, SetInsertionPoint, doc="See `GetInsertionPoint` and `SetInsertionPoint`"); - %property(InternalSelectionRange, GetInternalSelectionRange, SetInternalSelectionRange, doc="See `GetInternalSelectionRange` and `SetInternalSelectionRange`"); - %property(LastPosition, GetLastPosition, doc="See `GetLastPosition`"); - %property(NumberOfLines, GetNumberOfLines, doc="See `GetNumberOfLines`"); - %property(Selection, GetSelection, SetSelectionRange, doc="See `GetSelection` and `SetSelection`"); - %property(SelectionRange, GetSelectionRange, SetSelectionRange, doc="See `GetSelectionRange` and `SetSelectionRange`"); - %property(StringSelection, GetStringSelection, doc="See `GetStringSelection`"); - %property(StyleSheet, GetStyleSheet, SetStyleSheet, doc="See `GetStyleSheet` and `SetStyleSheet`"); - %property(Value, GetValue, SetValue, doc="See `GetValue` and `SetValue`"); - -// Implementation -// TODO: Which of these should be exposed to Python? - -// /// Set font, and also default attributes -// virtual bool SetFont(const wxFont& font); - -// /// Set up scrollbars, e.g. after a resize -// virtual void SetupScrollbars(bool atTop = false); - -// /// Keyboard navigation -// virtual bool KeyboardNavigate(int keyCode, int flags); - -// /// Paint the background -// virtual void PaintBackground(wxDC& dc); - -// /// 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); - -// /// 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 -// // (duplicated code from wxTextCtrlBase) -// #if !wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE -// virtual void DoUpdateWindowUI(wxUpdateUIEvent& event); -// #endif - -// /// Should we inherit colours? -// virtual bool ShouldInheritColours() const; - -// /// Position the caret -// virtual void PositionCaret(); - -// /// Extend the selection, returning true if the selection was -// /// changed. Selections are in caret positions. -// virtual bool ExtendSelection(long oldPosition, long newPosition, int flags); - -// /// Scroll into view. This takes a _caret_ position. -// virtual bool ScrollIntoView(long position, int keyCode); - -// /// 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; - -// /// 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. -// void MoveCaretForward(long oldPosition) ; - -// /// 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. -// void MoveCaretBack(long oldPosition) ; - -// /// Get the caret height and position for the given character position -// bool GetCaretPositionForIndex(long position, wxRect& rect); - -// /// Gets the line for the visible caret position. If the caret is -// /// shown at the very end of the line, it means the next character is actually -// /// on the following line. So let's get the line we're expecting to find -// /// if this is the case. -// wxRichTextLine* GetVisibleLineForCaretPosition(long caretPosition) const; - -// /// Gets the command processor -// wxCommandProcessor* GetCommandProcessor() const; - -// /// Delete content if there is a selection, e.g. when pressing a key. -// /// Returns the new caret position in newPos, or leaves it if there -// /// was no action. -// bool DeleteSelectedContent(long* newPos= NULL); - -// /// Transform logical to physical -// wxPoint GetPhysicalPoint(const wxPoint& ptLogical) const; - -// /// Transform physical to logical -// wxPoint GetLogicalPoint(const wxPoint& ptPhysical) const; - -// /// Finds the caret position for the next word. Direction -// /// is 1 (forward) or -1 (backwards). -// virtual long FindNextWordPosition(int direction = 1) const; - -// /// 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; -}; - - -//---------------------------------------------------------------------- - - -%constant wxEventType wxEVT_COMMAND_RICHTEXT_LEFT_CLICK; -%constant wxEventType wxEVT_COMMAND_RICHTEXT_RIGHT_CLICK; -%constant wxEventType wxEVT_COMMAND_RICHTEXT_MIDDLE_CLICK; -%constant wxEventType wxEVT_COMMAND_RICHTEXT_LEFT_DCLICK; -%constant wxEventType wxEVT_COMMAND_RICHTEXT_RETURN; -%constant wxEventType wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING; -%constant wxEventType wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGED; -%constant wxEventType wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACING; -%constant wxEventType wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACED; -%constant wxEventType wxEVT_COMMAND_RICHTEXT_CHARACTER; -%constant wxEventType wxEVT_COMMAND_RICHTEXT_DELETE; - -%pythoncode { -EVT_RICHTEXT_LEFT_CLICK = wx.PyEventBinder(wxEVT_COMMAND_RICHTEXT_LEFT_CLICK, 1) -EVT_RICHTEXT_RIGHT_CLICK = wx.PyEventBinder(wxEVT_COMMAND_RICHTEXT_RIGHT_CLICK, 1) -EVT_RICHTEXT_MIDDLE_CLICK = wx.PyEventBinder(wxEVT_COMMAND_RICHTEXT_MIDDLE_CLICK, 1) -EVT_RICHTEXT_LEFT_DCLICK = wx.PyEventBinder(wxEVT_COMMAND_RICHTEXT_LEFT_DCLICK, 1) -EVT_RICHTEXT_RETURN = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_RETURN, 1) -EVT_RICHTEXT_STYLESHEET_CHANGING = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING, 1) -EVT_RICHTEXT_STYLESHEET_CHANGED = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGED, 1) -EVT_RICHTEXT_STYLESHEET_REPLACING = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACING, 1) -EVT_RICHTEXT_STYLESHEET_REPLACED = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACED, 1) -EVT_RICHTEXT_CHARACTER = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_CHARACTER, 1) -EVT_RICHTEXT_DELETE = wx.PyEventBinder( wxEVT_COMMAND_RICHTEXT_DELETE, 1) -} - - -class wxRichTextEvent : public wxNotifyEvent -{ -public: - wxRichTextEvent(wxEventType commandType = wxEVT_NULL, int winid = 0); - - int GetPosition() const; - void SetPosition(int n); - - int GetFlags() const; - void SetFlags(int flags); - - %property(Flags, GetFlags, SetFlags, doc="See `GetFlags` and `SetFlags`"); - %property(Index, GetPosition, SetPosition, doc="See `GetPosition` and `SetPosition`"); -}; +%include _richtextbuffer.i +%include _richtextctrl.i +%include _richtexthtml.i +%include _richtextxml.i //----------------------------------------------------------------------