From dbf712b6073c383d0c57cc62a63be2377a4736de Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Mon, 7 Jun 2010 07:39:45 +0000 Subject: [PATCH] GetStyleMergedWithBase no longer hangs if there's a loop implied by based-on styles. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@64520 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + src/richtext/richtextstyles.cpp | 36 ++++++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index d4bf363d3e..4a52a58946 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -95,6 +95,7 @@ All (GUI): - wxRTC: fixed style selection resetting after editing a style. - wxRTC: can now edit line spacing in .1 increments from 1 to 2. +- wxRTC: GetStyleMergedWithBase now detects loops. wxMSW: diff --git a/src/richtext/richtextstyles.cpp b/src/richtext/richtextstyles.cpp index 9bf0e5563c..80561b582c 100644 --- a/src/richtext/richtextstyles.cpp +++ b/src/richtext/richtextstyles.cpp @@ -56,17 +56,35 @@ bool wxRichTextStyleDefinition::Eq(const wxRichTextStyleDefinition& def) const /// Gets the style combined with the base style wxRichTextAttr wxRichTextStyleDefinition::GetStyleMergedWithBase(const wxRichTextStyleSheet* sheet) const { - if (!m_baseStyle.IsEmpty()) + if (m_baseStyle.IsEmpty()) + return m_style; + + // Collect the styles, detecting loops + wxArrayString styleNames; + wxList styles; + const wxRichTextStyleDefinition* def = this; + while (def) { - wxRichTextStyleDefinition* baseStyle = sheet->FindStyle(m_baseStyle); - if (baseStyle) - { - wxRichTextAttr baseAttr = baseStyle->GetStyleMergedWithBase(sheet); - baseAttr.Apply(m_style, NULL); - return baseAttr; - } + styles.Insert((wxObject*) def); + styleNames.Add(def->GetName()); + + wxString baseStyleName = def->GetBaseStyle(); + if (!baseStyleName.IsEmpty() && styleNames.Index(baseStyleName) == wxNOT_FOUND) + def = sheet->FindStyle(baseStyleName); + else + def = NULL; } - return m_style; + + wxRichTextAttr attr; + wxList::compatibility_iterator node = styles.GetFirst(); + while (node) + { + wxRichTextStyleDefinition* def = (wxRichTextStyleDefinition*) node->GetData(); + attr.Apply(def->GetStyle(), NULL); + node = node->GetNext(); + } + + return attr; } /*!