summaryrefslogtreecommitdiff
path: root/sw/source/core/frmedt/fefly1.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/frmedt/fefly1.cxx')
-rw-r--r--sw/source/core/frmedt/fefly1.cxx76
1 files changed, 48 insertions, 28 deletions
diff --git a/sw/source/core/frmedt/fefly1.cxx b/sw/source/core/frmedt/fefly1.cxx
index 1f49a51d61f4..1931c734c3b7 100644
--- a/sw/source/core/frmedt/fefly1.cxx
+++ b/sw/source/core/frmedt/fefly1.cxx
@@ -105,8 +105,12 @@ static bool lcl_SetNewFlyPos( const SwNode& rNode, SwFmtAnchor& rAnchor,
return bRet;
}
-static sal_Bool lcl_FindAnchorPos( SwDoc& rDoc, const Point& rPt, const SwFrm& rFrm,
- SfxItemSet& rSet )
+static sal_Bool lcl_FindAnchorPos(
+ SwEditShell& rEditShell,
+ SwDoc& rDoc,
+ const Point& rPt,
+ const SwFrm& rFrm,
+ SfxItemSet& rSet )
{
sal_Bool bRet = sal_True;
SwFmtAnchor aNewAnch( (SwFmtAnchor&)rSet.Get( RES_ANCHOR ) );
@@ -147,6 +151,13 @@ static sal_Bool lcl_FindAnchorPos( SwDoc& rDoc, const Point& rPt, const SwFrm& r
else
pCNd->MakeEndIndex( &aPos.nContent );
}
+ else
+ {
+ if ( rEditShell.PosInsideInputFld( aPos ) )
+ {
+ aPos.nContent = rEditShell.StartOfInputFldAtPos( aPos );
+ }
+ }
}
aNewAnch.SetAnchor( &aPos );
}
@@ -192,7 +203,10 @@ static sal_Bool lcl_FindAnchorPos( SwDoc& rDoc, const Point& rPt, const SwFrm& r
//
//! also used in unoframe.cxx
//
-sal_Bool sw_ChkAndSetNewAnchor( const SwFlyFrm& rFly, SfxItemSet& rSet )
+sal_Bool sw_ChkAndSetNewAnchor(
+ SwEditShell& rEditShell,
+ const SwFlyFrm& rFly,
+ SfxItemSet& rSet )
{
const SwFrmFmt& rFmt = *rFly.GetFmt();
const SwFmtAnchor &rOldAnch = rFmt.GetAnchor();
@@ -212,7 +226,7 @@ sal_Bool sw_ChkAndSetNewAnchor( const SwFlyFrm& rFly, SfxItemSet& rSet )
"forbidden anchor change in Head/Foot." );
#endif
- return ::lcl_FindAnchorPos( *pDoc, rFly.Frm().Pos(), rFly, rSet );
+ return ::lcl_FindAnchorPos( rEditShell, *pDoc, rFly.Frm().Pos(), rFly, rSet );
}
void SwFEShell::SelectFlyFrm( SwFlyFrm& rFrm, sal_Bool bNew )
@@ -401,7 +415,7 @@ Point SwFEShell::FindAnchorPos( const Point& rAbsPos, sal_Bool bMoveIt )
// #i28701#
SwAnchoredObject* pAnchoredObj = ::GetUserCall( pObj )->GetAnchoredObj( pObj );
SwFrmFmt& rFmt = pAnchoredObj->GetFrmFmt();
- RndStdIds nAnchorId = rFmt.GetAnchor().GetAnchorId();
+ const RndStdIds nAnchorId = rFmt.GetAnchor().GetAnchorId();
if ( FLY_AS_CHAR == nAnchorId )
return aRet;
@@ -442,16 +456,20 @@ Point SwFEShell::FindAnchorPos( const Point& rAbsPos, sal_Bool bMoveIt )
// Search nearest SwFlyFrm starting from the upper-left corner
// of the fly
- SwCntntFrm *pTxtFrm;
+ SwCntntFrm *pTxtFrm = NULL;
{
SwCrsrMoveState aState( MV_SETONLYTEXT );
SwPosition aPos( GetDoc()->GetNodes().GetEndOfExtras() );
Point aTmpPnt( rAbsPos );
GetLayout()->GetCrsrOfst( &aPos, aTmpPnt, &aState );
- pTxtFrm = aPos.nNode.GetNode().GetCntntNode()->getLayoutFrm( GetLayout(),0,&aPos,sal_False );
+ if ( nAnchorId != FLY_AT_CHAR
+ || !PosInsideInputFld( aPos ) )
+ {
+ pTxtFrm = aPos.nNode.GetNode().GetCntntNode()->getLayoutFrm( GetLayout(),0,&aPos,sal_False );
+ }
}
- const SwFrm *pNewAnch;
- if( pTxtFrm )
+ const SwFrm *pNewAnch = NULL;
+ if( pTxtFrm != NULL )
{
if ( FLY_AT_PAGE == nAnchorId )
{
@@ -467,8 +485,6 @@ Point SwFEShell::FindAnchorPos( const Point& rAbsPos, sal_Bool bMoveIt )
}
}
}
- else
- pNewAnch = 0;
if( pNewAnch && !pNewAnch->IsProtected() )
{
@@ -508,6 +524,7 @@ Point SwFEShell::FindAnchorPos( const Point& rAbsPos, sal_Bool bMoveIt )
GetPhyPageNum() );
break;
}
+
case FLY_AT_FLY:
{
SwPosition aPos( *((SwFlyFrm*)pNewAnch)->GetFmt()->
@@ -515,26 +532,29 @@ Point SwFEShell::FindAnchorPos( const Point& rAbsPos, sal_Bool bMoveIt )
aAnch.SetAnchor( &aPos );
break;
}
+
case FLY_AT_CHAR:
- {
- SwPosition *pPos = (SwPosition*)aAnch.GetCntntAnchor();
- Point aTmpPnt( rAbsPos );
- if( pTxtFrm->GetCrsrOfst( pPos, aTmpPnt, NULL ) )
- {
- SwRect aTmpRect;
- pTxtFrm->GetCharRect( aTmpRect, *pPos );
- aRet = aTmpRect.Pos();
- }
- else
{
- pPos->nNode = *pTxtFrm->GetNode();
- pPos->nContent.Assign(0,0);
+ SwPosition *pPos = (SwPosition*)aAnch.GetCntntAnchor();
+ Point aTmpPnt( rAbsPos );
+ if( pTxtFrm->GetCrsrOfst( pPos, aTmpPnt, NULL ) )
+ {
+ SwRect aTmpRect;
+ pTxtFrm->GetCharRect( aTmpRect, *pPos );
+ aRet = aTmpRect.Pos();
+ }
+ else
+ {
+ pPos->nNode = *pTxtFrm->GetNode();
+ pPos->nContent.Assign(0,0);
+ }
+ break;
}
- break;
- }
default:
break;
+
}
+
if( bMoveIt )
{
StartAllAction();
@@ -898,7 +918,7 @@ void SwFEShell::InsertDrawObj( SdrObject& rDrawObj,
const Point aRelPos( rInsertPosition.X() - pFrm->Frm().Left(),
rInsertPosition.Y() - pFrm->Frm().Top() );
rDrawObj.SetRelativePos( aRelPos );
- ::lcl_FindAnchorPos( *GetDoc(), rInsertPosition, *pFrm, rFlyAttrSet );
+ ::lcl_FindAnchorPos( *this, *GetDoc(), rInsertPosition, *pFrm, rFlyAttrSet );
}
// insert drawing object into the document creating a new <SwDrawFrmFmt> instance
SwDrawFrmFmt* pFmt = GetDoc()->Insert( aPam, rDrawObj, &rFlyAttrSet, 0 );
@@ -1083,7 +1103,7 @@ bool SwFEShell::SetFlyFrmAttr( SfxItemSet& rSet )
const Point aPt( pFly->Frm().Pos() );
if( SFX_ITEM_SET == rSet.GetItemState( RES_ANCHOR, sal_False ))
- sw_ChkAndSetNewAnchor( *pFly, rSet );
+ sw_ChkAndSetNewAnchor( *this, *pFly, rSet );
SwFlyFrmFmt* pFlyFmt = (SwFlyFrmFmt*)pFly->GetFmt();
if( GetDoc()->SetFlyFrmAttr( *pFlyFmt, rSet ))
@@ -1241,7 +1261,7 @@ void SwFEShell::SetFrmFmt( SwFrmFmt *pNewFmt, bool bKeepOrient, Point* pDocPos )
{
pSet = new SfxItemSet( GetDoc()->GetAttrPool(), aFrmFmtSetRange );
pSet->Put( *pItem );
- if( !sw_ChkAndSetNewAnchor( *pFly, *pSet ))
+ if( !sw_ChkAndSetNewAnchor( *this, *pFly, *pSet ))
delete pSet, pSet = 0;
}