[Libreoffice-commits] core.git: sw/qa sw/source
Miklos Vajna (via logerrit)
logerrit at kemper.freedesktop.org
Fri Jun 21 16:03:07 UTC 2019
sw/qa/extras/unowriter/unowriter.cxx | 14 ++++++++++
sw/source/core/unocore/unoportenum.cxx | 44 +++++++++++++++++++++++++++------
2 files changed, 51 insertions(+), 7 deletions(-)
New commits:
commit bf4b40f720146e7f76dab4deb72e85ea158e2d17
Author: Miklos Vajna <vmiklos at collabora.com>
AuthorDate: Fri Jun 21 13:53:24 2019 +0200
Commit: Miklos Vajna <vmiklos at collabora.com>
CommitDate: Fri Jun 21 18:01:24 2019 +0200
sw comments on frames: fix annotation start order in UNO portion enum
The problem was similar to commit
76a4305d1e90b6617054dd33036e64f005dbcf04 (sw: fix inconsistent bookmark
behavior around at-char/as-char anchored frames, 2017-12-21), except
here we have an (annotation) mark which does have a range, but still
around at-char anchored frames, similar to the bookmark situation in
that commit.
Fix the problem similarly, by first adding comment-start portions to the
enumeration, then frames, and finally the rest of the comment portions
(as before).
With this, an ODF <office:annotation/><draw:frame
text:anchor-type="char"/><office:annotation-end/> sequence (commented
at-char image) is roundtripped correctly.
Change-Id: I8790d9efae625de48c689ca4180fe75f15b4833c
Reviewed-on: https://gerrit.libreoffice.org/74503
Reviewed-by: Miklos Vajna <vmiklos at collabora.com>
Tested-by: Jenkins
diff --git a/sw/qa/extras/unowriter/unowriter.cxx b/sw/qa/extras/unowriter/unowriter.cxx
index 2969b5447675..38c55cfb74dd 100644
--- a/sw/qa/extras/unowriter/unowriter.cxx
+++ b/sw/qa/extras/unowriter/unowriter.cxx
@@ -547,6 +547,20 @@ CPPUNIT_TEST_FIXTURE(SwUnoWriter, testImageCommentAtChar)
// is also the anchor position of the image).
IDocumentMarkAccess* pMarks = pDoc->getIDocumentMarkAccess();
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), pMarks->getAnnotationMarksCount());
+
+ uno::Reference<text::XTextRange> xPara = getParagraph(1);
+ CPPUNIT_ASSERT_EQUAL(OUString("Text"),
+ getProperty<OUString>(getRun(xPara, 1), "TextPortionType"));
+ // Without the accompanying fix in place, this test would have failed with 'Expected:
+ // Annotation; Actual: Frame', i.e. the comment-start portion was after the commented image.
+ CPPUNIT_ASSERT_EQUAL(OUString("Annotation"),
+ getProperty<OUString>(getRun(xPara, 2), "TextPortionType"));
+ CPPUNIT_ASSERT_EQUAL(OUString("Frame"),
+ getProperty<OUString>(getRun(xPara, 3), "TextPortionType"));
+ CPPUNIT_ASSERT_EQUAL(OUString("AnnotationEnd"),
+ getProperty<OUString>(getRun(xPara, 4), "TextPortionType"));
+ CPPUNIT_ASSERT_EQUAL(OUString("Text"),
+ getProperty<OUString>(getRun(xPara, 5), "TextPortionType"));
}
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/core/unocore/unoportenum.cxx b/sw/source/core/unocore/unoportenum.cxx
index 30cf25ade0bd..9660d3187754 100644
--- a/sw/source/core/unocore/unoportenum.cxx
+++ b/sw/source/core/unocore/unoportenum.cxx
@@ -1161,12 +1161,25 @@ static void lcl_ExportBkmAndRedline(
lcl_ExportSoftPageBreak(rPortions, xParent, pUnoCursor, rBreakArr, nIndex);
}
+/**
+ * Exports all start annotation marks from rAnnotationStartArr into rPortions that have the same
+ * start position as nIndex.
+ *
+ * @param rAnnotationStartArr the array of annotation marks. Consumed entries are removed.
+ *
+ * @param rFramePositions the list of positions where there is an at-char anchored frame.
+ *
+ * @param bOnlyFrame If true: export only the start of annotation marks which cover an at-char
+ * anchored frame. If false: export everything else.
+ */
static void lcl_ExportAnnotationStarts(
TextRangeList_t & rPortions,
Reference<XText> const & xParent,
const SwUnoCursor * const pUnoCursor,
SwAnnotationStartPortion_ImplList& rAnnotationStartArr,
- const sal_Int32 nIndex)
+ const sal_Int32 nIndex,
+ const std::set<sal_Int32>& rFramePositions,
+ bool bOnlyFrame)
{
for ( SwAnnotationStartPortion_ImplList::iterator aIter = rAnnotationStartArr.begin(), aEnd = rAnnotationStartArr.end();
aIter != aEnd; )
@@ -1182,12 +1195,18 @@ static void lcl_ExportAnnotationStarts(
break;
}
- SwXTextPortion* pPortion =
- new SwXTextPortion( pUnoCursor, xParent, PORTION_ANNOTATION );
- pPortion->SetTextField( pPtr->mxAnnotationField );
- rPortions.emplace_back(pPortion);
+ bool bFrameStart = rFramePositions.find(nIndex) != rFramePositions.end();
+ if (bFrameStart || !bOnlyFrame)
+ {
+ SwXTextPortion* pPortion =
+ new SwXTextPortion( pUnoCursor, xParent, PORTION_ANNOTATION );
+ pPortion->SetTextField( pPtr->mxAnnotationField );
+ rPortions.emplace_back(pPortion);
- aIter = rAnnotationStartArr.erase(aIter);
+ aIter = rAnnotationStartArr.erase(aIter);
+ }
+ else
+ ++aIter;
}
}
@@ -1356,6 +1375,15 @@ static void lcl_CreatePortions(
lcl_ExportBkmAndRedline( *PortionStack.top().first, i_xParentText,
pUnoCursor, Bookmarks, Redlines, SoftPageBreaks, nCurrentIndex, aFramePositions, /*bOnlyFrameBookmarkStarts=*/true );
+ lcl_ExportAnnotationStarts(
+ *PortionStack.top().first,
+ i_xParentText,
+ pUnoCursor,
+ AnnotationStarts,
+ nCurrentIndex,
+ aFramePositions,
+ /*bOnlyFrame=*/true );
+
const sal_Int32 nFirstFrameIndex =
lcl_ExportFrames( *PortionStack.top().first,
i_xParentText, pUnoCursor, i_rFrames, nCurrentIndex);
@@ -1370,7 +1398,9 @@ static void lcl_CreatePortions(
i_xParentText,
pUnoCursor,
AnnotationStarts,
- nCurrentIndex );
+ nCurrentIndex,
+ aFramePositions,
+ /*bOnlyFrame=*/false );
bool bCursorMoved( false );
sal_Int32 nNextAttrIndex = -1;
More information about the Libreoffice-commits
mailing list