include/svx/hlnkitem.hxx            |    8 +++++++-
 include/svx/svxids.hrc              |    1 +
 svx/sdi/svxitems.sdi                |   11 ++++++-----
 svx/source/items/hlnkitem.cxx       |   17 ++++++++++++++---
 sw/source/uibase/shells/textfld.cxx |   15 ++++++++++++++-
 5 files changed, 42 insertions(+), 10 deletions(-)

New commits:
commit fb3597932ad9322feb58115528ca1dae070edfa5
Author:     rash419 <rashesh.pa...@collabora.com>
AuthorDate: Thu Sep 15 18:02:06 2022 +0530
Commit:     Szymon Kłos <szymon.k...@collabora.com>
CommitDate: Tue Sep 27 11:15:56 2022 +0200

    svx: extended SvxHyperlinkItem to have a new property sReplacementText
    
    this property is use to pass text that needs to be replaced when
    executing uno:SetHyperlink command in online for inserting the mention
    
    Signed-off-by: rash419 <rashesh.pa...@collabora.com>
    Change-Id: I48fba347bda0652f7b657524f23c2dd837cd8186
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140015
    Reviewed-by: Szymon Kłos <szymon.k...@collabora.com>
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>

diff --git a/include/svx/hlnkitem.hxx b/include/svx/hlnkitem.hxx
index 5d6ac5689401..7c6501c7777d 100644
--- a/include/svx/hlnkitem.hxx
+++ b/include/svx/hlnkitem.hxx
@@ -26,6 +26,7 @@
 #include <svx/svxdllapi.h>
 #include <o3tl/typed_flags_set.hxx>
 #include <memory>
+#include <rtl/ustrbuf.hxx>
 
 enum class HyperDialogEvent {
     NONE                = 0x0000,
@@ -51,6 +52,7 @@ class SVX_DLLPUBLIC SvxHyperlinkItem final : public 
SfxPoolItem
     OUString sURL;
     OUString sTarget;
     SvxLinkInsertMode eType;
+    OUString sReplacementText;
 
     OUString sIntName;
     std::unique_ptr<SvxMacroTableDtor>  pMacroTable;
@@ -67,7 +69,8 @@ public:
                                     const OUString& rTarget, const OUString& 
rIntName,
                                     SvxLinkInsertMode eTyp,
                                     HyperDialogEvent nEvents,
-                                    SvxMacroTableDtor const *pMacroTbl );
+                                    SvxMacroTableDtor const *pMacroTbl,
+                                    const OUString& rReplacementText = 
OUString());
 
     virtual bool             operator==( const SfxPoolItem& ) const override;
     virtual SvxHyperlinkItem* Clone( SfxItemPool *pPool = nullptr ) const 
override;
@@ -97,6 +100,9 @@ public:
     void SetMacroEvents (const HyperDialogEvent nEvents) { nMacroEvents = 
nEvents; }
     HyperDialogEvent GetMacroEvents() const { return nMacroEvents; }
 
+    const OUString& GetReplacementText() const { return sReplacementText; }
+    void    SetReplacementText(const OUString& rReplacementText) { 
sReplacementText = rReplacementText; }
+
 };
 
 #endif
diff --git a/include/svx/svxids.hrc b/include/svx/svxids.hrc
index f8e162a973a6..e19f5121d5de 100644
--- a/include/svx/svxids.hrc
+++ b/include/svx/svxids.hrc
@@ -67,6 +67,7 @@ class SdrAngleItem;
 #define MID_HLINK_TARGET        0x71
 #define MID_HLINK_TYPE          0x72
 #define MID_HLINK_TEXT          0x73
+#define MID_HLINK_REPLACEMENTTEXT 0x74
 
 #define MID_VIEWLAYOUT_COLUMNS  0x77
 #define MID_VIEWLAYOUT_BOOKMODE 0x78
diff --git a/svx/sdi/svxitems.sdi b/svx/sdi/svxitems.sdi
index 549ffc3f3227..b34a317b3449 100644
--- a/svx/sdi/svxitems.sdi
+++ b/svx/sdi/svxitems.sdi
@@ -343,11 +343,12 @@ item SvxLongULSpace SvxLongULSpaceItem;
 
 struct SvxHyperlink
 {
-    String  Text    MID_HLINK_TEXT;
-    String  URL     MID_HLINK_URL;
-    String  Target  MID_HLINK_TARGET;
-    String  Name    MID_HLINK_NAME;
-    INT32   Type    MID_HLINK_TYPE;
+    String  Text               MID_HLINK_TEXT;
+    String  URL                MID_HLINK_URL;
+    String  Target             MID_HLINK_TARGET;
+    String  Name               MID_HLINK_NAME;
+    INT32   Type               MID_HLINK_TYPE;
+    String  ReplacementText    MID_HLINK_REPLACEMENTTEXT
 };
 item SvxHyperlink SvxHyperlinkItem;
 
