From b6cc6ae2c6428693cd2c4ce622f10a6990c247b9 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Thu, 17 Mar 2011 09:23:18 +0000 Subject: [PATCH] Fixed problems caused by duplicated names across different style types. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@67222 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 2 + src/richtext/richtextstyles.cpp | 91 +++++++++++++++++++++++++-------- 2 files changed, 72 insertions(+), 21 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 9af91ace5d..29b4152df0 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -113,6 +113,8 @@ All (GUI): they exist in the paragraph style. - wxRTC: fixed IsPositionVisible to scroll a position into view correctly. - wxRTC: fixed a problem with paste resetting the content paragraph style. +- wxRTC: style list box now copes with names duplicated across style types. + Also fixed wxRichTextStyleDefinition::GetStyleMergeWithBase similarly. - Fixed error in generic tree control CalculatePositions. - Added wxFD_FILE_MUST_EXIST to wxFileSelector function. - Added wxDataViewCtrl Get/SetValueByRow functions for forward compatibility diff --git a/src/richtext/richtextstyles.cpp b/src/richtext/richtextstyles.cpp index 80561b582c..c97acef959 100644 --- a/src/richtext/richtextstyles.cpp +++ b/src/richtext/richtextstyles.cpp @@ -58,7 +58,11 @@ wxRichTextAttr wxRichTextStyleDefinition::GetStyleMergedWithBase(const wxRichTex { if (m_baseStyle.IsEmpty()) return m_style; - + + bool isParaStyle = IsKindOf(CLASSINFO(wxRichTextParagraphStyleDefinition)); + bool isCharStyle = IsKindOf(CLASSINFO(wxRichTextCharacterStyleDefinition)); + bool isListStyle = IsKindOf(CLASSINFO(wxRichTextListStyleDefinition)); + // Collect the styles, detecting loops wxArrayString styleNames; wxList styles; @@ -67,14 +71,23 @@ wxRichTextAttr wxRichTextStyleDefinition::GetStyleMergedWithBase(const wxRichTex { styles.Insert((wxObject*) def); styleNames.Add(def->GetName()); - + wxString baseStyleName = def->GetBaseStyle(); if (!baseStyleName.IsEmpty() && styleNames.Index(baseStyleName) == wxNOT_FOUND) - def = sheet->FindStyle(baseStyleName); + { + if (isParaStyle) + def = sheet->FindParagraphStyle(baseStyleName); + else if (isCharStyle) + def = sheet->FindCharacterStyle(baseStyleName); + else if (isListStyle) + def = sheet->FindListStyle(baseStyleName); + else + def = sheet->FindStyle(baseStyleName); + } else def = NULL; } - + wxRichTextAttr attr; wxList::compatibility_iterator node = styles.GetFirst(); while (node) @@ -83,7 +96,7 @@ wxRichTextAttr wxRichTextStyleDefinition::GetStyleMergedWithBase(const wxRichTex attr.Apply(def->GetStyle(), NULL); node = node->GetNext(); } - + return attr; } @@ -479,6 +492,20 @@ bool wxRichTextStyleSheet::operator==(const wxRichTextStyleSheet& WXUNUSED(sheet #if wxUSE_HTML + +// Functions for dealing with clashing names for different kinds of style. +// Returns "P", "C", or "L" (paragraph, character, list) for +// style name | type. +static wxString wxGetRichTextStyleType(const wxString& style) +{ + return style.AfterLast(wxT('|')); +} + +static wxString wxGetRichTextStyle(const wxString& style) +{ + return style.BeforeLast(wxT('|')); +} + /*! * wxRichTextStyleListBox: a listbox to display styles. */ @@ -530,7 +557,16 @@ wxRichTextStyleDefinition* wxRichTextStyleListBox::GetStyle(size_t i) const if (i >= m_styleNames.GetCount() /* || i < 0 */ ) return NULL; - return GetStyleSheet()->FindStyle(m_styleNames[i]); + wxString styleType = wxGetRichTextStyleType(m_styleNames[i]); + wxString style = wxGetRichTextStyle(m_styleNames[i]); + if (styleType == wxT("P")) + return GetStyleSheet()->FindParagraphStyle(style); + else if (styleType == wxT("C")) + return GetStyleSheet()->FindCharacterStyle(style); + else if (styleType == wxT("L")) + return GetStyleSheet()->FindListStyle(style); + else + return GetStyleSheet()->FindStyle(style); } /// Updates the list @@ -548,17 +584,17 @@ void wxRichTextStyleListBox::UpdateStyles() if (GetStyleType() == wxRICHTEXT_STYLE_ALL || GetStyleType() == wxRICHTEXT_STYLE_PARAGRAPH) { for (i = 0; i < GetStyleSheet()->GetParagraphStyleCount(); i++) - m_styleNames.Add(GetStyleSheet()->GetParagraphStyle(i)->GetName()); + m_styleNames.Add(GetStyleSheet()->GetParagraphStyle(i)->GetName() + wxT("|P")); } if (GetStyleType() == wxRICHTEXT_STYLE_ALL || GetStyleType() == wxRICHTEXT_STYLE_CHARACTER) { for (i = 0; i < GetStyleSheet()->GetCharacterStyleCount(); i++) - m_styleNames.Add(GetStyleSheet()->GetCharacterStyle(i)->GetName()); + m_styleNames.Add(GetStyleSheet()->GetCharacterStyle(i)->GetName() + wxT("|C")); } if (GetStyleType() == wxRICHTEXT_STYLE_ALL || GetStyleType() == wxRICHTEXT_STYLE_LIST) { for (i = 0; i < GetStyleSheet()->GetListStyleCount(); i++) - m_styleNames.Add(GetStyleSheet()->GetListStyle(i)->GetName()); + m_styleNames.Add(GetStyleSheet()->GetListStyle(i)->GetName() + wxT("|L")); } m_styleNames.Sort(); @@ -583,7 +619,23 @@ void wxRichTextStyleListBox::UpdateStyles() // Get index for style name int wxRichTextStyleListBox::GetIndexForStyle(const wxString& name) const { - return m_styleNames.Index(name); + wxString s(name); + if (GetStyleType() == wxRICHTEXT_STYLE_PARAGRAPH) + s += wxT("|P"); + else if (GetStyleType() == wxRICHTEXT_STYLE_CHARACTER) + s += wxT("|C"); + else if (GetStyleType() == wxRICHTEXT_STYLE_LIST) + s += wxT("|L"); + else + { + if (m_styleNames.Index(s + wxT("|P")) != wxNOT_FOUND) + s += wxT("|P"); + else if (m_styleNames.Index(s + wxT("|C")) != wxNOT_FOUND) + s += wxT("|C"); + else if (m_styleNames.Index(s + wxT("|L")) != wxNOT_FOUND) + s += wxT("|L"); + } + return m_styleNames.Index(s); } /// Set selection for string @@ -652,21 +704,18 @@ wxString wxRichTextStyleListBox::CreateHTML(wxRichTextStyleDefinition* def) cons wxString normalTranslated(_("normal")); wxString defaultTranslated(_("default")); size_t i; - for (i = 0; i < m_styleNames.GetCount(); i++) + for (i = 0; i < GetStyleSheet()->GetParagraphStyleCount(); i++) { - wxString name = m_styleNames[i].Lower(); + wxRichTextStyleDefinition* d = GetStyleSheet()->GetParagraphStyle(i); + wxString name = d->GetName().Lower(); if (name.Find(wxT("normal")) != wxNOT_FOUND || name.Find(normalTranslated) != wxNOT_FOUND || name.Find(wxT("default")) != wxNOT_FOUND || name.Find(defaultTranslated) != wxNOT_FOUND) { - wxRichTextStyleDefinition* d = GetStyleSheet()->FindStyle(m_styleNames[i]); - if (d) + wxRichTextAttr attr2(d->GetStyleMergedWithBase(GetStyleSheet())); + if (attr2.HasFontSize()) { - wxRichTextAttr attr2(d->GetStyleMergedWithBase(GetStyleSheet())); - if (attr2.HasFontSize()) - { - stdFontSize = attr2.GetFontSize(); - break; - } + stdFontSize = attr2.GetFontSize(); + break; } } } @@ -680,7 +729,7 @@ wxString wxRichTextStyleListBox::CreateHTML(wxRichTextStyleDefinition* def) cons sizes.Add(0); for (i = 0; i < m_styleNames.GetCount(); i++) { - wxRichTextStyleDefinition* d = GetStyleSheet()->FindStyle(m_styleNames[i]); + wxRichTextStyleDefinition* d = GetStyle(i); if (d) { wxRichTextAttr attr2(d->GetStyleMergedWithBase(GetStyleSheet()));