summaryrefslogtreecommitdiff
path: root/sw/source/core/doc/doclay.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/doc/doclay.cxx')
-rw-r--r--sw/source/core/doc/doclay.cxx2365
1 files changed, 0 insertions, 2365 deletions
diff --git a/sw/source/core/doc/doclay.cxx b/sw/source/core/doc/doclay.cxx
deleted file mode 100644
index 830839e920..0000000000
--- a/sw/source/core/doc/doclay.cxx
+++ /dev/null
@@ -1,2365 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_sw.hxx"
-
-#include <unotools/linguprops.hxx>
-#include <unotools/lingucfg.hxx>
-#include <com/sun/star/embed/EmbedStates.hpp>
-#include <hintids.hxx>
-#include <com/sun/star/util/XCloseable.hpp>
-#include <sfx2/progress.hxx>
-#include <svx/svdmodel.hxx>
-#include <svx/svdpage.hxx>
-#include <editeng/keepitem.hxx>
-#include <editeng/ulspitem.hxx>
-#include <editeng/lrspitem.hxx>
-#include <editeng/boxitem.hxx>
-#include <editeng/shaditem.hxx>
-#include <editeng/protitem.hxx>
-#include <editeng/opaqitem.hxx>
-#include <editeng/prntitem.hxx>
-#include <svx/fmglob.hxx>
-#include <svx/svdouno.hxx>
-#include <svx/fmpage.hxx>
-#include <editeng/frmdiritem.hxx>
-
-#include <swmodule.hxx>
-#include <modcfg.hxx>
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <rtl/logfile.hxx>
-#include <SwStyleNameMapper.hxx>
-#include <fchrfmt.hxx>
-#include <frmatr.hxx>
-#include <txatbase.hxx>
-#include <fmtfld.hxx>
-#include <fmtornt.hxx>
-#include <fmtcntnt.hxx>
-#include <fmtanchr.hxx>
-#include <fmtfsize.hxx>
-#include <fmtsrnd.hxx>
-#include <fmtflcnt.hxx>
-#include <fmtcnct.hxx>
-#include <frmfmt.hxx>
-#include <txtflcnt.hxx>
-#include <docfld.hxx> // fuer Expression-Felder
-#include <pam.hxx>
-#include <ndtxt.hxx>
-#include <ndnotxt.hxx>
-#include <ndole.hxx>
-#include <doc.hxx>
-#include <IDocumentUndoRedo.hxx>
-#include <rootfrm.hxx>
-#include <pagefrm.hxx>
-#include <cntfrm.hxx>
-#include <flyfrm.hxx>
-#include <fesh.hxx>
-#include <docsh.hxx>
-#include <dflyobj.hxx>
-#include <dcontact.hxx>
-#include <swundo.hxx>
-#include <flypos.hxx>
-#include <UndoInsert.hxx>
-#include <expfld.hxx> // InsertLabel
-#include <poolfmt.hxx> // PoolVorlagen-Id's
-#include <docary.hxx>
-#include <swtable.hxx>
-#include <tblsel.hxx>
-#include <viewopt.hxx>
-#include <fldupde.hxx>
-#include <txtftn.hxx>
-#include <ftnidx.hxx>
-#include <ftninfo.hxx>
-#include <pagedesc.hxx>
-#include <PostItMgr.hxx>
-#include <comcore.hrc> // STR-ResId's
-
-#include <unoframe.hxx>
-
-#include <sortedobjs.hxx>
-
-#include <vector>
-
-using namespace ::com::sun::star;
-using ::rtl::OUString;
-
-#define DEF_FLY_WIDTH 2268 //Defaultbreite fuer FlyFrms (2268 == 4cm)
-
-
-static bool lcl_IsItemSet(const SwCntntNode & rNode, sal_uInt16 which)
-{
- bool bResult = false;
-
- if (SFX_ITEM_SET == rNode.GetSwAttrSet().GetItemState(which))
- bResult = true;
-
- return bResult;
-}
-
-/*************************************************************************
-|*
-|* SwDoc::MakeLayoutFmt()
-|*
-|* Beschreibung Erzeugt ein neues Format das in seinen Einstellungen
-|* Defaultmaessig zu dem Request passt. Das Format wird in das
-|* entsprechende Formate-Array gestellt.
-|* Wenn bereits ein passendes Format existiert, so wird dies
-|* zurueckgeliefert.
-|*************************************************************************/
-SwFrmFmt *SwDoc::MakeLayoutFmt( RndStdIds eRequest, const SfxItemSet* pSet )
-{
- SwFrmFmt *pFmt = 0;
- const sal_Bool bMod = IsModified();
- sal_Bool bHeader = sal_False;
-
- switch ( eRequest )
- {
- case RND_STD_HEADER:
- case RND_STD_HEADERL:
- case RND_STD_HEADERR:
- {
- bHeader = sal_True;
- // kein break, es geht unten weiter
- }
- case RND_STD_FOOTER:
- case RND_STD_FOOTERL:
- case RND_STD_FOOTERR:
- {
- pFmt = new SwFrmFmt( GetAttrPool(),
- (bHeader ? "Header" : "Footer"),
- GetDfltFrmFmt() );
-
- SwNodeIndex aTmpIdx( GetNodes().GetEndOfAutotext() );
- SwStartNode* pSttNd =
- GetNodes().MakeTextSection
- ( aTmpIdx,
- bHeader ? SwHeaderStartNode : SwFooterStartNode,
- GetTxtCollFromPool(static_cast<sal_uInt16>( bHeader
- ? ( eRequest == RND_STD_HEADERL
- ? RES_POOLCOLL_HEADERL
- : eRequest == RND_STD_HEADERR
- ? RES_POOLCOLL_HEADERR
- : RES_POOLCOLL_HEADER )
- : ( eRequest == RND_STD_FOOTERL
- ? RES_POOLCOLL_FOOTERL
- : eRequest == RND_STD_FOOTERR
- ? RES_POOLCOLL_FOOTERR
- : RES_POOLCOLL_FOOTER )
- ) ) );
- pFmt->SetFmtAttr( SwFmtCntnt( pSttNd ));
-
- if( pSet ) // noch ein paar Attribute setzen ?
- pFmt->SetFmtAttr( *pSet );
-
- // JP: warum zuruecksetzen ??? Doc. ist doch veraendert ???
- // bei den Fly auf jedenfall verkehrt !!
- if ( !bMod )
- ResetModified();
- }
- break;
-
- case RND_DRAW_OBJECT:
- {
- pFmt = MakeDrawFrmFmt( aEmptyStr, GetDfltFrmFmt() );
- if( pSet ) // noch ein paar Attribute setzen ?
- pFmt->SetFmtAttr( *pSet );
-
- if (GetIDocumentUndoRedo().DoesUndo())
- {
- GetIDocumentUndoRedo().AppendUndo(
- new SwUndoInsLayFmt(pFmt, 0, 0));
- }
- }
- break;
-
-#if OSL_DEBUG_LEVEL > 1
- case FLY_AT_PAGE:
- case FLY_AT_CHAR:
- case FLY_AT_FLY:
- case FLY_AT_PARA:
- case FLY_AS_CHAR:
- OSL_FAIL( "use new interface instead: SwDoc::MakeFlySection!" );
- break;
-#endif
-
- default:
- OSL_ENSURE( !this,
- "Layoutformat mit ungueltigem Request angefordert." );
-
- }
- return pFmt;
-}
-
-/*************************************************************************
-|*
-|* SwDoc::DelLayoutFmt()
-|*
-|* Beschreibung Loescht das angegebene Format, der Inhalt wird mit
-|* geloescht.
-|*
-|*************************************************************************/
-void SwDoc::DelLayoutFmt( SwFrmFmt *pFmt )
-{
- //Verkettung von Rahmen muss ggf. zusammengefuehrt werden.
- //Bevor die Frames vernichtet werden, damit die Inhalte der Rahmen
- //ggf. entsprechend gerichtet werden.
- const SwFmtChain &rChain = pFmt->GetChain();
- if ( rChain.GetPrev() )
- {
- SwFmtChain aChain( rChain.GetPrev()->GetChain() );
- aChain.SetNext( rChain.GetNext() );
- SetAttr( aChain, *rChain.GetPrev() );
- }
- if ( rChain.GetNext() )
- {
- SwFmtChain aChain( rChain.GetNext()->GetChain() );
- aChain.SetPrev( rChain.GetPrev() );
- SetAttr( aChain, *rChain.GetNext() );
- }
-
- const SwNodeIndex* pCntIdx = pFmt->GetCntnt().GetCntntIdx();
- if (pCntIdx && !GetIDocumentUndoRedo().DoesUndo())
- {
- //Verbindung abbauen, falls es sich um ein OLE-Objekt handelt.
- SwOLENode* pOLENd = GetNodes()[ pCntIdx->GetIndex()+1 ]->GetOLENode();
- if( pOLENd && pOLENd->GetOLEObj().IsOleRef() )
- {
-
- // TODO/MBA: the old object closed the object, cleared all references to it, but didn't remove it from the container.
- // I have no idea, why, nobody could explain it - so I do my very best to mimic this behavior
- //uno::Reference < util::XCloseable > xClose( pOLENd->GetOLEObj().GetOleRef(), uno::UNO_QUERY );
- //if ( xClose.is() )
- {
- try
- {
- pOLENd->GetOLEObj().GetOleRef()->changeState( embed::EmbedStates::LOADED );
- }
- catch ( uno::Exception& )
- {
- }
- }
-
- }
- }
-
- //Frms vernichten.
- pFmt->DelFrms();
-
- // erstmal sind nur Fly's Undofaehig
- const sal_uInt16 nWh = pFmt->Which();
- if (GetIDocumentUndoRedo().DoesUndo() &&
- (RES_FLYFRMFMT == nWh || RES_DRAWFRMFMT == nWh))
- {
- GetIDocumentUndoRedo().AppendUndo( new SwUndoDelLayFmt( pFmt ));
- }
- else
- {
- // #i32089# - delete at-frame anchored objects
- if ( nWh == RES_FLYFRMFMT )
- {
- // determine frame formats of at-frame anchored objects
- const SwNodeIndex* pCntntIdx = pFmt->GetCntnt().GetCntntIdx();
- if ( pCntntIdx )
- {
- const SwSpzFrmFmts* pTbl = pFmt->GetDoc()->GetSpzFrmFmts();
- if ( pTbl )
- {
- std::vector<SwFrmFmt*> aToDeleteFrmFmts;
- const sal_uLong nNodeIdxOfFlyFmt( pCntntIdx->GetIndex() );
-
- for ( sal_uInt16 i = 0; i < pTbl->Count(); ++i )
- {
- SwFrmFmt* pTmpFmt = (*pTbl)[i];
- const SwFmtAnchor &rAnch = pTmpFmt->GetAnchor();
- if ( rAnch.GetAnchorId() == FLY_AT_FLY &&
- rAnch.GetCntntAnchor()->nNode.GetIndex() == nNodeIdxOfFlyFmt )
- {
- aToDeleteFrmFmts.push_back( pTmpFmt );
- }
- }
-
- // delete found frame formats
- while ( !aToDeleteFrmFmts.empty() )
- {
- SwFrmFmt* pTmpFmt = aToDeleteFrmFmts.back();
- pFmt->GetDoc()->DelLayoutFmt( pTmpFmt );
-
- aToDeleteFrmFmts.pop_back();
- }
- }
- }
- }
-
- //Inhalt Loeschen.
- if( pCntIdx )
- {
- SwNode *pNode = &pCntIdx->GetNode();
- ((SwFmtCntnt&)pFmt->GetFmtAttr( RES_CNTNT )).SetNewCntntIdx( 0 );
- DeleteSection( pNode );
- }
-
- // ggfs. bei Zeichengebundenen Flys das Zeichen loeschen
- const SwFmtAnchor& rAnchor = pFmt->GetAnchor();
- if ((FLY_AS_CHAR == rAnchor.GetAnchorId()) && rAnchor.GetCntntAnchor())
- {
- const SwPosition* pPos = rAnchor.GetCntntAnchor();
- SwTxtNode *pTxtNd = pPos->nNode.GetNode().GetTxtNode();
-
- // attribute is still in text node, delete it
- if ( pTxtNd )
- {
- SwTxtFlyCnt* const pAttr = static_cast<SwTxtFlyCnt*>(
- pTxtNd->GetTxtAttrForCharAt( pPos->nContent.GetIndex(),
- RES_TXTATR_FLYCNT ));
- if ( pAttr && (pAttr->GetFlyCnt().GetFrmFmt() == pFmt) )
- {
- // dont delete, set pointer to 0
- const_cast<SwFmtFlyCnt&>(pAttr->GetFlyCnt()).SetFlyFmt();
- SwIndex aIdx( pPos->nContent );
- pTxtNd->EraseText( aIdx, 1 );
- }
- }
- }
-
- DelFrmFmt( pFmt );
- }
- SetModified();
-}
-
-/*************************************************************************
-|*
-|* SwDoc::CopyLayoutFmt()
-|*
-|* Beschreibung Kopiert das angegebene Format pSrc in pDest und
-|* returnt pDest. Wenn es noch kein pDest gibt, wird
-|* eins angelegt.
-|* JP: steht das Source Format in einem anderen
-|* Dokument, so kopiere auch dann noch richtig !!
-|* Vom chaos::Anchor-Attribut wird die Position immer
-|* auf 0 gesetzt !!!
-|*
-|*************************************************************************/
-SwFrmFmt *SwDoc::CopyLayoutFmt( const SwFrmFmt& rSource,
- const SwFmtAnchor& rNewAnchor,
- bool bSetTxtFlyAtt, bool bMakeFrms )
-{
- const bool bFly = RES_FLYFRMFMT == rSource.Which();
- const bool bDraw = RES_DRAWFRMFMT == rSource.Which();
- OSL_ENSURE( bFly || bDraw, "this method only works for fly or draw" );
-
- SwDoc* pSrcDoc = (SwDoc*)rSource.GetDoc();
-
- // May we copy this object?
- // We may, unless it's 1) it's a control (and therfore a draw)
- // 2) anchored in a header/footer
- // 3) anchored (to paragraph?)
- bool bMayNotCopy = false;
- if( bDraw )
- {
- const SwDrawContact* pDrawContact =
- static_cast<const SwDrawContact*>( rSource.FindContactObj() );
-
- bMayNotCopy =
- ((FLY_AT_PARA == rNewAnchor.GetAnchorId()) ||
- (FLY_AT_FLY == rNewAnchor.GetAnchorId()) ||
- (FLY_AT_CHAR == rNewAnchor.GetAnchorId())) &&
- rNewAnchor.GetCntntAnchor() &&
- IsInHeaderFooter( rNewAnchor.GetCntntAnchor()->nNode ) &&
- pDrawContact != NULL &&
- pDrawContact->GetMaster() != NULL &&
- CheckControlLayer( pDrawContact->GetMaster() );
- }
-
- // just return if we can't copy this
- if( bMayNotCopy )
- return NULL;
-
- SwFrmFmt* pDest = GetDfltFrmFmt();
- if( rSource.GetRegisteredIn() != pSrcDoc->GetDfltFrmFmt() )
- pDest = CopyFrmFmt( *(SwFrmFmt*)rSource.GetRegisteredIn() );
- if( bFly )
- {
- // #i11176#
- // To do a correct cloning concerning the ZOrder for all objects
- // it is necessary to actually create a draw object for fly frames, too.
- // These are then added to the DrawingLayer (which needs to exist).
- // Together with correct sorting of all drawinglayer based objects
- // before cloning ZOrder transfer works correctly then.
- SwFlyFrmFmt *pFormat = MakeFlyFrmFmt( rSource.GetName(), pDest );
- pDest = pFormat;
-
- SwXFrame::GetOrCreateSdrObject(pFormat);
- }
- else
- pDest = MakeDrawFrmFmt( aEmptyStr, pDest );
-
- // alle anderen/neue Attribute kopieren.
- pDest->CopyAttrs( rSource );
-
- //Chains werden nicht kopiert.
- pDest->ResetFmtAttr( RES_CHAIN );
-
- if( bFly )
- {
- //Der Inhalt wird dupliziert.
- const SwNode& rCSttNd = rSource.GetCntnt().GetCntntIdx()->GetNode();
- SwNodeRange aRg( rCSttNd, 1, *rCSttNd.EndOfSectionNode() );
-
- SwNodeIndex aIdx( GetNodes().GetEndOfAutotext() );
- SwStartNode* pSttNd = GetNodes().MakeEmptySection( aIdx, SwFlyStartNode );
-
- // erst den chaos::Anchor/CntntIndex setzen, innerhalb des Kopierens
- // auf die Werte zugegriffen werden kann (DrawFmt in Kopf-/Fusszeilen)
- aIdx = *pSttNd;
- SwFmtCntnt aAttr( rSource.GetCntnt() );
- aAttr.SetNewCntntIdx( &aIdx );
- pDest->SetFmtAttr( aAttr );
- pDest->SetFmtAttr( rNewAnchor );
-
- if( !mbCopyIsMove || this != pSrcDoc )
- {
- if( mbInReading )
- pDest->SetName( aEmptyStr );
- else
- {
- // Teste erstmal ob der Name schon vergeben ist.
- // Wenn ja -> neuen generieren
- sal_Int8 nNdTyp = aRg.aStart.GetNode().GetNodeType();
-
- String sOld( pDest->GetName() );
- pDest->SetName( aEmptyStr );
- if( FindFlyByName( sOld, nNdTyp ) ) // einen gefunden
- switch( nNdTyp )
- {
- case ND_GRFNODE: sOld = GetUniqueGrfName(); break;
- case ND_OLENODE: sOld = GetUniqueOLEName(); break;
- default: sOld = GetUniqueFrameName(); break;
- }
-
- pDest->SetName( sOld );
- }
- }
-
- if (GetIDocumentUndoRedo().DoesUndo())
- {
- GetIDocumentUndoRedo().AppendUndo(new SwUndoInsLayFmt(pDest,0,0));
- }
-
- // sorge dafuer das auch Fly's in Fly's kopiert werden
- aIdx = *pSttNd->EndOfSectionNode();
-
- //fdo#36631 disable (scoped) any undo operations associated with the
- //contact object itself. They should be managed by SwUndoInsLayFmt.
- const ::sw::DrawUndoGuard drawUndoGuard(GetIDocumentUndoRedo());
-
- pSrcDoc->CopyWithFlyInFly( aRg, 0, aIdx, sal_False, sal_True, sal_True );
- }
- else
- {
- OSL_ENSURE( RES_DRAWFRMFMT == rSource.Which(), "Weder Fly noch Draw." );
- // #i52780# - Note: moving object to visible layer not needed.
- SwDrawContact* pSourceContact = (SwDrawContact *)rSource.FindContactObj();
-
- SwDrawContact* pContact = new SwDrawContact( (SwDrawFrmFmt*)pDest,
- CloneSdrObj( *pSourceContact->GetMaster(),
- mbCopyIsMove && this == pSrcDoc ) );
- // #i49730# - notify draw frame format that position attributes are
- // already set, if the position attributes are already set at the
- // source draw frame format.
- if ( pDest->ISA(SwDrawFrmFmt) &&
- rSource.ISA(SwDrawFrmFmt) &&
- static_cast<const SwDrawFrmFmt&>(rSource).IsPosAttrSet() )
- {
- static_cast<SwDrawFrmFmt*>(pDest)->PosAttrSet();
- }
-
- if( pDest->GetAnchor() == rNewAnchor )
- {
- // Do *not* connect to layout, if a <MakeFrms> will not be called.
- if ( bMakeFrms )
- {
- pContact->ConnectToLayout( &rNewAnchor );
- }
- }
- else
- pDest->SetFmtAttr( rNewAnchor );
-
- if (GetIDocumentUndoRedo().DoesUndo())
- {
- GetIDocumentUndoRedo().AppendUndo(new SwUndoInsLayFmt(pDest,0,0));
- }
- }
-
- if (bSetTxtFlyAtt && (FLY_AS_CHAR == rNewAnchor.GetAnchorId()))
- {
- const SwPosition* pPos = rNewAnchor.GetCntntAnchor();
- SwFmtFlyCnt aFmt( pDest );
- pPos->nNode.GetNode().GetTxtNode()->InsertItem(
- aFmt, pPos->nContent.GetIndex(), 0 );
- }
-
- if( bMakeFrms )
- pDest->MakeFrms();
-
- return pDest;
-}
-
-SdrObject* SwDoc::CloneSdrObj( const SdrObject& rObj, sal_Bool bMoveWithinDoc,
- sal_Bool bInsInPage )
-{
- // #i52858# - method name changed
- SdrPage *pPg = GetOrCreateDrawModel()->GetPage( 0 );
- if( !pPg )
- {
- pPg = GetDrawModel()->AllocPage( sal_False );
- GetDrawModel()->InsertPage( pPg );
- }
-
- SdrObject *pObj = rObj.Clone();
- if( bMoveWithinDoc && FmFormInventor == pObj->GetObjInventor() )
- {
- // bei Controls muss der Name erhalten bleiben
- uno::Reference< awt::XControlModel > xModel = ((SdrUnoObj*)pObj)->GetUnoControlModel();
- uno::Any aVal;
- uno::Reference< beans::XPropertySet > xSet(xModel, uno::UNO_QUERY);
- OUString sName(RTL_CONSTASCII_USTRINGPARAM("Name"));
- if( xSet.is() )
- aVal = xSet->getPropertyValue( sName );
- if( bInsInPage )
- pPg->InsertObject( pObj );
- if( xSet.is() )
- xSet->setPropertyValue( sName, aVal );
- }
- else if( bInsInPage )
- pPg->InsertObject( pObj );
-
- // For drawing objects: set layer of cloned object to invisible layer
- SdrLayerID nLayerIdForClone = rObj.GetLayer();
- if ( !pObj->ISA(SwFlyDrawObj) &&
- !pObj->ISA(SwVirtFlyDrawObj) &&
- !IS_TYPE(SdrObject,pObj) )
- {
- if ( IsVisibleLayerId( nLayerIdForClone ) )
- {
- nLayerIdForClone = GetInvisibleLayerIdByVisibleOne( nLayerIdForClone );
- }
- }
- pObj->SetLayer( nLayerIdForClone );
-
-
- return pObj;
-}
-
-SwFlyFrmFmt* SwDoc::_MakeFlySection( const SwPosition& rAnchPos,
- const SwCntntNode& rNode,
- RndStdIds eRequestId,
- const SfxItemSet* pFlySet,
- SwFrmFmt* pFrmFmt )
-{
- if( !pFrmFmt )
- pFrmFmt = GetFrmFmtFromPool( RES_POOLFRM_FRAME );
-
- String sName;
- if( !mbInReading )
- switch( rNode.GetNodeType() )
- {
- case ND_GRFNODE: sName = GetUniqueGrfName(); break;
- case ND_OLENODE: sName = GetUniqueOLEName(); break;
- default: sName = GetUniqueFrameName(); break;
- }
- SwFlyFrmFmt* pFmt = MakeFlyFrmFmt( sName, pFrmFmt );
-
- //Inhalt erzeugen und mit dem Format verbinden.
- //CntntNode erzeugen und in die Autotextsection stellen
- SwNodeRange aRange( GetNodes().GetEndOfAutotext(), -1,
- GetNodes().GetEndOfAutotext() );
- GetNodes().SectionDown( &aRange, SwFlyStartNode );
-
- pFmt->SetFmtAttr( SwFmtCntnt( rNode.StartOfSectionNode() ));
-
-
- const SwFmtAnchor* pAnchor = 0;
- if( pFlySet )
- {
- pFlySet->GetItemState( RES_ANCHOR, sal_False,
- (const SfxPoolItem**)&pAnchor );
- if( SFX_ITEM_SET == pFlySet->GetItemState( RES_CNTNT, sal_False ))
- {
- SfxItemSet aTmpSet( *pFlySet );
- aTmpSet.ClearItem( RES_CNTNT );
- pFmt->SetFmtAttr( aTmpSet );
- }
- else
- pFmt->SetFmtAttr( *pFlySet );
- }
-
- // Anker noch nicht gesetzt ?
- RndStdIds eAnchorId = pAnchor ? pAnchor->GetAnchorId()
- : pFmt->GetAnchor().GetAnchorId();
- // #i107811# Assure that at-page anchored fly frames have a page num or a
- // content anchor set.
- if ( !pAnchor ||
- ( FLY_AT_PAGE != pAnchor->GetAnchorId() &&
- !pAnchor->GetCntntAnchor() ) ||
- ( FLY_AT_PAGE == pAnchor->GetAnchorId() &&
- !pAnchor->GetCntntAnchor() &&
- pAnchor->GetPageNum() == 0 ) )
- {
- // dann setze ihn, wird im Undo gebraucht
- SwFmtAnchor aAnch( pFmt->GetAnchor() );
- if (pAnchor && (FLY_AT_FLY == pAnchor->GetAnchorId()))
- {
- SwPosition aPos( *rAnchPos.nNode.GetNode().FindFlyStartNode() );
- aAnch.SetAnchor( &aPos );
- eAnchorId = FLY_AT_FLY;
- }
- else
- {
- if( eRequestId != aAnch.GetAnchorId() &&
- SFX_ITEM_SET != pFmt->GetItemState( RES_ANCHOR, sal_True ) )
- {
- aAnch.SetType( eRequestId );
- }
-
- eAnchorId = aAnch.GetAnchorId();
- if ( FLY_AT_PAGE != eAnchorId ||
- ( FLY_AT_PAGE == eAnchorId &&
- ( !pAnchor ||
- aAnch.GetPageNum() == 0 ) ) )
- {
- aAnch.SetAnchor( &rAnchPos );
- }
- }
- pFmt->SetFmtAttr( aAnch );
- }
- else
- eAnchorId = pFmt->GetAnchor().GetAnchorId();
-
- if ( FLY_AS_CHAR == eAnchorId )
- {
- xub_StrLen nStt = rAnchPos.nContent.GetIndex();
- SwTxtNode * pTxtNode = rAnchPos.nNode.GetNode().GetTxtNode();
-
- OSL_ENSURE(pTxtNode!= 0, "There should be a SwTxtNode!");
-
- if (pTxtNode != NULL)
- {
- SwFmtFlyCnt aFmt( pFmt );
- pTxtNode->InsertItem( aFmt, nStt, nStt );
- }
- }
-
- if( SFX_ITEM_SET != pFmt->GetAttrSet().GetItemState( RES_FRM_SIZE ))
- {
- SwFmtFrmSize aFmtSize( ATT_VAR_SIZE, 0, DEF_FLY_WIDTH );
- const SwNoTxtNode* pNoTxtNode = rNode.GetNoTxtNode();
- if( pNoTxtNode )
- {
- //Groesse einstellen.
- Size aSize( pNoTxtNode->GetTwipSize() );
- if( MINFLY > aSize.Width() )
- aSize.Width() = DEF_FLY_WIDTH;
- aFmtSize.SetWidth( aSize.Width() );
- if( aSize.Height() )
- {
- aFmtSize.SetHeight( aSize.Height() );
- aFmtSize.SetHeightSizeType( ATT_FIX_SIZE );
- }
- }
- pFmt->SetFmtAttr( aFmtSize );
- }
-
- // Frames anlegen
- if( GetCurrentViewShell() )
- pFmt->MakeFrms(); // ??? //swmod 071108//swmod 071225
-
- if (GetIDocumentUndoRedo().DoesUndo())
- {
- sal_uLong nNodeIdx = rAnchPos.nNode.GetIndex();
- xub_StrLen nCntIdx = rAnchPos.nContent.GetIndex();
- GetIDocumentUndoRedo().AppendUndo(
- new SwUndoInsLayFmt( pFmt, nNodeIdx, nCntIdx ));
- }
-
- SetModified();
- return pFmt;
-}
-
-SwFlyFrmFmt* SwDoc::MakeFlySection( RndStdIds eAnchorType,
- const SwPosition* pAnchorPos,
- const SfxItemSet* pFlySet,
- SwFrmFmt* pFrmFmt, sal_Bool bCalledFromShell )
-{
- SwFlyFrmFmt* pFmt = 0;
- sal_Bool bCallMake = sal_True;
- if ( !pAnchorPos && (FLY_AT_PAGE != eAnchorType) )
- {
- const SwFmtAnchor* pAnch;
- if( (pFlySet && SFX_ITEM_SET == pFlySet->GetItemState(
- RES_ANCHOR, sal_False, (const SfxPoolItem**)&pAnch )) ||
- ( pFrmFmt && SFX_ITEM_SET == pFrmFmt->GetItemState(
- RES_ANCHOR, sal_True, (const SfxPoolItem**)&pAnch )) )
- {
- if ( (FLY_AT_PAGE != pAnch->GetAnchorId()) )
- {
- pAnchorPos = pAnch->GetCntntAnchor();
- if (pAnchorPos)
- {
- bCallMake = sal_False;
- }
- }
- }
- }
-
- if( bCallMake )
- {
- if( !pFrmFmt )
- pFrmFmt = GetFrmFmtFromPool( RES_POOLFRM_FRAME );
-
- sal_uInt16 nCollId = static_cast<sal_uInt16>(
- get(IDocumentSettingAccess::HTML_MODE) ? RES_POOLCOLL_TEXT : RES_POOLCOLL_FRAME );
-
- /* If there exists no adjust item in the paragraph
- style for the content node of the new fly section
- propagate an existing adjust item at the anchor to the new
- content node. */
- SwCntntNode * pNewTxtNd = GetNodes().MakeTxtNode
- (SwNodeIndex( GetNodes().GetEndOfAutotext()),
- GetTxtCollFromPool( nCollId ));
- SwCntntNode * pAnchorNode = pAnchorPos->nNode.GetNode().GetCntntNode();
-
- const SfxPoolItem * pItem = NULL;
-
- if (bCalledFromShell && !lcl_IsItemSet(*pNewTxtNd, RES_PARATR_ADJUST) &&
- SFX_ITEM_SET == pAnchorNode->GetSwAttrSet().
- GetItemState(RES_PARATR_ADJUST, sal_True, &pItem))
- static_cast<SwCntntNode *>(pNewTxtNd)->SetAttr(*pItem);
-
- pFmt = _MakeFlySection( *pAnchorPos, *pNewTxtNd,
- eAnchorType, pFlySet, pFrmFmt );
- }
- return pFmt;
-}
-
-SwFlyFrmFmt* SwDoc::MakeFlyAndMove( const SwPaM& rPam, const SfxItemSet& rSet,
- const SwSelBoxes* pSelBoxes,
- SwFrmFmt *pParent )
-{
- SwFmtAnchor& rAnch = (SwFmtAnchor&)rSet.Get( RES_ANCHOR );
-
- GetIDocumentUndoRedo().StartUndo( UNDO_INSLAYFMT, NULL );
-
- SwFlyFrmFmt* pFmt = MakeFlySection( rAnch.GetAnchorId(), rPam.GetPoint(),
- &rSet, pParent );
-
- // Wenn Inhalt selektiert ist, so wird dieser jetzt zum Inhalt des
- // neuen Rahmen. Sprich er wird in die entspr. Sektion des NodesArr
- //gemoved.
-
- if( pFmt )
- {
- do { // middle check loop
- const SwFmtCntnt &rCntnt = pFmt->GetCntnt();
- OSL_ENSURE( rCntnt.GetCntntIdx(), "Kein Inhalt vorbereitet." );
- SwNodeIndex aIndex( *(rCntnt.GetCntntIdx()), 1 );
- SwCntntNode *pNode = aIndex.GetNode().GetCntntNode();
-
- // ACHTUNG: nicht einen Index auf dem Stack erzeugen, sonst
- // kann der CntntnNode am Ende nicht geloscht werden !!
- SwPosition aPos( aIndex );
- aPos.nContent.Assign( pNode, 0 );
-
- if( pSelBoxes && pSelBoxes->Count() )
- {
- // Tabellenselection
- // kopiere Teile aus einer Tabelle: lege eine Tabelle mit der
- // Breite der Originalen an und move (kopiere/loesche) die
- // selektierten Boxen. Die Groessen werden prozentual
- // korrigiert.
-
- SwTableNode* pTblNd = (SwTableNode*)(*pSelBoxes)[0]->
- GetSttNd()->FindTableNode();
- if( !pTblNd )
- break;
-
- SwTable& rTbl = pTblNd->GetTable();
-
- // ist die gesamte Tabelle selektiert ?
- if( pSelBoxes->Count() == rTbl.GetTabSortBoxes().Count() )
- {
- // verschiebe die gesamte Tabelle
- SwNodeRange aRg( *pTblNd, 0, *pTblNd->EndOfSectionNode(), 1 );
-
- // wird die gesamte Tabelle verschoben und steht diese
- // in einem FlyFrame, dann erzeuge dahinter einen neuen
- // TextNode. Dadurch bleibt dieser Fly erhalten !
- if( aRg.aEnd.GetNode().IsEndNode() )
- GetNodes().MakeTxtNode( aRg.aStart,
- (SwTxtFmtColl*)GetDfltTxtFmtColl() );
-
- MoveNodeRange( aRg, aPos.nNode, DOC_MOVEDEFAULT );
- }
- else
- {
- rTbl.MakeCopy( this, aPos, *pSelBoxes );
- // Don't delete a part of a table with row span!!
- // You could delete the content instead -> ToDo
- //rTbl.DeleteSel( this, *pSelBoxes, 0, 0, sal_True, sal_True );
- }
-
- // wenn Tabelle im Rahmen, dann ohne nachfolgenden TextNode
- aIndex = rCntnt.GetCntntIdx()->GetNode().EndOfSectionIndex() - 1;
- OSL_ENSURE( aIndex.GetNode().GetTxtNode(),
- "hier sollte ein TextNode stehen" );
- aPos.nContent.Assign( 0, 0 ); // Index abmelden !!
- GetNodes().Delete( aIndex, 1 );
-
-//JP erstmal ein Hack, solange keine Flys/Headers/Footers Undofaehig sind
-// werden erstmal alle Undo - Objecte geloescht.
-if( GetIDocumentUndoRedo().DoesUndo() )
-{
- GetIDocumentUndoRedo().DelAllUndoObj();
-}
-
- }
- else
- {
- // copy all Pams and then delete all
- SwPaM* pTmp = (SwPaM*)&rPam;
- sal_Bool bOldFlag = mbCopyIsMove;
- bool const bOldUndo = GetIDocumentUndoRedo().DoesUndo();
- mbCopyIsMove = sal_True;
- GetIDocumentUndoRedo().DoUndo(false);
- do {
- if( pTmp->HasMark() &&
- *pTmp->GetPoint() != *pTmp->GetMark() )
- {
- CopyRange( *pTmp, aPos, false );
- }
- pTmp = static_cast<SwPaM*>(pTmp->GetNext());
- } while ( &rPam != pTmp );
- mbCopyIsMove = bOldFlag;
- GetIDocumentUndoRedo().DoUndo(bOldUndo);
-
- pTmp = (SwPaM*)&rPam;
- do {
- if( pTmp->HasMark() &&
- *pTmp->GetPoint() != *pTmp->GetMark() )
- {
- DeleteAndJoin( *pTmp );
- }
- pTmp = static_cast<SwPaM*>(pTmp->GetNext());
- } while ( &rPam != pTmp );
- }
- } while( sal_False );
- }
-
- SetModified();
-
- GetIDocumentUndoRedo().EndUndo( UNDO_INSLAYFMT, NULL );
-
- return pFmt;
-}
-
-// 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 );
- }
-
- RndStdIds eAnchorId = pAnchor ? pAnchor->GetAnchorId()
- : pFmt->GetAnchor().GetAnchorId();
-
- // Anker noch nicht gesetzt ?
- // DrawObjecte duerfen niemals in Kopf-/Fusszeilen landen.
- const bool bIsAtCntnt = (FLY_AT_PAGE != eAnchorId);
-
- const SwNodeIndex* pChkIdx = 0;
- if( !pAnchor )
- {
- pChkIdx = &rRg.GetPoint()->nNode;
- }
- else if( bIsAtCntnt )
- {
- pChkIdx = pAnchor->GetCntntAnchor()
- ? &pAnchor->GetCntntAnchor()->nNode
- : &rRg.GetPoint()->nNode;
- }
-
- // Allow drawing objects in header/footer, but control objects aren't
- // allowed in header/footer.
- if( pChkIdx &&
- ::CheckControlLayer( &rDrawObj ) &&
- IsInHeaderFooter( *pChkIdx ) )
- {
- pFmt->SetFmtAttr( SwFmtAnchor( eAnchorId = FLY_AT_PAGE ) );
- }
- 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 );
- }
- }
- pFmt->SetFmtAttr( aAnch );
- }
-
- // bei als Zeichen gebundenen Draws das Attribut im Absatz setzen
- if ( FLY_AS_CHAR == eAnchorId )
- {
- xub_StrLen nStt = rRg.GetPoint()->nContent.GetIndex();
- SwFmtFlyCnt aFmt( pFmt );
- rRg.GetPoint()->nNode.GetNode().GetTxtNode()->InsertItem(
- aFmt, nStt, nStt );
- }
-
- SwDrawContact* pContact = new SwDrawContact( pFmt, &rDrawObj );
-
- // ggfs. Frames anlegen
- if( GetCurrentViewShell() )
- {
- pFmt->MakeFrms();
- // #i42319# - follow-up of #i35635#
- // move object to visible layer
- // #i79391#
- if ( pContact->GetAnchorFrm() )
- {
- pContact->MoveObjToVisibleLayer( &rDrawObj );
- }
- }
-
- if (GetIDocumentUndoRedo().DoesUndo())
- {
- GetIDocumentUndoRedo().AppendUndo( new SwUndoInsLayFmt(pFmt, 0, 0) );
- }
-
- SetModified();
- return pFmt;
-}
-
-/* ---------------------------------------------------------------------------
- paragraph frames - o.k. if the PaM includes the paragraph from the beginning
- to the beginning of the next paragraph at least
- frames at character - o.k. if the pam start at least at the same position
- as the frame
- ---------------------------------------------------------------------------*/
-sal_Bool TstFlyRange( const SwPaM* pPam, const SwPosition* pFlyPos,
- RndStdIds nAnchorId )
-{
- sal_Bool bOk = sal_False;
- const SwPaM* pTmp = pPam;
- do {
- const sal_uInt32 nFlyIndex = pFlyPos->nNode.GetIndex();
- const SwPosition* pPaMStart = pTmp->Start();
- const SwPosition* pPaMEnd = pTmp->End();
- const sal_uInt32 nPamStartIndex = pPaMStart->nNode.GetIndex();
- const sal_uInt32 nPamEndIndex = pPaMEnd->nNode.GetIndex();
- if (FLY_AT_PARA == nAnchorId)
- bOk = (nPamStartIndex < nFlyIndex && nPamEndIndex > nFlyIndex) ||
- (((nPamStartIndex == nFlyIndex) && (pPaMStart->nContent.GetIndex() == 0)) &&
- (nPamEndIndex > nFlyIndex));
- else
- {
- xub_StrLen nFlyContentIndex = pFlyPos->nContent.GetIndex();
- xub_StrLen nPamEndContentIndex = pPaMEnd->nContent.GetIndex();
- bOk = (nPamStartIndex < nFlyIndex &&
- (( nPamEndIndex > nFlyIndex )||
- ((nPamEndIndex == nFlyIndex) &&
- (nPamEndContentIndex > nFlyContentIndex))) )
- ||
- (((nPamStartIndex == nFlyIndex) &&
- (pPaMStart->nContent.GetIndex() <= nFlyContentIndex)) &&
- ((nPamEndIndex > nFlyIndex) ||
- (nPamEndContentIndex > nFlyContentIndex )));
- }
-
- } while( !bOk && pPam != ( pTmp = (const SwPaM*)pTmp->GetNext() ));
- return bOk;
-}
-
-void SwDoc::GetAllFlyFmts( SwPosFlyFrms& rPosFlyFmts,
- const SwPaM* pCmpRange, sal_Bool bDrawAlso,
- sal_Bool bAsCharAlso ) const
-{
- SwPosFlyFrm *pFPos = 0;
- SwFrmFmt *pFly;
-
- // erstmal alle Absatzgebundenen einsammeln
- for( sal_uInt16 n = 0; n < GetSpzFrmFmts()->Count(); ++n )
- {
- pFly = (*GetSpzFrmFmts())[ n ];
- bool bDrawFmt = bDrawAlso ? RES_DRAWFRMFMT == pFly->Which() : false;
- bool bFlyFmt = RES_FLYFRMFMT == pFly->Which();
- if( bFlyFmt || bDrawFmt )
- {
- const SwFmtAnchor& rAnchor = pFly->GetAnchor();
- SwPosition const*const pAPos = rAnchor.GetCntntAnchor();
- if (pAPos &&
- ((FLY_AT_PARA == rAnchor.GetAnchorId()) ||
- (FLY_AT_FLY == rAnchor.GetAnchorId()) ||
- (FLY_AT_CHAR == rAnchor.GetAnchorId()) ||
- ((FLY_AS_CHAR == rAnchor.GetAnchorId()) && bAsCharAlso)))
- {
- if( pCmpRange &&
- !TstFlyRange( pCmpRange, pAPos, rAnchor.GetAnchorId() ))
- continue; // kein gueltiger FlyFrame
- pFPos = new SwPosFlyFrm( pAPos->nNode, pFly, rPosFlyFmts.Count() );
- rPosFlyFmts.Insert( pFPos );
- }
- }
- }
-
- // kein Layout oder nur ein Teil, dann wars das
- // Seitenbezogen Flys nur, wenn vollstaendig "gewuenscht" wird !
- if( !GetCurrentViewShell() || pCmpRange ) //swmod 071108//swmod 071225
- return;
-
- pFPos = 0;
- SwPageFrm *pPage = (SwPageFrm*)GetCurrentLayout()->GetLower(); //swmod 080218
- while( pPage )
- {
- if( pPage->GetSortedObjs() )
- {
- SwSortedObjs &rObjs = *pPage->GetSortedObjs();
- for( sal_uInt16 i = 0; i < rObjs.Count(); ++i)
- {
- SwAnchoredObject* pAnchoredObj = rObjs[i];
- if ( pAnchoredObj->ISA(SwFlyFrm) )
- pFly = &(pAnchoredObj->GetFrmFmt());
- else if ( bDrawAlso )
- pFly = &(pAnchoredObj->GetFrmFmt());
- else
- continue;
-
- const SwFmtAnchor& rAnchor = pFly->GetAnchor();
- if ((FLY_AT_PARA != rAnchor.GetAnchorId()) &&
- (FLY_AT_FLY != rAnchor.GetAnchorId()) &&
- (FLY_AT_CHAR != rAnchor.GetAnchorId()))
- {
- const SwCntntFrm * pCntntFrm = pPage->FindFirstBodyCntnt();
- if ( !pCntntFrm )
- {
- //Oops! Eine leere Seite. Damit der Rahmen nicht ganz
- //verlorengeht (RTF) suchen wir schnell den letzen
- //Cntnt der vor der Seite steht.
- SwPageFrm *pPrv = (SwPageFrm*)pPage->GetPrev();
- while ( !pCntntFrm && pPrv )
- {
- pCntntFrm = pPrv->FindFirstBodyCntnt();
- pPrv = (SwPageFrm*)pPrv->GetPrev();
- }
- }
- if ( pCntntFrm )
- {
- SwNodeIndex aIdx( *pCntntFrm->GetNode() );
- pFPos = new SwPosFlyFrm( aIdx, pFly, rPosFlyFmts.Count() );
- }
- }
- if ( pFPos )
- {
- rPosFlyFmts.Insert( pFPos );
- pFPos = 0;
- }
- }
- }
- pPage = (SwPageFrm*)pPage->GetNext();
- }
-}
-
-/*************************************************************************
-|*
-|* SwDoc::InsertLabel()
-|*
-|*************************************************************************/
-
-/* #i6447# changed behaviour if lcl_CpyAttr:
-
- If the old item set contains the item to set (no inheritance) copy the item
- into the new set.
-
- If the old item set contains the item by inheritance and the new set
- contains the item, too:
- If the two items differ copy the item from the old set to the new set.
-
- Otherwise the new set will not be changed.
-*/
-void lcl_CpyAttr( SfxItemSet &rNewSet, const SfxItemSet &rOldSet, sal_uInt16 nWhich )
-{
- const SfxPoolItem *pOldItem = NULL, *pNewItem = NULL;
-
- rOldSet.GetItemState( nWhich, sal_False, &pOldItem);
- if (pOldItem != NULL)
- rNewSet.Put( *pOldItem );
- else
- {
- pOldItem = rOldSet.GetItem( nWhich, sal_True);
- if (pOldItem != NULL)
- {
- pNewItem = rNewSet.GetItem( nWhich, sal_True);
- if (pNewItem != NULL)
- {
- if (*pOldItem != *pNewItem)
- rNewSet.Put( *pOldItem );
- }
- else {
- OSL_FAIL("What am I doing here?");
- }
- }
- else {
- OSL_FAIL("What am I doing here?");
- }
- }
-
-}
-
-static SwFlyFrmFmt *
-lcl_InsertLabel(SwDoc & rDoc, SwTxtFmtColls *const pTxtFmtCollTbl,
- SwUndoInsertLabel *const pUndo,
- SwLabelType const eType, String const& rTxt, String const& rSeparator,
- const String& rNumberingSeparator,
- const sal_Bool bBefore, const sal_uInt16 nId, const sal_uLong nNdIdx,
- const String& rCharacterStyle,
- const sal_Bool bCpyBrd )
-{
- ::sw::UndoGuard const undoGuard(rDoc.GetIDocumentUndoRedo());
-
- sal_Bool bTable = sal_False; //Um etwas Code zu sparen.
-
- //Erstmal das Feld bauen, weil ueber den Namen die TxtColl besorgt werden
- //muss
- OSL_ENSURE( nId == USHRT_MAX || nId < rDoc.GetFldTypes()->Count(),
- "FldType index out of bounds." );
- SwFieldType *pType = (nId != USHRT_MAX) ? (*rDoc.GetFldTypes())[nId] : NULL;
- OSL_ENSURE(!pType || pType->Which() == RES_SETEXPFLD, "wrong Id for Label");
-
- SwTxtFmtColl * pColl = NULL;
- if( pType )
- {
- for( sal_uInt16 i = pTxtFmtCollTbl->Count(); i; )
- {
- if( (*pTxtFmtCollTbl)[ --i ]->GetName() == pType->GetName() )
- {
- pColl = (*pTxtFmtCollTbl)[i];
- break;
- }
- }
- OSL_ENSURE( pColl, "no text collection found" );
- }
-
- if( !pColl )
- {
- pColl = rDoc.GetTxtCollFromPool( RES_POOLCOLL_LABEL );
- }
-
- SwTxtNode *pNew = NULL;
- SwFlyFrmFmt* pNewFmt = NULL;
-
- switch ( eType )
- {
- case LTYPE_TABLE:
- bTable = sal_True;
- /* Kein Break hier */
- case LTYPE_FLY:
- //Am Anfang/Ende der Fly-Section den entsprechenden Node mit Feld
- //einfuegen (Frame wird automatisch erzeugt).
- {
- SwStartNode *pSttNd = rDoc.GetNodes()[nNdIdx]->GetStartNode();
- OSL_ENSURE( pSttNd, "Kein StartNode in InsertLabel." );
- sal_uLong nNode;
- if( bBefore )
- {
- nNode = pSttNd->GetIndex();
- if( !bTable )
- ++nNode;
- }
- else
- {
- nNode = pSttNd->EndOfSectionIndex();
- if( bTable )
- ++nNode;
- }
-
- if( pUndo )
- pUndo->SetNodePos( nNode );
-
- //Node fuer Beschriftungsabsatz erzeugen.
- SwNodeIndex aIdx( rDoc.GetNodes(), nNode );
- pNew = rDoc.GetNodes().MakeTxtNode( aIdx, pColl );
- }
- break;
-
- case LTYPE_OBJECT:
- {
- //Rahmen zerstoeren, neuen Rahmen einfuegen, entsprechenden
- // Node mit Feld in den neuen Rahmen, den alten Rahmen mit
- // dem Object (Grafik/Ole) absatzgebunden in den neuen Rahmen,
- // Frames erzeugen.
-
- //Erstmal das Format zum Fly besorgen und das Layout entkoppeln.
- SwFrmFmt *pOldFmt = rDoc.GetNodes()[nNdIdx]->GetFlyFmt();
- OSL_ENSURE( pOldFmt, "Format des Fly nicht gefunden." );
- // #i115719#
- // <title> and <description> attributes are lost when calling <DelFrms()>.
- // Thus, keep them and restore them after the calling <MakeFrms()>
- const bool bIsSwFlyFrmFmtInstance( dynamic_cast<SwFlyFrmFmt*>(pOldFmt) != 0 );
- const String sTitle( bIsSwFlyFrmFmtInstance
- ? static_cast<SwFlyFrmFmt*>(pOldFmt)->GetObjTitle()
- : String() );
- const String sDescription( bIsSwFlyFrmFmtInstance
- ? static_cast<SwFlyFrmFmt*>(pOldFmt)->GetObjDescription()
- : String() );
- pOldFmt->DelFrms();
-
- pNewFmt = rDoc.MakeFlyFrmFmt( rDoc.GetUniqueFrameName(),
- rDoc.GetFrmFmtFromPool(RES_POOLFRM_FRAME) );
-
- /* #i6447#: Only the selected items are copied from the old
- format. */
- SfxItemSet* pNewSet = pNewFmt->GetAttrSet().Clone( sal_True );
-
-
- //Diejenigen Attribute uebertragen die auch gesetzt sind,
- //andere sollen weiterhin aus den Vorlagen gueltig werden.
- lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_PRINT );
- lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_OPAQUE );
- lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_PROTECT );
- lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_SURROUND );
- lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_VERT_ORIENT );
- lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_HORI_ORIENT );
- lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_LR_SPACE );
- lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_UL_SPACE );
- lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_BACKGROUND );
- if( bCpyBrd )
- {
- // JP 07.07.99: Bug 67029 - if at Grafik no BoxItem but
- // in the new Format is any, then set the
- // default item in the new Set. Because
- // the Size of the Grafik have never been
- // changed!
- const SfxPoolItem *pItem;
- if( SFX_ITEM_SET == pOldFmt->GetAttrSet().
- GetItemState( RES_BOX, sal_True, &pItem ))
- pNewSet->Put( *pItem );
- else if( SFX_ITEM_SET == pNewFmt->GetAttrSet().
- GetItemState( RES_BOX, sal_True ))
- pNewSet->Put( *GetDfltAttr( RES_BOX ) );
-
- if( SFX_ITEM_SET == pOldFmt->GetAttrSet().
- GetItemState( RES_SHADOW, sal_True, &pItem ))
- pNewSet->Put( *pItem );
- else if( SFX_ITEM_SET == pNewFmt->GetAttrSet().
- GetItemState( RES_SHADOW, sal_True ))
- pNewSet->Put( *GetDfltAttr( RES_SHADOW ) );
- }
- else
- {
- //Die Attribute hart setzen, weil sie sonst aus der
- // Vorlage kommen koenten und dann passt die
- // Grossenberechnung nicht mehr.
- pNewSet->Put( SvxBoxItem(RES_BOX) );
- pNewSet->Put( SvxShadowItem(RES_SHADOW) );
-
- }
-
- //Anker immer uebertragen, ist sowieso ein hartes Attribut.
- pNewSet->Put( pOldFmt->GetAnchor() );
-
- //In der Hoehe soll der neue Varabel sein!
- SwFmtFrmSize aFrmSize( pOldFmt->GetFrmSize() );
- aFrmSize.SetHeightSizeType( ATT_MIN_SIZE );
- pNewSet->Put( aFrmSize );
-
- SwStartNode* pSttNd = rDoc.GetNodes().MakeTextSection(
- SwNodeIndex( rDoc.GetNodes().GetEndOfAutotext() ),
- SwFlyStartNode, pColl );
- pNewSet->Put( SwFmtCntnt( pSttNd ));
-
- pNewFmt->SetFmtAttr( *pNewSet );
-
- //Bei InCntnt's wird es spannend: Das TxtAttribut muss
- //vernichtet werden. Leider reisst dies neben den Frms auch
- //noch das Format mit in sein Grab. Um dass zu unterbinden
- //loesen wir vorher die Verbindung zwischen Attribut und Format.
-
- const SwFmtAnchor& rAnchor = pNewFmt->GetAnchor();
- if ( FLY_AS_CHAR == rAnchor.GetAnchorId() )
- {
- const SwPosition *pPos = rAnchor.GetCntntAnchor();
- SwTxtNode *pTxtNode = pPos->nNode.GetNode().GetTxtNode();
- OSL_ENSURE( pTxtNode->HasHints(), "Missing FlyInCnt-Hint." );
- const xub_StrLen nIdx = pPos->nContent.GetIndex();
- SwTxtAttr * const pHnt =
- pTxtNode->GetTxtAttrForCharAt(nIdx, RES_TXTATR_FLYCNT);
-
- OSL_ENSURE( pHnt && pHnt->Which() == RES_TXTATR_FLYCNT,
- "Missing FlyInCnt-Hint." );
- OSL_ENSURE( pHnt && pHnt->GetFlyCnt().GetFrmFmt() == pOldFmt,
- "Wrong TxtFlyCnt-Hint." );
-
- const_cast<SwFmtFlyCnt&>(pHnt->GetFlyCnt()).SetFlyFmt(
- pNewFmt );
- }
-
-
- //Der Alte soll keinen Umlauf haben, und er soll oben/mittig
- //ausgerichtet sein.
- //Ausserdem soll die Breite 100% betragen und bei Aenderungen
- //Die Hoehe mit anpassen.
- pNewSet->ClearItem();
-
- pNewSet->Put( SwFmtSurround( SURROUND_NONE ) );
- pNewSet->Put( SvxOpaqueItem( RES_OPAQUE, sal_True ) );
- pNewSet->Put( SwFmtVertOrient( text::VertOrientation::TOP ) );
- pNewSet->Put( SwFmtHoriOrient( text::HoriOrientation::CENTER ) );
-
- aFrmSize = pOldFmt->GetFrmSize();
- aFrmSize.SetWidthPercent( 100 );
- aFrmSize.SetHeightPercent( 255 );
- pNewSet->Put( aFrmSize );
-
- //Die Attribute setzen wir hart, weil sie sonst aus der Vorlage
- //kommen koenten und dann passt die Grossenberechnung nicht mehr.
- if( bCpyBrd )
- {
- pNewSet->Put( SvxBoxItem(RES_BOX) );
- pNewSet->Put( SvxShadowItem(RES_SHADOW) );
- }
- pNewSet->Put( SvxLRSpaceItem(RES_LR_SPACE) );
- pNewSet->Put( SvxULSpaceItem(RES_UL_SPACE) );
-
- //Der Alte ist absatzgebunden, und zwar am Absatz im neuen.
- SwFmtAnchor aAnch( FLY_AT_PARA );
- SwNodeIndex aAnchIdx( *pNewFmt->GetCntnt().GetCntntIdx(), 1 );
- pNew = aAnchIdx.GetNode().GetTxtNode();
- SwPosition aPos( aAnchIdx );
- aAnch.SetAnchor( &aPos );
- pNewSet->Put( aAnch );
-
- if( pUndo )
- pUndo->SetFlys( *pOldFmt, *pNewSet, *pNewFmt );
- else
- pOldFmt->SetFmtAttr( *pNewSet );
-
- delete pNewSet;
-
- //Nun nur noch die Flys erzeugen lassen. Das ueberlassen
- //wir vorhanden Methoden (insb. fuer InCntFlys etwas aufwendig).
- pNewFmt->MakeFrms();
- // #i115719#
- if ( bIsSwFlyFrmFmtInstance )
- {
- static_cast<SwFlyFrmFmt*>(pOldFmt)->SetObjTitle( sTitle );
- static_cast<SwFlyFrmFmt*>(pOldFmt)->SetObjDescription( sDescription );
- }
- }
- break;
-
- default:
- OSL_ENSURE(false, "unknown LabelType?");
- }
- OSL_ENSURE( pNew, "No Label inserted" );
- if( pNew )
- {
- //#i61007# order of captions
- sal_Bool bOrderNumberingFirst = SW_MOD()->GetModuleConfig()->IsCaptionOrderNumberingFirst();
- //String aufbereiten
- String aTxt;
- if( bOrderNumberingFirst )
- {
- aTxt = rNumberingSeparator;
- }
- if( pType)
- {
- aTxt += pType->GetName();
- if( !bOrderNumberingFirst )
- aTxt += ' ';
- }
- xub_StrLen nIdx = aTxt.Len();
- if( rTxt.Len() > 0 )
- {
- aTxt += rSeparator;
- }
- xub_StrLen nSepIdx = aTxt.Len();
- aTxt += rTxt;
-
- //String einfuegen
- SwIndex aIdx( pNew, 0 );
- pNew->InsertText( aTxt, aIdx );
-
- //
- //Feld einfuegen
- if(pType)
- {
- SwSetExpField aFld( (SwSetExpFieldType*)pType, aEmptyStr, SVX_NUM_ARABIC);
- if( bOrderNumberingFirst )
- nIdx = 0;
- SwFmtFld aFmt( aFld );
- pNew->InsertItem( aFmt, nIdx, nIdx );
- if(rCharacterStyle.Len())
- {
- SwCharFmt* pCharFmt = rDoc.FindCharFmtByName(rCharacterStyle);
- if( !pCharFmt )
- {
- const sal_uInt16 nMyId = SwStyleNameMapper::GetPoolIdFromUIName(rCharacterStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT);
- pCharFmt = rDoc.GetCharFmtFromPool( nMyId );
- }
- if (pCharFmt)
- {
- SwFmtCharFmt aCharFmt( pCharFmt );
- pNew->InsertItem( aCharFmt, 0,
- nSepIdx + 1, nsSetAttrMode::SETATTR_DONTEXPAND );
- }
- }
- }
-
- if ( bTable )
- {
- if ( bBefore )
- {
- if ( !pNew->GetSwAttrSet().GetKeep().GetValue() )
- pNew->SetAttr( SvxFmtKeepItem( sal_True, RES_KEEP ) );
- }
- else
- {
- SwTableNode *const pNd =
- rDoc.GetNodes()[nNdIdx]->GetStartNode()->GetTableNode();
- SwTable &rTbl = pNd->GetTable();
- if ( !rTbl.GetFrmFmt()->GetKeep().GetValue() )
- rTbl.GetFrmFmt()->SetFmtAttr( SvxFmtKeepItem( sal_True, RES_KEEP ) );
- if ( pUndo )
- pUndo->SetUndoKeep();
- }
- }
- rDoc.SetModified();
- }
-
- return pNewFmt;
-}
-
-SwFlyFrmFmt *
-SwDoc::InsertLabel(
- SwLabelType const eType, String const& rTxt, String const& rSeparator,
- String const& rNumberingSeparator,
- sal_Bool const bBefore, sal_uInt16 const nId, sal_uLong const nNdIdx,
- String const& rCharacterStyle,
- sal_Bool const bCpyBrd )
-{
- SwUndoInsertLabel * pUndo(0);
- if (GetIDocumentUndoRedo().DoesUndo())
- {
- pUndo = new SwUndoInsertLabel(
- eType, rTxt, rSeparator, rNumberingSeparator,
- bBefore, nId, rCharacterStyle, bCpyBrd );
- }
-
- SwFlyFrmFmt *const pNewFmt = lcl_InsertLabel(*this, pTxtFmtCollTbl, pUndo,
- eType, rTxt, rSeparator, rNumberingSeparator, bBefore,
- nId, nNdIdx, rCharacterStyle, bCpyBrd);
-
- if (pUndo)
- {
- GetIDocumentUndoRedo().AppendUndo(pUndo);
- }
- else
- {
- GetIDocumentUndoRedo().DelAllUndoObj();
- }
-
- return pNewFmt;
-}
-
-
-/*************************************************************************
-|*
-|* SwDoc::InsertDrawLabel()
-|*
-|*************************************************************************/
-static SwFlyFrmFmt *
-lcl_InsertDrawLabel( SwDoc & rDoc, SwTxtFmtColls *const pTxtFmtCollTbl,
- SwUndoInsertLabel *const pUndo, SwDrawFrmFmt *const pOldFmt,
- String const& rTxt,
- const String& rSeparator,
- const String& rNumberSeparator,
- const sal_uInt16 nId,
- const String& rCharacterStyle,
- SdrObject& rSdrObj )
-{
- ::sw::UndoGuard const undoGuard(rDoc.GetIDocumentUndoRedo());
- ::sw::DrawUndoGuard const drawUndoGuard(rDoc.GetIDocumentUndoRedo());
-
- // Erstmal das Feld bauen, weil ueber den Namen die TxtColl besorgt
- // werden muss
- OSL_ENSURE( nId == USHRT_MAX || nId < rDoc.GetFldTypes()->Count(),
- "FldType index out of bounds" );
- SwFieldType *pType = nId != USHRT_MAX ? (*rDoc.GetFldTypes())[nId] : 0;
- OSL_ENSURE( !pType || pType->Which() == RES_SETEXPFLD, "Wrong label id" );
-
- SwTxtFmtColl *pColl = NULL;
- if( pType )
- {
- for( sal_uInt16 i = pTxtFmtCollTbl->Count(); i; )
- {
- if( (*pTxtFmtCollTbl)[ --i ]->GetName() == pType->GetName() )
- {
- pColl = (*pTxtFmtCollTbl)[i];
- break;
- }
- }
- OSL_ENSURE( pColl, "no text collection found" );
- }
-
- if( !pColl )
- {
- pColl = rDoc.GetTxtCollFromPool( RES_POOLCOLL_LABEL );
- }
-
- SwTxtNode* pNew = NULL;
- SwFlyFrmFmt* pNewFmt = NULL;
-
- // Rahmen zerstoeren, neuen Rahmen einfuegen, entsprechenden
- // Node mit Feld in den neuen Rahmen, den alten Rahmen mit
- // dem Object (Grafik/Ole) absatzgebunden in den neuen Rahmen,
- // Frames erzeugen.
-
- // Keep layer ID of drawing object before removing
- // its frames.
- // Note: The layer ID is passed to the undo and have to be the correct value.
- // Removing the frames of the drawing object changes its layer.
- const SdrLayerID nLayerId = rSdrObj.GetLayer();
-
- pOldFmt->DelFrms();
-
- //Bei InCntnt's wird es spannend: Das TxtAttribut muss
- //vernichtet werden. Leider reisst dies neben den Frms auch
- //noch das Format mit in sein Grab. Um dass zu unterbinden
- //loesen wir vorher die Verbindung zwischen Attribut und Format.
- SfxItemSet* pNewSet = pOldFmt->GetAttrSet().Clone( sal_False );
-
- // Ggf. Groesse und Position des Rahmens schuetzen
- if ( rSdrObj.IsMoveProtect() || rSdrObj.IsResizeProtect() )
- {
- SvxProtectItem aProtect(RES_PROTECT);
- aProtect.SetCntntProtect( sal_False );
- aProtect.SetPosProtect( rSdrObj.IsMoveProtect() );
- aProtect.SetSizeProtect( rSdrObj.IsResizeProtect() );
- pNewSet->Put( aProtect );
- }
-
- // Umlauf uebernehmen
- lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_SURROUND );
-
- // Den Rahmen ggf. in den Hintergrund schicken.
- // Consider 'invisible' hell layer.
- if ( rDoc.GetHellId() != nLayerId &&
- rDoc.GetInvisibleHellId() != nLayerId )
- {
- SvxOpaqueItem aOpaque( RES_OPAQUE );
- aOpaque.SetValue( sal_True );
- pNewSet->Put( aOpaque );
- }
-
- // Position uebernehmen
- // #i26791# - use directly the positioning attributes of
- // the drawing object.
- pNewSet->Put( pOldFmt->GetHoriOrient() );
- pNewSet->Put( pOldFmt->GetVertOrient() );
-
- pNewSet->Put( pOldFmt->GetAnchor() );
-
- //In der Hoehe soll der neue Varabel sein!
- Size aSz( rSdrObj.GetCurrentBoundRect().GetSize() );
- SwFmtFrmSize aFrmSize( ATT_MIN_SIZE, aSz.Width(), aSz.Height() );
- pNewSet->Put( aFrmSize );
-
- // Abstaende auf den neuen Rahmen uebertragen. Eine Umrandung
- // gibt es beu Zeichen-Objekten nicht, also muss sie geloescht
- // werden.
- // MA: Falsch sie wird nicht gesetzt, denn die aus der Vorlage
- // soll ruhig wirksam werden
- pNewSet->Put( pOldFmt->GetLRSpace() );
- pNewSet->Put( pOldFmt->GetULSpace() );
-
- SwStartNode* pSttNd =
- rDoc.GetNodes().MakeTextSection(
- SwNodeIndex( rDoc.GetNodes().GetEndOfAutotext() ),
- SwFlyStartNode, pColl );
-
- pNewFmt = rDoc.MakeFlyFrmFmt( rDoc.GetUniqueFrameName(),
- rDoc.GetFrmFmtFromPool( RES_POOLFRM_FRAME ) );
-
- // JP 28.10.99: Bug 69487 - set border and shadow to default if the
- // template contains any.
- if( SFX_ITEM_SET == pNewFmt->GetAttrSet().GetItemState( RES_BOX, sal_True ))
- pNewSet->Put( *GetDfltAttr( RES_BOX ) );
-
- if( SFX_ITEM_SET == pNewFmt->GetAttrSet().GetItemState(RES_SHADOW,sal_True))
- pNewSet->Put( *GetDfltAttr( RES_SHADOW ) );
-
- pNewFmt->SetFmtAttr( SwFmtCntnt( pSttNd ));
- pNewFmt->SetFmtAttr( *pNewSet );
-
- const SwFmtAnchor& rAnchor = pNewFmt->GetAnchor();
- if ( FLY_AS_CHAR == rAnchor.GetAnchorId() )
- {
- const SwPosition *pPos = rAnchor.GetCntntAnchor();
- SwTxtNode *pTxtNode = pPos->nNode.GetNode().GetTxtNode();
- OSL_ENSURE( pTxtNode->HasHints(), "Missing FlyInCnt-Hint." );
- const xub_StrLen nIdx = pPos->nContent.GetIndex();
- SwTxtAttr * const pHnt =
- pTxtNode->GetTxtAttrForCharAt( nIdx, RES_TXTATR_FLYCNT );
-
-#if OSL_DEBUG_LEVEL > 1
- OSL_ENSURE( pHnt && pHnt->Which() == RES_TXTATR_FLYCNT,
- "Missing FlyInCnt-Hint." );
- OSL_ENSURE( pHnt && ((SwFmtFlyCnt&)pHnt->GetFlyCnt()).
- GetFrmFmt() == (SwFrmFmt*)pOldFmt,
- "Wrong TxtFlyCnt-Hint." );
-#endif
- const_cast<SwFmtFlyCnt&>(pHnt->GetFlyCnt()).SetFlyFmt( pNewFmt );
- }
-
-
- //Der Alte soll keinen Umlauf haben, und er soll oben/mittig
- //ausgerichtet sein.
- pNewSet->ClearItem();
-
- pNewSet->Put( SwFmtSurround( SURROUND_NONE ) );
- if (nLayerId == rDoc.GetHellId())
- {
- // Consider drawing objects in 'invisible' hell layer
- rSdrObj.SetLayer( rDoc.GetHeavenId() );
- }
- else if (nLayerId == rDoc.GetInvisibleHellId())
- {
- rSdrObj.SetLayer( rDoc.GetInvisibleHeavenId() );
- }
- pNewSet->Put( SvxLRSpaceItem( RES_LR_SPACE ) );
- pNewSet->Put( SvxULSpaceItem( RES_UL_SPACE ) );
-
- // #i26791# - set position of the drawing object, which is labeled.
- pNewSet->Put( SwFmtVertOrient( 0, text::VertOrientation::TOP, text::RelOrientation::FRAME ) );
- pNewSet->Put( SwFmtHoriOrient( 0, text::HoriOrientation::CENTER, text::RelOrientation::FRAME ) );
-
- //Der Alte ist absatzgebunden, und zwar am Absatz im neuen.
- SwFmtAnchor aAnch( FLY_AT_PARA );
- SwNodeIndex aAnchIdx( *pNewFmt->GetCntnt().GetCntntIdx(), 1 );
- pNew = aAnchIdx.GetNode().GetTxtNode();
- SwPosition aPos( aAnchIdx );
- aAnch.SetAnchor( &aPos );
- pNewSet->Put( aAnch );
-
- if( pUndo )
- {
- pUndo->SetFlys( *pOldFmt, *pNewSet, *pNewFmt );
- // #i26791# - position no longer needed
- pUndo->SetDrawObj( nLayerId );
- }
- else
- pOldFmt->SetFmtAttr( *pNewSet );
-
- delete pNewSet;
-
- //Nun nur noch die Flys erzeugen lassen. Das ueberlassen
- //wir vorhanden Methoden (insb. fuer InCntFlys etwas aufwendig).
- pNewFmt->MakeFrms();
-
- OSL_ENSURE( pNew, "No Label inserted" );
-
- if( pNew )
- {
- //#i61007# order of captions
- sal_Bool bOrderNumberingFirst = SW_MOD()->GetModuleConfig()->IsCaptionOrderNumberingFirst();
-
- // prepare string
- String aTxt;
- if( bOrderNumberingFirst )
- {
- aTxt = rNumberSeparator;
- }
- if ( pType )
- {
- aTxt += pType->GetName();
- if( !bOrderNumberingFirst )
- aTxt += ' ';
- }
- xub_StrLen nIdx = aTxt.Len();
- aTxt += rSeparator;
- xub_StrLen nSepIdx = aTxt.Len();
- aTxt += rTxt;
-
- // insert text
- SwIndex aIdx( pNew, 0 );
- pNew->InsertText( aTxt, aIdx );
-
- // insert field
- if ( pType )
- {
- SwSetExpField aFld( (SwSetExpFieldType*)pType, aEmptyStr, SVX_NUM_ARABIC );
- if( bOrderNumberingFirst )
- nIdx = 0;
- SwFmtFld aFmt( aFld );
- pNew->InsertItem( aFmt, nIdx, nIdx );
- if ( rCharacterStyle.Len() )
- {
- SwCharFmt * pCharFmt = rDoc.FindCharFmtByName(rCharacterStyle);
- if ( !pCharFmt )
- {
- const sal_uInt16 nMyId = SwStyleNameMapper::GetPoolIdFromUIName( rCharacterStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
- pCharFmt = rDoc.GetCharFmtFromPool( nMyId );
- }
- if ( pCharFmt )
- {
- SwFmtCharFmt aCharFmt( pCharFmt );
- pNew->InsertItem( aCharFmt, 0, nSepIdx + 1,
- nsSetAttrMode::SETATTR_DONTEXPAND );
- }
- }
- }
- }
-
- return pNewFmt;
-}
-
-SwFlyFrmFmt* SwDoc::InsertDrawLabel(
- String const& rTxt,
- String const& rSeparator,
- String const& rNumberSeparator,
- sal_uInt16 const nId,
- String const& rCharacterStyle,
- SdrObject& rSdrObj )
-{
- SwDrawContact *const pContact =
- static_cast<SwDrawContact*>(GetUserCall( &rSdrObj ));
- OSL_ENSURE( RES_DRAWFRMFMT == pContact->GetFmt()->Which(),
- "InsertDrawLabel(): not a DrawFrmFmt" );
- if (!pContact)
- return 0;
-
- SwDrawFrmFmt* pOldFmt = (SwDrawFrmFmt *)pContact->GetFmt();
- if (!pOldFmt)
- return 0;
-
- SwUndoInsertLabel * pUndo = 0;
- if (GetIDocumentUndoRedo().DoesUndo())
- {
- GetIDocumentUndoRedo().ClearRedo();
- pUndo = new SwUndoInsertLabel(
- LTYPE_DRAW, rTxt, rSeparator, rNumberSeparator, sal_False,
- nId, rCharacterStyle, sal_False );
- }
-
- SwFlyFrmFmt *const pNewFmt = lcl_InsertDrawLabel(
- *this, pTxtFmtCollTbl, pUndo, pOldFmt,
- rTxt, rSeparator, rNumberSeparator, nId, rCharacterStyle, rSdrObj);
-
- if (pUndo)
- {
- GetIDocumentUndoRedo().AppendUndo( pUndo );
- }
- else
- {
- GetIDocumentUndoRedo().DelAllUndoObj();
- }
-
- return pNewFmt;
-}
-
-
-/*************************************************************************
-|*
-|* IDocumentTimerAccess-methods
-|*
-|*************************************************************************/
-void SwDoc::StartIdling()
-{
- mbStartIdleTimer = sal_True;
- if( !mIdleBlockCount )
- aIdleTimer.Start();
-}
-
-void SwDoc::StopIdling()
-{
- mbStartIdleTimer = sal_False;
- aIdleTimer.Stop();
-}
-
-void SwDoc::BlockIdling()
-{
- aIdleTimer.Stop();
- ++mIdleBlockCount;
-}
-
-void SwDoc::UnblockIdling()
-{
- --mIdleBlockCount;
- if( !mIdleBlockCount && mbStartIdleTimer && !aIdleTimer.IsActive() )
- aIdleTimer.Start();
-}
-
-/*************************************************************************
-|*
-|* SwDoc::DoIdleJobs()
-|*
-|*************************************************************************/
-IMPL_LINK( SwDoc, DoIdleJobs, Timer *, pTimer )
-{
-#ifdef TIMELOG
- static ::rtl::Logfile* pModLogFile = 0;
- if( !pModLogFile )
- pModLogFile = new ::rtl::Logfile( "First DoIdleJobs" );
-#endif
-
- SwRootFrm* pTmpRoot = GetCurrentLayout();//swmod 080219
- if( pTmpRoot &&
- !SfxProgress::GetActiveProgress( pDocShell ) )
- {
- ViewShell *pSh, *pStartSh;
- pSh = pStartSh = GetCurrentViewShell();
- do {
- if( pSh->ActionPend() )
- {
- if( pTimer )
- pTimer->Start();
- return 0;
- }
- pSh = (ViewShell*)pSh->GetNext();
- } while( pSh != pStartSh );
-
- if( pTmpRoot->IsNeedGrammarCheck() )
- {
- sal_Bool bIsOnlineSpell = pSh->GetViewOptions()->IsOnlineSpell();
- sal_Bool bIsAutoGrammar = sal_False;
- SvtLinguConfig().GetProperty( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
- UPN_IS_GRAMMAR_AUTO )) ) >>= bIsAutoGrammar;
-
- if (bIsOnlineSpell && bIsAutoGrammar)
- StartGrammarChecking( *this );
- }
- SwFldUpdateFlags nFldUpdFlag;
- std::set<SwRootFrm*> aAllLayouts = GetAllLayouts();//swmod 080320
- std::set<SwRootFrm*>::iterator pLayIter = aAllLayouts.begin();
- for ( ;pLayIter != aAllLayouts.end();++pLayIter )
- {
- if ((*pLayIter)->IsIdleFormat())
- {
- (*pLayIter)->GetCurrShell()->LayoutIdle();
- break;
- }
- }
- bool bAllValid = pLayIter == aAllLayouts.end() ? 1 : 0;
- if( bAllValid && ( AUTOUPD_FIELD_ONLY ==
- ( nFldUpdFlag = getFieldUpdateFlags(true) )
- || AUTOUPD_FIELD_AND_CHARTS == nFldUpdFlag ) &&
- GetUpdtFlds().IsFieldsDirty() &&
- !GetUpdtFlds().IsInUpdateFlds() &&
- !IsExpFldsLocked()
- // das umschalten der Feldname fuehrt zu keinem Update der
- // Felder, also der "Hintergrund-Update" immer erfolgen
- /* && !pStartSh->GetViewOptions()->IsFldName()*/ )
- {
- // chaos::Action-Klammerung!
- GetUpdtFlds().SetInUpdateFlds( sal_True );
-
- pTmpRoot->StartAllAction();
-
- // no jump on update of fields #i85168#
- const sal_Bool bOldLockView = pStartSh->IsViewLocked();
- pStartSh->LockView( sal_True );
-
- GetSysFldType( RES_CHAPTERFLD )->ModifyNotification( 0, 0 ); // KapitelFld
- UpdateExpFlds( 0, sal_False ); // Expression-Felder Updaten
- UpdateTblFlds(NULL); // Tabellen
- UpdateRefFlds(NULL); // Referenzen
-
- pTmpRoot->EndAllAction();
-
- pStartSh->LockView( bOldLockView );
-
- GetUpdtFlds().SetInUpdateFlds( sal_False );
- GetUpdtFlds().SetFieldsDirty( sal_False );
- }
- } //swmod 080219
-#ifdef TIMELOG
- if( pModLogFile && 1 != (long)pModLogFile )
- delete pModLogFile, ((long&)pModLogFile) = 1;
-#endif
- if( pTimer )
- pTimer->Start();
- return 0;
-}
-
-IMPL_STATIC_LINK( SwDoc, BackgroundDone, SvxBrushItem*, EMPTYARG )
-{
- ViewShell *pSh, *pStartSh;
- pSh = pStartSh = pThis->GetCurrentViewShell(); //swmod 071108//swmod 071225
- if( pStartSh )
- do {
- if( pSh->GetWin() )
- {
- //Fuer Repaint mir virtuellen Device sorgen.
- pSh->LockPaint();
- pSh->UnlockPaint( sal_True );
- }
- pSh = (ViewShell*)pSh->GetNext();
- } while( pSh != pStartSh );
- return 0;
-}
-
-static String lcl_GetUniqueFlyName( const SwDoc* pDoc, sal_uInt16 nDefStrId )
-{
- ResId aId( nDefStrId, *pSwResMgr );
- String aName( aId );
- xub_StrLen nNmLen = aName.Len();
-
- const SwSpzFrmFmts& rFmts = *pDoc->GetSpzFrmFmts();
-
- sal_uInt16 nNum, nTmp, nFlagSize = ( rFmts.Count() / 8 ) +2;
- sal_uInt8* pSetFlags = new sal_uInt8[ nFlagSize ];
- sal_uInt16 n;
-
- memset( pSetFlags, 0, nFlagSize );
-
- for( n = 0; n < rFmts.Count(); ++n )
- {
- const SwFrmFmt* pFlyFmt = rFmts[ n ];
- if( RES_FLYFRMFMT == pFlyFmt->Which() &&
- pFlyFmt->GetName().Match( aName ) == nNmLen )
- {
- // Nummer bestimmen und das Flag setzen
- nNum = static_cast< sal_uInt16 >( pFlyFmt->GetName().Copy( nNmLen ).ToInt32() );
- if( nNum-- && nNum < rFmts.Count() )
- pSetFlags[ nNum / 8 ] |= (0x01 << ( nNum & 0x07 ));
- }
- }
-
- // alle Nummern entsprechend geflag, also bestimme die richtige Nummer
- nNum = rFmts.Count();
- for( n = 0; n < nFlagSize; ++n )
- if( 0xff != ( nTmp = pSetFlags[ n ] ))
- {
- // also die Nummer bestimmen
- nNum = n * 8;
- while( nTmp & 1 )
- ++nNum, nTmp >>= 1;
- break;
- }
-
- delete [] pSetFlags;
- return aName += String::CreateFromInt32( ++nNum );
-}
-
-String SwDoc::GetUniqueGrfName() const
-{
- return lcl_GetUniqueFlyName( this, STR_GRAPHIC_DEFNAME );
-}
-
-String SwDoc::GetUniqueOLEName() const
-{
- return lcl_GetUniqueFlyName( this, STR_OBJECT_DEFNAME );
-}
-
-String SwDoc::GetUniqueFrameName() const
-{
- return lcl_GetUniqueFlyName( this, STR_FRAME_DEFNAME );
-}
-
-const SwFlyFrmFmt* SwDoc::FindFlyByName( const String& rName, sal_Int8 nNdTyp ) const
-{
- const SwSpzFrmFmts& rFmts = *GetSpzFrmFmts();
- for( sal_uInt16 n = rFmts.Count(); n; )
- {
- const SwFrmFmt* pFlyFmt = rFmts[ --n ];
- const SwNodeIndex* pIdx;
- if( RES_FLYFRMFMT == pFlyFmt->Which() && pFlyFmt->GetName() == rName &&
- 0 != ( pIdx = pFlyFmt->GetCntnt().GetCntntIdx() ) &&
- pIdx->GetNode().GetNodes().IsDocNodes() )
- {
- if( nNdTyp )
- {
- // dann noch auf den richtigen Node-Typ abfragen
- const SwNode* pNd = GetNodes()[ pIdx->GetIndex()+1 ];
- if( nNdTyp == ND_TEXTNODE
- ? !pNd->IsNoTxtNode()
- : nNdTyp == pNd->GetNodeType() )
- return (SwFlyFrmFmt*)pFlyFmt;
- }
- else
- return (SwFlyFrmFmt*)pFlyFmt;
- }
- }
- return 0;
-}
-
-void SwDoc::SetFlyName( SwFlyFrmFmt& rFmt, const String& rName )
-{
- String sName( rName );
- if( !rName.Len() || FindFlyByName( rName ) )
- {
- sal_uInt16 nTyp = STR_FRAME_DEFNAME;
- const SwNodeIndex* pIdx = rFmt.GetCntnt().GetCntntIdx();
- if( pIdx && pIdx->GetNode().GetNodes().IsDocNodes() )
- switch( GetNodes()[ pIdx->GetIndex() + 1 ]->GetNodeType() )
- {
- case ND_GRFNODE: nTyp = STR_GRAPHIC_DEFNAME; break;
- case ND_OLENODE: nTyp = STR_OBJECT_DEFNAME; break;
- }
- sName = lcl_GetUniqueFlyName( this, nTyp );
- }
- rFmt.SetName( sName, sal_True );
- SetModified();
-}
-
-void SwDoc::SetAllUniqueFlyNames()
-{
- sal_uInt16 n, nFlyNum = 0, nGrfNum = 0, nOLENum = 0;
-
- ResId nFrmId( STR_FRAME_DEFNAME, *pSwResMgr ),
- nGrfId( STR_GRAPHIC_DEFNAME, *pSwResMgr ),
- nOLEId( STR_OBJECT_DEFNAME, *pSwResMgr );
- String sFlyNm( nFrmId );
- String sGrfNm( nGrfId );
- String sOLENm( nOLEId );
-
- if( 255 < ( n = GetSpzFrmFmts()->Count() ))
- n = 255;
- SwSpzFrmFmts aArr( (sal_Int8)n, 10 );
- SwFrmFmtPtr pFlyFmt;
- sal_Bool bLoadedFlag = sal_True; // noch etwas fuers Layout
-
- for( n = GetSpzFrmFmts()->Count(); n; )
- {
- if( RES_FLYFRMFMT == (pFlyFmt = (*GetSpzFrmFmts())[ --n ])->Which() )
- {
- sal_uInt16 *pNum = 0;
- xub_StrLen nLen;
- const String& rNm = pFlyFmt->GetName();
- if( rNm.Len() )
- {
- if( rNm.Match( sGrfNm ) == ( nLen = sGrfNm.Len() ))
- pNum = &nGrfNum;
- else if( rNm.Match( sFlyNm ) == ( nLen = sFlyNm.Len() ))
- pNum = &nFlyNum;
- else if( rNm.Match( sOLENm ) == ( nLen = sOLENm.Len() ))
- pNum = &nOLENum;
-
- if ( pNum && *pNum < ( nLen = static_cast< xub_StrLen >( rNm.Copy( nLen ).ToInt32() ) ) )
- *pNum = nLen;
- }
- else
- // das wollen wir nachher setzen
- aArr.Insert( pFlyFmt, aArr.Count() );
-
- }
- if( bLoadedFlag )
- {
- const SwFmtAnchor& rAnchor = pFlyFmt->GetAnchor();
- if (((FLY_AT_PAGE == rAnchor.GetAnchorId()) &&
- rAnchor.GetCntntAnchor()) ||
- // oder werden DrawObjecte rel. zu irgendetwas ausgerichtet?
- ( RES_DRAWFRMFMT == pFlyFmt->Which() && (
- SFX_ITEM_SET == pFlyFmt->GetItemState(
- RES_VERT_ORIENT )||
- SFX_ITEM_SET == pFlyFmt->GetItemState(
- RES_HORI_ORIENT ))) )
- {
- bLoadedFlag = sal_False;
- }
- }
- }
-
- const SwNodeIndex* pIdx;
-
- for( n = aArr.Count(); n; )
- if( 0 != ( pIdx = ( pFlyFmt = aArr[ --n ])->GetCntnt().GetCntntIdx() )
- && pIdx->GetNode().GetNodes().IsDocNodes() )
- {
- sal_uInt16 nNum;
- String sNm;
- switch( GetNodes()[ pIdx->GetIndex() + 1 ]->GetNodeType() )
- {
- case ND_GRFNODE:
- sNm = sGrfNm;
- nNum = ++nGrfNum;
- break;
- case ND_OLENODE:
- sNm = sOLENm;
- nNum = ++nOLENum;
- break;
- default:
- sNm = sFlyNm;
- nNum = ++nFlyNum;
- break;
- }
- pFlyFmt->SetName( sNm += String::CreateFromInt32( nNum ));
- }
- aArr.Remove( 0, aArr.Count() );
-
- if( GetFtnIdxs().Count() )
- {
- SwTxtFtn::SetUniqueSeqRefNo( *this );
- // #i52775# Chapter footnotes did not
- // get updated correctly. Calling UpdateAllFtn() instead of
- // UpdateFtn() solves this problem, but I do not dare to
- // call UpdateAllFtn() in all cases: Safety first.
- if ( FTNNUM_CHAPTER == GetFtnInfo().eNum )
- {
- GetFtnIdxs().UpdateAllFtn();
- }
- else
- {
- SwNodeIndex aTmp( GetNodes() );
- GetFtnIdxs().UpdateFtn( aTmp );
- }
- }
-
- // neues Document und keine seitengebundenen Rahmen/DrawObjecte gefunden,
- // die an einem Node verankert sind.
- if( bLoadedFlag )
- SetLoaded( sal_True );
-}
-
-sal_Bool SwDoc::IsInHeaderFooter( const SwNodeIndex& rIdx ) const
-{
- // gibt es ein Layout, dann ueber das laufen!!
- // (Das kann dann auch Fly in Fly in Kopfzeile !)
- // MIB 9.2.98: Wird auch vom sw3io benutzt, um festzustellen, ob sich
- // ein Redline-Objekt in einer Kopf- oder Fusszeile befindet. Da
- // Redlines auch an Start- und Endnodes haengen, muss der Index nicht
- // unbedingt der eines Content-Nodes sein.
- SwNode* pNd = &rIdx.GetNode();
- if( pNd->IsCntntNode() && pCurrentView )//swmod 071029//swmod 071225
- {
- const SwFrm *pFrm = pNd->GetCntntNode()->getLayoutFrm( GetCurrentLayout() );
- if( pFrm )
- {
- const SwFrm *pUp = pFrm->GetUpper();
- while ( pUp && !pUp->IsHeaderFrm() && !pUp->IsFooterFrm() )
- {
- if ( pUp->IsFlyFrm() )
- pUp = ((SwFlyFrm*)pUp)->GetAnchorFrm();
- pUp = pUp->GetUpper();
- }
- if ( pUp )
- return sal_True;
-
- return sal_False;
- }
- }
-
-
- const SwNode* pFlyNd = pNd->FindFlyStartNode();
- while( pFlyNd )
- {
- // dann ueber den Anker nach oben "hangeln"
- sal_uInt16 n;
- for( n = 0; n < GetSpzFrmFmts()->Count(); ++n )
- {
- const SwFrmFmt* pFmt = (*GetSpzFrmFmts())[ n ];
- const SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
- if( pIdx && pFlyNd == &pIdx->GetNode() )
- {
- const SwFmtAnchor& rAnchor = pFmt->GetAnchor();
- if ((FLY_AT_PAGE == rAnchor.GetAnchorId()) ||
- !rAnchor.GetCntntAnchor() )
- {
- return sal_False;
- }
-
- pNd = &rAnchor.GetCntntAnchor()->nNode.GetNode();
- pFlyNd = pNd->FindFlyStartNode();
- break;
- }
- }
- if( n >= GetSpzFrmFmts()->Count() )
- {
- OSL_ENSURE( mbInReading, "Fly-Section aber kein Format gefunden" );
- return sal_False;
- }
- }
-
- return 0 != pNd->FindHeaderStartNode() ||
- 0 != pNd->FindFooterStartNode();
-}
-
-short SwDoc::GetTextDirection( const SwPosition& rPos,
- const Point* pPt ) const
-{
- short nRet = -1;
-
- SwCntntNode *pNd = rPos.nNode.GetNode().GetCntntNode();
-
- // #i42921# - use new method <SwCntntNode::GetTextDirection(..)>
- if ( pNd )
- {
- nRet = pNd->GetTextDirection( rPos, pPt );
- }
- if ( nRet == -1 )
- {
- const SvxFrameDirectionItem* pItem = 0;
- if( pNd )
- {
- // in a flyframe? Then look at that for the correct attribute
- const SwFrmFmt* pFlyFmt = pNd->GetFlyFmt();
- while( pFlyFmt )
- {
- pItem = &pFlyFmt->GetFrmDir();
- if( FRMDIR_ENVIRONMENT == pItem->GetValue() )
- {
- pItem = 0;
- const SwFmtAnchor* pAnchor = &pFlyFmt->GetAnchor();
- if ((FLY_AT_PAGE != pAnchor->GetAnchorId()) &&
- pAnchor->GetCntntAnchor())
- {
- pFlyFmt = pAnchor->GetCntntAnchor()->nNode.
- GetNode().GetFlyFmt();
- }
- else
- pFlyFmt = 0;
- }
- else
- pFlyFmt = 0;
- }
-
- if( !pItem )
- {
- const SwPageDesc* pPgDsc = pNd->FindPageDesc( sal_False );
- if( pPgDsc )
- pItem = &pPgDsc->GetMaster().GetFrmDir();
- }
- }
- if( !pItem )
- pItem = (SvxFrameDirectionItem*)&GetAttrPool().GetDefaultItem(
- RES_FRAMEDIR );
- nRet = pItem->GetValue();
- }
- return nRet;
-}
-
-sal_Bool SwDoc::IsInVerticalText( const SwPosition& rPos, const Point* pPt ) const
-{
- const short nDir = GetTextDirection( rPos, pPt );
- return FRMDIR_VERT_TOP_RIGHT == nDir || FRMDIR_VERT_TOP_LEFT == nDir;
-}
-
-void SwDoc::SetCurrentViewShell( ViewShell* pNew )
-{
- pCurrentView = pNew;
-}
-
-SwLayouter* SwDoc::GetLayouter()
-{
- return pLayouter;
-}
-
-const SwLayouter* SwDoc::GetLayouter() const
-{
- return pLayouter;
-}
-
-void SwDoc::SetLayouter( SwLayouter* pNew )
-{
- pLayouter = pNew;
-}
-
-const ViewShell *SwDoc::GetCurrentViewShell() const
-{
- return pCurrentView;
-}
-
-ViewShell *SwDoc::GetCurrentViewShell()
-{
- return pCurrentView;
-} //swmod 080219 It must be able to communicate to a ViewShell.This is going to be removedd later.
-
-const SwRootFrm *SwDoc::GetCurrentLayout() const
-{
- if(GetCurrentViewShell())
- return GetCurrentViewShell()->GetLayout();
- return 0;
-}
-
-SwRootFrm *SwDoc::GetCurrentLayout()
-{
- if(GetCurrentViewShell())
- return GetCurrentViewShell()->GetLayout();
- return 0;
-}
-
-bool SwDoc::HasLayout() const
-{
- // if there is a view, there is always a layout
- return (pCurrentView != 0);
-}
-
-std::set<SwRootFrm*> SwDoc::GetAllLayouts()
-{
- std::set<SwRootFrm*> aAllLayouts;
- ViewShell *pStart = GetCurrentViewShell();
- ViewShell *pTemp = pStart;
- if ( pTemp )
- {
- do
- {
- if (pTemp->GetLayout())
- {
- aAllLayouts.insert(pTemp->GetLayout());
- pTemp = (ViewShell*)pTemp->GetNext();
- }
- } while(pTemp!=pStart);
- }
-
- return aAllLayouts;
-}//swmod 070825
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */