summaryrefslogtreecommitdiff
path: root/editeng
diff options
context:
space:
mode:
authorSzymon Kłos <szymon.klos@collabora.com>2023-01-25 14:39:34 +0100
committerSzymon Kłos <szymon.klos@collabora.com>2023-02-06 15:01:41 +0000
commitec93446f703746ec45a16846b291e5a002a788e7 (patch)
treea02c2a82d88e79689402e05bf3080f897bb7b135 /editeng
parent887b2eb4583549d104c03747405e1f925ab6168a (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.cxx47
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 );