Fixed #13017: wxRichTextCtrl CopyToClipboard regression
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67132 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -2637,49 +2637,61 @@ bool wxRichTextParagraphLayoutBox::CopyFragment(const wxRichTextRange& range, wx
|
|||||||
// Now top and tail the first and last paragraphs in our new fragment (which might be the same).
|
// Now top and tail the first and last paragraphs in our new fragment (which might be the same).
|
||||||
if (!fragment.IsEmpty())
|
if (!fragment.IsEmpty())
|
||||||
{
|
{
|
||||||
wxRichTextRange topTailRange(range);
|
|
||||||
|
|
||||||
wxRichTextParagraph* firstPara = wxDynamicCast(fragment.GetChildren().GetFirst()->GetData(), wxRichTextParagraph);
|
wxRichTextParagraph* firstPara = wxDynamicCast(fragment.GetChildren().GetFirst()->GetData(), wxRichTextParagraph);
|
||||||
wxASSERT( firstPara != NULL );
|
wxASSERT( firstPara != NULL );
|
||||||
|
|
||||||
// Chop off the start of the paragraph
|
|
||||||
if (topTailRange.GetStart() > firstPara->GetRange().GetStart())
|
|
||||||
{
|
|
||||||
wxRichTextRange r(firstPara->GetRange().GetStart(), topTailRange.GetStart()-1);
|
|
||||||
firstPara->DeleteRange(r);
|
|
||||||
|
|
||||||
// Make sure the numbering is correct
|
|
||||||
long end;
|
|
||||||
fragment.CalculateRange(firstPara->GetRange().GetStart(), end);
|
|
||||||
|
|
||||||
// Now, we've deleted some positions, so adjust the range
|
|
||||||
// accordingly.
|
|
||||||
topTailRange.SetEnd(topTailRange.GetEnd() - r.GetLength());
|
|
||||||
}
|
|
||||||
|
|
||||||
wxRichTextParagraph* lastPara = wxDynamicCast(fragment.GetChildren().GetLast()->GetData(), wxRichTextParagraph);
|
wxRichTextParagraph* lastPara = wxDynamicCast(fragment.GetChildren().GetLast()->GetData(), wxRichTextParagraph);
|
||||||
wxASSERT( lastPara != NULL );
|
wxASSERT( lastPara != NULL );
|
||||||
|
|
||||||
if (topTailRange.GetEnd() < (lastPara->GetRange().GetEnd()-1))
|
if (!firstPara || !lastPara)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool isFragment = (range.GetEnd() < lastPara->GetRange().GetEnd());
|
||||||
|
|
||||||
|
long firstPos = firstPara->GetRange().GetStart();
|
||||||
|
|
||||||
|
// Adjust for renumbering from zero
|
||||||
|
wxRichTextRange topTailRange(range.GetStart() - firstPos, range.GetEnd() - firstPos);
|
||||||
|
|
||||||
|
long end;
|
||||||
|
fragment.CalculateRange(0, end);
|
||||||
|
|
||||||
|
// Chop off the start of the paragraph
|
||||||
|
if (topTailRange.GetStart() > 0)
|
||||||
{
|
{
|
||||||
wxRichTextRange r(topTailRange.GetEnd()+1, lastPara->GetRange().GetEnd()-1); /* -1 since actual text ends 1 position before end of para marker */
|
wxRichTextRange r(0, topTailRange.GetStart()-1);
|
||||||
lastPara->DeleteRange(r);
|
firstPara->DeleteRange(r);
|
||||||
|
|
||||||
|
// Make sure the numbering is correct
|
||||||
|
fragment.CalculateRange(0, end);
|
||||||
|
|
||||||
|
// Now, we've deleted some positions, so adjust the range
|
||||||
|
// accordingly.
|
||||||
|
topTailRange.SetStart(range.GetLength());
|
||||||
|
topTailRange.SetEnd(fragment.GetOwnRange().GetEnd());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
topTailRange.SetStart(range.GetLength());
|
||||||
|
topTailRange.SetEnd(fragment.GetOwnRange().GetEnd());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (topTailRange.GetStart() < (lastPara->GetRange().GetEnd()-1))
|
||||||
|
{
|
||||||
|
lastPara->DeleteRange(topTailRange);
|
||||||
|
|
||||||
// Make sure the numbering is correct
|
// Make sure the numbering is correct
|
||||||
long end;
|
long end;
|
||||||
fragment.CalculateRange(firstPara->GetRange().GetStart(), end);
|
fragment.CalculateRange(0, end);
|
||||||
|
|
||||||
// We only have part of a paragraph at the end
|
// We only have part of a paragraph at the end
|
||||||
fragment.SetPartialParagraph(true);
|
fragment.SetPartialParagraph(true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (topTailRange.GetEnd() == (lastPara->GetRange().GetEnd() - 1))
|
// We have a partial paragraph (don't save last new paragraph marker)
|
||||||
// We have a partial paragraph (don't save last new paragraph marker)
|
// or complete paragraph
|
||||||
fragment.SetPartialParagraph(true);
|
fragment.SetPartialParagraph(isFragment);
|
||||||
else
|
|
||||||
// We have a complete paragraph
|
|
||||||
fragment.SetPartialParagraph(false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user