diff options
author | Szymon Kłos <szymon.klos@collabora.com> | 2023-01-25 14:39:34 +0100 |
---|---|---|
committer | Szymon Kłos <szymon.klos@collabora.com> | 2023-02-06 15:01:41 +0000 |
commit | ec93446f703746ec45a16846b291e5a002a788e7 (patch) | |
tree | a02c2a82d88e79689402e05bf3080f897bb7b135 /editeng | |
parent | 887b2eb4583549d104c03747405e1f925ab6168a (diff) |
lok: formulabar: fix URL fields selection
field is calculated as 1 character by selection getter
let's unfold fields and send real length
Change-Id: I557f8785a4d2ee6a41c6c95f4551f5e104a58c02
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146350
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Andras Timar <andras.timar@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146574
Tested-by: Jenkins
Reviewed-by: Szymon Kłos <szymon.klos@collabora.com>
Diffstat (limited to 'editeng')
-rw-r--r-- | editeng/source/editeng/editview.cxx | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/editeng/source/editeng/editview.cxx b/editeng/source/editeng/editview.cxx index 4096e0e18bf8..f243d6d8feb6 100644 --- a/editeng/source/editeng/editview.cxx +++ b/editeng/source/editeng/editview.cxx @@ -1394,6 +1394,53 @@ const SvxFieldData* EditView::GetFieldAtCursor() const return pFieldItem ? pFieldItem->GetField() : nullptr; } +sal_Int32 EditView::countFieldsOffsetSum(sal_Int32 nPara, sal_Int32 nPos, bool bCanOverflow) const +{ + if (!pImpEditView || !pImpEditView->pEditEngine) + return 0; + + int nOffset = 0; + + for (int nCurrentPara = 0; nCurrentPara <= nPara; nCurrentPara++) + { + int nFields = pImpEditView->pEditEngine->GetFieldCount( nCurrentPara ); + for (int nField = 0; nField < nFields; nField++) + { + EFieldInfo aFieldInfo + = pImpEditView->pEditEngine->GetFieldInfo( nCurrentPara, nField ); + + bool bLastPara = nCurrentPara == nPara; + sal_Int32 nFieldPos = aFieldInfo.aPosition.nIndex; + + if (bLastPara && nFieldPos >= nPos) + break; + + sal_Int32 nFieldLen = aFieldInfo.aCurrentText.getLength(); + + // position in the middle of a field + if (!bCanOverflow && bLastPara && nFieldPos + nFieldLen > nPos) + nFieldLen = nPos - nFieldPos; + + nOffset += nFieldLen - 1; + } + } + + return nOffset; +} + +sal_Int32 EditView::GetPosNoField(sal_Int32 nPara, sal_Int32 nPos) const +{ + sal_Int32 nOffset = countFieldsOffsetSum(nPara, nPos, false); + assert(nPos >= nOffset); + return nPos - nOffset; +} + +sal_Int32 EditView::GetPosWithField(sal_Int32 nPara, sal_Int32 nPos) const +{ + sal_Int32 nOffset = countFieldsOffsetSum(nPara, nPos, true); + return nPos + nOffset; +} + void EditView::SetInvalidateMore( sal_uInt16 nPixel ) { pImpEditView->SetInvalidateMore( nPixel ); |