X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ff76711fbee3bc3358c69ca43b44f0c8258ad1f9..18138662efd0bc550d78cbe32e93e25b43bbcbd2:/src/richtext/richtextbuffer.cpp diff --git a/src/richtext/richtextbuffer.cpp b/src/richtext/richtextbuffer.cpp index 49c609d053..47f1e8d8e3 100644 --- a/src/richtext/richtextbuffer.cpp +++ b/src/richtext/richtextbuffer.cpp @@ -1561,26 +1561,27 @@ bool wxRichTextParagraphLayoutBox::SetStyle(const wxRichTextRange& range, const bool parasOnly = ((flags & wxRICHTEXT_SETSTYLE_PARAGRAPHS_ONLY) != 0); bool charactersOnly = ((flags & wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY) != 0); bool resetExistingStyle = ((flags & wxRICHTEXT_SETSTYLE_RESET) != 0); + bool removeStyle = ((flags & wxRICHTEXT_SETSTYLE_REMOVE) != 0); // Apply paragraph style first, if any wxRichTextAttr wholeStyle(style); - if (wholeStyle.HasParagraphStyleName() && GetStyleSheet()) + if (!removeStyle && wholeStyle.HasParagraphStyleName() && GetStyleSheet()) { wxRichTextParagraphStyleDefinition* def = GetStyleSheet()->FindParagraphStyle(wholeStyle.GetParagraphStyleName()); if (def) - wxRichTextApplyStyle(wholeStyle, def->GetStyle()); + wxRichTextApplyStyle(wholeStyle, def->GetStyleMergedWithBase(GetStyleSheet())); } // Limit the attributes to be set to the content to only character attributes. wxRichTextAttr characterAttributes(wholeStyle); characterAttributes.SetFlags(characterAttributes.GetFlags() & (wxTEXT_ATTR_CHARACTER)); - if (characterAttributes.HasCharacterStyleName() && GetStyleSheet()) + if (!removeStyle && characterAttributes.HasCharacterStyleName() && GetStyleSheet()) { wxRichTextCharacterStyleDefinition* def = GetStyleSheet()->FindCharacterStyle(characterAttributes.GetCharacterStyleName()); if (def) - wxRichTextApplyStyle(characterAttributes, def->GetStyle()); + wxRichTextApplyStyle(characterAttributes, def->GetStyleMergedWithBase(GetStyleSheet())); } // If we are associated with a control, make undoable; otherwise, apply immediately @@ -1630,7 +1631,12 @@ bool wxRichTextParagraphLayoutBox::SetStyle(const wxRichTextRange& range, const // to be included in the paragraph style if ((paragraphStyle || parasOnly) && !charactersOnly) { - if (resetExistingStyle) + if (removeStyle) + { + // Removes the given style from the paragraph + wxRichTextRemoveStyle(newPara->GetAttributes(), style); + } + else if (resetExistingStyle) newPara->GetAttributes() = wholeStyle; else { @@ -1705,7 +1711,12 @@ bool wxRichTextParagraphLayoutBox::SetStyle(const wxRichTextRange& range, const { wxRichTextObject* child = node2->GetData(); - if (resetExistingStyle) + if (removeStyle) + { + // Removes the given style from the paragraph + wxRichTextRemoveStyle(child->GetAttributes(), style); + } + else if (resetExistingStyle) child->GetAttributes() = characterAttributes; else { @@ -1838,9 +1849,9 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons { if (style.HasFont()) { - if (style.HasSize() && !wxHasStyle(multipleStyleAttributes, wxTEXT_ATTR_FONT_SIZE)) + if (style.HasFontSize() && !wxHasStyle(multipleStyleAttributes, wxTEXT_ATTR_FONT_SIZE)) { - if (currentStyle.GetFont().Ok() && currentStyle.HasSize()) + if (currentStyle.GetFont().Ok() && currentStyle.HasFontSize()) { if (currentStyle.GetFont().GetPointSize() != style.GetFont().GetPointSize()) { @@ -1861,9 +1872,9 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons } } - if (style.HasItalic() && !wxHasStyle(multipleStyleAttributes, wxTEXT_ATTR_FONT_ITALIC)) + if (style.HasFontItalic() && !wxHasStyle(multipleStyleAttributes, wxTEXT_ATTR_FONT_ITALIC)) { - if (currentStyle.GetFont().Ok() && currentStyle.HasItalic()) + if (currentStyle.GetFont().Ok() && currentStyle.HasFontItalic()) { if (currentStyle.GetFont().GetStyle() != style.GetFont().GetStyle()) { @@ -1883,9 +1894,9 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons } } - if (style.HasWeight() && !wxHasStyle(multipleStyleAttributes, wxTEXT_ATTR_FONT_WEIGHT)) + if (style.HasFontWeight() && !wxHasStyle(multipleStyleAttributes, wxTEXT_ATTR_FONT_WEIGHT)) { - if (currentStyle.GetFont().Ok() && currentStyle.HasWeight()) + if (currentStyle.GetFont().Ok() && currentStyle.HasFontWeight()) { if (currentStyle.GetFont().GetWeight() != style.GetFont().GetWeight()) { @@ -1905,9 +1916,9 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons } } - if (style.HasFaceName() && !wxHasStyle(multipleStyleAttributes, wxTEXT_ATTR_FONT_FACE)) + if (style.HasFontFaceName() && !wxHasStyle(multipleStyleAttributes, wxTEXT_ATTR_FONT_FACE)) { - if (currentStyle.GetFont().Ok() && currentStyle.HasFaceName()) + if (currentStyle.GetFont().Ok() && currentStyle.HasFontFaceName()) { wxString faceName1(currentStyle.GetFont().GetFaceName()); wxString faceName2(style.GetFont().GetFaceName()); @@ -1930,9 +1941,9 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons } } - if (style.HasUnderlined() && !wxHasStyle(multipleStyleAttributes, wxTEXT_ATTR_FONT_UNDERLINE)) + if (style.HasFontUnderlined() && !wxHasStyle(multipleStyleAttributes, wxTEXT_ATTR_FONT_UNDERLINE)) { - if (currentStyle.GetFont().Ok() && currentStyle.HasUnderlined()) + if (currentStyle.GetFont().Ok() && currentStyle.HasFontUnderlined()) { if (currentStyle.GetFont().GetUnderlined() != style.GetFont().GetUnderlined()) { @@ -2512,13 +2523,13 @@ bool wxRichTextParagraphLayoutBox::ApplyStyleSheet(wxRichTextStyleSheet* styleSh wxRichTextListStyleDefinition* listDef = styleSheet->FindListStyle(para->GetAttributes().GetListStyleName()); if (paraDef && !listDef) { - para->GetAttributes() = paraDef->GetStyle(); + para->GetAttributes() = paraDef->GetStyleMergedWithBase(styleSheet); foundCount ++; } else if (listDef && !paraDef) { // Set overall style defined for the list style definition - para->GetAttributes() = listDef->GetStyle(); + para->GetAttributes() = listDef->GetStyleMergedWithBase(styleSheet); // Apply the style for this level wxRichTextApplyStyle(para->GetAttributes(), * listDef->GetLevelAttributes(listDef->FindLevelForIndent(currentIndent))); @@ -2527,7 +2538,7 @@ bool wxRichTextParagraphLayoutBox::ApplyStyleSheet(wxRichTextStyleSheet* styleSh else if (listDef && paraDef) { // Combines overall list style, style for level, and paragraph style - para->GetAttributes() = listDef->CombineWithParagraphStyle(currentIndent, paraDef->GetStyle()); + para->GetAttributes() = listDef->CombineWithParagraphStyle(currentIndent, paraDef->GetStyleMergedWithBase(styleSheet)); foundCount ++; } } @@ -2538,7 +2549,7 @@ bool wxRichTextParagraphLayoutBox::ApplyStyleSheet(wxRichTextStyleSheet* styleSh wxRichTextListStyleDefinition* listDef = styleSheet->FindListStyle(para->GetAttributes().GetListStyleName()); // Overall list definition style - para->GetAttributes() = listDef->GetStyle(); + para->GetAttributes() = listDef->GetStyleMergedWithBase(styleSheet); // Style for this level wxRichTextApplyStyle(para->GetAttributes(), * listDef->GetLevelAttributes(listDef->FindLevelForIndent(currentIndent))); @@ -2550,7 +2561,7 @@ bool wxRichTextParagraphLayoutBox::ApplyStyleSheet(wxRichTextStyleSheet* styleSh wxRichTextParagraphStyleDefinition* def = styleSheet->FindParagraphStyle(para->GetAttributes().GetParagraphStyleName()); if (def) { - para->GetAttributes() = def->GetStyle(); + para->GetAttributes() = def->GetStyleMergedWithBase(styleSheet); foundCount ++; } } @@ -2564,6 +2575,8 @@ bool wxRichTextParagraphLayoutBox::ApplyStyleSheet(wxRichTextStyleSheet* styleSh /// Set list style bool wxRichTextParagraphLayoutBox::SetListStyle(const wxRichTextRange& range, wxRichTextListStyleDefinition* def, int flags, int startFrom, int specifiedLevel) { + wxRichTextStyleSheet* styleSheet = GetStyleSheet(); + bool withUndo = ((flags & wxRICHTEXT_SETSTYLE_WITH_UNDO) != 0); // bool applyMinimal = ((flags & wxRICHTEXT_SETSTYLE_OPTIMIZE) != 0); bool specifyLevel = ((flags & wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL) != 0); @@ -2631,7 +2644,7 @@ bool wxRichTextParagraphLayoutBox::SetListStyle(const wxRichTextRange& range, wx // 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)); + wxTextAttrEx listStyle(def->GetCombinedStyleForLevel(thisLevel, styleSheet)); wxRichTextApplyStyle(newPara->GetAttributes(), listStyle); // Now we need to do numbering @@ -2654,13 +2667,12 @@ bool wxRichTextParagraphLayoutBox::SetListStyle(const wxRichTextRange& range, wx // 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_TEXT & 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(); + newPara->GetAttributes() = def->GetStyleMergedWithBase(styleSheet); } } } @@ -2704,6 +2716,8 @@ bool wxRichTextParagraphLayoutBox::NumberList(const wxRichTextRange& range, wxRi bool wxRichTextParagraphLayoutBox::DoNumberList(const wxRichTextRange& range, const wxRichTextRange& promotionRange, int promoteBy, wxRichTextListStyleDefinition* def, int flags, int startFrom, int specifiedLevel) { + wxRichTextStyleSheet* styleSheet = GetStyleSheet(); + bool withUndo = ((flags & wxRICHTEXT_SETSTYLE_WITH_UNDO) != 0); // bool applyMinimal = ((flags & wxRICHTEXT_SETSTYLE_OPTIMIZE) != 0); #ifdef __WXDEBUG__ @@ -2781,10 +2795,8 @@ bool wxRichTextParagraphLayoutBox::DoNumberList(const wxRichTextRange& range, co wxRichTextListStyleDefinition* defToUse = def; if (!defToUse) { - wxRichTextStyleSheet* sheet = GetStyleSheet(); - - if (sheet && !newPara->GetAttributes().GetListStyleName().IsEmpty()) - defToUse = sheet->FindListStyle(newPara->GetAttributes().GetListStyleName()); + if (styleSheet && !newPara->GetAttributes().GetListStyleName().IsEmpty()) + defToUse = styleSheet->FindListStyle(newPara->GetAttributes().GetListStyleName()); } if (defToUse) @@ -2807,7 +2819,7 @@ bool wxRichTextParagraphLayoutBox::DoNumberList(const wxRichTextRange& range, co } // Apply the overall list style, and item style for this level - wxTextAttrEx listStyle(defToUse->GetCombinedStyleForLevel(thisLevel)); + wxTextAttrEx listStyle(defToUse->GetCombinedStyleForLevel(thisLevel, styleSheet)); wxRichTextApplyStyle(newPara->GetAttributes(), listStyle); // OK, we've (re)applied the style, now let's get the numbering right. @@ -2923,10 +2935,10 @@ bool wxRichTextParagraphLayoutBox::FindNextParagraphNumber(wxRichTextParagraph* if (!previousParagraph->GetAttributes().HasFlag(wxTEXT_ATTR_BULLET_STYLE) || previousParagraph->GetAttributes().GetBulletStyle() == wxTEXT_ATTR_BULLET_STYLE_NONE) return false; - wxRichTextStyleSheet* sheet = GetStyleSheet(); - if (sheet && !previousParagraph->GetAttributes().GetListStyleName().IsEmpty()) + wxRichTextStyleSheet* styleSheet = GetStyleSheet(); + if (styleSheet && !previousParagraph->GetAttributes().GetListStyleName().IsEmpty()) { - wxRichTextListStyleDefinition* def = sheet->FindListStyle(previousParagraph->GetAttributes().GetListStyleName()); + wxRichTextListStyleDefinition* def = styleSheet->FindListStyle(previousParagraph->GetAttributes().GetListStyleName()); if (def) { // int thisIndent = previousParagraph->GetAttributes().GetLeftIndent(); @@ -3016,6 +3028,16 @@ bool wxRichTextParagraph::Draw(wxDC& dc, const wxRichTextRange& range, const wxR wxTextAttrEx bulletAttr(GetCombinedAttributes()); + // Combine with the font of the first piece of content, if one is specified + if (GetChildren().GetCount() > 0) + { + wxRichTextObject* firstObj = (wxRichTextObject*) GetChildren().GetFirst()->GetData(); + if (firstObj->GetAttributes().HasFont()) + { + wxRichTextApplyStyle(bulletAttr, firstObj->GetAttributes()); + } + } + // Get line height from first line, if any wxRichTextLine* line = m_cachedLines.GetFirst() ? (wxRichTextLine* ) m_cachedLines.GetFirst()->GetData() : (wxRichTextLine*) NULL; @@ -3657,12 +3679,12 @@ int wxRichTextParagraph::HitTest(wxDC& dc, const wxPoint& pt, long& textPosition if (pt.x < linePos.x) { textPosition = lineRange.GetStart(); - return wxRICHTEXT_HITTEST_BEFORE; + return wxRICHTEXT_HITTEST_BEFORE|wxRICHTEXT_HITTEST_OUTSIDE; } else if (pt.x >= (linePos.x + lineSize.x)) { textPosition = lineRange.GetEnd(); - return wxRICHTEXT_HITTEST_AFTER; + return wxRICHTEXT_HITTEST_AFTER|wxRICHTEXT_HITTEST_OUTSIDE; } else { @@ -4729,7 +4751,8 @@ bool wxRichTextBuffer::InsertTextWithUndo(long pos, const wxString& text, wxRich wxTextAttrEx paraAttr; if (flags & wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE) { - paraAttr = GetStyleForNewParagraph(pos); + // Get appropriate paragraph style + paraAttr = GetStyleForNewParagraph(pos, false, false); if (!paraAttr.IsDefault()) p = & paraAttr; } @@ -4744,6 +4767,8 @@ bool wxRichTextBuffer::InsertTextWithUndo(long pos, const wxString& text, wxRich length --; action->GetNewParagraphs().SetPartialParagraph(true); } + else if (text.length() > 0 && text.Last() == wxT('\n')) + length --; action->SetPosition(pos); @@ -4764,7 +4789,7 @@ bool wxRichTextBuffer::InsertNewlineWithUndo(long pos, wxRichTextCtrl* ctrl, int wxTextAttrEx paraAttr; if (flags & wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE) { - paraAttr = GetStyleForNewParagraph(pos); + paraAttr = GetStyleForNewParagraph(pos, false, true /* look for next paragraph style */); if (!paraAttr.IsDefault()) p = & paraAttr; } @@ -4828,7 +4853,7 @@ bool wxRichTextBuffer::InsertImageWithUndo(long pos, const wxRichTextImageBlock& /// Get the style that is appropriate for a new paragraph at this position. /// If the previous paragraph has a paragraph style name, look up the next-paragraph /// style. -wxRichTextAttr wxRichTextBuffer::GetStyleForNewParagraph(long pos, bool caretPosition) const +wxRichTextAttr wxRichTextBuffer::GetStyleForNewParagraph(long pos, bool caretPosition, bool lookUpNewParaStyle) const { wxRichTextParagraph* para = GetParagraphAtPosition(pos, caretPosition); if (para) @@ -4837,7 +4862,7 @@ wxRichTextAttr wxRichTextBuffer::GetStyleForNewParagraph(long pos, bool caretPos bool foundAttributes = false; // Look for a matching paragraph style - if (!para->GetAttributes().GetParagraphStyleName().IsEmpty() && GetStyleSheet()) + if (lookUpNewParaStyle && !para->GetAttributes().GetParagraphStyleName().IsEmpty() && GetStyleSheet()) { wxRichTextParagraphStyleDefinition* paraDef = GetStyleSheet()->FindParagraphStyle(para->GetAttributes().GetParagraphStyleName()); if (paraDef) @@ -4848,7 +4873,7 @@ wxRichTextAttr wxRichTextBuffer::GetStyleForNewParagraph(long pos, bool caretPos if (nextParaDef) { foundAttributes = true; - attr = nextParaDef->GetStyle(); + attr = nextParaDef->GetStyleMergedWithBase(GetStyleSheet()); } } @@ -4856,7 +4881,7 @@ wxRichTextAttr wxRichTextBuffer::GetStyleForNewParagraph(long pos, bool caretPos if (!foundAttributes) { foundAttributes = true; - attr = paraDef->GetStyle(); + attr = paraDef->GetStyleMergedWithBase(GetStyleSheet()); } } } @@ -5214,7 +5239,7 @@ bool wxRichTextBuffer::BeginCharacterStyle(const wxString& characterStyle) wxRichTextCharacterStyleDefinition* def = GetStyleSheet()->FindCharacterStyle(characterStyle); if (def) { - wxTextAttrEx attr = def->GetStyle(); + wxTextAttrEx attr = def->GetStyleMergedWithBase(GetStyleSheet()); return BeginStyle(attr); } } @@ -5229,7 +5254,7 @@ bool wxRichTextBuffer::BeginParagraphStyle(const wxString& paragraphStyle) wxRichTextParagraphStyleDefinition* def = GetStyleSheet()->FindParagraphStyle(paragraphStyle); if (def) { - wxTextAttrEx attr = def->GetStyle(); + wxTextAttrEx attr = def->GetStyleMergedWithBase(GetStyleSheet()); return BeginStyle(attr); } } @@ -5264,7 +5289,7 @@ bool wxRichTextBuffer::BeginURL(const wxString& url, const wxString& characterSt wxRichTextCharacterStyleDefinition* def = GetStyleSheet()->FindCharacterStyle(characterStyle); if (def) { - attr = def->GetStyle(); + attr = def->GetStyleMergedWithBase(GetStyleSheet()); } } attr.SetURL(url); @@ -6037,6 +6062,13 @@ bool wxRichTextAction::Do() // Don't take into account the last newline if (m_newParagraphs.GetPartialParagraph()) newCaretPosition --; + else + if (m_newParagraphs.GetChildren().GetCount() > 1) + { + wxRichTextObject* p = (wxRichTextObject*) m_newParagraphs.GetChildren().GetLast()->GetData(); + if (p->GetRange().GetLength() == 1) + newCaretPosition --; + } newCaretPosition = wxMin(newCaretPosition, (m_buffer->GetRange().GetEnd()-1)); @@ -6848,9 +6880,7 @@ bool wxRichTextApplyStyle(wxRichTextAttr& destStyle, const wxTextAttrEx& style) bool wxRichTextApplyStyle(wxRichTextAttr& destStyle, const wxRichTextAttr& style, wxRichTextAttr* compareWith) { - wxTextAttrEx attr(destStyle); - wxRichTextApplyStyle(attr, style, compareWith); - destStyle = attr; + destStyle = destStyle.Combine(style, compareWith); return true; } @@ -6869,7 +6899,7 @@ bool wxRichTextApplyStyle(wxTextAttrEx& destStyle, const wxRichTextAttr& style, if (style.GetFlags() & wxTEXT_ATTR_FONT_FACE) { - if (compareWith && compareWith->HasFaceName() && compareWith->GetFontFaceName() == style.GetFontFaceName()) + if (compareWith && compareWith->HasFontFaceName() && compareWith->GetFontFaceName() == style.GetFontFaceName()) { // The same as currently displayed, so don't set } @@ -6882,7 +6912,7 @@ bool wxRichTextApplyStyle(wxTextAttrEx& destStyle, const wxRichTextAttr& style, if (style.GetFlags() & wxTEXT_ATTR_FONT_SIZE) { - if (compareWith && compareWith->HasSize() && compareWith->GetFontSize() == style.GetFontSize()) + if (compareWith && compareWith->HasFontSize() && compareWith->GetFontSize() == style.GetFontSize()) { // The same as currently displayed, so don't set } @@ -6895,7 +6925,7 @@ bool wxRichTextApplyStyle(wxTextAttrEx& destStyle, const wxRichTextAttr& style, if (style.GetFlags() & wxTEXT_ATTR_FONT_ITALIC) { - if (compareWith && compareWith->HasItalic() && compareWith->GetFontStyle() == style.GetFontStyle()) + if (compareWith && compareWith->HasFontItalic() && compareWith->GetFontStyle() == style.GetFontStyle()) { // The same as currently displayed, so don't set } @@ -6908,7 +6938,7 @@ bool wxRichTextApplyStyle(wxTextAttrEx& destStyle, const wxRichTextAttr& style, if (style.GetFlags() & wxTEXT_ATTR_FONT_WEIGHT) { - if (compareWith && compareWith->HasWeight() && compareWith->GetFontWeight() == style.GetFontWeight()) + if (compareWith && compareWith->HasFontWeight() && compareWith->GetFontWeight() == style.GetFontWeight()) { // The same as currently displayed, so don't set } @@ -6921,7 +6951,7 @@ bool wxRichTextApplyStyle(wxTextAttrEx& destStyle, const wxRichTextAttr& style, if (style.GetFlags() & wxTEXT_ATTR_FONT_UNDERLINE) { - if (compareWith && compareWith->HasUnderlined() && compareWith->GetFontUnderlined() == style.GetFontUnderlined()) + if (compareWith && compareWith->HasFontUnderlined() && compareWith->GetFontUnderlined() == style.GetFontUnderlined()) { // The same as currently displayed, so don't set } @@ -7080,6 +7110,17 @@ bool wxRichTextApplyStyle(wxTextAttrEx& destStyle, const wxRichTextAttr& style, return true; } +// Remove attributes +bool wxRichTextRemoveStyle(wxTextAttrEx& destStyle, const wxRichTextAttr& style) +{ + int flags = style.GetFlags(); + int destFlags = destStyle.GetFlags(); + + destStyle.SetFlags(destFlags & ~flags); + + return true; +} + /// Combine two bitlists, specifying the bits of interest with separate flags. bool wxRichTextCombineBitlists(int& valueA, int valueB, int& flagsA, int flagsB) { @@ -7411,116 +7452,184 @@ bool wxRichTextAttr::GetFontAttributes(const wxFont& font) return true; } -wxRichTextAttr wxRichTextAttr::Combine(const wxRichTextAttr& attr, - const wxRichTextAttr& attrDef, - const wxTextCtrlBase *text) +wxRichTextAttr wxRichTextAttr::Combine(const wxRichTextAttr& style, const wxRichTextAttr* compareWith) const { - wxColour colFg = attr.GetTextColour(); - if ( !colFg.Ok() ) - { - colFg = attrDef.GetTextColour(); + wxRichTextAttr destStyle = (*this); + destStyle.Apply(style, compareWith); + + return destStyle; +} - if ( text && !colFg.Ok() ) - colFg = text->GetForegroundColour(); +bool wxRichTextAttr::Apply(const wxRichTextAttr& style, const wxRichTextAttr* compareWith) +{ + wxRichTextAttr& destStyle = (*this); + + if (style.HasFontWeight()) + { + if (!(compareWith && compareWith->HasFontWeight() && compareWith->GetFontWeight() == style.GetFontWeight())) + destStyle.SetFontWeight(style.GetFontWeight()); } - wxColour colBg = attr.GetBackgroundColour(); - if ( !colBg.Ok() ) + if (style.HasFontSize()) { - colBg = attrDef.GetBackgroundColour(); - - if ( text && !colBg.Ok() ) - colBg = text->GetBackgroundColour(); + if (!(compareWith && compareWith->HasFontSize() && compareWith->GetFontSize() == style.GetFontSize())) + destStyle.SetFontSize(style.GetFontSize()); } - wxRichTextAttr newAttr(colFg, colBg); + if (style.HasFontItalic()) + { + if (!(compareWith && compareWith->HasFontItalic() && compareWith->GetFontStyle() == style.GetFontStyle())) + destStyle.SetFontStyle(style.GetFontStyle()); + } - if (attr.HasWeight()) - newAttr.SetFontWeight(attr.GetFontWeight()); + if (style.HasFontUnderlined()) + { + if (!(compareWith && compareWith->HasFontUnderlined() && compareWith->GetFontUnderlined() == style.GetFontUnderlined())) + destStyle.SetFontUnderlined(style.GetFontUnderlined()); + } - if (attr.HasSize()) - newAttr.SetFontSize(attr.GetFontSize()); + if (style.HasFontFaceName()) + { + if (!(compareWith && compareWith->HasFontFaceName() && compareWith->GetFontFaceName() == style.GetFontFaceName())) + destStyle.SetFontFaceName(style.GetFontFaceName()); + } - if (attr.HasItalic()) - newAttr.SetFontStyle(attr.GetFontStyle()); + if (style.GetTextColour().Ok() && style.HasTextColour()) + { + if (!(compareWith && compareWith->HasTextColour() && compareWith->GetTextColour() == style.GetTextColour())) + destStyle.SetTextColour(style.GetTextColour()); + } - if (attr.HasUnderlined()) - newAttr.SetFontUnderlined(attr.GetFontUnderlined()); + if (style.GetBackgroundColour().Ok() && style.HasBackgroundColour()) + { + if (!(compareWith && compareWith->HasBackgroundColour() && compareWith->GetBackgroundColour() == style.GetBackgroundColour())) + destStyle.SetBackgroundColour(style.GetBackgroundColour()); + } - if (attr.HasFaceName()) - newAttr.SetFontFaceName(attr.GetFontFaceName()); + if (style.HasAlignment()) + { + if (!(compareWith && compareWith->HasAlignment() && compareWith->GetAlignment() == style.GetAlignment())) + destStyle.SetAlignment(style.GetAlignment()); + } - if (attr.HasAlignment()) - newAttr.SetAlignment(attr.GetAlignment()); - else if (attrDef.HasAlignment()) - newAttr.SetAlignment(attrDef.GetAlignment()); + if (style.HasTabs()) + { + if (!(compareWith && compareWith->HasTabs() && wxRichTextTabsEq(compareWith->GetTabs(), style.GetTabs()))) + destStyle.SetTabs(style.GetTabs()); + } - if (attr.HasTabs()) - newAttr.SetTabs(attr.GetTabs()); - else if (attrDef.HasTabs()) - newAttr.SetTabs(attrDef.GetTabs()); + if (style.HasLeftIndent()) + { + if (!(compareWith && compareWith->HasLeftIndent() && compareWith->GetLeftIndent() == style.GetLeftIndent() + && compareWith->GetLeftSubIndent() == style.GetLeftSubIndent())) + destStyle.SetLeftIndent(style.GetLeftIndent(), style.GetLeftSubIndent()); + } - if (attr.HasLeftIndent()) - newAttr.SetLeftIndent(attr.GetLeftIndent(), attr.GetLeftSubIndent()); - else if (attrDef.HasLeftIndent()) - newAttr.SetLeftIndent(attrDef.GetLeftIndent(), attr.GetLeftSubIndent()); + if (style.HasRightIndent()) + { + if (!(compareWith && compareWith->HasRightIndent() && compareWith->GetRightIndent() == style.GetRightIndent())) + destStyle.SetRightIndent(style.GetRightIndent()); + } - if (attr.HasRightIndent()) - newAttr.SetRightIndent(attr.GetRightIndent()); - else if (attrDef.HasRightIndent()) - newAttr.SetRightIndent(attrDef.GetRightIndent()); + if (style.HasParagraphSpacingAfter()) + { + if (!(compareWith && compareWith->HasParagraphSpacingAfter() && compareWith->GetParagraphSpacingAfter() == style.GetParagraphSpacingAfter())) + destStyle.SetParagraphSpacingAfter(style.GetParagraphSpacingAfter()); + } - // NEW ATTRIBUTES + if (style.HasParagraphSpacingBefore()) + { + if (!(compareWith && compareWith->HasParagraphSpacingBefore() && compareWith->GetParagraphSpacingBefore() == style.GetParagraphSpacingBefore())) + destStyle.SetParagraphSpacingBefore(style.GetParagraphSpacingBefore()); + } - if (attr.HasParagraphSpacingAfter()) - newAttr.SetParagraphSpacingAfter(attr.GetParagraphSpacingAfter()); + if (style.HasLineSpacing()) + { + if (!(compareWith && compareWith->HasLineSpacing() && compareWith->GetLineSpacing() == style.GetLineSpacing())) + destStyle.SetLineSpacing(style.GetLineSpacing()); + } - if (attr.HasParagraphSpacingBefore()) - newAttr.SetParagraphSpacingBefore(attr.GetParagraphSpacingBefore()); + if (style.HasCharacterStyleName()) + { + if (!(compareWith && compareWith->HasCharacterStyleName() && compareWith->GetCharacterStyleName() == style.GetCharacterStyleName())) + destStyle.SetCharacterStyleName(style.GetCharacterStyleName()); + } - if (attr.HasLineSpacing()) - newAttr.SetLineSpacing(attr.GetLineSpacing()); + if (style.HasParagraphStyleName()) + { + if (!(compareWith && compareWith->HasParagraphStyleName() && compareWith->GetParagraphStyleName() == style.GetParagraphStyleName())) + destStyle.SetParagraphStyleName(style.GetParagraphStyleName()); + } - if (attr.HasCharacterStyleName()) - newAttr.SetCharacterStyleName(attr.GetCharacterStyleName()); + if (style.HasListStyleName()) + { + if (!(compareWith && compareWith->HasListStyleName() && compareWith->GetListStyleName() == style.GetListStyleName())) + destStyle.SetListStyleName(style.GetListStyleName()); + } - if (attr.HasParagraphStyleName()) - newAttr.SetParagraphStyleName(attr.GetParagraphStyleName()); + if (style.HasBulletStyle()) + { + if (!(compareWith && compareWith->HasBulletStyle() && compareWith->GetBulletStyle() == style.GetBulletStyle())) + destStyle.SetBulletStyle(style.GetBulletStyle()); + } - if (attr.HasListStyleName()) - newAttr.SetListStyleName(attr.GetListStyleName()); + if (style.HasBulletText()) + { + if (!(compareWith && compareWith->HasBulletText() && compareWith->GetBulletText() == style.GetBulletText())) + { + destStyle.SetBulletText(style.GetBulletText()); + destStyle.SetBulletFont(style.GetBulletFont()); + } + } - if (attr.HasBulletStyle()) - newAttr.SetBulletStyle(attr.GetBulletStyle()); + if (style.HasBulletNumber()) + { + if (!(compareWith && compareWith->HasBulletNumber() && compareWith->GetBulletNumber() == style.GetBulletNumber())) + destStyle.SetBulletNumber(style.GetBulletNumber()); + } - if (attr.HasBulletNumber()) - newAttr.SetBulletNumber(attr.GetBulletNumber()); + if (style.HasBulletName()) + { + if (!(compareWith && compareWith->HasBulletName() && compareWith->GetBulletName() == style.GetBulletName())) + destStyle.SetBulletName(style.GetBulletName()); + } - if (attr.HasBulletName()) - newAttr.SetBulletName(attr.GetBulletName()); + if (style.HasURL()) + { + if (!(compareWith && compareWith->HasURL() && compareWith->GetURL() == style.GetURL())) + destStyle.SetURL(style.GetURL()); + } - if (attr.HasBulletText()) + if (style.HasPageBreak()) { - newAttr.SetBulletText(attr.GetBulletText()); - newAttr.SetBulletFont(attr.GetBulletFont()); + if (!(compareWith && compareWith->HasPageBreak())) + destStyle.SetPageBreak(); } - if (attr.HasURL()) - newAttr.SetURL(attr.GetURL()); + if (style.HasTextEffects()) + { + if (!(compareWith && compareWith->HasTextEffects() && compareWith->GetTextEffects() == style.GetTextEffects())) + { + int destBits = destStyle.GetTextEffects(); + int destFlags = destStyle.GetTextEffectFlags(); - if (attr.HasPageBreak()) - newAttr.SetPageBreak(); + int srcBits = style.GetTextEffects(); + int srcFlags = style.GetTextEffectFlags(); + + wxRichTextCombineBitlists(destBits, srcBits, destFlags, srcFlags); + + destStyle.SetTextEffects(destBits); + destStyle.SetTextEffectFlags(destFlags); + } + } - if (attr.HasTextEffects()) + if (style.HasOutlineLevel()) { - newAttr.SetTextEffects(attr.GetTextEffects()); - newAttr.SetTextEffectFlags(attr.GetTextEffectFlags()); + if (!(compareWith && compareWith->HasOutlineLevel() && compareWith->GetOutlineLevel() == style.GetOutlineLevel())) + destStyle.SetOutlineLevel(style.GetOutlineLevel()); } - if (attr.HasOutlineLevel()) - newAttr.SetOutlineLevel(attr.GetOutlineLevel()); - - return newAttr; + return true; } /*! @@ -7643,27 +7752,27 @@ wxTextAttrEx wxTextAttrEx::CombineEx(const wxTextAttrEx& attr, // Otherwise, if there are font attributes in attr, apply them if (attr.GetFlags() & wxTEXT_ATTR_FONT) { - if (attr.HasSize()) + if (attr.HasFontSize()) { flags |= wxTEXT_ATTR_FONT_SIZE; font.SetPointSize(attr.GetFont().GetPointSize()); } - if (attr.HasItalic()) + if (attr.HasFontItalic()) { flags |= wxTEXT_ATTR_FONT_ITALIC;; font.SetStyle(attr.GetFont().GetStyle()); } - if (attr.HasWeight()) + if (attr.HasFontWeight()) { flags |= wxTEXT_ATTR_FONT_WEIGHT; font.SetWeight(attr.GetFont().GetWeight()); } - if (attr.HasFaceName()) + if (attr.HasFontFaceName()) { flags |= wxTEXT_ATTR_FONT_FACE; font.SetFaceName(attr.GetFont().GetFaceName()); } - if (attr.HasUnderlined()) + if (attr.HasFontUnderlined()) { flags |= wxTEXT_ATTR_FONT_UNDERLINE; font.SetUnderlined(attr.GetFont().GetUnderlined());