sc/sdi/cellsh.sdi | 2 + sc/source/ui/inc/gridwin.hxx | 3 +- sc/source/ui/view/cellsh1.cxx | 54 ++++++++++++++++++++++++++++++++++++++++-- sc/source/ui/view/gridwin.cxx | 14 +++++++--- svx/sdi/svx.sdi | 4 +-- 5 files changed, 67 insertions(+), 10 deletions(-)
New commits: commit 2ef50e771768b383d9299cbb30e710679253c471 Author: Jaume Pujantell <[email protected]> AuthorDate: Mon Jul 8 22:27:24 2024 +0200 Commit: Miklos Vajna <[email protected]> CommitDate: Mon Jul 15 16:20:35 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 <[email protected]> Reviewed-by: Miklos Vajna <[email protected]> (cherry picked from commit decb72c909b3f8296fb5c6b57b267c1079a865be) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170479 diff --git a/sc/sdi/cellsh.sdi b/sc/sdi/cellsh.sdi index 9aed584061a3..687273d4eacf 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 773cb3a1eac3..ec992b680f73 100644 --- a/sc/source/ui/inc/gridwin.hxx +++ b/sc/source/ui/inc/gridwin.hxx @@ -387,7 +387,8 @@ public: /// Get the cell selection, coordinates are in logic units. void GetCellSelection(std::vector<tools::Rectangle>& rLogicRects); - bool GetEditUrl( const Point& rPos, OUString* pName=nullptr, OUString* pUrl=nullptr, OUString* pTarget=nullptr ); + bool GetEditUrl(const Point& rPos, OUString* pName = nullptr, OUString* pUrl = nullptr, + OUString* pTarget = nullptr, SCCOL* pnCol= 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 b3d3d491166b..1eb1b717b8a0 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> @@ -3213,8 +3214,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(); @@ -3226,6 +3227,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 fc368a7cd8c3..51caa18026fa 100644 --- a/sc/source/ui/view/gridwin.cxx +++ b/sc/source/ui/view/gridwin.cxx @@ -2469,7 +2469,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(); @@ -2489,7 +2490,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; @@ -2621,7 +2623,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) + ", " @@ -5698,8 +5700,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* pnCol) { ScTabViewShell* pViewSh = mrViewData.GetViewShell(); ScInputHandler* pInputHdl = nullptr; @@ -5722,6 +5724,8 @@ bool ScGridWindow::GetEditUrl( const Point& rPos, bool bFound = lcl_GetHyperlinkCell(rDoc, nPosX, nPosY, nTab, aCell, sURL); if( !bFound ) return false; + if (pnCol) + *pnCol = 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 9062a5351582..4fc9f2844159 100644 --- a/svx/sdi/svx.sdi +++ b/svx/sdi/svx.sdi @@ -9657,7 +9657,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, @@ -12394,7 +12394,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,
