Further fixes, for selected text display and new paragraph insertion

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51753 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2008-02-13 14:24:49 +00:00
parent e014851ee9
commit c025e094f4
3 changed files with 42 additions and 15 deletions

View File

@@ -195,6 +195,7 @@ class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextBuffer;
#define wxRICHTEXT_INSERT_NONE 0x00 #define wxRICHTEXT_INSERT_NONE 0x00
#define wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE 0x01 #define wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE 0x01
#define wxRICHTEXT_INSERT_INTERACTIVE 0x02
/*! /*!
* wxRichTextFontTable * wxRichTextFontTable

View File

@@ -1159,13 +1159,10 @@ bool wxRichTextParagraphLayoutBox::InsertFragment(long position, wxRichTextParag
while (objectNode) while (objectNode)
{ {
if (!objectNode->GetData()->IsEmpty()) wxRichTextObject* newObj = objectNode->GetData()->Clone();
{
wxRichTextObject* newObj = objectNode->GetData()->Clone();
// Append // Append
para->AppendChild(newObj); para->AppendChild(newObj);
}
objectNode = objectNode->GetNext(); objectNode = objectNode->GetNext();
} }
@@ -1212,7 +1209,8 @@ bool wxRichTextParagraphLayoutBox::InsertFragment(long position, wxRichTextParag
// 4. Add back the remaining content. // 4. Add back the remaining content.
if (finalPara) if (finalPara)
{ {
finalPara->MoveFromList(savedObjects); if (nextObject)
finalPara->MoveFromList(savedObjects);
// Ensure there's at least one object // Ensure there's at least one object
if (finalPara->GetChildCount() == 0) if (finalPara->GetChildCount() == 0)
@@ -4272,11 +4270,11 @@ bool wxRichTextPlainText::Draw(wxDC& dc, const wxRichTextRange& range, const wxR
wxString str = m_text; wxString str = m_text;
wxString toRemove = wxRichTextLineBreakChar; wxString toRemove = wxRichTextLineBreakChar;
str.Replace(toRemove, wxT(" ")); str.Replace(toRemove, wxT(" "));
if (textAttr.HasTextEffects() && (textAttr.GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS))
str.MakeUpper();
long len = range.GetLength(); long len = range.GetLength();
wxString stringChunk = str.Mid(range.GetStart() - offset, (size_t) len); wxString stringChunk = str.Mid(range.GetStart() - offset, (size_t) len);
if (textAttr.HasTextEffects() && (textAttr.GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS))
stringChunk.MakeUpper();
int charHeight = dc.GetCharHeight(); int charHeight = dc.GetCharHeight();
@@ -4903,17 +4901,45 @@ bool wxRichTextBuffer::InsertNewlineWithUndo(long pos, wxRichTextCtrl* ctrl, int
action->GetNewParagraphs().AppendChild(newPara); action->GetNewParagraphs().AppendChild(newPara);
action->GetNewParagraphs().UpdateRanges(); action->GetNewParagraphs().UpdateRanges();
action->GetNewParagraphs().SetPartialParagraph(false); action->GetNewParagraphs().SetPartialParagraph(false);
wxRichTextParagraph* para = GetParagraphAtPosition(pos, false);
long pos1 = pos;
if (flags & wxRICHTEXT_INSERT_INTERACTIVE)
{
if (para && para->GetRange().GetEnd() == pos)
pos1 ++;
}
action->SetPosition(pos); action->SetPosition(pos);
if (p) if (p)
newPara->SetAttributes(*p); newPara->SetAttributes(*p);
// Use the default character style
// Use the default character style // Use the default character style
if (!GetDefaultStyle().IsDefault() && newPara->GetChildren().GetFirst()) if (!GetDefaultStyle().IsDefault() && newPara->GetChildren().GetFirst())
newPara->GetChildren().GetFirst()->GetData()->SetAttributes(GetDefaultStyle()); {
// Check whether the default style merely reflects the paragraph/basic style,
// in which case don't apply it.
wxTextAttrEx defaultStyle(GetDefaultStyle());
wxTextAttrEx toApply;
if (para)
{
wxRichTextAttr combinedAttr = para->GetCombinedAttributes();
wxTextAttrEx newAttr;
// This filters out attributes that are accounted for by the current
// paragraph/basic style
wxRichTextApplyStyle(toApply, defaultStyle, & combinedAttr);
}
else
toApply = defaultStyle;
if (!toApply.IsDefault())
newPara->GetChildren().GetFirst()->GetData()->SetAttributes(toApply);
}
// Set the range we'll need to delete in Undo // Set the range we'll need to delete in Undo
action->SetRange(wxRichTextRange(pos, pos)); action->SetRange(wxRichTextRange(pos1, pos1));
SubmitAction(action); SubmitAction(action);
@@ -6129,7 +6155,7 @@ bool wxRichTextAction::Do()
wxPoint firstVisiblePt = m_ctrl->GetFirstVisiblePoint(); wxPoint firstVisiblePt = m_ctrl->GetFirstVisiblePoint();
int lastY = firstVisiblePt.y + clientSize.y; int lastY = firstVisiblePt.y + clientSize.y;
wxRichTextParagraph* para = m_buffer->GetParagraphAtPosition(GetPosition()); wxRichTextParagraph* para = m_buffer->GetParagraphAtPosition(GetRange().GetStart());
wxRichTextObjectList::compatibility_iterator node = m_buffer->GetChildren().Find(para); wxRichTextObjectList::compatibility_iterator node = m_buffer->GetChildren().Find(para);
while (node) while (node)
{ {
@@ -6162,9 +6188,9 @@ bool wxRichTextAction::Do()
} }
#endif #endif
m_buffer->InsertFragment(GetPosition(), m_newParagraphs); m_buffer->InsertFragment(GetRange().GetStart(), m_newParagraphs);
m_buffer->UpdateRanges(); m_buffer->UpdateRanges();
m_buffer->Invalidate(GetRange()); m_buffer->Invalidate(wxRichTextRange(GetRange().GetStart()-1, GetRange().GetEnd()));
long newCaretPosition = GetPosition() + m_newParagraphs.GetRange().GetLength(); long newCaretPosition = GetPosition() + m_newParagraphs.GetRange().GetLength();

View File

@@ -596,7 +596,7 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event)
GetBuffer().InsertTextWithUndo(newPos+1, text, this); GetBuffer().InsertTextWithUndo(newPos+1, text, this);
} }
else else
GetBuffer().InsertNewlineWithUndo(newPos+1, this, wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE); GetBuffer().InsertNewlineWithUndo(newPos+1, this, wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE|wxRICHTEXT_INSERT_INTERACTIVE);
EndBatchUndo(); EndBatchUndo();
SetDefaultStyleToCursorStyle(); SetDefaultStyleToCursorStyle();