summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2019-07-04 17:40:09 +0200
committerMiklos Vajna <vmiklos@collabora.com>2019-07-08 10:32:52 +0200
commita1545a9f642aa4b3d4c4baafc1951e851b6a6ab5 (patch)
tree4a580a0c9a008ac31967913232b0d8d3dc3228d5
parenta59cec34225893f352b4fb6d6c416ade0717eccd (diff)
sw comments on frames: fix comment insert for as-char frame at para start
This adapts SwWrtShell::InsertPostIt() to behave similar to commit 86fd893e32ef7a737b2c4b60e0938146b102fc07 (sw comments on frames: delete comment of frame when deleting frame, 2019-07-03), i.e. instead of hoping that the cursor will be at the end of paragraph and traveling back, just set the cursor to the remembered anchor position. This is cleaner, and as a side-effect also fixes the scenario when creating a comment on an as-char image, which happens to be at the start of the paragraph. Change-Id: Iedca0feb62242677b6e8b69ef7b813d6da72c8eb Reviewed-on: https://gerrit.libreoffice.org/75093 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins (cherry picked from commit b382025abcd05ff75dd2cbe46df76213d4913f00) Reviewed-on: https://gerrit.libreoffice.org/75123 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
-rw-r--r--sw/qa/extras/uiwriter/uiwriter2.cxx18
-rw-r--r--sw/source/uibase/wrtsh/wrtsh1.cxx33
2 files changed, 30 insertions, 21 deletions
diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx
index bc1fe510dc03..7f161e0d9369 100644
--- a/sw/qa/extras/uiwriter/uiwriter2.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter2.cxx
@@ -492,6 +492,12 @@ void SwUiWriterTest2::testImageComment()
SwDoc* pDoc = createDoc("image-comment.odt");
SwView* pView = pDoc->GetDocShell()->GetView();
+ // Test document has "before<image>after", remove the content before the image.
+ SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ pWrtShell->SttEndDoc(/*bStart=*/true);
+ pWrtShell->Right(CRSR_SKIP_CHARS, /*bSelect=*/true, 6, /*bBasicCall=*/false);
+ pWrtShell->Delete();
+
// Select the image.
pView->GetViewFrame()->GetDispatcher()->Execute(FN_CNTNT_TO_NEXT_FRAME, SfxCallMode::SYNCHRON);
@@ -501,17 +507,17 @@ void SwUiWriterTest2::testImageComment()
// Verify that the comment is around the image.
// Without the accompanying fix in place, this test would have failed, as FN_POSTIT was disabled
// in the frame shell.
+ // Then this test would have failed, as in case the as-char anchored image was at the start of
+ // the paragraph, the comment of the image covered the character after the image, not the image.
uno::Reference<text::XTextRange> xPara = getParagraph(1);
- CPPUNIT_ASSERT_EQUAL(OUString("Text"),
- getProperty<OUString>(getRun(xPara, 1), "TextPortionType"));
CPPUNIT_ASSERT_EQUAL(OUString("Annotation"),
- getProperty<OUString>(getRun(xPara, 2), "TextPortionType"));
+ getProperty<OUString>(getRun(xPara, 1), "TextPortionType"));
CPPUNIT_ASSERT_EQUAL(OUString("Frame"),
- getProperty<OUString>(getRun(xPara, 3), "TextPortionType"));
+ getProperty<OUString>(getRun(xPara, 2), "TextPortionType"));
CPPUNIT_ASSERT_EQUAL(OUString("AnnotationEnd"),
- getProperty<OUString>(getRun(xPara, 4), "TextPortionType"));
+ getProperty<OUString>(getRun(xPara, 3), "TextPortionType"));
CPPUNIT_ASSERT_EQUAL(OUString("Text"),
- getProperty<OUString>(getRun(xPara, 5), "TextPortionType"));
+ getProperty<OUString>(getRun(xPara, 4), "TextPortionType"));
// Insert content to the comment, and select the image again.
SfxStringItem aItem(FN_INSERT_STRING, "x");
diff --git a/sw/source/uibase/wrtsh/wrtsh1.cxx b/sw/source/uibase/wrtsh/wrtsh1.cxx
index 88fcc174dab8..183f964c9d25 100644
--- a/sw/source/uibase/wrtsh/wrtsh1.cxx
+++ b/sw/source/uibase/wrtsh/wrtsh1.cxx
@@ -1885,6 +1885,21 @@ void SwWrtShell::InsertPostIt(SwFieldMgr& rFieldMgr, SfxRequest& rReq)
{
SwFlyFrame* pFly = GetSelectedFlyFrame();
+ // Remember the anchor of the selected object before deletion.
+ std::unique_ptr<SwPosition> pAnchor;
+ if (pFly)
+ {
+ SwFrameFormat* pFormat = pFly->GetFormat();
+ if (pFormat)
+ {
+ RndStdIds eAnchorId = pFormat->GetAnchor().GetAnchorId();
+ if ((eAnchorId == RndStdIds::FLY_AS_CHAR || eAnchorId == RndStdIds::FLY_AT_CHAR) && pFormat->GetAnchor().GetContentAnchor())
+ {
+ pAnchor.reset(new SwPosition(*pFormat->GetAnchor().GetContentAnchor()));
+ }
+ }
+ }
+
// A frame is selected, end frame selection.
EnterStdMode();
GetView().AttrChangedNotify(this);
@@ -1893,6 +1908,7 @@ void SwWrtShell::InsertPostIt(SwFieldMgr& rFieldMgr, SfxRequest& rReq)
// comment.
if (pFly)
{
+ *GetCurrentShellCursor().GetPoint() = *pAnchor;
SwFrameFormat* pFormat = pFly->GetFormat();
if (pFormat && pFormat->GetAnchor().GetAnchorId() == RndStdIds::FLY_AS_CHAR)
{
@@ -1900,21 +1916,8 @@ void SwWrtShell::InsertPostIt(SwFieldMgr& rFieldMgr, SfxRequest& rReq)
}
else if (pFormat && pFormat->GetAnchor().GetAnchorId() == RndStdIds::FLY_AT_CHAR)
{
- // Ending the frame selection positions the cursor at the end of the paragraph,
- // move it to the anchor position.
- sal_Int32 nCursor = GetCurrentShellCursor().GetPoint()->nContent.GetIndex();
- const SwPosition* pAnchor = pFormat->GetAnchor().GetContentAnchor();
- if (pAnchor)
- {
- sal_Int32 nDiff = nCursor - pAnchor->nContent.GetIndex();
- if (nDiff > 0)
- {
- Left(CRSR_SKIP_CELLS, /*bSelect=*/false, nDiff, /*bBasicCall=*/false,
- /*bVisual=*/true);
- aData.m_pAnnotationRange.reset(new SwPaM(
- *GetCurrentShellCursor().Start(), *GetCurrentShellCursor().End()));
- }
- }
+ aData.m_pAnnotationRange.reset(new SwPaM(*GetCurrentShellCursor().Start(),
+ *GetCurrentShellCursor().End()));
}
}
}