Kaydet (Commit) d33db207 authored tarafından Jan-Marek Glogowski's avatar Jan-Marek Glogowski Kaydeden (comit) Caolán McNamara

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/10837Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst 3f26ab24
......@@ -673,6 +673,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
......@@ -683,23 +685,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 )
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment