X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/44cc96a80c09c8572e1315be66d29f6d610cbf78..50a2a3553af0449fefad444c04e91dea2589092c:/src/richtext/richtextstyles.cpp diff --git a/src/richtext/richtextstyles.cpp b/src/richtext/richtextstyles.cpp index ca97d596de..af2c0f4f37 100644 --- a/src/richtext/richtextstyles.cpp +++ b/src/richtext/richtextstyles.cpp @@ -35,6 +35,7 @@ IMPLEMENT_CLASS(wxRichTextStyleDefinition, wxObject) IMPLEMENT_CLASS(wxRichTextCharacterStyleDefinition, wxRichTextStyleDefinition) IMPLEMENT_CLASS(wxRichTextParagraphStyleDefinition, wxRichTextStyleDefinition) IMPLEMENT_CLASS(wxRichTextListStyleDefinition, wxRichTextParagraphStyleDefinition) +IMPLEMENT_CLASS(wxRichTextBoxStyleDefinition, wxRichTextStyleDefinition) /*! * A definition @@ -54,19 +55,37 @@ bool wxRichTextStyleDefinition::Eq(const wxRichTextStyleDefinition& def) const } /// Gets the style combined with the base style -wxTextAttr wxRichTextStyleDefinition::GetStyleMergedWithBase(const wxRichTextStyleSheet* sheet) const +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) - { - wxTextAttr 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; + } + + wxRichTextAttr attr; + wxList::compatibility_iterator node = styles.GetFirst(); + while (node) + { + wxRichTextStyleDefinition* def = (wxRichTextStyleDefinition*) node->GetData(); + attr.Apply(def->GetStyle(), NULL); + node = node->GetNext(); } - return m_style; + + return attr; } /*! @@ -85,6 +104,20 @@ bool wxRichTextParagraphStyleDefinition::operator ==(const wxRichTextParagraphSt return (Eq(def) && m_nextStyle == def.m_nextStyle); } +/*! + * Box style definition + */ + +void wxRichTextBoxStyleDefinition::Copy(const wxRichTextBoxStyleDefinition& def) +{ + wxRichTextStyleDefinition::Copy(def); +} + +bool wxRichTextBoxStyleDefinition::operator ==(const wxRichTextBoxStyleDefinition& def) const +{ + return (Eq(def)); +} + /*! * List style definition */ @@ -111,14 +144,14 @@ bool wxRichTextListStyleDefinition::operator ==(const wxRichTextListStyleDefinit } /// Sets/gets the attributes for the given level -void wxRichTextListStyleDefinition::SetLevelAttributes(int i, const wxTextAttr& attr) +void wxRichTextListStyleDefinition::SetLevelAttributes(int i, const wxRichTextAttr& attr) { wxASSERT( (i >= 0 && i < 10) ); if (i >= 0 && i < 10) m_levelStyles[i] = attr; } -const wxTextAttr* wxRichTextListStyleDefinition::GetLevelAttributes(int i) const +const wxRichTextAttr* wxRichTextListStyleDefinition::GetLevelAttributes(int i) const { wxASSERT( (i >= 0 && i < 10) ); if (i >= 0 && i < 10) @@ -127,7 +160,7 @@ const wxTextAttr* wxRichTextListStyleDefinition::GetLevelAttributes(int i) const return NULL; } -wxTextAttr* wxRichTextListStyleDefinition::GetLevelAttributes(int i) +wxRichTextAttr* wxRichTextListStyleDefinition::GetLevelAttributes(int i) { wxASSERT( (i >= 0 && i < 10) ); if (i >= 0 && i < 10) @@ -142,7 +175,7 @@ void wxRichTextListStyleDefinition::SetAttributes(int i, int leftIndent, int lef wxASSERT( (i >= 0 && i < 10) ); if (i >= 0 && i < 10) { - wxTextAttr attr; + wxRichTextAttr attr; attr.SetBulletStyle(bulletStyle); attr.SetLeftIndent(leftIndent, leftSubIndent); @@ -178,11 +211,11 @@ int wxRichTextListStyleDefinition::FindLevelForIndent(int indent) const /// Combine the list style with a paragraph style, using the given indent (from which /// an appropriate level is found) -wxTextAttr wxRichTextListStyleDefinition::CombineWithParagraphStyle(int indent, const wxTextAttr& paraStyle, wxRichTextStyleSheet* styleSheet) +wxRichTextAttr wxRichTextListStyleDefinition::CombineWithParagraphStyle(int indent, const wxRichTextAttr& paraStyle, wxRichTextStyleSheet* styleSheet) { int listLevel = FindLevelForIndent(indent); - wxTextAttr attr(*GetLevelAttributes(listLevel)); + wxRichTextAttr attr(*GetLevelAttributes(listLevel)); int oldLeftIndent = attr.GetLeftIndent(); int oldLeftSubIndent = attr.GetLeftSubIndent(); @@ -203,7 +236,7 @@ wxTextAttr wxRichTextListStyleDefinition::CombineWithParagraphStyle(int indent, /// Combine the base and list style, using the given indent (from which /// an appropriate level is found) -wxTextAttr wxRichTextListStyleDefinition::GetCombinedStyle(int indent, wxRichTextStyleSheet* styleSheet) +wxRichTextAttr wxRichTextListStyleDefinition::GetCombinedStyle(int indent, wxRichTextStyleSheet* styleSheet) { int listLevel = FindLevelForIndent(indent); return GetCombinedStyleForLevel(listLevel, styleSheet); @@ -211,9 +244,9 @@ wxTextAttr wxRichTextListStyleDefinition::GetCombinedStyle(int indent, wxRichTex /// Combine the base and list style, using the given indent (from which /// an appropriate level is found) -wxTextAttr wxRichTextListStyleDefinition::GetCombinedStyleForLevel(int listLevel, wxRichTextStyleSheet* styleSheet) +wxRichTextAttr wxRichTextListStyleDefinition::GetCombinedStyleForLevel(int listLevel, wxRichTextStyleSheet* styleSheet) { - wxTextAttr attr(*GetLevelAttributes(listLevel)); + wxRichTextAttr attr(*GetLevelAttributes(listLevel)); int oldLeftIndent = attr.GetLeftIndent(); int oldLeftSubIndent = attr.GetLeftSubIndent(); @@ -297,6 +330,8 @@ bool wxRichTextStyleSheet::RemoveStyle(wxRichTextStyleDefinition* def, bool dele return true; if (RemoveListStyle(def, deleteStyle)) return true; + if (RemoveBoxStyle(def, deleteStyle)) + return true; return false; } @@ -322,6 +357,7 @@ void wxRichTextStyleSheet::DeleteStyles() WX_CLEAR_LIST(wxList, m_characterStyleDefinitions); WX_CLEAR_LIST(wxList, m_paragraphStyleDefinitions); WX_CLEAR_LIST(wxList, m_listStyleDefinitions); + WX_CLEAR_LIST(wxList, m_boxStyleDefinitions); } /// Insert into list of style sheets @@ -387,6 +423,13 @@ bool wxRichTextStyleSheet::AddListStyle(wxRichTextListStyleDefinition* def) return AddStyle(m_listStyleDefinitions, def); } +/// Add a definition to the box style list +bool wxRichTextStyleSheet::AddBoxStyle(wxRichTextBoxStyleDefinition* def) +{ + def->GetStyle().SetParagraphStyleName(def->GetName()); + return AddStyle(m_boxStyleDefinitions, def); +} + /// Add a definition to the appropriate style list bool wxRichTextStyleSheet::AddStyle(wxRichTextStyleDefinition* def) { @@ -402,6 +445,10 @@ bool wxRichTextStyleSheet::AddStyle(wxRichTextStyleDefinition* def) if (charDef) return AddCharacterStyle(charDef); + wxRichTextBoxStyleDefinition* boxDef = wxDynamicCast(def, wxRichTextBoxStyleDefinition); + if (boxDef) + return AddBoxStyle(boxDef); + return false; } @@ -420,6 +467,10 @@ wxRichTextStyleDefinition* wxRichTextStyleSheet::FindStyle(const wxString& name, if (charDef) return charDef; + wxRichTextBoxStyleDefinition* boxDef = FindBoxStyle(name, recurse); + if (boxDef) + return boxDef; + return NULL; } @@ -448,6 +499,12 @@ void wxRichTextStyleSheet::Copy(const wxRichTextStyleSheet& sheet) AddListStyle(new wxRichTextListStyleDefinition(*def)); } + for (node = sheet.m_boxStyleDefinitions.GetFirst(); node; node = node->GetNext()) + { + wxRichTextBoxStyleDefinition* def = (wxRichTextBoxStyleDefinition*) node->GetData(); + AddBoxStyle(new wxRichTextBoxStyleDefinition(*def)); + } + SetName(sheet.GetName()); SetDescription(sheet.GetDescription()); } @@ -520,6 +577,8 @@ void wxRichTextStyleListBox::UpdateStyles() { if (GetStyleSheet()) { + int oldSel = GetSelection(); + SetSelection(wxNOT_FOUND); m_styleNames.Clear(); @@ -540,15 +599,26 @@ void wxRichTextStyleListBox::UpdateStyles() for (i = 0; i < GetStyleSheet()->GetListStyleCount(); i++) m_styleNames.Add(GetStyleSheet()->GetListStyle(i)->GetName()); } + 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.Sort(); SetItemCount(m_styleNames.GetCount()); Refresh(); - if (GetItemCount() > 0) + int newSel = -1; + if (oldSel >= 0 && oldSel < (int) GetItemCount()) + newSel = oldSel; + else if (GetItemCount() > 0) + newSel = 0; + + if (newSel >= 0) { - SetSelection(0); + SetSelection(newSel); SendSelectedEvent(); } } @@ -590,7 +660,7 @@ wxString wxRichTextStyleListBox::CreateHTML(wxRichTextStyleDefinition* def) cons bool isCentred = false; - wxTextAttr attr(def->GetStyleMergedWithBase(GetStyleSheet())); + wxRichTextAttr attr(def->GetStyleMergedWithBase(GetStyleSheet())); if (attr.HasAlignment() && attr.GetAlignment() == wxTEXT_ALIGNMENT_CENTRE) isCentred = true; @@ -614,18 +684,76 @@ wxString wxRichTextStyleListBox::CreateHTML(wxRichTextStyleDefinition* def) cons str << wxT("