diff options
author | Oliver-Rainer Wittmann <orw@apache.org> | 2013-11-18 11:29:24 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-11-19 15:51:27 +0000 |
commit | c2b5521921b806ff7b04cdacebde3834d2aafd4b (patch) | |
tree | b38392e0a7d40b58487ea4a72a5ddc748b8cb5b3 /sw/source/core/frmedt | |
parent | 06ed06d2808cad5eeea17ee94c0da0426bb6ea9f (diff) |
Resolves: #i33737# enable in-place editing of Input Fields
(cherry picked from commit c2afeb1c3f11e8f420b59f3786eb8626c99ff595)
Conflicts:
sw/inc/IDocumentContentOperations.hxx
sw/inc/crsrsh.hxx
sw/inc/doc.hxx
sw/inc/editsh.hxx
sw/inc/expfld.hxx
sw/inc/fldbas.hxx
sw/inc/fmtfld.hxx
sw/inc/hintids.hxx
sw/inc/ndtxt.hxx
sw/inc/txatbase.hxx
sw/inc/txtfld.hxx
sw/inc/txtrfmrk.hxx
sw/inc/txttxmrk.hxx
sw/inc/viscrs.hxx
sw/source/core/bastyp/init.cxx
sw/source/core/crsr/crsrsh.cxx
sw/source/core/crsr/crstrvl.cxx
sw/source/core/crsr/findattr.cxx
sw/source/core/crsr/findtxt.cxx
sw/source/core/crsr/swcrsr.cxx
sw/source/core/crsr/viscrs.cxx
sw/source/core/doc/dbgoutsw.cxx
sw/source/core/doc/doc.cxx
sw/source/core/doc/docfld.cxx
sw/source/core/doc/docfmt.cxx
sw/source/core/doc/docnum.cxx
sw/source/core/doc/docredln.cxx
sw/source/core/doc/docruby.cxx
sw/source/core/doc/doctxm.cxx
sw/source/core/doc/visiturl.cxx
sw/source/core/docnode/nodes.cxx
sw/source/core/edit/edatmisc.cxx
sw/source/core/edit/edattr.cxx
sw/source/core/edit/edfld.cxx
sw/source/core/edit/edfldexp.cxx
sw/source/core/edit/editsh.cxx
sw/source/core/edit/edlingu.cxx
sw/source/core/edit/ednumber.cxx
sw/source/core/fields/expfld.cxx
sw/source/core/fields/fldbas.cxx
sw/source/core/fields/reffld.cxx
sw/source/core/frmedt/fefly1.cxx
sw/source/core/inc/docfld.hxx
sw/source/core/inc/rolbck.hxx
sw/source/core/inc/swfont.hxx
sw/source/core/layout/flycnt.cxx
sw/source/core/layout/laycache.cxx
sw/source/core/layout/trvlfrm.cxx
sw/source/core/text/atrhndl.hxx
sw/source/core/text/atrstck.cxx
sw/source/core/text/inftxt.cxx
sw/source/core/text/porfld.cxx
sw/source/core/text/porfld.hxx
sw/source/core/text/txtfld.cxx
sw/source/core/tox/tox.cxx
sw/source/core/tox/txmsrt.cxx
sw/source/core/txtnode/atrfld.cxx
sw/source/core/txtnode/ndhints.cxx
sw/source/core/txtnode/ndtxt.cxx
sw/source/core/txtnode/thints.cxx
sw/source/core/txtnode/txatbase.cxx
sw/source/core/txtnode/txatritr.cxx
sw/source/core/txtnode/txtedt.cxx
sw/source/core/undo/SwUndoField.cxx
sw/source/core/undo/rolbck.cxx
sw/source/core/undo/unsect.cxx
sw/source/core/undo/untbl.cxx
sw/source/core/unocore/unocrsrhelper.cxx
sw/source/core/unocore/unofield.cxx
sw/source/core/unocore/unoframe.cxx
sw/source/core/unocore/unorefmk.cxx
sw/source/core/view/vprint.cxx
sw/source/filter/ascii/ascatr.cxx
sw/source/filter/html/htmlatr.cxx
sw/source/filter/rtf/rtffly.cxx
sw/source/filter/ww1/fltshell.cxx
sw/source/filter/ww1/w1filter.cxx
sw/source/filter/ww8/wrtw8esh.cxx
sw/source/filter/ww8/wrtw8nds.cxx
sw/source/filter/ww8/ww8atr.cxx
sw/source/filter/ww8/ww8par.cxx
sw/source/filter/ww8/ww8par3.cxx
sw/source/filter/ww8/ww8par5.cxx
sw/source/ui/app/applab.cxx
sw/source/ui/docvw/edtwin.cxx
sw/source/ui/docvw/edtwin2.cxx
sw/source/ui/envelp/envfmt.cxx
sw/source/ui/fldui/fldedt.cxx
sw/source/ui/fldui/fldmgr.cxx
sw/source/ui/inc/wrtsh.hxx
sw/source/ui/lingu/hhcwrp.cxx
sw/source/ui/shells/basesh.cxx
sw/source/ui/shells/drwtxtex.cxx
sw/source/ui/shells/grfsh.cxx
sw/source/ui/shells/tabsh.cxx
sw/source/ui/shells/textfld.cxx
sw/source/ui/shells/textidx.cxx
sw/source/ui/shells/textsh.cxx
sw/source/ui/shells/textsh1.cxx
sw/source/ui/shells/txtattr.cxx
sw/source/ui/uiview/formatclipboard.cxx
sw/source/ui/uiview/view.cxx
sw/source/ui/uiview/view2.cxx
sw/source/ui/uiview/viewsrch.cxx
sw/source/ui/uiview/viewstat.cxx
sw/source/ui/uiview/viewtab.cxx
sw/source/ui/wrtsh/wrtsh1.cxx
sw/source/ui/wrtsh/wrtsh2.cxx
Change-Id: I6758d6719e1fd523797cc6ee2648ffcb47d52595
Diffstat (limited to 'sw/source/core/frmedt')
-rw-r--r-- | sw/source/core/frmedt/fefly1.cxx | 76 |
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; } |