diff --git a/svx/source/items/hlnkitem.cxx b/svx/source/items/hlnkitem.cxx
index 7a092b36fc5a..f8500277316a 100644
--- a/svx/source/items/hlnkitem.cxx
+++ b/svx/source/items/hlnkitem.cxx
@@ -33,6 +33,7 @@ SvxHyperlinkItem::SvxHyperlinkItem( const SvxHyperlinkItem& 
rHyperlinkItem ):
     eType   = rHyperlinkItem.eType;
     sIntName = rHyperlinkItem.sIntName;
     nMacroEvents = rHyperlinkItem.nMacroEvents;
+    sReplacementText = rHyperlinkItem.sReplacementText;
 
     if( rHyperlinkItem.GetMacroTable() )
         pMacroTable.reset( new SvxMacroTableDtor( 
*rHyperlinkItem.GetMacroTable() ) );
@@ -41,14 +42,15 @@ SvxHyperlinkItem::SvxHyperlinkItem( const SvxHyperlinkItem& 
rHyperlinkItem ):
 
 SvxHyperlinkItem::SvxHyperlinkItem( sal_uInt16 _nWhich, const OUString& rName, 
const OUString& rURL,
                                     const OUString& rTarget, const OUString& 
rIntName, SvxLinkInsertMode eTyp,
-                                    HyperDialogEvent nEvents, 
SvxMacroTableDtor const *pMacroTbl ):
+                                    HyperDialogEvent nEvents, 
SvxMacroTableDtor const *pMacroTbl, const OUString& rReplacementText):
     SfxPoolItem (_nWhich),
     sName       (rName),
     sURL        (rURL),
     sTarget     (rTarget),
     eType       (eTyp),
     sIntName (rIntName),
-    nMacroEvents (nEvents)
+    nMacroEvents (nEvents),
+    sReplacementText (rReplacementText)
 {
     if (pMacroTbl)
         pMacroTable.reset( new SvxMacroTableDtor ( *pMacroTbl ) );
@@ -70,7 +72,8 @@ bool SvxHyperlinkItem::operator==( const SfxPoolItem& rAttr ) 
const
                   sTarget == rItem.sTarget &&
                   eType   == rItem.eType   &&
                   sIntName == rItem.sIntName &&
-                  nMacroEvents == rItem.nMacroEvents);
+                  nMacroEvents == rItem.nMacroEvents &&
+                  sReplacementText == rItem.sReplacementText);
     if (!bRet)
         return false;
 
@@ -135,6 +138,9 @@ bool SvxHyperlinkItem::QueryValue( css::uno::Any& rVal, 
sal_uInt8 nMemberId ) co
         case MID_HLINK_TYPE:
             rVal <<= static_cast<sal_Int32>(eType);
         break;
+        case MID_HLINK_REPLACEMENTTEXT:
+            rVal <<= sReplacementText;
+        break;
         default:
             return false;
     }
@@ -174,6 +180,11 @@ bool SvxHyperlinkItem::PutValue( const css::uno::Any& 
rVal, sal_uInt8 nMemberId
                 return false;
             eType = 
static_cast<SvxLinkInsertMode>(static_cast<sal_uInt16>(nVal));
         break;
+        case MID_HLINK_REPLACEMENTTEXT:
+            if(!(rVal >>= aStr))
+                return false;
+            sReplacementText = aStr;
+        break;
         default:
             return false;
     }
diff --git a/sw/source/uibase/shells/textfld.cxx 
b/sw/source/uibase/shells/textfld.cxx
index 9a1cbe76e040..474d76ce0030 100644
--- a/sw/source/uibase/shells/textfld.cxx
+++ b/sw/source/uibase/shells/textfld.cxx
@@ -976,6 +976,7 @@ void SwTextShell::InsertHyperlink(const SvxHyperlinkItem& 
rHlnkItem)
     const OUString& rName   = rHlnkItem.GetName();
     const OUString& rURL    = rHlnkItem.GetURL();
     const OUString& rTarget = rHlnkItem.GetTargetFrame();
+    const OUString& rReplacementText = rHlnkItem.GetReplacementText();
     sal_uInt16 nType =  o3tl::narrowing<sal_uInt16>(rHlnkItem.GetInsertMode());
     nType &= ~HLINK_HTMLMODE;
     const SvxMacroTableDtor* pMacroTable = rHlnkItem.GetMacroTable();
@@ -1015,7 +1016,19 @@ void SwTextShell::InsertHyperlink(const 
SvxHyperlinkItem& rHlnkItem)
                     aINetFormat.SetMacro(SvMacroItemId::OnMouseOut, *pMacro);
             }
             rSh.SttSelect();
-            rSh.InsertURL( aINetFormat, rName, true );
+            // inserting mention
+            if (comphelper::LibreOfficeKit::isActive() && 
!rReplacementText.isEmpty())
+            {
+                SwPaM* pCursorPos = rSh.GetCursor();
+                // move cursor backwards to select @mention
+                for(int i=0; i < rReplacementText.getLength(); i++)
+                    pCursorPos->Move(fnMoveBackward);
+                rSh.InsertURL( aINetFormat, rName, false );
+            }
+            else
+            {
+                rSh.InsertURL( aINetFormat, rName, true );
+            }
             rSh.EndSelect();
         }
         break;

Reply via email to