Added wxRICHTEXT_SETSTYLE_RESET SetStyleEx() flag to allow for clearing attributes before setting new ones

SetStyle() now looks up and applies named paragraph or character style
Fixed a bug in text entry (taking previous paragraph's style)


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@43459 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2006-11-17 08:33:34 +00:00
parent 380a5dd803
commit 523d2f145e
5 changed files with 53 additions and 20 deletions

View File

@@ -807,10 +807,11 @@ This differs from the wxRichTextCtrl API, where you would specify (5,6).
\item wxRICHTEXT\_SETSTYLE\_WITH\_UNDO: specifies that this operation should be undoable.
\item wxRICHTEXT\_SETSTYLE\_OPTIMIZE: specifies that the style should not be applied if the
combined style at this point is already the style in question.
\item define wxRICHTEXT\_SETSTYLE\_PARAGRAPHS\_ONLY: specifies that the style should only be applied to paragraphs,
\item wxRICHTEXT\_SETSTYLE\_PARAGRAPHS\_ONLY: specifies that the style should only be applied to paragraphs,
and not the content. This allows content styling to be preserved independently from that of e.g. a named paragraph style.
\item wxRICHTEXT\_SETSTYLE\_CHARACTERS\_ONLY: specifies that the style should only be applied to characters,
and not the paragraph. This allows content styling to be preserved independently from that of e.g. a named paragraph style.
\item wxRICHTEXT\_SETSTYLE\_RESET: resets (clears) the existing style before applying the new style.
\end{itemize}
\membersection{wxRichTextBuffer::SetStyleSheet}\label{wxrichtextbuffersetstylesheet}

View File

@@ -1373,10 +1373,11 @@ So, for example, to set the style for a character at position 5, use the range (
\item wxRICHTEXT\_SETSTYLE\_WITH\_UNDO: specifies that this operation should be undoable.
\item wxRICHTEXT\_SETSTYLE\_OPTIMIZE: specifies that the style should not be applied if the
combined style at this point is already the style in question.
\item define wxRICHTEXT\_SETSTYLE\_PARAGRAPHS\_ONLY: specifies that the style should only be applied to paragraphs,
\item wxRICHTEXT\_SETSTYLE\_PARAGRAPHS\_ONLY: specifies that the style should only be applied to paragraphs,
and not the content. This allows content styling to be preserved independently from that of e.g. a named paragraph style.
\item wxRICHTEXT\_SETSTYLE\_CHARACTERS\_ONLY: specifies that the style should only be applied to characters,
and not the paragraph. This allows content styling to be preserved independently from that of e.g. a named paragraph style.
\item wxRICHTEXT\_SETSTYLE\_RESET: resets (clears) the existing style before applying the new style.
\end{itemize}
\membersection{wxRichTextCtrl::SetStyleSheet}\label{wxrichtextctrlsetstylesheet}

View File

@@ -176,6 +176,9 @@ class WXDLLIMPEXP_RICHTEXT wxRichTextBuffer;
// the current indentation will be used
#define wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL 0x20
// Resets the existing style before applying the new style
#define wxRICHTEXT_SETSTYLE_RESET 0x40
/*!
* Flags for text insertion
*/

View File

@@ -1599,11 +1599,29 @@ bool wxRichTextParagraphLayoutBox::SetStyle(const wxRichTextRange& range, const
bool applyMinimal = ((flags & wxRICHTEXT_SETSTYLE_OPTIMIZE) != 0);
bool parasOnly = ((flags & wxRICHTEXT_SETSTYLE_PARAGRAPHS_ONLY) != 0);
bool charactersOnly = ((flags & wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY) != 0);
bool resetExistingStyle = ((flags & wxRICHTEXT_SETSTYLE_RESET) != 0);
// Apply paragraph style first, if any
wxRichTextAttr wholeStyle(style);
if (wholeStyle.HasParagraphStyleName() && GetStyleSheet())
{
wxRichTextParagraphStyleDefinition* def = GetStyleSheet()->FindParagraphStyle(wholeStyle.GetParagraphStyleName());
if (def)
wxRichTextApplyStyle(wholeStyle, def->GetStyle());
}
// Limit the attributes to be set to the content to only character attributes.
wxRichTextAttr characterAttributes(style);
wxRichTextAttr characterAttributes(wholeStyle);
characterAttributes.SetFlags(characterAttributes.GetFlags() & (wxTEXT_ATTR_CHARACTER));
if (characterAttributes.HasCharacterStyleName() && GetStyleSheet())
{
wxRichTextCharacterStyleDefinition* def = GetStyleSheet()->FindCharacterStyle(characterAttributes.GetCharacterStyleName());
if (def)
wxRichTextApplyStyle(characterAttributes, def->GetStyle());
}
// If we are associated with a control, make undoable; otherwise, apply immediately
// to the data.
@@ -1650,16 +1668,21 @@ bool wxRichTextParagraphLayoutBox::SetStyle(const wxRichTextRange& range, const
// If we're specifying paragraphs only, then we really mean character formatting
// to be included in the paragraph style
if ((paragraphStyle || parasOnly) && !charactersOnly)
{
if (resetExistingStyle)
newPara->GetAttributes() = wholeStyle;
else
{
if (applyMinimal)
{
// Only apply attributes that will make a difference to the combined
// style as seen on the display
wxRichTextAttr combinedAttr(para->GetCombinedAttributes());
wxRichTextApplyStyle(newPara->GetAttributes(), style, & combinedAttr);
wxRichTextApplyStyle(newPara->GetAttributes(), wholeStyle, & combinedAttr);
}
else
wxRichTextApplyStyle(newPara->GetAttributes(), style);
wxRichTextApplyStyle(newPara->GetAttributes(), wholeStyle);
}
}
#if wxRICHTEXT_USE_DYNAMIC_STYLES
@@ -1725,6 +1748,10 @@ bool wxRichTextParagraphLayoutBox::SetStyle(const wxRichTextRange& range, const
{
wxRichTextObject* child = node2->GetData();
if (resetExistingStyle)
child->GetAttributes() = characterAttributes;
else
{
if (applyMinimal)
{
// Only apply attributes that will make a difference to the combined
@@ -1734,6 +1761,7 @@ bool wxRichTextParagraphLayoutBox::SetStyle(const wxRichTextRange& range, const
}
else
wxRichTextApplyStyle(child->GetAttributes(), characterAttributes);
}
if (node2 == lastNode)
break;

View File

@@ -769,7 +769,7 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event)
DeleteSelectedContent(& newPos);
wxString str = (wxChar) event.GetKeyCode();
GetBuffer().InsertTextWithUndo(newPos+1, str, this, wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE);
GetBuffer().InsertTextWithUndo(newPos+1, str, this, 0);
EndBatchUndo();