You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by or...@apache.org on 2014/02/18 12:47:14 UTC

svn commit: r1569286 - in /openoffice/trunk/main/sw: inc/ source/core/doc/ source/core/frmedt/ source/core/unocore/ source/filter/html/ source/filter/rtf/ source/filter/ww8/

Author: orw
Date: Tue Feb 18 11:47:13 2014
New Revision: 1569286

URL: http://svn.apache.org/r1569286
Log:
124188: <SwDoc::InsertDrawObj(..)> - assure correct insertion of text attribute for as-character anchored drawing objects

	Thx to Andre for his deep analysis.


Modified:
    openoffice/trunk/main/sw/inc/IDocumentContentOperations.hxx
    openoffice/trunk/main/sw/inc/doc.hxx
    openoffice/trunk/main/sw/source/core/doc/doclay.cxx
    openoffice/trunk/main/sw/source/core/frmedt/fecopy.cxx
    openoffice/trunk/main/sw/source/core/frmedt/fefly1.cxx
    openoffice/trunk/main/sw/source/core/unocore/unodraw.cxx
    openoffice/trunk/main/sw/source/filter/html/htmldraw.cxx
    openoffice/trunk/main/sw/source/filter/rtf/swparrtf.cxx
    openoffice/trunk/main/sw/source/filter/ww8/ww8graf.cxx
    openoffice/trunk/main/sw/source/filter/ww8/ww8graf2.cxx
    openoffice/trunk/main/sw/source/filter/ww8/ww8par4.cxx

Modified: openoffice/trunk/main/sw/inc/IDocumentContentOperations.hxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sw/inc/IDocumentContentOperations.hxx?rev=1569286&r1=1569285&r2=1569286&view=diff
==============================================================================
--- openoffice/trunk/main/sw/inc/IDocumentContentOperations.hxx (original)
+++ openoffice/trunk/main/sw/inc/IDocumentContentOperations.hxx Tue Feb 18 11:47:13 2014
@@ -138,7 +138,7 @@ public:
     /** Einfuegen eines DrawObjectes. Das Object muss bereits im DrawModel
     angemeldet sein.
     */
-    virtual SwDrawFrmFmt* Insert(const SwPaM &rRg, SdrObject& rDrawObj, const SfxItemSet* pFlyAttrSet, SwFrmFmt*) = 0;
+    virtual SwDrawFrmFmt* InsertDrawObj( const SwPaM &rRg, SdrObject& rDrawObj, const SfxItemSet& rFlyAttrSet ) = 0;
 
     /** Einfuegen von OLE-Objecten.
     */

Modified: openoffice/trunk/main/sw/inc/doc.hxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sw/inc/doc.hxx?rev=1569286&r1=1569285&r2=1569286&view=diff
==============================================================================
--- openoffice/trunk/main/sw/inc/doc.hxx (original)
+++ openoffice/trunk/main/sw/inc/doc.hxx Tue Feb 18 11:47:13 2014
@@ -891,7 +891,10 @@ public:
 						const SfxItemSet* pFlyAttrSet, const SfxItemSet* pGrfAttrSet, SwFrmFmt*);
 	virtual SwFlyFrmFmt* Insert(const SwPaM& rRg, const GraphicObject& rGrfObj,	const SfxItemSet* pFlyAttrSet,
 						const SfxItemSet* pGrfAttrSet, SwFrmFmt*);
-    virtual SwDrawFrmFmt* Insert(const SwPaM &rRg, SdrObject& rDrawObj, const SfxItemSet* pFlyAttrSet, SwFrmFmt*);
+    virtual SwDrawFrmFmt* InsertDrawObj(
+        const SwPaM &rRg,
+        SdrObject& rDrawObj,
+        const SfxItemSet& rFlyAttrSet );
     virtual SwFlyFrmFmt* Insert(const SwPaM &rRg, const svt::EmbeddedObjectRef& xObj, const SfxItemSet* pFlyAttrSet,
 						const SfxItemSet* pGrfAttrSet, SwFrmFmt*);
 

Modified: openoffice/trunk/main/sw/source/core/doc/doclay.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sw/source/core/doc/doclay.cxx?rev=1569286&r1=1569285&r2=1569286&view=diff
==============================================================================
--- openoffice/trunk/main/sw/source/core/doc/doclay.cxx (original)
+++ openoffice/trunk/main/sw/source/core/doc/doclay.cxx Tue Feb 18 11:47:13 2014
@@ -923,97 +923,100 @@ if( GetIDocumentUndoRedo().DoesUndo() )
 }
 
 
-	//Einfuegen eines DrawObjectes. Das Object muss bereits im DrawModel
-	// angemeldet sein.
-SwDrawFrmFmt* SwDoc::Insert( const SwPaM &rRg,
-							 SdrObject& rDrawObj,
-							 const SfxItemSet* pFlyAttrSet,
-							 SwFrmFmt* pDefFmt )
-{
-	SwDrawFrmFmt *pFmt = MakeDrawFrmFmt( aEmptyStr,
-										pDefFmt ? pDefFmt : GetDfltFrmFmt() );
-
-	const SwFmtAnchor* pAnchor = 0;
-	if( pFlyAttrSet )
-	{
-		pFlyAttrSet->GetItemState( RES_ANCHOR, sal_False,
-									(const SfxPoolItem**)&pAnchor );
-        pFmt->SetFmtAttr( *pFlyAttrSet );
-	}
+// Insert drawing object, which has to be already inserted in the DrawModel
+SwDrawFrmFmt* SwDoc::InsertDrawObj(
+    const SwPaM &rRg,
+    SdrObject& rDrawObj,
+    const SfxItemSet& rFlyAttrSet )
+{
+    SwDrawFrmFmt* pFmt = MakeDrawFrmFmt( aEmptyStr, GetDfltFrmFmt() );
+
+    const SwFmtAnchor* pAnchor = 0;
+    rFlyAttrSet.GetItemState( RES_ANCHOR, sal_False, (const SfxPoolItem**) &pAnchor );
+    pFmt->SetFmtAttr( rFlyAttrSet );
 
-	RndStdIds eAnchorId = pAnchor ? pAnchor->GetAnchorId()
-								  : pFmt->GetAnchor().GetAnchorId();
-
-	// Anker noch nicht gesetzt ?
-	// DrawObjecte duerfen niemals in Kopf-/Fusszeilen landen.
+    RndStdIds eAnchorId = pAnchor != NULL ? pAnchor->GetAnchorId() : pFmt->GetAnchor().GetAnchorId();
     const bool bIsAtCntnt = (FLY_AT_PAGE != eAnchorId);
 
-	const SwNodeIndex* pChkIdx = 0;
-	if( !pAnchor )
+    const SwNodeIndex* pChkIdx = 0;
+    if ( pAnchor == NULL )
     {
-		pChkIdx = &rRg.GetPoint()->nNode;
+        pChkIdx = &rRg.GetPoint()->nNode;
     }
-	else if( bIsAtCntnt )
+    else if ( bIsAtCntnt )
     {
-		pChkIdx = pAnchor->GetCntntAnchor()
-					? &pAnchor->GetCntntAnchor()->nNode
-					: &rRg.GetPoint()->nNode;
+        pChkIdx =
+            pAnchor->GetCntntAnchor() ? &pAnchor->GetCntntAnchor()->nNode : &rRg.GetPoint()->nNode;
     }
 
-    // OD 24.06.2003 #108784# - allow drawing objects in header/footer, but
-    // control objects aren't allowed in header/footer.
-    if( pChkIdx &&
-        ::CheckControlLayer( &rDrawObj ) &&
-        IsInHeaderFooter( *pChkIdx ) )
+    // allow drawing objects in header/footer, but control objects aren't allowed in header/footer.
+    if( pChkIdx != NULL
+        && ::CheckControlLayer( &rDrawObj )
+        && IsInHeaderFooter( *pChkIdx ) )
     {
-       pFmt->SetFmtAttr( SwFmtAnchor( eAnchorId = FLY_AT_PAGE ) );
+        // apply at-page anchor format
+        eAnchorId = FLY_AT_PAGE;
+        pFmt->SetFmtAttr( SwFmtAnchor( eAnchorId ) );
     }
-    else if( !pAnchor || (bIsAtCntnt && !pAnchor->GetCntntAnchor() ))
-	{
-		// dann setze ihn, wird im Undo gebraucht
-		SwFmtAnchor aAnch( pAnchor ? *pAnchor : pFmt->GetAnchor() );
-		eAnchorId = aAnch.GetAnchorId();
-		if( FLY_AT_FLY == eAnchorId )
-		{
-			SwPosition aPos( *rRg.GetNode()->FindFlyStartNode() );
-			aAnch.SetAnchor( &aPos );
-		}
-		else
-		{
-			aAnch.SetAnchor( rRg.GetPoint() );
-            if ( FLY_AT_PAGE == eAnchorId )
-			{
-				eAnchorId = rDrawObj.ISA( SdrUnoObj )
-                                    ? FLY_AS_CHAR : FLY_AT_PARA;
-				aAnch.SetType( eAnchorId );
-			}
-		}
+    else if( pAnchor == NULL
+             || ( bIsAtCntnt
+                  && pAnchor->GetCntntAnchor() == NULL ) )
+    {
+        // apply anchor format
+        SwFmtAnchor aAnch( pAnchor != NULL ? *pAnchor : pFmt->GetAnchor() );
+        eAnchorId = aAnch.GetAnchorId();
+        if ( eAnchorId == FLY_AT_FLY )
+        {
+            SwPosition aPos( *rRg.GetNode()->FindFlyStartNode() );
+            aAnch.SetAnchor( &aPos );
+        }
+        else
+        {
+            aAnch.SetAnchor( rRg.GetPoint() );
+            if ( eAnchorId == FLY_AT_PAGE )
+            {
+                eAnchorId = rDrawObj.ISA( SdrUnoObj ) ? FLY_AS_CHAR : FLY_AT_PARA;
+                aAnch.SetType( eAnchorId );
+            }
+        }
         pFmt->SetFmtAttr( aAnch );
-	}
+    }
 
-	// bei als Zeichen gebundenen Draws das Attribut im Absatz setzen
-    if ( FLY_AS_CHAR == eAnchorId )
+    // insert text attribute for as-character anchored drawing object
+    if ( eAnchorId == FLY_AS_CHAR )
     {
-		xub_StrLen nStt = rRg.GetPoint()->nContent.GetIndex();
-        SwFmtFlyCnt aFmt( pFmt );
-        rRg.GetPoint()->nNode.GetNode().GetTxtNode()->InsertItem(
-                aFmt, nStt, nStt );
+        bool bAnchorAtPageAsFallback = true;
+        const SwFmtAnchor& rDrawObjAnchorFmt = pFmt->GetAnchor();
+        if ( rDrawObjAnchorFmt.GetCntntAnchor() != NULL )
+        {
+            SwTxtNode* pAnchorTxtNode =
+                    rDrawObjAnchorFmt.GetCntntAnchor()->nNode.GetNode().GetTxtNode();
+            if ( pAnchorTxtNode != NULL )
+            {
+                const xub_StrLen nStt = rDrawObjAnchorFmt.GetCntntAnchor()->nContent.GetIndex();
+                SwFmtFlyCnt aFmt( pFmt );
+                pAnchorTxtNode->InsertItem( aFmt, nStt, nStt );
+                bAnchorAtPageAsFallback = false;
+            }
+        }
+
+        if ( bAnchorAtPageAsFallback )
+        {
+            ASSERT( false, "SwDoc::InsertDrawObj(..) - missing content anchor for as-character anchored drawing object --> anchor at-page" );
+            pFmt->SetFmtAttr( SwFmtAnchor( FLY_AT_PAGE ) );
+        }
     }
 
     SwDrawContact* pContact = new SwDrawContact( pFmt, &rDrawObj );
 
-	// ggfs. Frames anlegen
-	if( GetCurrentViewShell() )
+    if ( GetCurrentViewShell() )
     {
-		pFmt->MakeFrms();
-        // --> OD 2005-02-09 #i42319# - follow-up of #i35635#
-        // move object to visible layer
-        // --> OD 2007-07-10 #i79391#
+        // create layout representation
+        pFmt->MakeFrms();
         if ( pContact->GetAnchorFrm() )
         {
             pContact->MoveObjToVisibleLayer( &rDrawObj );
         }
-        // <--
     }
 
     if (GetIDocumentUndoRedo().DoesUndo())
@@ -1021,8 +1024,8 @@ SwDrawFrmFmt* SwDoc::Insert( const SwPaM
         GetIDocumentUndoRedo().AppendUndo( new SwUndoInsLayFmt(pFmt, 0, 0) );
     }
 
-	SetModified();
-	return pFmt;
+    SetModified();
+    return pFmt;
 }
 
 /*************************************************************************

Modified: openoffice/trunk/main/sw/source/core/frmedt/fecopy.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sw/source/core/frmedt/fecopy.cxx?rev=1569286&r1=1569285&r2=1569286&view=diff
==============================================================================
--- openoffice/trunk/main/sw/source/core/frmedt/fecopy.cxx (original)
+++ openoffice/trunk/main/sw/source/core/frmedt/fecopy.cxx Tue Feb 18 11:47:13 2014
@@ -211,7 +211,7 @@ sal_Bool SwFEShell::Copy( SwDoc* pClpDoc
                     pClpDoc->CloneSdrObj( *pObj, sal_False, sal_True );
 
                 SwPaM aTemp(aPos);
-                pClpDoc->Insert(aTemp, *pNew, &aSet, NULL);
+                pClpDoc->InsertDrawObj(aTemp, *pNew, aSet );
 			}
 			else
 			{
@@ -396,8 +396,7 @@ sal_Bool SwFEShell::CopyDrawSel( SwFEShe
 					aSet.Put( aAnchor );
 					SdrObject* pNew = pDestDoc->CloneSdrObj( *pObj, bIsMove &&
 												GetDoc() == pDestDoc, sal_True );
-					pFmt = pDestDoc->Insert( *pDestShell->GetCrsr(),
-											*pNew, &aSet, NULL );
+					pFmt = pDestDoc->InsertDrawObj( *pDestShell->GetCrsr(), *pNew, aSet );
 				}
 				else
                     pFmt = pDestDoc->CopyLayoutFmt( *pFmt, aAnchor, true, true );
@@ -1456,7 +1455,7 @@ void SwFEShell::Paste( SvStream& rStrm, 
 
 					DelSelectedObj();
 
-					pFmt = GetDoc()->Insert( *GetCrsr(), *pNewObj, &aFrmSet, NULL );
+					pFmt = GetDoc()->InsertDrawObj( *GetCrsr(), *pNewObj, aFrmSet );
 				}
 				else
                 {

Modified: openoffice/trunk/main/sw/source/core/frmedt/fefly1.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sw/source/core/frmedt/fefly1.cxx?rev=1569286&r1=1569285&r2=1569286&view=diff
==============================================================================
--- openoffice/trunk/main/sw/source/core/frmedt/fefly1.cxx (original)
+++ openoffice/trunk/main/sw/source/core/frmedt/fefly1.cxx Tue Feb 18 11:47:13 2014
@@ -965,7 +965,7 @@ void SwFEShell::InsertDrawObj( SdrObject
         ::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 );
+    SwDrawFrmFmt* pFmt = GetDoc()->InsertDrawObj( aPam, rDrawObj, rFlyAttrSet );
 
     // move object to visible layer
     SwContact* pContact = static_cast<SwContact*>(rDrawObj.GetUserCall());

Modified: openoffice/trunk/main/sw/source/core/unocore/unodraw.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sw/source/core/unocore/unodraw.cxx?rev=1569286&r1=1569285&r2=1569286&view=diff
==============================================================================
--- openoffice/trunk/main/sw/source/core/unocore/unodraw.cxx (original)
+++ openoffice/trunk/main/sw/source/core/unocore/unodraw.cxx Tue Feb 18 11:47:13 2014
@@ -759,7 +759,7 @@ void SwXDrawPage::add(const uno::Referen
 	if ( !pTemp )
 		pTemp = pPam;
 	UnoActionContext aAction(pDoc);
-	pDoc->Insert( *pTemp, *pObj, &aSet, NULL );
+	pDoc->InsertDrawObj( *pTemp, *pObj, aSet );
 	SwFrmFmt* pFmt = ::FindFrmFmt( pObj );
 	if(pFmt)
 		pFmt->Add(pShape);

Modified: openoffice/trunk/main/sw/source/filter/html/htmldraw.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sw/source/filter/html/htmldraw.cxx?rev=1569286&r1=1569285&r2=1569286&view=diff
==============================================================================
--- openoffice/trunk/main/sw/source/filter/html/htmldraw.cxx (original)
+++ openoffice/trunk/main/sw/source/filter/html/htmldraw.cxx Tue Feb 18 11:47:13 2014
@@ -220,7 +220,7 @@ void SwHTMLParser::InsertDrawObject( Sdr
     }
 	aFrmSet.Put( aAnchor );
 
-	pDoc->Insert( *pPam, *pNewDrawObj, &aFrmSet, NULL );
+	pDoc->InsertDrawObj( *pPam, *pNewDrawObj, aFrmSet );
 }
 
 /*  */

Modified: openoffice/trunk/main/sw/source/filter/rtf/swparrtf.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sw/source/filter/rtf/swparrtf.cxx?rev=1569286&r1=1569285&r2=1569286&view=diff
==============================================================================
--- openoffice/trunk/main/sw/source/filter/rtf/swparrtf.cxx (original)
+++ openoffice/trunk/main/sw/source/filter/rtf/swparrtf.cxx Tue Feb 18 11:47:13 2014
@@ -1311,7 +1311,7 @@ void SwRTFParser::ReadDrawingObject()
 
         pStroke->SetSnapRect(aRect);
 
-        /* SwFrmFmt* pRetFrmFmt = */pDoc->Insert(*pPam, *pStroke, &aFlySet, NULL);
+        /* SwFrmFmt* pRetFrmFmt = */pDoc->InsertDrawObj(*pPam, *pStroke, aFlySet );
     }
 }
 
