Fixed problems caused by duplicated names across different style types.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67223 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart 2011-03-17 09:46:59 +00:00
parent 057f610bae
commit 6d53143092

View File

@ -60,6 +60,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));
bool isBoxStyle = IsKindOf(CLASSINFO(wxRichTextBoxStyleDefinition));
// Collect the styles, detecting loops
wxArrayString styleNames;
wxList styles;
@ -71,7 +76,18 @@ wxRichTextAttr wxRichTextStyleDefinition::GetStyleMergedWithBase(const wxRichTex
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 if (isBoxStyle)
def = sheet->FindBoxStyle(baseStyleName);
else
def = sheet->FindStyle(baseStyleName);
}
else
def = NULL;
}
@ -518,6 +534,21 @@ bool wxRichTextStyleSheet::operator==(const wxRichTextStyleSheet& WXUNUSED(sheet
#if wxUSE_HTML
// Functions for dealing with clashing names for different kinds of style.
// Returns "P", "C", "L" or "B" (paragraph, character, list or box) 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.
*/
@ -569,7 +600,18 @@ 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 if (styleType == wxT("B"))
return GetStyleSheet()->FindBoxStyle(style);
else
return GetStyleSheet()->FindStyle(style);
}
/// Updates the list
@ -587,22 +629,22 @@ 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"));
}
if (GetStyleType() == wxRICHTEXT_STYLE_ALL || GetStyleType() == wxRICHTEXT_STYLE_BOX)
{
for (i = 0; i < GetStyleSheet()->GetBoxStyleCount(); i++)
m_styleNames.Add(GetStyleSheet()->GetBoxStyle(i)->GetName());
m_styleNames.Add(GetStyleSheet()->GetBoxStyle(i)->GetName() + wxT("|B"));
}
m_styleNames.Sort();
@ -627,7 +669,27 @@ 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 (GetStyleType() == wxRICHTEXT_STYLE_BOX)
s += wxT("|B");
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");
else if (m_styleNames.Index(s + wxT("|B")) != wxNOT_FOUND)
s += wxT("|B");
}
return m_styleNames.Index(s);
}
/// Set selection for string
@ -696,21 +758,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)
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;
}
}
}
@ -724,7 +783,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()));