fdo#63428 writerfilter: fix paste of commented text ranges

There were multiple problems here:

- xFoo->createTextCursorByRange() got a text range argument,
  where the text range wasn't from the xFoo text
- it was assumed that all XText implements text::XParagraphCursor as
  well, but this is not true for e.g. comment text
- commented text ranges were pasted as normal comments (once again, the
  insert position wasn't passed around)

Change-Id: I9a975a08b08a7f32b1ee71e42f58736cc0dbb09d
This commit is contained in:
Miklos Vajna
2013-08-12 11:53:45 +02:00
parent ae035a3273
commit c73b8072a1
3 changed files with 32 additions and 4 deletions

View File

@@ -0,0 +1,8 @@
{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
\stshfdbch0{\fonttbl\f0\fnil\fcharset0 Verdana;}
{\colortbl;\red255\green255\blue255;}
\paperw12240\paperh15840\margl1800\margr1800\margt1440\margb1440\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\fi360\sl288\slmult1\pardirnatural
\f0\fs28 \cf0 {\*\atrfstart 1}\f0\fs28\b0\i0\ul0 hello{\*\atrfend 1}\f0\fs28\b0\i0\ul0 {\chatn{\*\annotation{\*\atnref 1}\pard\plain\f0\fs28\b0\i0\ul0
\fs20 crash
\fs28 }}\f0\fs28\b0 \i0 \ul0 }

View File

@@ -162,6 +162,7 @@ public:
void testFdo67498();
void testFdo47440();
void testFdo53556();
void testFdo63428();
CPPUNIT_TEST_SUITE(Test);
#if !defined(MACOSX) && !defined(WNT)
@@ -308,6 +309,7 @@ void Test::run()
{"fdo67498.rtf", &Test::testFdo67498},
{"fdo47440.rtf", &Test::testFdo47440},
{"fdo53556.rtf", &Test::testFdo53556},
{"hello.rtf", &Test::testFdo63428},
};
header();
for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i)
@@ -1505,6 +1507,19 @@ void Test::testFdo53556()
CPPUNIT_ASSERT_EQUAL(OUString("FrameShape"), xShapeDescriptor->getShapeType());
}
void Test::testFdo63428()
{
// Pasting content that contained an annotation caused a crash.
uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
uno::Reference<text::XTextRange> xText(xTextDocument->getText(), uno::UNO_QUERY);
uno::Reference<text::XTextRange> xEnd = xText->getEnd();
paste("fdo63428.rtf", xEnd);
// Additionally, commented range was imported as a normal comment.
CPPUNIT_ASSERT_EQUAL(OUString("TextFieldStart"), getProperty<OUString>(getRun(getParagraph(1), 2), "TextPortionType"));
CPPUNIT_ASSERT_EQUAL(OUString("TextFieldEnd"), getProperty<OUString>(getRun(getParagraph(1), 4), "TextPortionType"));
}
CPPUNIT_TEST_SUITE_REGISTRATION(Test);
CPPUNIT_PLUGIN_IMPLEMENT();

View File

@@ -290,7 +290,7 @@ void DomainMapper_Impl::RemoveLastParagraph( )
uno::Reference<lang::XComponent> xParagraph(xEnumeration->nextElement(), uno::UNO_QUERY);
xParagraph->dispose();
}
else
else if (xCursor.is())
{
xCursor->goLeft( 1, true );
// If this is a text on a shape, possibly the text has the trailing
@@ -1603,7 +1603,7 @@ void DomainMapper_Impl::PushAnnotation()
uno::Reference< text::XText > xAnnotationText;
m_xAnnotationField->getPropertyValue("TextRange") >>= xAnnotationText;
m_aTextAppendStack.push(TextAppendContext(uno::Reference< text::XTextAppend >( xAnnotationText, uno::UNO_QUERY_THROW ),
m_bIsNewDoc ? uno::Reference<text::XTextCursor>() : m_xBodyText->createTextCursorByRange(xAnnotationText->getStart())));
m_bIsNewDoc ? uno::Reference<text::XTextCursor>() : xAnnotationText->createTextCursorByRange(xAnnotationText->getStart())));
}
catch( const uno::Exception& rException)
{
@@ -3626,8 +3626,13 @@ void DomainMapper_Impl::AddAnnotationPosition(const bool bStart)
uno::Reference<text::XTextRange> xCurrent;
if (xTextAppend.is())
{
uno::Reference<text::XTextCursor> xCursor = xTextAppend->createTextCursorByRange(xTextAppend->getEnd());
xCurrent = xCursor->getStart();
uno::Reference<text::XTextCursor> xCursor;
if (m_bIsNewDoc)
xCursor = xTextAppend->createTextCursorByRange(xTextAppend->getEnd());
else
xCursor = m_aTextAppendStack.top().xCursor;
if (xCursor.is())
xCurrent = xCursor->getStart();
}
// And save it, to be used by PopAnnotation() later.