IMPLEMENT_CLASS(wxRichTextCharacterStyleDefinition, wxRichTextStyleDefinition)
IMPLEMENT_CLASS(wxRichTextParagraphStyleDefinition, wxRichTextStyleDefinition)
IMPLEMENT_CLASS(wxRichTextListStyleDefinition, wxRichTextParagraphStyleDefinition)
+IMPLEMENT_CLASS(wxRichTextBoxStyleDefinition, wxRichTextStyleDefinition)
/*!
* A definition
}
/// 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;
}
- 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;
}
/*!
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
*/
}
/// 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)
return NULL;
}
-wxTextAttr* wxRichTextListStyleDefinition::GetLevelAttributes(int i)
+wxRichTextAttr* wxRichTextListStyleDefinition::GetLevelAttributes(int i)
{
wxASSERT( (i >= 0 && i < 10) );
if (i >= 0 && i < 10)
wxASSERT( (i >= 0 && i < 10) );
if (i >= 0 && i < 10)
{
- wxTextAttr attr;
+ wxRichTextAttr attr;
attr.SetBulletStyle(bulletStyle);
attr.SetLeftIndent(leftIndent, leftSubIndent);
/// 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();
/// 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);
/// 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();
return true;
if (RemoveListStyle(def, deleteStyle))
return true;
+ if (RemoveBoxStyle(def, deleteStyle))
+ return true;
return false;
}
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
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)
{
if (charDef)
return AddCharacterStyle(charDef);
+ wxRichTextBoxStyleDefinition* boxDef = wxDynamicCast(def, wxRichTextBoxStyleDefinition);
+ if (boxDef)
+ return AddBoxStyle(boxDef);
+
return false;
}
if (charDef)
return charDef;
+ wxRichTextBoxStyleDefinition* boxDef = FindBoxStyle(name, recurse);
+ if (boxDef)
+ return boxDef;
+
return NULL;
}
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());
}
{
if (GetStyleSheet())
{
+ int oldSel = GetSelection();
+
SetSelection(wxNOT_FOUND);
m_styleNames.Clear();
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();
}
}
bool isCentred = false;
- wxTextAttr attr(def->GetStyleMergedWithBase(GetStyleSheet()));
+ wxRichTextAttr attr(def->GetStyleMergedWithBase(GetStyleSheet()));
if (attr.HasAlignment() && attr.GetAlignment() == wxTEXT_ALIGNMENT_CENTRE)
isCentred = true;
wxString styleName;
- wxTextAttr attr;
+ wxRichTextAttr attr;
ctrl->GetStyle(adjustedCaretPos, attr);
// Take into account current default style just chosen by user
else if ((styleType == wxRICHTEXT_STYLE_ALL || styleType == wxRICHTEXT_STYLE_LIST) &&
!attr.GetListStyleName().IsEmpty())
styleName = attr.GetListStyleName();
+ // TODO: when we have a concept of focused object (text box), we'll
+ // use the paragraph style name of the focused object as the frame style name.
+#if 0
+ else if ((styleType == wxRICHTEXT_STYLE_ALL || styleType == wxRICHTEXT_STYLE_BOX) &&
+ !attr.GetBoxStyleName().IsEmpty())
+ styleName = attr.GetBoxStyleName();
+#endif
}
else if ((styleType == wxRICHTEXT_STYLE_ALL || styleType == wxRICHTEXT_STYLE_CHARACTER) &&
!attr.GetCharacterStyleName().IsEmpty())
choices.Add(_("Paragraph styles"));
choices.Add(_("Character styles"));
choices.Add(_("List styles"));
+ choices.Add(_("Box styles"));
m_styleChoice = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, choices);
return;
wxRichTextStyleListBox::wxRichTextStyleType styleType = StyleIndexToType(event.GetSelection());
+ m_styleListBox->SetSelection(-1);
m_styleListBox->SetStyleType(styleType);
}
}
{
return 3;
}
+ else if (styleType == wxRichTextStyleListBox::wxRICHTEXT_STYLE_BOX)
+ {
+ return 4;
+ }
return 0;
}
return wxRichTextStyleListBox::wxRICHTEXT_STYLE_CHARACTER;
else if (i == 3)
return wxRichTextStyleListBox::wxRICHTEXT_STYLE_LIST;
+ else if (i == 4)
+ return wxRichTextStyleListBox::wxRICHTEXT_STYLE_BOX;
return wxRichTextStyleListBox::wxRICHTEXT_STYLE_ALL;
}