From: Julian Smart Date: Thu, 14 Oct 2010 18:06:02 +0000 (+0000) Subject: Fixed #12566 (assert on deletion) due to inconsistent commit X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/5ad9ae3a29787f4cdf6dfc1c69d77fedfa2f4c73 Fixed #12566 (assert on deletion) due to inconsistent commit git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65805 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/richtext/richtextbuffer.h b/include/wx/richtext/richtextbuffer.h index 6f79ca90d3..afb4139089 100644 --- a/include/wx/richtext/richtextbuffer.h +++ b/include/wx/richtext/richtextbuffer.h @@ -1510,14 +1510,14 @@ protected: * TODO: a floating text box */ -class WXDLLIMPEXP_RICHTEXT wxRichTextBox: public wxRichTextParagraphLayoutBox +class WXDLLIMPEXP_RICHTEXT wxRichTextBox: public wxRichTextCompositeObject { DECLARE_DYNAMIC_CLASS(wxRichTextBox) public: // Constructors wxRichTextBox(wxRichTextObject* parent = NULL); - wxRichTextBox(const wxRichTextBox& obj): wxRichTextParagraphLayoutBox() { Copy(obj); } + wxRichTextBox(const wxRichTextBox& obj): wxRichTextCompositeObject() { Copy(obj); } // Overrideables @@ -1527,6 +1527,10 @@ public: /// Lay the item out virtual bool Layout(wxDC& dc, const wxRect& rect, int style); + /// Get/set the object size for the given range. Returns false if the range + /// is invalid for this object. + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const; + // Accessors // Operations diff --git a/samples/richtext/richtext.cpp b/samples/richtext/richtext.cpp index 1c5b0b97b7..1f728785ae 100644 --- a/samples/richtext/richtext.cpp +++ b/samples/richtext/richtext.cpp @@ -792,7 +792,7 @@ void MyFrame::WriteInitialText() imageAttr.GetTextBoxAttr().GetTop().SetUnits(wxTEXT_ATTR_UNITS_PIXELS); imageAttr.GetTextBoxAttr().SetFloatMode(wxTEXT_BOX_ATTR_FLOAT_RIGHT); r.WriteImage(wxBitmap(zebra_xpm), wxBITMAP_TYPE_PNG, imageAttr); - r.WriteText(wxString(wxT("This is a simple test for a floating left image test. The zebra image should be placed at the left side of the current buffer and all the text should flow around it at the right side. This is a simple test for a floating left image test. The zebra image should be placed at the left side of the current buffer and all the text should flow around it at the right side. This is a simple test for a floating left image test. The zebra image should be placed at the left side of the current buffer and all the text should flow around it at the right side."))); + r.WriteText(wxString(wxT("This is a simple test for a floating right image test. The zebra image should be placed at the right side of the current buffer and all the text should flow around it at the left side. This is a simple test for a floating left image test. The zebra image should be placed at the right side of the current buffer and all the text should flow around it at the left side. This is a simple test for a floating left image test. The zebra image should be placed at the right side of the current buffer and all the text should flow around it at the left side."))); r.EndAlignment(); r.Newline(); diff --git a/src/richtext/richtextbuffer.cpp b/src/richtext/richtextbuffer.cpp index e7a1a328f5..0473d2f20e 100644 --- a/src/richtext/richtextbuffer.cpp +++ b/src/richtext/richtextbuffer.cpp @@ -6866,26 +6866,59 @@ bool wxRichTextStdRenderer::EnumerateStandardBulletNames(wxArrayString& bulletNa IMPLEMENT_DYNAMIC_CLASS(wxRichTextBox, wxRichTextCompositeObject) wxRichTextBox::wxRichTextBox(wxRichTextObject* parent): - wxRichTextParagraphLayoutBox(parent) + wxRichTextCompositeObject(parent) { } /// Draw the item -bool wxRichTextBox::Draw(wxDC& dc, const wxRichTextRange& range, const wxRichTextRange& selectionRange, const wxRect& rect, int descent, int style) +bool wxRichTextBox::Draw(wxDC& dc, const wxRichTextRange& range, const wxRichTextRange& selectionRange, const wxRect& WXUNUSED(rect), int descent, int style) { - return wxRichTextParagraphLayoutBox::Draw(dc, range, selectionRange, rect, descent, style); + wxRichTextObjectList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxRichTextObject* child = node->GetData(); + + wxRect childRect = wxRect(child->GetPosition(), child->GetCachedSize()); + child->Draw(dc, range, selectionRange, childRect, descent, style); + + node = node->GetNext(); + } + return true; } /// Lay the item out bool wxRichTextBox::Layout(wxDC& dc, const wxRect& rect, int style) { - return wxRichTextParagraphLayoutBox::Layout(dc, rect, style); + wxRichTextObjectList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxRichTextObject* child = node->GetData(); + child->Layout(dc, rect, style); + + node = node->GetNext(); + } + m_dirty = false; + return true; + } /// Copy void wxRichTextBox::Copy(const wxRichTextBox& obj) { - wxRichTextParagraphLayoutBox::Copy(obj); + wxRichTextCompositeObject::Copy(obj); +} + +/// Get/set the size for the given range. Assume only has one child. +bool wxRichTextBox::GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position, wxArrayInt* partialExtents) const +{ + wxRichTextObjectList::compatibility_iterator node = m_children.GetFirst(); + if (node) + { + wxRichTextObject* child = node->GetData(); + return child->GetRangeSize(range, size, descent, dc, flags, position, partialExtents); + } + else + return false; } /*