tdf#112543 Add Edit/Remove hyperlink to text boxes/shapes in Writer

Change-Id: I9052387cf39135c2324b9db03662dc0365323400
Reviewed-on: https://gerrit.libreoffice.org/75479
Tested-by: Jenkins
Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>
diff --git a/editeng/source/misc/urlfieldhelper.cxx b/editeng/source/misc/urlfieldhelper.cxx
index 961a946..f2499db 100644
--- a/editeng/source/misc/urlfieldhelper.cxx
+++ b/editeng/source/misc/urlfieldhelper.cxx
@@ -24,4 +24,21 @@ void URLFieldHelper::RemoveURLField(Outliner* pOutl, OutlinerView* pOLV)
    }
}

bool URLFieldHelper::IsCursorAtURLField(OutlinerView* pOLV)
{
    if (!pOLV)
        return false;

    const SvxFieldItem* pFieldItem = pOLV->GetFieldUnderMousePointer();
    if (!pFieldItem)
        pFieldItem = pOLV->GetFieldAtSelection();
    if (pFieldItem)
    {
        const SvxFieldData* pField = pFieldItem->GetField();
        if (dynamic_cast<const SvxURLField*>(pField))
            return true;
    }
    return false;
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/include/editeng/urlfieldhelper.hxx b/include/editeng/urlfieldhelper.hxx
index 698a220..a2f20b5 100644
--- a/include/editeng/urlfieldhelper.hxx
+++ b/include/editeng/urlfieldhelper.hxx
@@ -17,6 +17,7 @@ class EDITENG_DLLPUBLIC URLFieldHelper
{
public:
    static void RemoveURLField(Outliner* pOutl, OutlinerView* pOLV);
    static bool IsCursorAtURLField(OutlinerView* pOLV);
};

/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sd/source/ui/view/drviewsf.cxx b/sd/source/ui/view/drviewsf.cxx
index df68fa2..d420c6f 100644
--- a/sd/source/ui/view/drviewsf.cxx
+++ b/sd/source/ui/view/drviewsf.cxx
@@ -475,22 +475,8 @@ void DrawViewShell::GetAttrState( SfxItemSet& rSet )

            case SID_REMOVE_HYPERLINK:
            {
                OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();
                if (pOLV)
                {
                    bool bField = false;
                    const SvxFieldItem* pFieldItem = pOLV->GetFieldUnderMousePointer();
                    if (!pFieldItem)
                        pFieldItem = pOLV->GetFieldAtSelection();
                    if (pFieldItem)
                    {
                        const SvxFieldData* pField = pFieldItem->GetField();
                        if (dynamic_cast<const SvxURLField*>(pField))
                            bField = true;
                    }
                    if (!bField)
                        rSet.DisableItem(nWhich);
                }
                if (!URLFieldHelper::IsCursorAtURLField(mpDrawView->GetTextEditOutlinerView()))
                    rSet.DisableItem(nWhich);
            }
            break;

diff --git a/sw/sdi/drwtxtsh.sdi b/sw/sdi/drwtxtsh.sdi
index 2046fdf..c5a0e64 100644
--- a/sw/sdi/drwtxtsh.sdi
+++ b/sw/sdi/drwtxtsh.sdi
@@ -546,6 +546,18 @@ interface TextDrawText
    [
        StateMethod = StateInsert ;
    ]
    FN_EDIT_HYPERLINK
    [
        ExecMethod = Execute ;
        StateMethod = GetState;
        DisableFlags="SfxDisableFlags::SwOnProtectedCursor";
    ]
    FN_REMOVE_HYPERLINK
    [
        ExecMethod = Execute ;
        StateMethod = GetState;
        DisableFlags="SfxDisableFlags::SwOnProtectedCursor";
    ]
    SID_TRANSLITERATE_SENTENCE_CASE
    [
        ExecMethod = ExecTransliteration;
diff --git a/sw/source/uibase/shells/drwtxtex.cxx b/sw/source/uibase/shells/drwtxtex.cxx
index 16f5ca1..898cc87 100644
--- a/sw/source/uibase/shells/drwtxtex.cxx
+++ b/sw/source/uibase/shells/drwtxtex.cxx
@@ -47,6 +47,7 @@
#include <editeng/contouritem.hxx>
#include <editeng/postitem.hxx>
#include <editeng/frmdiritem.hxx>
#include <editeng/urlfieldhelper.hxx>
#include <svx/svdoutl.hxx>
#include <sfx2/viewfrm.hxx>
#include <svl/stritem.hxx>
@@ -485,6 +486,21 @@ void SwDrawTextShell::Execute( SfxRequest &rReq )
        }
        break;

        case FN_EDIT_HYPERLINK:
        {
            // Ensure the field is selected first
            pOLV->GetFieldAtCursor();
            GetView().GetViewFrame()->GetDispatcher()->Execute(SID_HYPERLINK_DIALOG);
        }
        break;

        case FN_REMOVE_HYPERLINK:
        {
            URLFieldHelper::RemoveURLField(pSdrView->GetTextEditOutliner(),
                                           pOLV);
        }
        break;

        case SID_TEXTDIRECTION_LEFT_TO_RIGHT:
        case SID_TEXTDIRECTION_TOP_TO_BOTTOM:
            // Shell switch!
@@ -884,12 +900,19 @@ void SwDrawTextShell::GetState(SfxItemSet& rSet)
                    rSet.DisableItem(nWhich);
            }
            break;
            case FN_REMOVE_HYPERLINK:
            case FN_EDIT_HYPERLINK:
            {
                if (!URLFieldHelper::IsCursorAtURLField(pOLV))
                    rSet.DisableItem(nWhich);
            }
            break;
            default:
                nSlotId = 0; // don't know this slot
                break;
        }

        if (nSlotId)
        if (nSlotId && bFlag)
            rSet.Put(SfxBoolItem(nWhich, bFlag));

        nWhich = aIter.NextWhich();
diff --git a/sw/uiconfig/swriter/popupmenu/drawtext.xml b/sw/uiconfig/swriter/popupmenu/drawtext.xml
index e13990c..7536d60 100644
--- a/sw/uiconfig/swriter/popupmenu/drawtext.xml
+++ b/sw/uiconfig/swriter/popupmenu/drawtext.xml
@@ -25,5 +25,8 @@
  <menu:menuseparator/>
  <menu:menuitem menu:id=".uno:ThesaurusFromContext"/>
  <menu:menuseparator/>
  <menu:menuitem menu:id=".uno:EditHyperlink"/>
  <menu:menuitem menu:id=".uno:RemoveHyperlink"/>
  <menu:menuseparator/>
  <menu:menuitem menu:id=".uno:ResetAttributes"/>
</menu:menupopup>