[Libreoffice-commits] core.git: sw/qa sw/source

Miklos Vajna (via logerrit) logerrit at kemper.freedesktop.org
Mon Jul 1 15:41:29 UTC 2019


 sw/qa/extras/uiwriter/data2/image-comment-at-char.odt |binary
 sw/qa/extras/uiwriter/uiwriter2.cxx                   |   28 ++++++++++++++++++
 sw/source/uibase/fldui/fldmgr.cxx                     |    2 -
 sw/source/uibase/inc/fldmgr.hxx                       |    2 +
 sw/source/uibase/inc/wrtsh.hxx                        |    2 -
 sw/source/uibase/wrtsh/wrtsh1.cxx                     |   18 +++++++++++
 sw/source/uibase/wrtsh/wrtsh2.cxx                     |   18 ++++++++++-
 7 files changed, 67 insertions(+), 3 deletions(-)

New commits:
commit 5cb34f1c38be72047be1c4ed8357c5e87134c6a2
Author:     Miklos Vajna <vmiklos at collabora.com>
AuthorDate: Mon Jul 1 16:08:10 2019 +0200
Commit:     Miklos Vajna <vmiklos at collabora.com>
CommitDate: Mon Jul 1 17:40:43 2019 +0200

    sw comments on frames: fix UI to be able to annotate with at-char anchors
    
    We used to just comment the doc model position at the end of the
    paragraph of the image anchor. Change this, so that in case an at-char
    anchored image is commented, first we insert the comment (which creates
    a placeholder character), and then we set the annotation range to cover
    exactly that placeholder character.
    
    This results in a layout that shows a commented image.
    
    Change-Id: Ie21d62ddb9f55f3e06ee39d9eccfaa0446ce7845
    Reviewed-on: https://gerrit.libreoffice.org/74957
    Reviewed-by: Miklos Vajna <vmiklos at collabora.com>
    Tested-by: Jenkins

diff --git a/sw/qa/extras/uiwriter/data2/image-comment-at-char.odt b/sw/qa/extras/uiwriter/data2/image-comment-at-char.odt
new file mode 100644
index 000000000000..a3638ffe7276
Binary files /dev/null and b/sw/qa/extras/uiwriter/data2/image-comment-at-char.odt differ
diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx
index 4a5a014761b6..375b4a3aacda 100644
--- a/sw/qa/extras/uiwriter/uiwriter2.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter2.cxx
@@ -1561,4 +1561,32 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testImageComment)
                          getProperty<OUString>(getRun(xPara, 5), "TextPortionType"));
 }
 
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testImageCommentAtChar)
+{
+    // Load a document with an at-char image in it.
+    SwDoc* pDoc = createDoc("image-comment-at-char.odt");
+    SwView* pView = pDoc->GetDocShell()->GetView();
+
+    // Select the image.
+    pView->GetViewFrame()->GetDispatcher()->Execute(FN_CNTNT_TO_NEXT_FRAME, SfxCallMode::SYNCHRON);
+
+    // Insert a comment while the image is selected.
+    pView->GetViewFrame()->GetDispatcher()->Execute(FN_POSTIT, SfxCallMode::SYNCHRON);
+
+    // Verify that the comment is around the image.
+    // Without the accompanying fix in place, this test would have failed, as the comment was
+    // anchored at the end of the paragraph, it was not around 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"));
+    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"));
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/fldui/fldmgr.cxx b/sw/source/uibase/fldui/fldmgr.cxx
index d7ccd768723b..547e71e1283f 100644
--- a/sw/source/uibase/fldui/fldmgr.cxx
+++ b/sw/source/uibase/fldui/fldmgr.cxx
@@ -1500,7 +1500,7 @@ bool SwFieldMgr::InsertField(
     // insert
     pCurShell->StartAllAction();
 
-    pCurShell->Insert( *pField );
+    pCurShell->Insert(*pField, rData.m_pAnnotationRange.get());
 
     if (TYP_INPUTFLD == rData.m_nTypeId)
     {
diff --git a/sw/source/uibase/inc/fldmgr.hxx b/sw/source/uibase/inc/fldmgr.hxx
index 4b8a2707ef01..e954e52b9d56 100644
--- a/sw/source/uibase/inc/fldmgr.hxx
+++ b/sw/source/uibase/inc/fldmgr.hxx
@@ -80,6 +80,8 @@ struct SwInsertField_Data
     css::uno::Any m_aDBConnection;
     css::uno::Any m_aDBColumn;
     weld::Widget* m_pParent; // parent widget used for SwWrtShell::StartInputFieldDlg()
+    /// Marks the PostIt field's annotation start/end if it differs from the cursor selection.
+    std::unique_ptr<SwPaM> m_pAnnotationRange;
 
     SwInsertField_Data(sal_uInt16 nType, sal_uInt16 nSub, const OUString& rPar1, const OUString& rPar2,
                     sal_uInt32 nFormatId, SwWrtShell* pShell = nullptr, sal_Unicode cSep = ' ', bool bIsAutoLanguage = true) :
diff --git a/sw/source/uibase/inc/wrtsh.hxx b/sw/source/uibase/inc/wrtsh.hxx
index 8307327ce135..54e97e0b40d3 100644
--- a/sw/source/uibase/inc/wrtsh.hxx
+++ b/sw/source/uibase/inc/wrtsh.hxx
@@ -298,7 +298,7 @@ typedef bool (SwWrtShell:: *FNSimpleMove)();
     int     IntelligentCut(SelectionType nSelectionType, bool bCut = true);
 
     // edit
-    void    Insert(SwField const &);
+    void    Insert(SwField const &, SwPaM* pAnnotationRange = nullptr);
     void    Insert(const OUString &);
     // graphic
     void    Insert( const OUString &rPath, const OUString &rFilter,
diff --git a/sw/source/uibase/wrtsh/wrtsh1.cxx b/sw/source/uibase/wrtsh/wrtsh1.cxx
index 0b4ae14c8290..ce49c2ec315f 100644
--- a/sw/source/uibase/wrtsh/wrtsh1.cxx
+++ b/sw/source/uibase/wrtsh/wrtsh1.cxx
@@ -1925,6 +1925,24 @@ void SwWrtShell::InsertPostIt(SwFieldMgr& rFieldMgr, SfxRequest& rReq)
                 {
                     Right(CRSR_SKIP_CELLS, /*bSelect=*/true, 1, /*bBasicCall=*/false, /*bVisual=*/true);
                 }
+                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()));
+                        }
+                    }
+                }
             }
         }
 
