while (objectNode)
{
- if (!objectNode->GetData()->IsEmpty())
- {
- wxRichTextObject* newObj = objectNode->GetData()->Clone();
+ wxRichTextObject* newObj = objectNode->GetData()->Clone();
- // Append
- para->AppendChild(newObj);
- }
+ // Append
+ para->AppendChild(newObj);
objectNode = objectNode->GetNext();
}
// 4. Add back the remaining content.
if (finalPara)
{
- finalPara->MoveFromList(savedObjects);
+ if (nextObject)
+ finalPara->MoveFromList(savedObjects);
// Ensure there's at least one object
if (finalPara->GetChildCount() == 0)
{
wxRichTextObject* obj1 = node1->GetData();
- // If the object is empty, optimise it out
- if (obj1->IsEmpty())
- {
- delete obj1;
- }
- else
- {
- firstPara->AppendChild(obj1);
- }
+ firstPara->AppendChild(obj1);
wxRichTextObjectList::compatibility_iterator next1 = node1->GetNext();
nextParagraph->GetChildren().Erase(node1);
RemoveChild(nextParagraph, true);
}
+ // Avoid empty paragraphs
+ if (firstPara && firstPara->GetChildren().GetCount() == 0)
+ {
+ wxRichTextPlainText* text = new wxRichTextPlainText(wxEmptyString);
+ firstPara->AppendChild(text);
+ }
+
if (applyFinalParagraphStyle)
firstPara->SetAttributes(nextParaAttr);
splitPoint ++;
// Find last object
- if (splitPoint == newPara->GetRange().GetEnd() || splitPoint == (newPara->GetRange().GetEnd() - 1))
+ if (splitPoint == newPara->GetRange().GetEnd())
lastObject = newPara->GetChildren().GetLast()->GetData();
else
// lastObject is set as a side-effect of splitting. It's
wxString str = m_text;
wxString toRemove = wxRichTextLineBreakChar;
str.Replace(toRemove, wxT(" "));
+ if (textAttr.HasTextEffects() && (textAttr.GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS))
+ str.MakeUpper();
long len = range.GetLength();
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();
action->GetNewParagraphs().AppendChild(newPara);
action->GetNewParagraphs().UpdateRanges();
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);
if (p)
newPara->SetAttributes(*p);
+ // Use the default character style
// Use the default character style
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
- action->SetRange(wxRichTextRange(pos, pos));
+ action->SetRange(wxRichTextRange(pos1, pos1));
SubmitAction(action);
wxASSERT(m_batchedCommand == NULL);
if (m_batchedCommand)
{
- GetCommandProcessor()->Submit(m_batchedCommand);
+ GetCommandProcessor()->Store(m_batchedCommand);
}
m_batchedCommand = new wxRichTextCommand(cmdName);
}
if (m_batchedCommandDepth == 0)
{
- GetCommandProcessor()->Submit(m_batchedCommand);
+ GetCommandProcessor()->Store(m_batchedCommand);
m_batchedCommand = NULL;
}
bool wxRichTextBuffer::SubmitAction(wxRichTextAction* action)
{
if (BatchingUndo() && m_batchedCommand && !SuppressingUndo())
+ {
+ wxRichTextCommand* cmd = new wxRichTextCommand(action->GetName());
+ cmd->AddAction(action);
+ cmd->Do();
+ cmd->GetActions().Clear();
+ delete cmd;
+
m_batchedCommand->AddAction(action);
+ }
else
{
wxRichTextCommand* cmd = new wxRichTextCommand(action->GetName());
wxPoint firstVisiblePt = m_ctrl->GetFirstVisiblePoint();
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);
while (node)
{
}
#endif
- m_buffer->InsertFragment(GetPosition(), m_newParagraphs);
+ m_buffer->InsertFragment(GetRange().GetStart(), m_newParagraphs);
m_buffer->UpdateRanges();
- m_buffer->Invalidate(GetRange());
+ m_buffer->Invalidate(wxRichTextRange(GetRange().GetStart()-1, GetRange().GetEnd()));
long newCaretPosition = GetPosition() + m_newParagraphs.GetRange().GetLength();