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
This commit is contained in:
Julian Smart
2011-03-17 09:23:18 +00:00
parent d904d43ce2
commit b6cc6ae2c6
2 changed files with 72 additions and 21 deletions

View File

@@ -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

View File

@@ -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()));