tdf#62561 Add remove/edit hyperlink to calc context menu
Change-Id: Idb1b96dc4e95be40a796f9178975207099101b87
Reviewed-on: https://gerrit.libreoffice.org/75497
Tested-by: Jenkins
Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>
diff --git a/editeng/source/editeng/editview.cxx b/editeng/source/editeng/editview.cxx
index c0ad848..637f36a 100644
--- a/editeng/source/editeng/editview.cxx
+++ b/editeng/source/editeng/editview.cxx
@@ -1225,6 +1225,34 @@ const SvxFieldItem* EditView::GetFieldAtSelection() const
return nullptr;
}
const SvxFieldData* EditView::GetFieldAtCursor()
{
const SvxFieldItem* pFieldItem = GetFieldAtSelection();
if (pFieldItem)
{
// Make sure the whole field is selected
ESelection aSel = GetSelection();
if (aSel.nStartPos == aSel.nEndPos)
{
aSel.nEndPos++;
SetSelection(aSel);
}
}
if (!pFieldItem)
{
// Cursor probably behind the field - extend selection to select the field
ESelection aSel = GetSelection();
if (aSel.nStartPos == aSel.nEndPos)
{
aSel.nStartPos--;
SetSelection(aSel);
pFieldItem = GetFieldAtSelection();
}
}
return pFieldItem ? pFieldItem->GetField() : nullptr;
}
void EditView::SetInvalidateMore( sal_uInt16 nPixel )
{
pImpEditView->SetInvalidateMore( nPixel );
diff --git a/editeng/source/outliner/outlvw.cxx b/editeng/source/outliner/outlvw.cxx
index 43efbbb..6708079 100644
--- a/editeng/source/outliner/outlvw.cxx
+++ b/editeng/source/outliner/outlvw.cxx
@@ -1319,30 +1319,7 @@ const SvxFieldItem* OutlinerView::GetFieldAtSelection() const
const SvxFieldData* OutlinerView::GetFieldAtCursor()
{
const SvxFieldItem* pFieldItem = GetFieldAtSelection();
if (pFieldItem)
{
// Make sure the whole field is selected
ESelection aSel = GetSelection();
if (aSel.nStartPos == aSel.nEndPos)
{
aSel.nEndPos++;
SetSelection(aSel);
}
}
if (!pFieldItem)
{
// Cursor probably behind the field - extend selection to select the field
ESelection aSel = GetSelection();
if (aSel.nStartPos == aSel.nEndPos)
{
aSel.nStartPos--;
SetSelection(aSel);
pFieldItem = GetFieldAtSelection();
}
}
return pFieldItem ? pFieldItem->GetField() : nullptr;
return pEditView->GetFieldAtCursor();
}
void OutlinerView::SetInvalidateMore( sal_uInt16 nPixel )
diff --git a/include/editeng/editview.hxx b/include/editeng/editview.hxx
index 15ac187..9adb6ba 100644
--- a/include/editeng/editview.hxx
+++ b/include/editeng/editview.hxx
@@ -29,6 +29,7 @@
#include <vcl/errcode.hxx>
#include <vcl/vclptr.hxx>
#include <editeng/editstat.hxx>
#include <editeng/flditem.hxx>
#include <svl/languageoptions.hxx>
#include <editeng/editdata.hxx>
#include <com/sun/star/uno/Reference.h>
@@ -276,6 +277,8 @@ public:
const SvxFieldItem* GetField( const Point& rPos, sal_Int32* pnPara = nullptr, sal_Int32* pnPos = nullptr ) const;
const SvxFieldItem* GetFieldAtSelection() const;
/// Select and return the field at the current cursor position
const SvxFieldData* GetFieldAtCursor();
void SetInvalidateMore( sal_uInt16 nPixel );
sal_uInt16 GetInvalidateMore() const;
diff --git a/sc/sdi/drtxtob.sdi b/sc/sdi/drtxtob.sdi
index e1a7f4a..89be1b2 100644
--- a/sc/sdi/drtxtob.sdi
+++ b/sc/sdi/drtxtob.sdi
@@ -129,7 +129,9 @@ interface TableDrawText
SID_HYPERLINK_SETLINK [ ExecMethod = Execute; Export = FALSE; ]
SID_HYPERLINK_GETLINK [ StateMethod = GetState; Export = FALSE; ]
SID_OPEN_HYPERLINK [ ExecMethod = Execute; StateMethod = GetState; Export = FALSE; ]
SID_OPEN_HYPERLINK [ ExecMethod = Execute; StateMethod = GetState; Export = FALSE; ]
SID_EDIT_HYPERLINK [ ExecMethod = Execute; StateMethod = GetState; Export = FALSE; ]
SID_REMOVE_HYPERLINK [ ExecMethod = Execute; StateMethod = GetState; Export = FALSE; ]
SID_ENABLE_HYPHENATION [ ExecMethod = Execute; StateMethod = GetState; Export = FALSE; ]
SID_TEXTDIRECTION_LEFT_TO_RIGHT [ ExecMethod = Execute; StateMethod = GetAttrState; Export = FALSE; ]
diff --git a/sc/sdi/editsh.sdi b/sc/sdi/editsh.sdi
index 9e1e5d4a..5718fc6 100644
--- a/sc/sdi/editsh.sdi
+++ b/sc/sdi/editsh.sdi
@@ -78,7 +78,9 @@ interface TableText
SID_HYPERLINK_SETLINK [ ExecMethod = Execute; Export = FALSE; ]
SID_HYPERLINK_GETLINK [ StateMethod = GetState; Export = FALSE; ]
SID_OPEN_HYPERLINK [ ExecMethod = Execute; StateMethod = GetState; Export = FALSE; ]
SID_OPEN_HYPERLINK [ ExecMethod = Execute; StateMethod = GetState; Export = FALSE; ]
SID_EDIT_HYPERLINK [ ExecMethod = Execute; StateMethod = GetState; Export = FALSE; ]
SID_REMOVE_HYPERLINK [ ExecMethod = Execute; StateMethod = GetState; Export = FALSE; ]
SID_TRANSLITERATE_SENTENCE_CASE [ ExecMethod = ExecuteTrans; StateMethod = GetState; Export = FALSE; ]
SID_TRANSLITERATE_TITLE_CASE [ ExecMethod = ExecuteTrans; StateMethod = GetState; Export = FALSE; ]
diff --git a/sc/source/ui/drawfunc/drtxtob.cxx b/sc/source/ui/drawfunc/drtxtob.cxx
index c37b8f1..877434a 100644
--- a/sc/source/ui/drawfunc/drtxtob.cxx
+++ b/sc/source/ui/drawfunc/drtxtob.cxx
@@ -35,6 +35,7 @@
#include <editeng/lrspitem.hxx>
#include <editeng/lspcitem.hxx>
#include <editeng/ulspitem.hxx>
#include <editeng/urlfieldhelper.hxx>
#include <svx/hlnkitem.hxx>
#include <svx/svdoutl.hxx>
#include <svx/sdooitm.hxx>
@@ -328,6 +329,20 @@ void ScDrawTextObjectBar::Execute( SfxRequest &rReq )
}
break;
case SID_EDIT_HYPERLINK:
{
// Ensure the field is selected first
pOutView->GetFieldAtCursor();
pViewData->GetViewShell()->GetViewFrame()->GetDispatcher()->Execute(SID_HYPERLINK_DIALOG);
}
break;
case SID_REMOVE_HYPERLINK:
{
URLFieldHelper::RemoveURLField(pOutliner, pOutView);
}
break;
case SID_ENABLE_HYPHENATION:
case SID_TEXTDIRECTION_LEFT_TO_RIGHT:
case SID_TEXTDIRECTION_TOP_TO_BOTTOM:
@@ -406,7 +421,9 @@ void ScDrawTextObjectBar::GetState( SfxItemSet& rSet )
rSet.Put(aHLinkItem);
}
if ( rSet.GetItemState( SID_OPEN_HYPERLINK ) != SfxItemState::UNKNOWN )
if (rSet.GetItemState(SID_OPEN_HYPERLINK) != SfxItemState::UNKNOWN
|| rSet.GetItemState(SID_EDIT_HYPERLINK) != SfxItemState::UNKNOWN
|| rSet.GetItemState(SID_REMOVE_HYPERLINK) != SfxItemState::UNKNOWN)
{
SdrView* pView = pViewData->GetScDrawView();
OutlinerView* pOutView = pView->GetTextEditOutlinerView();
@@ -421,7 +438,11 @@ void ScDrawTextObjectBar::GetState( SfxItemSet& rSet )
}
}
if( !bEnable )
{
rSet.DisableItem( SID_OPEN_HYPERLINK );
rSet.DisableItem( SID_EDIT_HYPERLINK );
rSet.DisableItem( SID_REMOVE_HYPERLINK );
}
}
if( rSet.GetItemState( SID_TRANSLITERATE_HALFWIDTH ) != SfxItemState::UNKNOWN )
diff --git a/sc/source/ui/view/editsh.cxx b/sc/source/ui/view/editsh.cxx
index f458a0a..c2e3e3a 100644
--- a/sc/source/ui/view/editsh.cxx
+++ b/sc/source/ui/view/editsh.cxx
@@ -45,6 +45,7 @@
#include <editeng/wghtitem.hxx>
#include <sfx2/basedlgs.hxx>
#include <sfx2/bindings.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/msg.hxx>
#include <sfx2/objface.hxx>
#include <sfx2/objsh.hxx>
@@ -627,6 +628,27 @@ void ScEditShell::Execute( SfxRequest& rReq )
ScGlobal::OpenURL( pURLField->GetURL(), pURLField->GetTargetFrame() );
return;
}
case SID_EDIT_HYPERLINK:
{
// Ensure the field is selected first
pEditView->GetFieldAtCursor();
pViewData->GetViewShell()->GetViewFrame()->GetDispatcher()->Execute(
SID_HYPERLINK_DIALOG);
}
break;
case SID_REMOVE_HYPERLINK:
{
// Ensure the field is selected first
pEditView->GetFieldAtCursor();
const SvxURLField* pURLField = GetURLField();
if (pURLField)
{
ESelection aSel = pEditView->GetSelection();
pEditView->GetEditEngine()->QuickInsertText(pURLField->GetRepresentation(), aSel);
}
}
break;
case FN_INSERT_SOFT_HYPHEN:
lclInsertCharacter( pTableView, pTopView, CHAR_SHY );
@@ -752,6 +774,8 @@ void ScEditShell::GetState( SfxItemSet& rSet )
break;
case SID_OPEN_HYPERLINK:
case SID_EDIT_HYPERLINK:
case SID_REMOVE_HYPERLINK:
{
if ( !GetURLField() )
rSet.DisableItem( nWhich );
diff --git a/sc/uiconfig/scalc/popupmenu/celledit.xml b/sc/uiconfig/scalc/popupmenu/celledit.xml
index ea0aed1..526b47d 100644
--- a/sc/uiconfig/scalc/popupmenu/celledit.xml
+++ b/sc/uiconfig/scalc/popupmenu/celledit.xml
@@ -25,7 +25,8 @@
</menu:menu>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:OpenHyperlinkOnCursor"/>
<menu:menuitem menu:id=".uno:HyperlinkDialog"/>
<menu:menuitem menu:id=".uno:EditHyperlink"/>
<menu:menuitem menu:id=".uno:RemoveHyperlink"/>
<menu:menuitem menu:id=".uno:ThesaurusFromContext"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:ResetAttributes"/>
diff --git a/sc/uiconfig/scalc/popupmenu/drawtext.xml b/sc/uiconfig/scalc/popupmenu/drawtext.xml
index b070b32..d05b1bf 100644
--- a/sc/uiconfig/scalc/popupmenu/drawtext.xml
+++ b/sc/uiconfig/scalc/popupmenu/drawtext.xml
@@ -24,6 +24,8 @@
<menu:menuitem menu:id=".uno:ParagraphDialog"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:OpenHyperlinkOnCursor"/>
<menu:menuitem menu:id=".uno:EditHyperlink"/>
<menu:menuitem menu:id=".uno:RemoveHyperlink"/>
<menu:menuitem menu:id=".uno:ThesaurusFromContext"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:StandardTextAttributes"/>