@@ -1343,7 +1343,7 @@ void SwRTFParser::InsertShpObject(SdrObj
         SdrPage* pDrawPg = pDrawModel->GetPage(0);
         pDrawPg->InsertObject(pStroke);
         pDrawPg->SetObjectOrdNum(pStroke->GetOrdNum(), _nZOrder);
-        /* SwFrmFmt* pRetFrmFmt = */pDoc->Insert(*pPam, *pStroke, &aFlySet, NULL);
+        /* SwFrmFmt* pRetFrmFmt = */pDoc->InsertDrawObj(*pPam, *pStroke, aFlySet );
 }
 
 ::basegfx::B2DPoint rotate(const ::basegfx::B2DPoint& rStart, const ::basegfx::B2DPoint& rEnd)

Modified: openoffice/trunk/main/sw/source/filter/ww8/ww8graf.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sw/source/filter/ww8/ww8graf.cxx?rev=1569286&r1=1569285&r2=1569286&view=diff
==============================================================================
--- openoffice/trunk/main/sw/source/filter/ww8/ww8graf.cxx (original)
+++ openoffice/trunk/main/sw/source/filter/ww8/ww8graf.cxx Tue Feb 18 11:47:13 2014
@@ -1409,7 +1409,7 @@ void SwWW8ImplReader::ReadGrafLayer1( WW
         if (SdrObject *pObject = ReadGrafPrimitive( nLeft, &aDo, aSet ))
         {
             pWWZOrder->InsertDrawingObject(pObject, SVBT16ToShort(aDo.dhgt));
-            SwFrmFmt *pFrm = rDoc.Insert( *pPaM, *pObject, &aSet, NULL);
+            SwFrmFmt *pFrm = rDoc.InsertDrawObj( *pPaM, *pObject, aSet );
             pObject->SetMergedItemSet(aSet);
             pAnchorStck->AddAnchor(*pPaM->GetPoint(), pFrm);
         }
@@ -2839,7 +2839,7 @@ SwFrmFmt* SwWW8ImplReader::Read_GrafLaye
                 pWWZOrder->InsertTextLayerObject(pObject);
             }
 
