summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorJan-Marek Glogowski <glogow@fbihome.de>2014-08-08 11:21:14 +0200
committerCaolán McNamara <caolanm@redhat.com>2014-10-08 15:50:26 +0000
commit659194b946f3c2d31ffe715fb2232257cf0424e0 (patch)
tree654e483fc2b4f59f73ef3b2b71968ce7ee8f3f97 /sw
parentdfde5b967b27d9a44f35ce96cf99554722985bc5 (diff)
Fix input field tab handling
When searching for the current field in the field list to find the previous or next one, we check the field start and compare it with the cursor position. But with the new input fields, the cursor can actually be anywhere in the field, so we actually have to search for the start position of the input field at the cursor position. Change-Id: I26526524eccfdbea41c6bf69a460fa64248f50ca Reviewed-on: https://gerrit.libreoffice.org/10837 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com> (cherry picked from commit d33db207e27198df7af9fc007d7532ec76c80991) Reviewed-on: https://gerrit.libreoffice.org/11781
Diffstat (limited to 'sw')
-rw-r--r--sw/source/core/crsr/crstrvl.cxx34
1 files changed, 30 insertions, 4 deletions
diff --git a/sw/source/core/crsr/crstrvl.cxx b/sw/source/core/crsr/crstrvl.cxx
index 80febe13fdb1..c9b11c03d4c7 100644
--- a/sw/source/core/crsr/crstrvl.cxx
+++ b/sw/source/core/crsr/crstrvl.cxx
@@ -670,6 +670,8 @@ bool SwCrsrShell::MoveFldType(
SwTxtFld * pTxtFld = pTNd->GetFldTxtAttrAt( rPos.nContent.GetIndex(), true );
const bool bDelFld = ( pTxtFld == NULL );
+ sal_Int32 nContentOffset = -1;
+
if( bDelFld )
{
// create dummy for the search
@@ -680,23 +682,47 @@ bool SwCrsrShell::MoveFldType(
mpDoc->IsClipBoard() );
pTxtFld->ChgTxtNode( pTNd );
}
+ else
+ {
+ // the cursor might be anywhere inside the input field,
+ // but we will be searching for the field start
+ if (pTxtFld->Which() == RES_TXTATR_INPUTFIELD
+ && rPos.nContent.GetIndex() != *pTxtFld->GetStart())
+ nContentOffset = *pTxtFld->GetStart();
+ }
+
+ _SetGetExpFld *pSrch = NULL;
+ SwIndex *pIndex = NULL;
+ if( -1 == nContentOffset )
+ {
+ pSrch = new _SetGetExpFld( rPos.nNode, pTxtFld, &rPos.nContent );
+ }
+ else
+ {
+ pIndex = new SwIndex( rPos.nNode.GetNode().GetCntntNode(), nContentOffset );
+ pSrch = new _SetGetExpFld( rPos.nNode, pTxtFld, pIndex );
+ }
- _SetGetExpFld aSrch( rPos.nNode, pTxtFld, &rPos.nContent );
if( rPos.nNode.GetIndex() < mpDoc->GetNodes().GetEndOfExtras().GetIndex() )
{
// also at collection use only the first frame
Point aPt;
- aSrch.SetBodyPos( *pTNd->getLayoutFrm( GetLayout(), &aPt, &rPos, false ) );
+ pSrch->SetBodyPos( *pTNd->getLayoutFrm( GetLayout(), &aPt, &rPos, false ) );
}
- it = aSrtLst.lower_bound( &aSrch );
+ it = aSrtLst.lower_bound( pSrch );
+
+ bool isSrch = (**it == *pSrch);
+ delete pIndex;
+ delete pSrch;
+
if( bDelFld )
{
delete (SwFmtFld*)&pTxtFld->GetAttr();
delete pTxtFld;
}
- if( it != aSrtLst.end() && **it == aSrch ) // found
+ if( it != aSrtLst.end() && isSrch ) // found
{
if( bNext )
{