sc/sdi/cellsh.sdi | 2 + sc/source/ui/inc/gridwin.hxx | 2 - sc/source/ui/view/cellsh1.cxx | 54 ++++++++++++++++++++++++++++++++++++++++-- sc/source/ui/view/gridwin.cxx | 14 +++++++--- svx/sdi/svx.sdi | 4 +-- 5 files changed, 66 insertions(+), 10 deletions(-)
New commits: commit decb72c909b3f8296fb5c6b57b267c1079a865be Author: Jaume Pujantell <jaume.pujant...@collabora.com> AuthorDate: Mon Jul 8 22:27:24 2024 +0200 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Wed Jul 10 15:45:30 2024 +0200 lok calc: allow remove and edit hypelink outside of edit mode Right now .uno:EditHyperlink and .uno:RemoveHyperlink only work on edit mode or inside a draw object, but LOK_CALLBACK_HYPERLINK_CLICKED is dispatched outside of edit mode. Change-Id: I26fb0c2e1ac438631ea71e33282e201f0a215d05 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170171 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Miklos Vajna <vmik...@collabora.com> diff --git a/sc/sdi/cellsh.sdi b/sc/sdi/cellsh.sdi index f01bf7e93a64..d3d7a4dfec3d 100644 --- a/sc/sdi/cellsh.sdi +++ b/sc/sdi/cellsh.sdi @@ -183,6 +183,8 @@ interface CellSelection SID_CLIPBOARD_FORMAT_ITEMS [ ExecMethod = ExecuteEdit; StateMethod = GetClipState; ] SID_EXTERNAL_SOURCE [ ExecMethod = ExecuteEdit; StateMethod = GetBlockState; ] SID_COPY_HYPERLINK_LOCATION [ ExecMethod = ExecuteEdit; StateMethod = GetBlockState; ] + SID_EDIT_HYPERLINK [ ExecMethod = ExecuteEdit; StateMethod = GetBlockState; ] + SID_REMOVE_HYPERLINK [ ExecMethod = ExecuteEdit; StateMethod = GetBlockState; ] FID_MERGE_ON [ ExecMethod = Execute; StateMethod = GetState; ] FID_MERGE_OFF [ ExecMethod = Execute; StateMethod = GetState; ] FID_MERGE_TOGGLE [ ExecMethod = Execute; StateMethod = GetState; ] diff --git a/sc/source/ui/inc/gridwin.hxx b/sc/source/ui/inc/gridwin.hxx index a2b8783fbac7..b0c6128f3031 100644 --- a/sc/source/ui/inc/gridwin.hxx +++ b/sc/source/ui/inc/gridwin.hxx @@ -389,7 +389,7 @@ public: void GetCellSelection(std::vector<tools::Rectangle>& rLogicRects); bool GetEditUrl(const Point& rPos, OUString* pName = nullptr, OUString* pUrl = nullptr, - OUString* pTarget = nullptr); + OUString* pTarget = nullptr, SCCOL* pnRow = nullptr); virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessible() override; diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx index 7ef0b67efc8a..38d1e4682111 100644 --- a/sc/source/ui/view/cellsh1.cxx +++ b/sc/source/ui/view/cellsh1.cxx @@ -46,6 +46,7 @@ #include <svx/hlnkitem.hxx> #include <basic/sbxcore.hxx> #include <editeng/editview.hxx> +#include <editeng/urlfieldhelper.hxx> #include <svtools/cliplistener.hxx> #include <cellsh.hxx> @@ -3207,8 +3208,8 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq ) { const Point aPoint(pPosX->GetValue() * rData.GetPPTX(), pPosY->GetValue() * rData.GetPPTY()); - OUString aName, aUrl; - if (pWindow->GetEditUrl(aPoint, &aName, &aUrl)) + OUString aUrl; + if (pWindow->GetEditUrl(aPoint, nullptr, &aUrl)) { uno::Reference<datatransfer::clipboard::XClipboard> xClipboard = pWindow->GetClipboard(); @@ -3220,6 +3221,55 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq ) } break; + case SID_EDIT_HYPERLINK: + case SID_REMOVE_HYPERLINK: + { + ScViewData& rData = GetViewData(); + ScGridWindow* pWindow = rData.GetActiveWin(); + const SfxInt32Item* pPosX = rReq.GetArg<SfxInt32Item>(FN_PARAM_1); + const SfxInt32Item* pPosY = rReq.GetArg<SfxInt32Item>(FN_PARAM_2); + if (pWindow && pPosX && pPosY) + { + const Point aPoint(pPosX->GetValue() * rData.GetPPTX(), + pPosY->GetValue() * rData.GetPPTY()); + SCCOL nPosX; + SCROW nPosY; + ScSplitPos eWhich = rData.GetActivePart(); + rData.GetPosFromPixel(aPoint.X(), aPoint.Y(), eWhich, nPosX, nPosY); + if (pWindow->GetEditUrl(aPoint, nullptr, nullptr, nullptr, &nPosX)) + { + pTabViewShell->SetCursor(nPosX, nPosY); + pTabViewShell->UpdateInputHandler(); + pScMod->SetInputMode(SC_INPUT_TABLE); + ScInputHandler* pHdl = pScMod->GetInputHdl(pTabViewShell); + if (rData.HasEditView(eWhich) && pHdl) + { + // Set text cursor where clicked + EditView* pEditView = rData.GetEditView(eWhich); + MouseEvent aEditEvt(aPoint, 1, MouseEventModifiers::SYNTHETIC, + MOUSE_LEFT, 0); + pEditView->MouseButtonDown(aEditEvt); + pEditView->MouseButtonUp(aEditEvt); + if (nSlot == SID_REMOVE_HYPERLINK) + { + pHdl->DataChanging(); + URLFieldHelper::RemoveURLField(*pEditView); + pHdl->DataChanged(); + pHdl->EnterHandler(); + } + else + { + pEditView->SelectFieldAtCursor(); + rData.GetViewShell()->GetViewFrame().GetDispatcher()->Execute( + SID_HYPERLINK_DIALOG); + } + rReq.Done(); + } + } + } + } + break; + default: OSL_FAIL("incorrect slot in ExecuteEdit"); break; diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx index f7a9bd78108b..1db87192e9c2 100644 --- a/sc/source/ui/view/gridwin.cxx +++ b/sc/source/ui/view/gridwin.cxx @@ -2592,7 +2592,8 @@ void ScGridWindow::MouseButtonUp( const MouseEvent& rMEvt ) // Only execute on ButtonUp, if ButtonDown also was done on a URL OUString aName, aUrl, aTarget; - if ( GetEditUrl( rMEvt.GetPosPixel(), &aName, &aUrl, &aTarget ) ) + SCCOL nUrlCellX; + if (GetEditUrl(rMEvt.GetPosPixel(), &aName, &aUrl, &aTarget, &nUrlCellX)) { nMouseStatus = SC_GM_NONE; // Ignore double-click bool isTiledRendering = comphelper::LibreOfficeKit::isActive(); @@ -2612,7 +2613,8 @@ void ScGridWindow::MouseButtonUp( const MouseEvent& rMEvt ) { aPos = rMEvt.GetPosPixel(); mrViewData.GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nPosX, nPosY ); - OString aCursor = pViewShell->GetViewData().describeCellCursorAt(nPosX, nPosY); + OString aCursor + = pViewShell->GetViewData().describeCellCursorAt(nUrlCellX, nPosY); double fPPTX = pViewShell->GetViewData().GetPPTX(); int mouseX = aPos.X() / fPPTX; int mouseY = aPos.Y() / fPPTX; @@ -2740,7 +2742,7 @@ void ScGridWindow::MouseButtonUp( const MouseEvent& rMEvt ) OUString aName, aUrl, aTarget; ScTabViewShell* pViewShell = mrViewData.GetViewShell(); if (pViewShell && nPosX == m_nDownPosX && nPosY == m_nDownPosY - && GetEditUrl(aPos, &aName, &aUrl, &aTarget)) + && GetEditUrl(aPos, &aName, &aUrl, &aTarget, &nPosX)) { OString aMsg(aUrl.toUtf8() + " coordinates: " + pViewShell->GetViewData().describeCellCursorAt(nPosX, nPosY) + ", " @@ -5800,8 +5802,8 @@ bool extractURLInfo( const SvxFieldItem* pFieldItem, OUString* pName, OUString* } -bool ScGridWindow::GetEditUrl( const Point& rPos, - OUString* pName, OUString* pUrl, OUString* pTarget ) +bool ScGridWindow::GetEditUrl(const Point& rPos, OUString* pName, OUString* pUrl, OUString* pTarget, + SCCOL* pnRow) { ScTabViewShell* pViewSh = mrViewData.GetViewShell(); ScInputHandler* pInputHdl = nullptr; @@ -5824,6 +5826,8 @@ bool ScGridWindow::GetEditUrl( const Point& rPos, bool bFound = lcl_GetHyperlinkCell(rDoc, nPosX, nPosY, nTab, aCell, sURL); if( !bFound ) return false; + if (pnRow) + *pnRow = nPosX; const ScPatternAttr* pPattern = rDoc.GetPattern( nPosX, nPosY, nTab ); // bForceToTop = sal_False, use the cell's real position diff --git a/svx/sdi/svx.sdi b/svx/sdi/svx.sdi index 4d3fc88df97f..bab0601c2f28 100644 --- a/svx/sdi/svx.sdi +++ b/svx/sdi/svx.sdi @@ -9670,7 +9670,7 @@ SfxVoidItem OpenHyperlinkOnCursor SID_OPEN_HYPERLINK ] SfxVoidItem EditHyperlink SID_EDIT_HYPERLINK -() +(SfxInt32Item PositionX FN_PARAM_1, SfxInt32Item PositionY FN_PARAM_2) [ AutoUpdate = FALSE, FastCall = FALSE, @@ -12407,7 +12407,7 @@ SfxVoidItem SignSignatureLine SID_SIGN_SIGNATURELINE ] SfxVoidItem RemoveHyperlink SID_REMOVE_HYPERLINK -() +(SfxInt32Item PositionX FN_PARAM_1, SfxInt32Item PositionY FN_PARAM_2) [ AutoUpdate = FALSE, FastCall = FALSE,