-            pRetFrmFmt = rDoc.Insert(*pPaM, *pObject, &aFlySet, NULL);
+            pRetFrmFmt = rDoc.InsertDrawObj(*pPaM, *pObject, aFlySet );
 
             ASSERT(pRetFrmFmt->GetAnchor().GetAnchorId() ==
                 eAnchor, "Not the anchor type requested!");

Modified: openoffice/trunk/main/sw/source/filter/ww8/ww8graf2.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sw/source/filter/ww8/ww8graf2.cxx?rev=1569286&r1=1569285&r2=1569286&view=diff
==============================================================================
--- openoffice/trunk/main/sw/source/filter/ww8/ww8graf2.cxx (original)
+++ openoffice/trunk/main/sw/source/filter/ww8/ww8graf2.cxx Tue Feb 18 11:47:13 2014
@@ -696,7 +696,7 @@ SwFrmFmt* SwWW8ImplReader::ImportGraf(Sd
                             }
                         }
                         else
-                            pRet = rDoc.Insert(*pPaM, *pObject, &aAttrSet, NULL);
+                            pRet = rDoc.InsertDrawObj(*pPaM, *pObject, aAttrSet );
                     }
                 }
 

Modified: openoffice/trunk/main/sw/source/filter/ww8/ww8par4.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sw/source/filter/ww8/ww8par4.cxx?rev=1569286&r1=1569285&r2=1569286&view=diff
==============================================================================
--- openoffice/trunk/main/sw/source/filter/ww8/ww8par4.cxx (original)
+++ openoffice/trunk/main/sw/source/filter/ww8/ww8par4.cxx Tue Feb 18 11:47:13 2014
@@ -310,7 +310,7 @@ SwFrmFmt* SwWW8ImplReader::ImportOle(con
             SdrObject::Free( pRet );        // das brauchen wir nicht mehr
         }
         else
-            pFmt = rDoc.Insert(*pPaM, *pRet, pFlySet, NULL);
+            pFmt = rDoc.InsertDrawObj(*pPaM, *pRet, *pFlySet );
     }
     else if (
                 GRAPHIC_GDIMETAFILE == aGraph.GetType() ||