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

Muhammet Kara (via logerrit) logerrit at kemper.freedesktop.org
Sat Feb 29 01:23:56 UTC 2020


 sw/source/core/crsr/viscrs.cxx |   44 +++++++++++++++++++++++++++++++++++------
 1 file changed, 38 insertions(+), 6 deletions(-)

New commits:
commit 150ca03b82393c8c9704885b56c2752b77bbb559
Author:     Muhammet Kara <muhammet.kara at collabora.com>
AuthorDate: Wed Dec 18 02:11:23 2019 +0300
Commit:     Muhammet Kara <muhammet.kara at collabora.com>
CommitDate: Sat Feb 29 02:23:22 2020 +0100

    lok: Resolves: Writer - selecting a hyperlink doesn't show link in dialog
    
    Repro: Select text in Online, and Ctrl + K to open Hyperlink dialog,
    then assign a hyperlink and close with Ok. Without removing/changing
    the selection, re-open the hyperlink dialog again by Ctrl + K. You see
    that the hyperlink is not recognized.
    
    Why?
    The dialog relies on the hyperlinkUnderCursor property which is
    set by the SfxLokHelper::notifyVisCursorInvalidation() method, which
    also relies on the current char cursor is on. So when you select a hyperlinked
    text from left to right (in English), the final position of the cursor is outside
    the hyperlinked text, thus the hyperlinkUnderCursor property is unset.
    
    Solution
    Check for presence of selection and hyperlink via SfxItemPool and
    proceed accordingly
    
    Change-Id: I3a7f18c8199cec243ac99f011d9aaee7c7c575b8
    Reviewed-on: https://gerrit.libreoffice.org/85348
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Muhammet Kara <muhammet.kara at collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/89704
    Tested-by: Jenkins

diff --git a/sw/source/core/crsr/viscrs.cxx b/sw/source/core/crsr/viscrs.cxx
index 400b79c869e1..bf764a12db94 100644
--- a/sw/source/core/crsr/viscrs.cxx
+++ b/sw/source/core/crsr/viscrs.cxx
@@ -54,6 +54,7 @@
 #include <paintfrm.hxx>
 #include <PostItMgr.hxx>
 #include <SwGrammarMarkUp.hxx>
+#include <docsh.hxx>
 
 #include <cellfrm.hxx>
 #include <wrtsh.hxx>
@@ -108,6 +109,23 @@ void SwVisibleCursor::Hide()
     }
 }
 
+namespace
+{
+
+// Build JSON message to be sent to Online
+OString buildHyperlinkJSON(const OUString& sText, const OUString& sLink)
+{
+    boost::property_tree::ptree aTree;
+    aTree.put("text", sText);
+    aTree.put("link", sLink);
+    std::stringstream aStream;
+    boost::property_tree::write_json(aStream, aTree, false);
+
+    return OString(aStream.str().c_str()).trim();
+}
+
+}
+
 void SwVisibleCursor::SetPosAndShow(SfxViewShell const * pViewShell)
 {
     SwRect aRect;
@@ -241,15 +259,29 @@ void SwVisibleCursor::SetPosAndShow(SfxViewShell const * pViewShell)
 
         OString sHyperlink;
         SwContentAtPos aContentAtPos(IsAttrAtPos::InetAttr);
+        bool bIsSelection = m_pCursorShell->IsSelection();
+
         if (const_cast<SwCursorShell*>(m_pCursorShell)->GetContentAtPos(aRect.Pos(), aContentAtPos))
         {
             const SwFormatINetFormat* pItem = static_cast<const SwFormatINetFormat*>(aContentAtPos.aFnd.pAttr);
-            boost::property_tree::ptree aTree;
-            aTree.put("text", aContentAtPos.sStr);
-            aTree.put("link", pItem->GetValue());
-            std::stringstream aStream;
-            boost::property_tree::write_json(aStream, aTree, false);
-            sHyperlink = OString(aStream.str().c_str()).trim();
+            sHyperlink = buildHyperlinkJSON(aContentAtPos.sStr, pItem->GetValue());
+        }
+        else if (bIsSelection)
+        {
+            SwWrtShell* pShell = m_pCursorShell->GetDoc()->GetDocShell()->GetWrtShell();
+
+            if (pShell)
+            {
+                SfxItemSet aSet(m_pCursorShell->GetSfxViewShell()->GetPool(),
+                    svl::Items<RES_TXTATR_INETFMT,
+                    RES_TXTATR_INETFMT>{});
+                pShell->GetCurAttr(aSet);
+                if(SfxItemState::SET <= aSet.GetItemState( RES_TXTATR_INETFMT ))
+                {
+                    sHyperlink = buildHyperlinkJSON(m_pCursorShell->GetSelText(),
+                                                    aSet.GetItem(RES_TXTATR_INETFMT)->GetValue());
+                }
+            }
         }
 
         if (pViewShell)


More information about the Libreoffice-commits mailing list