diff --git a/sw/source/uibase/wrtsh/wrtsh2.cxx b/sw/source/uibase/wrtsh/wrtsh2.cxx
index 8897fe213130..e46a1d6c03b8 100644
--- a/sw/source/uibase/wrtsh/wrtsh2.cxx
+++ b/sw/source/uibase/wrtsh/wrtsh2.cxx
@@ -68,7 +68,7 @@
 #include <sfx2/event.hxx>
 #include <sal/log.hxx>
 
-void SwWrtShell::Insert(SwField const &rField)
+void SwWrtShell::Insert(SwField const& rField, SwPaM* pAnnotationRange)
 {
     ResetCursorStack();
     if(!CanInsert())
@@ -82,6 +82,11 @@ void SwWrtShell::Insert(SwField const &rField)
 
     bool bDeleted = false;
     std::unique_ptr<SwPaM> pAnnotationTextRange;
+    if (pAnnotationRange)
+    {
+        pAnnotationTextRange.reset(new SwPaM(*pAnnotationRange->Start(), *pAnnotationRange->End()));
+    }
+
     if ( HasSelection() )
     {
         if ( rField.GetTyp()->Which() == SwFieldIds::Postit )
@@ -121,6 +126,17 @@ void SwWrtShell::Insert(SwField const &rField)
     {
         if ( GetDoc() != nullptr )
         {
+            const SwPaM& rCurrPaM = GetCurrentShellCursor();
+            if (*rCurrPaM.Start() == *pAnnotationTextRange->Start()
+                && *rCurrPaM.End() == *pAnnotationTextRange->End())
+            {
+                // Annotation range was passed in externally, and inserting the postit field shifted
+                // its start/end positions right by one. Restore the original position for the range
+                // start. This allows commenting on the placeholder character of the field.
+                SwIndex& rRangeStart = pAnnotationTextRange->Start()->nContent;
+                if (rRangeStart.GetIndex() > 0)
+                    --rRangeStart;
+            }
             IDocumentMarkAccess* pMarksAccess = GetDoc()->getIDocumentMarkAccess();
             pMarksAccess->makeAnnotationMark( *pAnnotationTextRange, OUString() );
         }


More information about the Libreoffice-commits mailing list