Added list style to text attributes, independent from paragraph style

Added list style definition
Added SetListStyle, ClearListStyle, NumberList, PromoteList to
buffer and control classes
Changed style listbox so double-click applies style instead of
single click. This allows for multiple items to be applicable,
and also in future to edit styles from this listbox without
accidentally applying the style to content.
Added wxRichTextStyleListCtrl which also shows a wxChoice for
selecting the type of style to display.
Style sheets can form a chain to allow inheritance from current
style sheet (not yet supported by style list controls).
Added PushStyleSheet/PopStyleSheet.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42075 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2006-10-17 14:09:14 +00:00
parent daca43d847
commit 38f833b10c
6 changed files with 1372 additions and 143 deletions

View File

@@ -1617,7 +1617,7 @@ bool wxRichTextParagraphLayoutBox::SetStyle(const wxRichTextRange& range, const
}
else
newPara = para;
if (paragraphStyle && !charactersOnly)
{
if (applyMinimal)
@@ -2108,6 +2108,21 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons
currentStyle.SetParagraphStyleName(style.GetParagraphStyleName());
}
if (style.HasListStyleName() && !wxHasStyle(multipleStyleAttributes, wxTEXT_ATTR_LIST_STYLE_NAME))
{
if (currentStyle.HasListStyleName())
{
if (currentStyle.HasListStyleName() != style.HasListStyleName())
{
// Clash of style - mark as such
multipleStyleAttributes |= wxTEXT_ATTR_LIST_STYLE_NAME;
currentStyle.SetFlags(currentStyle.GetFlags() & ~wxTEXT_ATTR_LIST_STYLE_NAME);
}
}
else
currentStyle.SetListStyleName(style.GetListStyleName());
}
if (style.HasBulletStyle() && !wxHasStyle(multipleStyleAttributes, wxTEXT_ATTR_BULLET_STYLE))
{
if (currentStyle.HasBulletStyle())
@@ -2410,7 +2425,57 @@ bool wxRichTextParagraphLayoutBox::ApplyStyleSheet(wxRichTextStyleSheet* styleSh
if (para)
{
if (!para->GetAttributes().GetParagraphStyleName().IsEmpty())
// Combine paragraph and list styles. If there is a list style in the original attributes,
// the current indentation overrides anything else and is used to find the item indentation.
// Also, for applying paragraph styles, consider having 2 modes: (1) we merge with what we have,
// thereby taking into account all user changes, (2) reset the style completely (except for indentation/list
// exception as above).
// Problem: when changing from one list style to another, there's a danger that the level info will get lost.
// So when changing a list style interactively, could retrieve level based on current style, then
// set appropriate indent and apply new style.
if (!para->GetAttributes().GetParagraphStyleName().IsEmpty() && !para->GetAttributes().GetListStyleName().IsEmpty())
{
int currentIndent = para->GetAttributes().GetLeftIndent();
wxRichTextParagraphStyleDefinition* paraDef = styleSheet->FindParagraphStyle(para->GetAttributes().GetParagraphStyleName());
wxRichTextListStyleDefinition* listDef = styleSheet->FindListStyle(para->GetAttributes().GetListStyleName());
if (paraDef && !listDef)
{
para->GetAttributes() = paraDef->GetStyle();
foundCount ++;
}
else if (listDef && !paraDef)
{
// Set overall style defined for the list style definition
para->GetAttributes() = listDef->GetStyle();
// Apply the style for this level
wxRichTextApplyStyle(para->GetAttributes(), * listDef->GetLevelAttributes(listDef->FindLevelForIndent(currentIndent)));
foundCount ++;
}
else if (listDef && paraDef)
{
// Combines overall list style, style for level, and paragraph style
para->GetAttributes() = listDef->CombineWithParagraphStyle(currentIndent, paraDef->GetStyle());
foundCount ++;
}
}
else if (para->GetAttributes().GetParagraphStyleName().IsEmpty() && !para->GetAttributes().GetListStyleName().IsEmpty())
{
int currentIndent = para->GetAttributes().GetLeftIndent();
wxRichTextListStyleDefinition* listDef = styleSheet->FindListStyle(para->GetAttributes().GetListStyleName());
// Overall list definition style
para->GetAttributes() = listDef->GetStyle();
// Style for this level
wxRichTextApplyStyle(para->GetAttributes(), * listDef->GetLevelAttributes(listDef->FindLevelForIndent(currentIndent)));
foundCount ++;
}
else if (!para->GetAttributes().GetParagraphStyleName().IsEmpty() && para->GetAttributes().GetListStyleName().IsEmpty())
{
wxRichTextParagraphStyleDefinition* def = styleSheet->FindParagraphStyle(para->GetAttributes().GetParagraphStyleName());
if (def)
@@ -2426,6 +2491,344 @@ bool wxRichTextParagraphLayoutBox::ApplyStyleSheet(wxRichTextStyleSheet* styleSh
return foundCount != 0;
}
/// Set list style
bool wxRichTextParagraphLayoutBox::SetListStyle(const wxRichTextRange& range, wxRichTextListStyleDefinition* def, int flags, int startFrom, int specifiedLevel)
{
bool withUndo = ((flags & wxRICHTEXT_SETSTYLE_WITH_UNDO) != 0);
// bool applyMinimal = ((flags & wxRICHTEXT_SETSTYLE_OPTIMIZE) != 0);
bool specifyLevel = ((flags & wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL) != 0);
bool renumber = ((flags & wxRICHTEXT_SETSTYLE_RENUMBER) != 0);
// Current number, if numbering
int n = startFrom;
wxASSERT (!specifyLevel || (specifyLevel && (specifiedLevel >= 0)));
// If we are associated with a control, make undoable; otherwise, apply immediately
// to the data.
bool haveControl = (GetRichTextCtrl() != NULL);
wxRichTextAction* action = NULL;
if (haveControl && withUndo)
{
action = new wxRichTextAction(NULL, _("Change List Style"), wxRICHTEXT_CHANGE_STYLE, & GetRichTextCtrl()->GetBuffer(), GetRichTextCtrl());
action->SetRange(range);
action->SetPosition(GetRichTextCtrl()->GetCaretPosition());
}
wxRichTextObjectList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
wxRichTextParagraph* para = wxDynamicCast(node->GetData(), wxRichTextParagraph);
wxASSERT (para != NULL);
if (para && para->GetChildCount() > 0)
{
// Stop searching if we're beyond the range of interest
if (para->GetRange().GetStart() > range.GetEnd())
break;
if (!para->GetRange().IsOutside(range))
{
// We'll be using a copy of the paragraph to make style changes,
// not updating the buffer directly.
wxRichTextParagraph* newPara wxDUMMY_INITIALIZE(NULL);
if (haveControl && withUndo)
{
newPara = new wxRichTextParagraph(*para);
action->GetNewParagraphs().AppendChild(newPara);
// Also store the old ones for Undo
action->GetOldParagraphs().AppendChild(new wxRichTextParagraph(*para));
}
else
newPara = para;
if (def)
{
int thisIndent = newPara->GetAttributes().GetLeftIndent();
int thisLevel = specifyLevel ? specifiedLevel : def->FindLevelForIndent(thisIndent);
// How is numbering going to work?
// If we are renumbering, or numbering for the first time, we need to keep
// track of the number for each level. But we might be simply applying a different
// list style.
// In Word, applying a style to several paragraphs, even if at different levels,
// reverts the level back to the same one. So we could do the same here.
// Renumbering will need to be done when we promote/demote a paragraph.
// Apply the overall list style, and item style for this level
wxTextAttrEx listStyle(def->GetCombinedStyleForLevel(thisLevel));
wxRichTextApplyStyle(newPara->GetAttributes(), listStyle);
// Now we need to check numbering
if (renumber)
{
newPara->GetAttributes().SetBulletNumber(n);
}
n ++;
}
else if (!newPara->GetAttributes().GetListStyleName().IsEmpty())
{
// if def is NULL, remove list style, applying any associated paragraph style
// to restore the attributes
newPara->GetAttributes().SetListStyleName(wxEmptyString);
newPara->GetAttributes().SetLeftIndent(0, 0);
// Eliminate the main list-related attributes
newPara->GetAttributes().SetFlags(newPara->GetAttributes().GetFlags() & ~wxTEXT_ATTR_LEFT_INDENT & ~wxTEXT_ATTR_BULLET_STYLE & ~wxTEXT_ATTR_BULLET_NUMBER & ~wxTEXT_ATTR_BULLET_SYMBOL & wxTEXT_ATTR_LIST_STYLE_NAME);
wxRichTextStyleSheet* styleSheet = GetStyleSheet();
if (styleSheet && !newPara->GetAttributes().GetParagraphStyleName().IsEmpty())
{
wxRichTextParagraphStyleDefinition* def = styleSheet->FindParagraphStyle(newPara->GetAttributes().GetParagraphStyleName());
if (def)
{
newPara->GetAttributes() = def->GetStyle();
}
}
}
}
}
node = node->GetNext();
}
// Do action, or delay it until end of batch.
if (haveControl && withUndo)
GetRichTextCtrl()->GetBuffer().SubmitAction(action);
return true;
}
bool wxRichTextParagraphLayoutBox::SetListStyle(const wxRichTextRange& range, const wxString& defName, int flags, int startFrom, int specifiedLevel)
{
if (GetStyleSheet())
{
wxRichTextListStyleDefinition* def = GetStyleSheet()->FindListStyle(defName);
if (def)
return SetListStyle(range, def, flags, startFrom, specifiedLevel);
}
return false;
}
/// Clear list for given range
bool wxRichTextParagraphLayoutBox::ClearListStyle(const wxRichTextRange& range, int flags)
{
return SetListStyle(range, NULL, flags);
}
/// Number/renumber any list elements in the given range
bool wxRichTextParagraphLayoutBox::NumberList(const wxRichTextRange& range, wxRichTextListStyleDefinition* def, int flags, int startFrom, int specifiedLevel)
{
return DoNumberList(range, range, 0, def, flags, startFrom, specifiedLevel);
}
/// Number/renumber any list elements in the given range. Also do promotion or demotion of items, if specified
bool wxRichTextParagraphLayoutBox::DoNumberList(const wxRichTextRange& range, const wxRichTextRange& promotionRange, int promoteBy,
wxRichTextListStyleDefinition* def, int flags, int startFrom, int specifiedLevel)
{
bool withUndo = ((flags & wxRICHTEXT_SETSTYLE_WITH_UNDO) != 0);
// bool applyMinimal = ((flags & wxRICHTEXT_SETSTYLE_OPTIMIZE) != 0);
bool specifyLevel = ((flags & wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL) != 0);
bool renumber = ((flags & wxRICHTEXT_SETSTYLE_RENUMBER) != 0);
// Max number of levels
const int maxLevels = 10;
// The level we're looking at now
int currentLevel = -1;
// The item number for each level
int levels[maxLevels];
int i;
// Reset all numbering
for (i = 0; i < maxLevels; i++)
{
if (startFrom != -1)
levels[i] = startFrom;
else if (renumber) // start again
levels[i] = 1;
else
levels[i] = -1; // start from the number we found, if any
}
wxASSERT(!specifyLevel || (specifyLevel && (specifiedLevel >= 0)));
// If we are associated with a control, make undoable; otherwise, apply immediately
// to the data.
bool haveControl = (GetRichTextCtrl() != NULL);
wxRichTextAction* action = NULL;
if (haveControl && withUndo)
{
action = new wxRichTextAction(NULL, _("Renumber List"), wxRICHTEXT_CHANGE_STYLE, & GetRichTextCtrl()->GetBuffer(), GetRichTextCtrl());
action->SetRange(range);
action->SetPosition(GetRichTextCtrl()->GetCaretPosition());
}
wxRichTextObjectList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
wxRichTextParagraph* para = wxDynamicCast(node->GetData(), wxRichTextParagraph);
wxASSERT (para != NULL);
if (para && para->GetChildCount() > 0)
{
// Stop searching if we're beyond the range of interest
if (para->GetRange().GetStart() > range.GetEnd())
break;
if (!para->GetRange().IsOutside(range))
{
// We'll be using a copy of the paragraph to make style changes,
// not updating the buffer directly.
wxRichTextParagraph* newPara wxDUMMY_INITIALIZE(NULL);
if (haveControl && withUndo)
{
newPara = new wxRichTextParagraph(*para);
action->GetNewParagraphs().AppendChild(newPara);
// Also store the old ones for Undo
action->GetOldParagraphs().AppendChild(new wxRichTextParagraph(*para));
}
else
newPara = para;
wxRichTextListStyleDefinition* defToUse = def;
if (!defToUse)
{
wxRichTextStyleSheet* sheet = GetStyleSheet();
if (sheet && !newPara->GetAttributes().GetListStyleName().IsEmpty())
defToUse = sheet->FindListStyle(newPara->GetAttributes().GetListStyleName());
}
if (defToUse)
{
int thisIndent = newPara->GetAttributes().GetLeftIndent();
int thisLevel = defToUse->FindLevelForIndent(thisIndent);
// If the paragraph doesn't have an indent, or we've specified a level to apply to all,
// change the level.
if (thisIndent == 0 || specifiedLevel != -1)
thisLevel = specifiedLevel;
// Do promotion if specified
if ((promoteBy != 0) && !para->GetRange().IsOutside(promotionRange))
{
thisLevel = thisLevel - promoteBy;
if (thisLevel < 0)
thisLevel = 0;
if (thisLevel > 9)
thisLevel = 9;
}
// Apply the overall list style, and item style for this level
wxTextAttrEx listStyle(defToUse->GetCombinedStyleForLevel(thisLevel));
wxRichTextApplyStyle(newPara->GetAttributes(), listStyle);
// OK, we've (re)applied the style, now let's get the numbering right.
if (currentLevel == -1)
currentLevel = thisLevel;
// Same level as before, do nothing except increment level's number afterwards
if (currentLevel == thisLevel)
{
}
// A deeper level: start renumbering all levels after current level
else if (thisLevel > currentLevel)
{
for (i = currentLevel+1; i <= thisLevel; i++)
{
levels[i] = 1;
}
currentLevel = thisLevel;
}
else if (thisLevel < currentLevel)
{
currentLevel = thisLevel;
}
// Use the current numbering if -1 and we have a bullet number already
if (levels[currentLevel] == -1)
{
if (newPara->GetAttributes().HasBulletNumber())
levels[currentLevel] = newPara->GetAttributes().GetBulletNumber();
else
levels[currentLevel] = 1;
}
newPara->GetAttributes().SetBulletNumber(levels[currentLevel]);
levels[currentLevel] ++;
}
}
}
node = node->GetNext();
}
// Do action, or delay it until end of batch.
if (haveControl && withUndo)
GetRichTextCtrl()->GetBuffer().SubmitAction(action);
return true;
}
bool wxRichTextParagraphLayoutBox::NumberList(const wxRichTextRange& range, const wxString& defName, int flags, int startFrom, int specifiedLevel)
{
if (GetStyleSheet())
{
wxRichTextListStyleDefinition* def = NULL;
if (!defName.IsEmpty())
def = GetStyleSheet()->FindListStyle(defName);
return NumberList(range, def, flags, startFrom, specifiedLevel);
}
return false;
}
/// Promote the list items within the given range. promoteBy can be a positive or negative number, e.g. 1 or -1
bool wxRichTextParagraphLayoutBox::PromoteList(int promoteBy, const wxRichTextRange& range, wxRichTextListStyleDefinition* def, int flags, int specifiedLevel)
{
// TODO
// One strategy is to first work out the range within which renumbering must occur. Then could pass these two ranges
// to NumberList with a flag indicating promotion is required within one of the ranges.
// Find first and last paragraphs in range. Then for first, calculate new indentation and look back until we find
// a paragraph that either has no list style, or has one that is different or whose indentation is less.
// We start renumbering from the para after that different para we found. We specify that the numbering of that
// list position will start from 1.
// Similarly, we look after the last para in the promote range for an indentation that is less (or no list style).
// We can end the renumbering at this point.
// For now, only renumber within the promotion range.
return DoNumberList(range, range, promoteBy, def, flags, 1, specifiedLevel);
}
bool wxRichTextParagraphLayoutBox::PromoteList(int promoteBy, const wxRichTextRange& range, const wxString& defName, int flags, int specifiedLevel)
{
if (GetStyleSheet())
{
wxRichTextListStyleDefinition* def = NULL;
if (!defName.IsEmpty())
def = GetStyleSheet()->FindListStyle(defName);
return PromoteList(promoteBy, range, def, flags, specifiedLevel);
}
return false;
}
/*!
* wxRichTextParagraph
* This object represents a single paragraph (or in a straight text editor, a line).
@@ -4027,6 +4430,32 @@ void wxRichTextBuffer::Copy(const wxRichTextBuffer& obj)
m_suppressUndo = obj.m_suppressUndo;
}
/// Push style sheet to top of stack
bool wxRichTextBuffer::PushStyleSheet(wxRichTextStyleSheet* styleSheet)
{
if (m_styleSheet)
styleSheet->InsertSheet(m_styleSheet);
SetStyleSheet(styleSheet);
return true;
}
/// Pop style sheet from top of stack
wxRichTextStyleSheet* wxRichTextBuffer::PopStyleSheet()
{
if (m_styleSheet)
{
wxRichTextStyleSheet* oldSheet = m_styleSheet;
m_styleSheet = oldSheet->GetNextSheet();
oldSheet->Unlink();
return oldSheet;
}
else
return NULL;
}
/// Submit command to insert paragraphs
bool wxRichTextBuffer::InsertParagraphsWithUndo(long pos, const wxRichTextParagraphLayoutBox& paragraphs, wxRichTextCtrl* ctrl, int flags)
{
@@ -5304,24 +5733,7 @@ void wxRichTextImage::Copy(const wxRichTextImage& obj)
/// Compare two attribute objects
bool wxTextAttrEq(const wxTextAttrEx& attr1, const wxTextAttrEx& attr2)
{
return (
attr1.GetTextColour() == attr2.GetTextColour() &&
attr1.GetBackgroundColour() == attr2.GetBackgroundColour() &&
attr1.GetFont() == attr2.GetFont() &&
attr1.GetAlignment() == attr2.GetAlignment() &&
attr1.GetLeftIndent() == attr2.GetLeftIndent() &&
attr1.GetRightIndent() == attr2.GetRightIndent() &&
attr1.GetLeftSubIndent() == attr2.GetLeftSubIndent() &&
wxRichTextTabsEq(attr1.GetTabs(), attr2.GetTabs()) &&
attr1.GetLineSpacing() == attr2.GetLineSpacing() &&
attr1.GetParagraphSpacingAfter() == attr2.GetParagraphSpacingAfter() &&
attr1.GetParagraphSpacingBefore() == attr2.GetParagraphSpacingBefore() &&
attr1.GetBulletStyle() == attr2.GetBulletStyle() &&
attr1.GetBulletNumber() == attr2.GetBulletNumber() &&
attr1.GetBulletSymbol() == attr2.GetBulletSymbol() &&
attr1.GetBulletFont() == attr2.GetBulletFont() &&
attr1.GetCharacterStyleName() == attr2.GetCharacterStyleName() &&
attr1.GetParagraphStyleName() == attr2.GetParagraphStyleName());
return (attr1 == attr2);
}
bool wxTextAttrEq(const wxTextAttrEx& attr1, const wxRichTextAttr& attr2)
@@ -5347,7 +5759,8 @@ bool wxTextAttrEq(const wxTextAttrEx& attr1, const wxRichTextAttr& attr2)
attr1.GetBulletSymbol() == attr2.GetBulletSymbol() &&
attr1.GetBulletFont() == attr2.GetBulletFont() &&
attr1.GetCharacterStyleName() == attr2.GetCharacterStyleName() &&
attr1.GetParagraphStyleName() == attr2.GetParagraphStyleName());
attr1.GetParagraphStyleName() == attr2.GetParagraphStyleName() &&
attr1.GetListStyleName() == attr2.GetListStyleName());
}
/// Compare two attribute objects, but take into account the flags
@@ -5411,6 +5824,10 @@ bool wxTextAttrEqPartial(const wxTextAttrEx& attr1, const wxTextAttrEx& attr2, i
(attr1.GetParagraphStyleName() != attr2.GetParagraphStyleName()))
return false;
if ((flags & wxTEXT_ATTR_LIST_STYLE_NAME) &&
(attr1.GetListStyleName() != attr2.GetListStyleName()))
return false;
if ((flags & wxTEXT_ATTR_BULLET_STYLE) &&
(attr1.GetBulletStyle() != attr2.GetBulletStyle()))
return false;
@@ -5496,6 +5913,10 @@ bool wxTextAttrEqPartial(const wxTextAttrEx& attr1, const wxRichTextAttr& attr2,
(attr1.GetParagraphStyleName() != attr2.GetParagraphStyleName()))
return false;
if ((flags & wxTEXT_ATTR_LIST_STYLE_NAME) &&
(attr1.GetListStyleName() != attr2.GetListStyleName()))
return false;
if ((flags & wxTEXT_ATTR_BULLET_STYLE) &&
(attr1.GetBulletStyle() != attr2.GetBulletStyle()))
return false;
@@ -5618,6 +6039,9 @@ bool wxRichTextApplyStyle(wxTextAttrEx& destStyle, const wxTextAttrEx& style)
if (style.HasParagraphStyleName())
destStyle.SetParagraphStyleName(style.GetParagraphStyleName());
if (style.HasListStyleName())
destStyle.SetListStyleName(style.GetListStyleName());
if (style.HasBulletStyle())
{
destStyle.SetBulletStyle(style.GetBulletStyle());
@@ -5795,6 +6219,12 @@ bool wxRichTextApplyStyle(wxTextAttrEx& destStyle, const wxRichTextAttr& style,
destStyle.SetParagraphStyleName(style.GetParagraphStyleName());
}
if (style.HasListStyleName())
{
if (!(compareWith && compareWith->HasListStyleName() && compareWith->GetListStyleName() == style.GetListStyleName()))
destStyle.SetListStyleName(style.GetListStyleName());
}
if (style.HasBulletStyle())
{
if (!(compareWith && compareWith->HasBulletStyle() && compareWith->GetBulletStyle() == style.GetBulletStyle()))
@@ -5950,6 +6380,7 @@ void wxRichTextAttr::operator= (const wxRichTextAttr& attr)
m_lineSpacing = attr.m_lineSpacing;
m_characterStyleName = attr.m_characterStyleName;
m_paragraphStyleName = attr.m_paragraphStyleName;
m_listStyleName = attr.m_listStyleName;
m_bulletStyle = attr.m_bulletStyle;
m_bulletNumber = attr.m_bulletNumber;
m_bulletSymbol = attr.m_bulletSymbol;
@@ -5973,6 +6404,7 @@ void wxRichTextAttr::operator= (const wxTextAttrEx& attr)
m_lineSpacing = attr.GetLineSpacing();
m_characterStyleName = attr.GetCharacterStyleName();
m_paragraphStyleName = attr.GetParagraphStyleName();
m_listStyleName = attr.GetListStyleName();
m_bulletStyle = attr.GetBulletStyle();
m_bulletNumber = attr.GetBulletNumber();
m_bulletSymbol = attr.GetBulletSymbol();
@@ -6009,6 +6441,7 @@ bool wxRichTextAttr::operator== (const wxRichTextAttr& attr) const
GetLineSpacing() == attr.GetLineSpacing() &&
GetCharacterStyleName() == attr.GetCharacterStyleName() &&
GetParagraphStyleName() == attr.GetParagraphStyleName() &&
GetListStyleName() == attr.GetListStyleName() &&
GetBulletStyle() == attr.GetBulletStyle() &&
GetBulletSymbol() == attr.GetBulletSymbol() &&
@@ -6042,6 +6475,7 @@ void wxRichTextAttr::CopyTo(wxTextAttrEx& attr) const
attr.SetBulletFont(m_bulletFont);
attr.SetCharacterStyleName(m_characterStyleName);
attr.SetParagraphStyleName(m_paragraphStyleName);
attr.SetListStyleName(m_listStyleName);
attr.SetFlags(GetFlags()); // Important: set after SetFont and others, since they set flags
}
@@ -6147,6 +6581,9 @@ wxRichTextAttr wxRichTextAttr::Combine(const wxRichTextAttr& attr,
if (attr.HasParagraphStyleName())
newAttr.SetParagraphStyleName(attr.GetParagraphStyleName());
if (attr.HasListStyleName())
newAttr.SetListStyleName(attr.GetListStyleName());
if (attr.HasBulletStyle())
newAttr.SetBulletStyle(attr.GetBulletStyle());
@@ -6173,6 +6610,7 @@ wxTextAttrEx::wxTextAttrEx(const wxTextAttrEx& attr): wxTextAttr(attr)
m_lineSpacing = attr.m_lineSpacing;
m_paragraphStyleName = attr.m_paragraphStyleName;
m_characterStyleName = attr.m_characterStyleName;
m_listStyleName = attr.m_listStyleName;
m_bulletStyle = attr.m_bulletStyle;
m_bulletNumber = attr.m_bulletNumber;
m_bulletSymbol = attr.m_bulletSymbol;
@@ -6201,6 +6639,7 @@ void wxTextAttrEx::operator= (const wxTextAttrEx& attr)
m_lineSpacing = attr.m_lineSpacing;
m_characterStyleName = attr.m_characterStyleName;
m_paragraphStyleName = attr.m_paragraphStyleName;
m_listStyleName = attr.m_listStyleName;
m_bulletStyle = attr.m_bulletStyle;
m_bulletNumber = attr.m_bulletNumber;
m_bulletSymbol = attr.m_bulletSymbol;
@@ -6213,6 +6652,30 @@ void wxTextAttrEx::operator= (const wxTextAttr& attr)
wxTextAttr::operator= (attr);
}
// Equality test
bool wxTextAttrEx::operator== (const wxTextAttrEx& attr) const
{
return (
GetTextColour() == attr.GetTextColour() &&
GetBackgroundColour() == attr.GetBackgroundColour() &&
GetFont() == attr.GetFont() &&
GetAlignment() == attr.GetAlignment() &&
GetLeftIndent() == attr.GetLeftIndent() &&
GetRightIndent() == attr.GetRightIndent() &&
GetLeftSubIndent() == attr.GetLeftSubIndent() &&
wxRichTextTabsEq(GetTabs(), attr.GetTabs()) &&
GetLineSpacing() == attr.GetLineSpacing() &&
GetParagraphSpacingAfter() == attr.GetParagraphSpacingAfter() &&
GetParagraphSpacingBefore() == attr.GetParagraphSpacingBefore() &&
GetBulletStyle() == attr.GetBulletStyle() &&
GetBulletNumber() == attr.GetBulletNumber() &&
GetBulletSymbol() == attr.GetBulletSymbol() &&
GetBulletFont() == attr.GetBulletFont() &&
GetCharacterStyleName() == attr.GetCharacterStyleName() &&
GetParagraphStyleName() == attr.GetParagraphStyleName() &&
GetListStyleName() == attr.GetListStyleName());
}
wxTextAttrEx wxTextAttrEx::CombineEx(const wxTextAttrEx& attr,
const wxTextAttrEx& attrDef,
const wxTextCtrlBase *text)
@@ -6340,6 +6803,9 @@ wxTextAttrEx wxTextAttrEx::CombineEx(const wxTextAttrEx& attr,
if (attr.HasParagraphStyleName())
newAttr.SetParagraphStyleName(attr.GetParagraphStyleName());
if (attr.HasListStyleName())
newAttr.SetListStyleName(attr.GetListStyleName());
if (attr.HasBulletStyle())
newAttr.SetBulletStyle(attr.GetBulletStyle());