xref: /AOO41X/main/sw/source/core/doc/doclay.cxx (revision 5222b95b3ede3af7a8a07cdec672334a798315fa)
1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5efeef26fSAndrew Rist  * distributed with this work for additional information
6efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17efeef26fSAndrew Rist  * specific language governing permissions and limitations
18efeef26fSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20efeef26fSAndrew Rist  *************************************************************/
21efeef26fSAndrew Rist 
22efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <unotools/linguprops.hxx>
28cdf0e10cSrcweir #include <unotools/lingucfg.hxx>
29cdf0e10cSrcweir #include <com/sun/star/embed/EmbedStates.hpp>
30cdf0e10cSrcweir #include <hintids.hxx>
31cdf0e10cSrcweir #include <com/sun/star/util/XCloseable.hpp>
32cdf0e10cSrcweir #include <sfx2/progress.hxx>
33cdf0e10cSrcweir #include <svx/svdmodel.hxx>
34cdf0e10cSrcweir #include <svx/svdpage.hxx>
35cdf0e10cSrcweir #include <editeng/keepitem.hxx>
36cdf0e10cSrcweir #include <editeng/ulspitem.hxx>
37cdf0e10cSrcweir #include <editeng/lrspitem.hxx>
38cdf0e10cSrcweir #include <editeng/boxitem.hxx>
39cdf0e10cSrcweir #include <editeng/shaditem.hxx>
40cdf0e10cSrcweir #include <editeng/protitem.hxx>
41cdf0e10cSrcweir #include <editeng/opaqitem.hxx>
42cdf0e10cSrcweir #include <editeng/prntitem.hxx>
43cdf0e10cSrcweir #include <svx/fmglob.hxx>
44cdf0e10cSrcweir #include <svx/svdouno.hxx>
45cdf0e10cSrcweir #include <svx/fmpage.hxx>
46cdf0e10cSrcweir #include <editeng/frmdiritem.hxx>
47cdf0e10cSrcweir 
48cdf0e10cSrcweir #include <swmodule.hxx>
49cdf0e10cSrcweir #include <modcfg.hxx>
50cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
51cdf0e10cSrcweir #include <rtl/logfile.hxx>
52cdf0e10cSrcweir #include <SwStyleNameMapper.hxx>
53cdf0e10cSrcweir #include <fchrfmt.hxx>
54cdf0e10cSrcweir #include <errhdl.hxx>
55cdf0e10cSrcweir #include <frmatr.hxx>
56cdf0e10cSrcweir #include <txatbase.hxx>
57cdf0e10cSrcweir #include <fmtfld.hxx>
58cdf0e10cSrcweir #include <fmtornt.hxx>
59cdf0e10cSrcweir #include <fmtcntnt.hxx>
60cdf0e10cSrcweir #include <fmtanchr.hxx>
61cdf0e10cSrcweir #include <fmtfsize.hxx>
62cdf0e10cSrcweir #include <fmtsrnd.hxx>
63cdf0e10cSrcweir #include <fmtflcnt.hxx>
64cdf0e10cSrcweir #include <fmtcnct.hxx>
65cdf0e10cSrcweir #include <frmfmt.hxx>
66cdf0e10cSrcweir #include <dcontact.hxx>
67cdf0e10cSrcweir #include <txtflcnt.hxx>
68cdf0e10cSrcweir #include <docfld.hxx>   // fuer Expression-Felder
69cdf0e10cSrcweir #include <pam.hxx>
70cdf0e10cSrcweir #include <ndtxt.hxx>
71cdf0e10cSrcweir #include <ndnotxt.hxx>
72cdf0e10cSrcweir #include <ndole.hxx>
73cdf0e10cSrcweir #include <doc.hxx>
74cdf0e10cSrcweir #include <IDocumentUndoRedo.hxx>
75cdf0e10cSrcweir #include <rootfrm.hxx>
76cdf0e10cSrcweir #include <pagefrm.hxx>
77cdf0e10cSrcweir #include <cntfrm.hxx>
78cdf0e10cSrcweir #include <flyfrm.hxx>
79cdf0e10cSrcweir #include <fesh.hxx>
80cdf0e10cSrcweir #include <docsh.hxx>
81cdf0e10cSrcweir #include <dflyobj.hxx>
82cdf0e10cSrcweir #include <dcontact.hxx>
83cdf0e10cSrcweir #include <swundo.hxx>
84cdf0e10cSrcweir #include <flypos.hxx>
85cdf0e10cSrcweir #include <UndoInsert.hxx>
86cdf0e10cSrcweir #include <expfld.hxx>		// InsertLabel
87cdf0e10cSrcweir #include <poolfmt.hxx>		// PoolVorlagen-Id's
88cdf0e10cSrcweir #include <docary.hxx>
89cdf0e10cSrcweir #include <swtable.hxx>
90cdf0e10cSrcweir #include <tblsel.hxx>
91cdf0e10cSrcweir #include <viewopt.hxx>
92cdf0e10cSrcweir #include <fldupde.hxx>
93cdf0e10cSrcweir #include <txtftn.hxx>
94cdf0e10cSrcweir #include <ftnidx.hxx>
95cdf0e10cSrcweir #include <ftninfo.hxx>
96cdf0e10cSrcweir #include <pagedesc.hxx>
97cdf0e10cSrcweir #include <PostItMgr.hxx>
98cdf0e10cSrcweir #include <comcore.hrc>		// STR-ResId's
99cdf0e10cSrcweir 
100cdf0e10cSrcweir // #i11176#
101cdf0e10cSrcweir #include <unoframe.hxx>
102cdf0e10cSrcweir // OD 2004-05-24 #i28701#
103cdf0e10cSrcweir #include <sortedobjs.hxx>
104cdf0e10cSrcweir 
105cdf0e10cSrcweir // --> OD 2004-07-26 #i32089#
106cdf0e10cSrcweir #include <vector>
107cdf0e10cSrcweir // <--
108cdf0e10cSrcweir 
109cdf0e10cSrcweir using namespace ::com::sun::star;
110cdf0e10cSrcweir using ::rtl::OUString;
111cdf0e10cSrcweir 
112cdf0e10cSrcweir #define DEF_FLY_WIDTH	 2268	//Defaultbreite fuer FlyFrms	(2268 == 4cm)
113cdf0e10cSrcweir 
114cdf0e10cSrcweir /* #109161# */
lcl_IsItemSet(const SwCntntNode & rNode,sal_uInt16 which)115cdf0e10cSrcweir static bool lcl_IsItemSet(const SwCntntNode & rNode, sal_uInt16 which)
116cdf0e10cSrcweir {
117cdf0e10cSrcweir     bool bResult = false;
118cdf0e10cSrcweir 
119cdf0e10cSrcweir     if (SFX_ITEM_SET == rNode.GetSwAttrSet().GetItemState(which))
120cdf0e10cSrcweir         bResult = true;
121cdf0e10cSrcweir 
122cdf0e10cSrcweir     return bResult;
123cdf0e10cSrcweir }
124cdf0e10cSrcweir 
125cdf0e10cSrcweir /*************************************************************************
126cdf0e10cSrcweir |*
127cdf0e10cSrcweir |*	SwDoc::MakeLayoutFmt()
128cdf0e10cSrcweir |*
129cdf0e10cSrcweir |*	Beschreibung		Erzeugt ein neues Format das in seinen Einstellungen
130cdf0e10cSrcweir |* 		Defaultmaessig zu dem Request passt. Das Format wird in das
131cdf0e10cSrcweir |* 		entsprechende Formate-Array gestellt.
132cdf0e10cSrcweir |* 		Wenn bereits ein passendes Format existiert, so wird dies
133cdf0e10cSrcweir |* 		zurueckgeliefert.
134cdf0e10cSrcweir |*	Ersterstellung		MA 22. Sep. 92
135cdf0e10cSrcweir |*	Letzte Aenderung	JP 08.05.98
136cdf0e10cSrcweir |*
137cdf0e10cSrcweir |*************************************************************************/
138cdf0e10cSrcweir 
MakeLayoutFmt(RndStdIds eRequest,const SfxItemSet * pSet)139cdf0e10cSrcweir SwFrmFmt *SwDoc::MakeLayoutFmt( RndStdIds eRequest, const SfxItemSet* pSet )
140cdf0e10cSrcweir {
141cdf0e10cSrcweir 	SwFrmFmt *pFmt = 0;
142cdf0e10cSrcweir 	const sal_Bool bMod = IsModified();
143cdf0e10cSrcweir 	sal_Bool bHeader = sal_False;
144cdf0e10cSrcweir 
145cdf0e10cSrcweir 	switch ( eRequest )
146cdf0e10cSrcweir 	{
147cdf0e10cSrcweir 	case RND_STD_HEADER:
148cdf0e10cSrcweir 	case RND_STD_HEADERL:
149cdf0e10cSrcweir 	case RND_STD_HEADERR:
150cdf0e10cSrcweir 		{
151cdf0e10cSrcweir 			bHeader = sal_True;
152cdf0e10cSrcweir 			// kein break, es geht unten weiter
153cdf0e10cSrcweir 		}
154cdf0e10cSrcweir 	case RND_STD_FOOTER:
155cdf0e10cSrcweir 	case RND_STD_FOOTERL:
156cdf0e10cSrcweir 	case RND_STD_FOOTERR:
157cdf0e10cSrcweir 		{
158cdf0e10cSrcweir             pFmt = new SwFrmFmt( GetAttrPool(),
159cdf0e10cSrcweir                                  (bHeader ? "Header" : "Footer"),
160cdf0e10cSrcweir                                  GetDfltFrmFmt() );
161cdf0e10cSrcweir 
162cdf0e10cSrcweir 			SwNodeIndex aTmpIdx( GetNodes().GetEndOfAutotext() );
163cdf0e10cSrcweir 			SwStartNode* pSttNd =
164cdf0e10cSrcweir                 GetNodes().MakeTextSection
165cdf0e10cSrcweir                 ( aTmpIdx,
166cdf0e10cSrcweir                   bHeader ? SwHeaderStartNode : SwFooterStartNode,
167cdf0e10cSrcweir                   GetTxtCollFromPool(static_cast<sal_uInt16>( bHeader
168cdf0e10cSrcweir                                      ? ( eRequest == RND_STD_HEADERL
169cdf0e10cSrcweir                                          ? RES_POOLCOLL_HEADERL
170cdf0e10cSrcweir                                          : eRequest == RND_STD_HEADERR
171cdf0e10cSrcweir                                          ? RES_POOLCOLL_HEADERR
172cdf0e10cSrcweir                                          : RES_POOLCOLL_HEADER )
173cdf0e10cSrcweir                                      : ( eRequest == RND_STD_FOOTERL
174cdf0e10cSrcweir                                          ? RES_POOLCOLL_FOOTERL
175cdf0e10cSrcweir                                          : eRequest == RND_STD_FOOTERR
176cdf0e10cSrcweir                                          ? RES_POOLCOLL_FOOTERR
177cdf0e10cSrcweir                                          : RES_POOLCOLL_FOOTER )
178cdf0e10cSrcweir                                      ) ) );
179cdf0e10cSrcweir             pFmt->SetFmtAttr( SwFmtCntnt( pSttNd ));
180cdf0e10cSrcweir 
181cdf0e10cSrcweir 			if( pSet )		// noch ein paar Attribute setzen ?
182cdf0e10cSrcweir                 pFmt->SetFmtAttr( *pSet );
183cdf0e10cSrcweir 
184cdf0e10cSrcweir             // JP: warum zuruecksetzen ???	Doc. ist doch veraendert ???
185cdf0e10cSrcweir             // bei den Fly auf jedenfall verkehrt !!
186cdf0e10cSrcweir 			if ( !bMod )
187cdf0e10cSrcweir 				ResetModified();
188cdf0e10cSrcweir 		}
189cdf0e10cSrcweir 		break;
190cdf0e10cSrcweir 
191cdf0e10cSrcweir 	case RND_DRAW_OBJECT:
192cdf0e10cSrcweir 		{
193cdf0e10cSrcweir 			pFmt = MakeDrawFrmFmt( aEmptyStr, GetDfltFrmFmt() );
194cdf0e10cSrcweir 			if( pSet )		// noch ein paar Attribute setzen ?
195cdf0e10cSrcweir                 pFmt->SetFmtAttr( *pSet );
196cdf0e10cSrcweir 
197cdf0e10cSrcweir             if (GetIDocumentUndoRedo().DoesUndo())
198cdf0e10cSrcweir             {
199cdf0e10cSrcweir                 GetIDocumentUndoRedo().AppendUndo(
200cdf0e10cSrcweir                     new SwUndoInsLayFmt(pFmt, 0, 0));
201cdf0e10cSrcweir             }
202cdf0e10cSrcweir         }
203cdf0e10cSrcweir 		break;
204cdf0e10cSrcweir 
205cdf0e10cSrcweir #ifdef DBG_UTIL
206cdf0e10cSrcweir     case FLY_AT_PAGE:
207cdf0e10cSrcweir     case FLY_AT_CHAR:
208cdf0e10cSrcweir     case FLY_AT_FLY:
209cdf0e10cSrcweir     case FLY_AT_PARA:
210cdf0e10cSrcweir     case FLY_AS_CHAR:
211cdf0e10cSrcweir         ASSERT( false, "use new interface instead: SwDoc::MakeFlySection!" );
212cdf0e10cSrcweir         break;
213cdf0e10cSrcweir #endif
214cdf0e10cSrcweir 
215cdf0e10cSrcweir 	default:
216cdf0e10cSrcweir 		ASSERT( !this,
217cdf0e10cSrcweir 				"Layoutformat mit ungueltigem Request angefordert." );
218cdf0e10cSrcweir 
219cdf0e10cSrcweir 	}
220cdf0e10cSrcweir 	return pFmt;
221cdf0e10cSrcweir }
222cdf0e10cSrcweir /*************************************************************************
223cdf0e10cSrcweir |*
224cdf0e10cSrcweir |*	SwDoc::DelLayoutFmt()
225cdf0e10cSrcweir |*
226cdf0e10cSrcweir |*	Beschreibung		Loescht das angegebene Format, der Inhalt wird mit
227cdf0e10cSrcweir |* 		geloescht.
228cdf0e10cSrcweir |*	Ersterstellung		MA 23. Sep. 92
229cdf0e10cSrcweir |*	Letzte Aenderung	MA 05. Feb. 93
230cdf0e10cSrcweir |*
231cdf0e10cSrcweir |*************************************************************************/
232cdf0e10cSrcweir 
DelLayoutFmt(SwFrmFmt * pFmt)233cdf0e10cSrcweir void SwDoc::DelLayoutFmt( SwFrmFmt *pFmt )
234cdf0e10cSrcweir {
235cdf0e10cSrcweir 	//Verkettung von Rahmen muss ggf. zusammengefuehrt werden.
236cdf0e10cSrcweir 	//Bevor die Frames vernichtet werden, damit die Inhalte der Rahmen
237cdf0e10cSrcweir 	//ggf. entsprechend gerichtet werden.
238cdf0e10cSrcweir 	const SwFmtChain &rChain = pFmt->GetChain();
239cdf0e10cSrcweir 	if ( rChain.GetPrev() )
240cdf0e10cSrcweir 	{
241cdf0e10cSrcweir 		SwFmtChain aChain( rChain.GetPrev()->GetChain() );
242cdf0e10cSrcweir 		aChain.SetNext( rChain.GetNext() );
243cdf0e10cSrcweir 		SetAttr( aChain, *rChain.GetPrev() );
244cdf0e10cSrcweir 	}
245cdf0e10cSrcweir 	if ( rChain.GetNext() )
246cdf0e10cSrcweir 	{
247cdf0e10cSrcweir 		SwFmtChain aChain( rChain.GetNext()->GetChain() );
248cdf0e10cSrcweir 		aChain.SetPrev( rChain.GetPrev() );
249cdf0e10cSrcweir 		SetAttr( aChain, *rChain.GetNext() );
250cdf0e10cSrcweir 	}
251cdf0e10cSrcweir 
252cdf0e10cSrcweir 	const SwNodeIndex* pCntIdx = pFmt->GetCntnt().GetCntntIdx();
253cdf0e10cSrcweir     if (pCntIdx && !GetIDocumentUndoRedo().DoesUndo())
254cdf0e10cSrcweir     {
255cdf0e10cSrcweir 		//Verbindung abbauen, falls es sich um ein OLE-Objekt handelt.
256cdf0e10cSrcweir 		SwOLENode* pOLENd = GetNodes()[ pCntIdx->GetIndex()+1 ]->GetOLENode();
257cdf0e10cSrcweir 		if( pOLENd && pOLENd->GetOLEObj().IsOleRef() )
258cdf0e10cSrcweir 		{
259cdf0e10cSrcweir             /*
260cdf0e10cSrcweir 			SwDoc* pDoc = (SwDoc*)pFmt->GetDoc();
261cdf0e10cSrcweir 			if( pDoc )
262cdf0e10cSrcweir 			{
263cdf0e10cSrcweir                 SfxObjectShell* p = pDoc->GetPersist();
264cdf0e10cSrcweir 				if( p )		// muss da sein
265cdf0e10cSrcweir 				{
266cdf0e10cSrcweir 					SvInfoObjectRef aRef( p->Find( pOLENd->GetOLEObj().GetName() ) );
267cdf0e10cSrcweir 					if( aRef.Is() )
268cdf0e10cSrcweir 						aRef->SetObj(0);
269cdf0e10cSrcweir 				}
270cdf0e10cSrcweir             } */
271cdf0e10cSrcweir 
272cdf0e10cSrcweir             // TODO/MBA: the old object closed the object, cleared all references to it, but didn't remove it from the container.
273cdf0e10cSrcweir             // I have no idea, why, nobody could explain it - so I do my very best to mimic this behavior
274cdf0e10cSrcweir             //uno::Reference < util::XCloseable > xClose( pOLENd->GetOLEObj().GetOleRef(), uno::UNO_QUERY );
275cdf0e10cSrcweir             //if ( xClose.is() )
276cdf0e10cSrcweir             {
277cdf0e10cSrcweir                 try
278cdf0e10cSrcweir                 {
279cdf0e10cSrcweir                     pOLENd->GetOLEObj().GetOleRef()->changeState( embed::EmbedStates::LOADED );
280cdf0e10cSrcweir                 }
281cdf0e10cSrcweir                 catch ( uno::Exception& )
282cdf0e10cSrcweir                 {
283cdf0e10cSrcweir                 }
284cdf0e10cSrcweir             }
285cdf0e10cSrcweir 
286cdf0e10cSrcweir             //pOLENd->GetOLEObj().GetOleRef() = 0;
287cdf0e10cSrcweir 		}
288cdf0e10cSrcweir 	}
289cdf0e10cSrcweir 
290cdf0e10cSrcweir 	//Frms vernichten.
291cdf0e10cSrcweir 	pFmt->DelFrms();
292cdf0e10cSrcweir 
293cdf0e10cSrcweir 	// erstmal sind nur Fly's Undofaehig
294cdf0e10cSrcweir 	const sal_uInt16 nWh = pFmt->Which();
295cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo() &&
296cdf0e10cSrcweir         (RES_FLYFRMFMT == nWh || RES_DRAWFRMFMT == nWh))
297cdf0e10cSrcweir     {
298cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo( new SwUndoDelLayFmt( pFmt ));
299cdf0e10cSrcweir     }
300cdf0e10cSrcweir     else
301cdf0e10cSrcweir     {
302cdf0e10cSrcweir         // --> OD 2004-07-26 #i32089# - delete at-frame anchored objects
303cdf0e10cSrcweir         if ( nWh == RES_FLYFRMFMT )
304cdf0e10cSrcweir         {
305cdf0e10cSrcweir             // determine frame formats of at-frame anchored objects
306cdf0e10cSrcweir             const SwNodeIndex* pCntntIdx = pFmt->GetCntnt().GetCntntIdx();
307cdf0e10cSrcweir             if ( pCntntIdx )
308cdf0e10cSrcweir             {
309cdf0e10cSrcweir                 const SwSpzFrmFmts* pTbl = pFmt->GetDoc()->GetSpzFrmFmts();
310cdf0e10cSrcweir                 if ( pTbl )
311cdf0e10cSrcweir                 {
312cdf0e10cSrcweir                     std::vector<SwFrmFmt*> aToDeleteFrmFmts;
313cdf0e10cSrcweir                     const sal_uLong nNodeIdxOfFlyFmt( pCntntIdx->GetIndex() );
314cdf0e10cSrcweir 
315cdf0e10cSrcweir                     for ( sal_uInt16 i = 0; i < pTbl->Count(); ++i )
316cdf0e10cSrcweir                     {
317cdf0e10cSrcweir                         SwFrmFmt* pTmpFmt = (*pTbl)[i];
318cdf0e10cSrcweir                         const SwFmtAnchor &rAnch = pTmpFmt->GetAnchor();
319cdf0e10cSrcweir                         if ( rAnch.GetAnchorId() == FLY_AT_FLY &&
320cdf0e10cSrcweir                              rAnch.GetCntntAnchor()->nNode.GetIndex() == nNodeIdxOfFlyFmt )
321cdf0e10cSrcweir                         {
322cdf0e10cSrcweir                             aToDeleteFrmFmts.push_back( pTmpFmt );
323cdf0e10cSrcweir                         }
324cdf0e10cSrcweir                     }
325cdf0e10cSrcweir 
326cdf0e10cSrcweir                     // delete found frame formats
327cdf0e10cSrcweir                     while ( !aToDeleteFrmFmts.empty() )
328cdf0e10cSrcweir                     {
329cdf0e10cSrcweir                         SwFrmFmt* pTmpFmt = aToDeleteFrmFmts.back();
330cdf0e10cSrcweir                         pFmt->GetDoc()->DelLayoutFmt( pTmpFmt );
331cdf0e10cSrcweir 
332cdf0e10cSrcweir                         aToDeleteFrmFmts.pop_back();
333cdf0e10cSrcweir                     }
334cdf0e10cSrcweir                 }
335cdf0e10cSrcweir             }
336cdf0e10cSrcweir         }
337cdf0e10cSrcweir         // <--
338cdf0e10cSrcweir 
339cdf0e10cSrcweir 		//Inhalt Loeschen.
340cdf0e10cSrcweir 		if( pCntIdx )
341cdf0e10cSrcweir 		{
342cdf0e10cSrcweir 			SwNode *pNode = &pCntIdx->GetNode();
343cdf0e10cSrcweir             ((SwFmtCntnt&)pFmt->GetFmtAttr( RES_CNTNT )).SetNewCntntIdx( 0 );
344cdf0e10cSrcweir 			DeleteSection( pNode );
345cdf0e10cSrcweir 		}
346cdf0e10cSrcweir 
347cdf0e10cSrcweir 		// ggfs. bei Zeichengebundenen Flys das Zeichen loeschen
348cdf0e10cSrcweir 		const SwFmtAnchor& rAnchor = pFmt->GetAnchor();
349cdf0e10cSrcweir         if ((FLY_AS_CHAR == rAnchor.GetAnchorId()) && rAnchor.GetCntntAnchor())
350cdf0e10cSrcweir         {
351cdf0e10cSrcweir 			const SwPosition* pPos = rAnchor.GetCntntAnchor();
352cdf0e10cSrcweir 			SwTxtNode *pTxtNd = pPos->nNode.GetNode().GetTxtNode();
353cdf0e10cSrcweir 
354cdf0e10cSrcweir             // attribute is still in text node, delete it
355cdf0e10cSrcweir             if ( pTxtNd )
356cdf0e10cSrcweir             {
357cdf0e10cSrcweir                 SwTxtFlyCnt* const pAttr = static_cast<SwTxtFlyCnt*>(
358cdf0e10cSrcweir                     pTxtNd->GetTxtAttrForCharAt( pPos->nContent.GetIndex(),
359cdf0e10cSrcweir                         RES_TXTATR_FLYCNT ));
360cdf0e10cSrcweir                 if ( pAttr && (pAttr->GetFlyCnt().GetFrmFmt() == pFmt) )
361cdf0e10cSrcweir                 {
362cdf0e10cSrcweir                     // dont delete, set pointer to 0
363cdf0e10cSrcweir                     const_cast<SwFmtFlyCnt&>(pAttr->GetFlyCnt()).SetFlyFmt();
364cdf0e10cSrcweir                     SwIndex aIdx( pPos->nContent );
365cdf0e10cSrcweir                     pTxtNd->EraseText( aIdx, 1 );
366cdf0e10cSrcweir                 }
367cdf0e10cSrcweir             }
368cdf0e10cSrcweir         }
369cdf0e10cSrcweir 
370cdf0e10cSrcweir 		DelFrmFmt( pFmt );
371cdf0e10cSrcweir 	}
372cdf0e10cSrcweir 	SetModified();
373cdf0e10cSrcweir }
374cdf0e10cSrcweir 
375cdf0e10cSrcweir /*************************************************************************
376cdf0e10cSrcweir |*
377cdf0e10cSrcweir |*	SwDoc::CopyLayoutFmt()
378cdf0e10cSrcweir |*
379cdf0e10cSrcweir |*	Beschreibung		Kopiert das angegebene Format pSrc in pDest und
380cdf0e10cSrcweir |*						returnt pDest. Wenn es noch kein pDest gibt, wird
381cdf0e10cSrcweir |*						eins angelegt.
382cdf0e10cSrcweir |*						JP: steht das Source Format in einem anderen
383cdf0e10cSrcweir |*							Dokument, so kopiere auch dann noch richtig !!
384cdf0e10cSrcweir |*							Vom chaos::Anchor-Attribut wird die Position immer
385cdf0e10cSrcweir |*							auf 0 gesetzt !!!
386cdf0e10cSrcweir |*
387cdf0e10cSrcweir |*	Ersterstellung		BP 18.12.92
388cdf0e10cSrcweir |*	Letzte Aenderung	MA 17. Jul. 96
389cdf0e10cSrcweir |*
390cdf0e10cSrcweir |*************************************************************************/
391cdf0e10cSrcweir 
CopyLayoutFmt(const SwFrmFmt & rSource,const SwFmtAnchor & rNewAnchor,bool bSetTxtFlyAtt,bool bMakeFrms)392dec99bbdSOliver-Rainer Wittmann SwFrmFmt *SwDoc::CopyLayoutFmt(
393dec99bbdSOliver-Rainer Wittmann     const SwFrmFmt& rSource,
394cdf0e10cSrcweir     const SwFmtAnchor& rNewAnchor,
395dec99bbdSOliver-Rainer Wittmann     bool bSetTxtFlyAtt,
396dec99bbdSOliver-Rainer Wittmann     bool bMakeFrms )
397cdf0e10cSrcweir {
398cdf0e10cSrcweir     const bool bFly = RES_FLYFRMFMT == rSource.Which();
399cdf0e10cSrcweir     const bool bDraw = RES_DRAWFRMFMT == rSource.Which();
400cdf0e10cSrcweir     ASSERT( bFly || bDraw, "this method only works for fly or draw" );
401cdf0e10cSrcweir 
402cdf0e10cSrcweir 	SwDoc* pSrcDoc = (SwDoc*)rSource.GetDoc();
403cdf0e10cSrcweir 
404cdf0e10cSrcweir     // #108784# may we copy this object?
405cdf0e10cSrcweir     // We may, unless it's 1) it's a control (and therfore a draw)
406cdf0e10cSrcweir     //                     2) anchored in a header/footer
407cdf0e10cSrcweir     //                     3) anchored (to paragraph?)
408cdf0e10cSrcweir     bool bMayNotCopy = false;
409cdf0e10cSrcweir     if( bDraw )
410cdf0e10cSrcweir     {
411cdf0e10cSrcweir         const SwDrawContact* pDrawContact =
412cdf0e10cSrcweir             static_cast<const SwDrawContact*>( rSource.FindContactObj() );
413cdf0e10cSrcweir 
414cdf0e10cSrcweir         bMayNotCopy =
415cdf0e10cSrcweir             ((FLY_AT_PARA == rNewAnchor.GetAnchorId()) ||
416cdf0e10cSrcweir              (FLY_AT_FLY  == rNewAnchor.GetAnchorId()) ||
417cdf0e10cSrcweir              (FLY_AT_CHAR == rNewAnchor.GetAnchorId())) &&
418cdf0e10cSrcweir             rNewAnchor.GetCntntAnchor() &&
419cdf0e10cSrcweir             IsInHeaderFooter( rNewAnchor.GetCntntAnchor()->nNode ) &&
420cdf0e10cSrcweir             pDrawContact != NULL  &&
421cdf0e10cSrcweir             pDrawContact->GetMaster() != NULL  &&
422cdf0e10cSrcweir             CheckControlLayer( pDrawContact->GetMaster() );
423cdf0e10cSrcweir     }
424cdf0e10cSrcweir 
425cdf0e10cSrcweir     // just return if we can't copy this
426cdf0e10cSrcweir     if( bMayNotCopy )
427cdf0e10cSrcweir         return NULL;
428cdf0e10cSrcweir 
429cdf0e10cSrcweir 	SwFrmFmt* pDest = GetDfltFrmFmt();
430cdf0e10cSrcweir 	if( rSource.GetRegisteredIn() != pSrcDoc->GetDfltFrmFmt() )
431cdf0e10cSrcweir 		pDest = CopyFrmFmt( *(SwFrmFmt*)rSource.GetRegisteredIn() );
432cdf0e10cSrcweir 	if( bFly )
433cdf0e10cSrcweir 	{
434cdf0e10cSrcweir 		// #i11176#
435cdf0e10cSrcweir 		// To do a correct cloning concerning the ZOrder for all objects
436cdf0e10cSrcweir 		// it is necessary to actually create a draw object for fly frames, too.
437cdf0e10cSrcweir 		// These are then added to the DrawingLayer (which needs to exist).
438cdf0e10cSrcweir 		// Together with correct sorting of all drawinglayer based objects
439cdf0e10cSrcweir 		// before cloning ZOrder transfer works correctly then.
440cdf0e10cSrcweir 		SwFlyFrmFmt *pFormat = MakeFlyFrmFmt( rSource.GetName(), pDest );
441cdf0e10cSrcweir 		pDest = pFormat;
442cdf0e10cSrcweir 
443cdf0e10cSrcweir 		SwXFrame::GetOrCreateSdrObject(pFormat);
444cdf0e10cSrcweir 	}
445cdf0e10cSrcweir 	else
446cdf0e10cSrcweir 		pDest = MakeDrawFrmFmt( aEmptyStr, pDest );
447cdf0e10cSrcweir 
448cdf0e10cSrcweir 	// alle anderen/neue Attribute kopieren.
449cdf0e10cSrcweir 	pDest->CopyAttrs( rSource );
450cdf0e10cSrcweir 
451cdf0e10cSrcweir 	//Chains werden nicht kopiert.
452cdf0e10cSrcweir     pDest->ResetFmtAttr( RES_CHAIN );
453cdf0e10cSrcweir 
454cdf0e10cSrcweir 	if( bFly )
455cdf0e10cSrcweir 	{
456cdf0e10cSrcweir 		//Der Inhalt wird dupliziert.
457cdf0e10cSrcweir 		const SwNode& rCSttNd = rSource.GetCntnt().GetCntntIdx()->GetNode();
458cdf0e10cSrcweir 		SwNodeRange aRg( rCSttNd, 1, *rCSttNd.EndOfSectionNode() );
459cdf0e10cSrcweir 
460cdf0e10cSrcweir 		SwNodeIndex aIdx( GetNodes().GetEndOfAutotext() );
461cdf0e10cSrcweir 		SwStartNode* pSttNd = GetNodes().MakeEmptySection( aIdx, SwFlyStartNode );
462cdf0e10cSrcweir 
463cdf0e10cSrcweir 		// erst den chaos::Anchor/CntntIndex setzen, innerhalb des Kopierens
464cdf0e10cSrcweir 		// auf die Werte zugegriffen werden kann (DrawFmt in Kopf-/Fusszeilen)
465cdf0e10cSrcweir 		aIdx = *pSttNd;
466cdf0e10cSrcweir 		SwFmtCntnt aAttr( rSource.GetCntnt() );
467cdf0e10cSrcweir 		aAttr.SetNewCntntIdx( &aIdx );
468cdf0e10cSrcweir         pDest->SetFmtAttr( aAttr );
469cdf0e10cSrcweir         pDest->SetFmtAttr( rNewAnchor );
470cdf0e10cSrcweir 
471cdf0e10cSrcweir 		if( !mbCopyIsMove || this != pSrcDoc )
472cdf0e10cSrcweir 		{
473cdf0e10cSrcweir 			if( mbInReading )
474cdf0e10cSrcweir 				pDest->SetName( aEmptyStr );
475cdf0e10cSrcweir 			else
476cdf0e10cSrcweir 			{
477cdf0e10cSrcweir 				// Teste erstmal ob der Name schon vergeben ist.
478cdf0e10cSrcweir 				// Wenn ja -> neuen generieren
479cdf0e10cSrcweir 				sal_Int8 nNdTyp = aRg.aStart.GetNode().GetNodeType();
480cdf0e10cSrcweir 
481cdf0e10cSrcweir 				String sOld( pDest->GetName() );
482cdf0e10cSrcweir 				pDest->SetName( aEmptyStr );
483cdf0e10cSrcweir 				if( FindFlyByName( sOld, nNdTyp ) )		// einen gefunden
484cdf0e10cSrcweir 					switch( nNdTyp )
485cdf0e10cSrcweir 					{
486cdf0e10cSrcweir 					case ND_GRFNODE:	sOld = GetUniqueGrfName();		break;
487cdf0e10cSrcweir 					case ND_OLENODE:	sOld = GetUniqueOLEName();		break;
488cdf0e10cSrcweir 					default:			sOld = GetUniqueFrameName();	break;
489cdf0e10cSrcweir 					}
490cdf0e10cSrcweir 
491cdf0e10cSrcweir 				pDest->SetName( sOld );
492cdf0e10cSrcweir 			}
493cdf0e10cSrcweir 		}
494cdf0e10cSrcweir 
495cdf0e10cSrcweir         if (GetIDocumentUndoRedo().DoesUndo())
496cdf0e10cSrcweir         {
497cdf0e10cSrcweir             GetIDocumentUndoRedo().AppendUndo(new SwUndoInsLayFmt(pDest,0,0));
498cdf0e10cSrcweir         }
499cdf0e10cSrcweir 
500cdf0e10cSrcweir 		// sorge dafuer das auch Fly's in Fly's kopiert werden
501cdf0e10cSrcweir 		aIdx = *pSttNd->EndOfSectionNode();
502dec99bbdSOliver-Rainer Wittmann         pSrcDoc->CopyWithFlyInFly( aRg, 0, aIdx, NULL, sal_False, sal_True, sal_True );
503cdf0e10cSrcweir 	}
504cdf0e10cSrcweir 	else
505cdf0e10cSrcweir 	{
506cdf0e10cSrcweir 		ASSERT( RES_DRAWFRMFMT == rSource.Which(), "Weder Fly noch Draw." );
507cdf0e10cSrcweir         // OD 2005-08-02 #i52780# - Note: moving object to visible layer not needed.
508cdf0e10cSrcweir         SwDrawContact* pSourceContact = (SwDrawContact *)rSource.FindContactObj();
509cdf0e10cSrcweir 
510cdf0e10cSrcweir         SwDrawContact* pContact = new SwDrawContact( (SwDrawFrmFmt*)pDest,
511cdf0e10cSrcweir                                 CloneSdrObj( *pSourceContact->GetMaster(),
512cdf0e10cSrcweir                                         mbCopyIsMove && this == pSrcDoc ) );
513cdf0e10cSrcweir         // --> OD 2005-05-23 #i49730# - notify draw frame format
514cdf0e10cSrcweir         // that position attributes are already set, if the position attributes
515cdf0e10cSrcweir         // are already set at the source draw frame format.
516cdf0e10cSrcweir         if ( pDest->ISA(SwDrawFrmFmt) &&
517cdf0e10cSrcweir              rSource.ISA(SwDrawFrmFmt) &&
518cdf0e10cSrcweir              static_cast<const SwDrawFrmFmt&>(rSource).IsPosAttrSet() )
519cdf0e10cSrcweir         {
520cdf0e10cSrcweir             static_cast<SwDrawFrmFmt*>(pDest)->PosAttrSet();
521cdf0e10cSrcweir         }
522cdf0e10cSrcweir         // <--
523cdf0e10cSrcweir 
524cdf0e10cSrcweir         if( pDest->GetAnchor() == rNewAnchor )
525cdf0e10cSrcweir         {
526cdf0e10cSrcweir             // OD 03.07.2003 #108784# - do *not* connect to layout, if
527cdf0e10cSrcweir             // a <MakeFrms> will not be called.
528cdf0e10cSrcweir             if ( bMakeFrms )
529cdf0e10cSrcweir             {
530cdf0e10cSrcweir                 pContact->ConnectToLayout( &rNewAnchor );
531cdf0e10cSrcweir             }
532cdf0e10cSrcweir         }
533cdf0e10cSrcweir 		else
534cdf0e10cSrcweir             pDest->SetFmtAttr( rNewAnchor );
535cdf0e10cSrcweir 
536cdf0e10cSrcweir         if (GetIDocumentUndoRedo().DoesUndo())
537cdf0e10cSrcweir         {
538cdf0e10cSrcweir             GetIDocumentUndoRedo().AppendUndo(new SwUndoInsLayFmt(pDest,0,0));
539cdf0e10cSrcweir         }
540cdf0e10cSrcweir     }
541cdf0e10cSrcweir 
542cdf0e10cSrcweir     if (bSetTxtFlyAtt && (FLY_AS_CHAR == rNewAnchor.GetAnchorId()))
543cdf0e10cSrcweir     {
544cdf0e10cSrcweir         const SwPosition* pPos = rNewAnchor.GetCntntAnchor();
545cdf0e10cSrcweir         SwFmtFlyCnt aFmt( pDest );
546cdf0e10cSrcweir         pPos->nNode.GetNode().GetTxtNode()->InsertItem(
547cdf0e10cSrcweir             aFmt, pPos->nContent.GetIndex(), 0 );
548cdf0e10cSrcweir 	}
549cdf0e10cSrcweir 
550cdf0e10cSrcweir 	if( bMakeFrms )
551cdf0e10cSrcweir 		pDest->MakeFrms();
552cdf0e10cSrcweir 
553cdf0e10cSrcweir 	return pDest;
554cdf0e10cSrcweir }
555cdf0e10cSrcweir 
CloneSdrObj(const SdrObject & rObj,sal_Bool bMoveWithinDoc,sal_Bool bInsInPage)556cdf0e10cSrcweir SdrObject* SwDoc::CloneSdrObj( const SdrObject& rObj, sal_Bool bMoveWithinDoc,
557cdf0e10cSrcweir 								sal_Bool bInsInPage )
558cdf0e10cSrcweir {
559cdf0e10cSrcweir     // --> OD 2005-08-08 #i52858# - method name changed
560cdf0e10cSrcweir     SdrPage *pPg = GetOrCreateDrawModel()->GetPage( 0 );
561cdf0e10cSrcweir     // <--
562cdf0e10cSrcweir 	if( !pPg )
563cdf0e10cSrcweir 	{
564cdf0e10cSrcweir 		pPg = GetDrawModel()->AllocPage( sal_False );
565cdf0e10cSrcweir 		GetDrawModel()->InsertPage( pPg );
566cdf0e10cSrcweir 	}
567cdf0e10cSrcweir 
568cdf0e10cSrcweir 	SdrObject *pObj = rObj.Clone();
569cdf0e10cSrcweir 	if( bMoveWithinDoc && FmFormInventor == pObj->GetObjInventor() )
570cdf0e10cSrcweir 	{
571cdf0e10cSrcweir 		// bei Controls muss der Name erhalten bleiben
572cdf0e10cSrcweir 		uno::Reference< awt::XControlModel >  xModel = ((SdrUnoObj*)pObj)->GetUnoControlModel();
573cdf0e10cSrcweir 		uno::Any aVal;
574cdf0e10cSrcweir 		uno::Reference< beans::XPropertySet >  xSet(xModel, uno::UNO_QUERY);
575cdf0e10cSrcweir 		OUString sName( rtl::OUString::createFromAscii("Name") );
576cdf0e10cSrcweir 		if( xSet.is() )
577cdf0e10cSrcweir 			aVal = xSet->getPropertyValue( sName );
578cdf0e10cSrcweir 		if( bInsInPage )
579cdf0e10cSrcweir 			pPg->InsertObject( pObj );
580cdf0e10cSrcweir 		if( xSet.is() )
581cdf0e10cSrcweir 			xSet->setPropertyValue( sName, aVal );
582cdf0e10cSrcweir 	}
583cdf0e10cSrcweir 	else if( bInsInPage )
584cdf0e10cSrcweir 		pPg->InsertObject( pObj );
585cdf0e10cSrcweir 
586cdf0e10cSrcweir     // OD 02.07.2003 #108784# - for drawing objects: set layer of cloned object
587cdf0e10cSrcweir     // to invisible layer
588cdf0e10cSrcweir     SdrLayerID nLayerIdForClone = rObj.GetLayer();
589cdf0e10cSrcweir     if ( !pObj->ISA(SwFlyDrawObj) &&
590cdf0e10cSrcweir          !pObj->ISA(SwVirtFlyDrawObj) &&
591cdf0e10cSrcweir          !IS_TYPE(SdrObject,pObj) )
592cdf0e10cSrcweir     {
593cdf0e10cSrcweir         if ( IsVisibleLayerId( nLayerIdForClone ) )
594cdf0e10cSrcweir         {
595cdf0e10cSrcweir             nLayerIdForClone = GetInvisibleLayerIdByVisibleOne( nLayerIdForClone );
596cdf0e10cSrcweir         }
597cdf0e10cSrcweir     }
598cdf0e10cSrcweir     pObj->SetLayer( nLayerIdForClone );
599cdf0e10cSrcweir 
600cdf0e10cSrcweir 
601cdf0e10cSrcweir     return pObj;
602cdf0e10cSrcweir }
603cdf0e10cSrcweir 
_MakeFlySection(const SwPosition & rAnchPos,const SwCntntNode & rNode,RndStdIds eRequestId,const SfxItemSet * pFlySet,SwFrmFmt * pFrmFmt)604cdf0e10cSrcweir SwFlyFrmFmt* SwDoc::_MakeFlySection( const SwPosition& rAnchPos,
605cdf0e10cSrcweir 									const SwCntntNode& rNode,
606cdf0e10cSrcweir 									RndStdIds eRequestId,
607cdf0e10cSrcweir 									const SfxItemSet* pFlySet,
608cdf0e10cSrcweir 									SwFrmFmt* pFrmFmt )
609cdf0e10cSrcweir {
610cdf0e10cSrcweir 	if( !pFrmFmt )
611cdf0e10cSrcweir 		pFrmFmt = GetFrmFmtFromPool( RES_POOLFRM_FRAME );
612cdf0e10cSrcweir 
613cdf0e10cSrcweir 	String sName;
614cdf0e10cSrcweir 	if( !mbInReading )
615cdf0e10cSrcweir 		switch( rNode.GetNodeType() )
616cdf0e10cSrcweir 		{
617cdf0e10cSrcweir 		case ND_GRFNODE:		sName = GetUniqueGrfName();		break;
618cdf0e10cSrcweir 		case ND_OLENODE:        sName = GetUniqueOLEName();		break;
619cdf0e10cSrcweir 		default:				sName = GetUniqueFrameName();		break;
620cdf0e10cSrcweir 		}
621cdf0e10cSrcweir 	SwFlyFrmFmt* pFmt = MakeFlyFrmFmt( sName, pFrmFmt );
622cdf0e10cSrcweir 
623cdf0e10cSrcweir 	//Inhalt erzeugen und mit dem Format verbinden.
624cdf0e10cSrcweir 	//CntntNode erzeugen und in die Autotextsection stellen
625cdf0e10cSrcweir 	SwNodeRange aRange( GetNodes().GetEndOfAutotext(), -1,
626cdf0e10cSrcweir 						GetNodes().GetEndOfAutotext() );
627cdf0e10cSrcweir 	GetNodes().SectionDown( &aRange, SwFlyStartNode );
628cdf0e10cSrcweir 
629cdf0e10cSrcweir     pFmt->SetFmtAttr( SwFmtCntnt( rNode.StartOfSectionNode() ));
630cdf0e10cSrcweir 
631cdf0e10cSrcweir 
632cdf0e10cSrcweir 	const SwFmtAnchor* pAnchor = 0;
633cdf0e10cSrcweir 	if( pFlySet )
634cdf0e10cSrcweir 	{
635cdf0e10cSrcweir 		pFlySet->GetItemState( RES_ANCHOR, sal_False,
636cdf0e10cSrcweir 								(const SfxPoolItem**)&pAnchor );
637cdf0e10cSrcweir 		if( SFX_ITEM_SET == pFlySet->GetItemState( RES_CNTNT, sal_False ))
638cdf0e10cSrcweir 		{
639cdf0e10cSrcweir 			SfxItemSet aTmpSet( *pFlySet );
640cdf0e10cSrcweir 			aTmpSet.ClearItem( RES_CNTNT );
641cdf0e10cSrcweir             pFmt->SetFmtAttr( aTmpSet );
642cdf0e10cSrcweir 		}
643cdf0e10cSrcweir 		else
644cdf0e10cSrcweir             pFmt->SetFmtAttr( *pFlySet );
645cdf0e10cSrcweir 	}
646cdf0e10cSrcweir 
647cdf0e10cSrcweir 	// Anker noch nicht gesetzt ?
648cdf0e10cSrcweir 	RndStdIds eAnchorId = pAnchor ? pAnchor->GetAnchorId()
649cdf0e10cSrcweir 								  : pFmt->GetAnchor().GetAnchorId();
650cdf0e10cSrcweir     // --> OD 2010-01-07 #i107811#
651cdf0e10cSrcweir     // Assure that at-page anchored fly frames have a page num or a content anchor set.
652cdf0e10cSrcweir     if ( !pAnchor ||
653cdf0e10cSrcweir          ( FLY_AT_PAGE != pAnchor->GetAnchorId() &&
654cdf0e10cSrcweir            !pAnchor->GetCntntAnchor() ) ||
655cdf0e10cSrcweir          ( FLY_AT_PAGE == pAnchor->GetAnchorId() &&
656cdf0e10cSrcweir            !pAnchor->GetCntntAnchor() &&
657cdf0e10cSrcweir            pAnchor->GetPageNum() == 0 ) )
658cdf0e10cSrcweir 	{
659cdf0e10cSrcweir 		// dann setze ihn, wird im Undo gebraucht
660cdf0e10cSrcweir 		SwFmtAnchor aAnch( pFmt->GetAnchor() );
661cdf0e10cSrcweir         if (pAnchor && (FLY_AT_FLY == pAnchor->GetAnchorId()))
662cdf0e10cSrcweir         {
663cdf0e10cSrcweir 			SwPosition aPos( *rAnchPos.nNode.GetNode().FindFlyStartNode() );
664cdf0e10cSrcweir 			aAnch.SetAnchor( &aPos );
665cdf0e10cSrcweir 			eAnchorId = FLY_AT_FLY;
666cdf0e10cSrcweir 		}
667cdf0e10cSrcweir 		else
668cdf0e10cSrcweir 		{
669cdf0e10cSrcweir 			if( eRequestId != aAnch.GetAnchorId() &&
670cdf0e10cSrcweir 				SFX_ITEM_SET != pFmt->GetItemState( RES_ANCHOR, sal_True ) )
671cdf0e10cSrcweir             {
672cdf0e10cSrcweir 				aAnch.SetType( eRequestId );
673cdf0e10cSrcweir             }
674cdf0e10cSrcweir 
675cdf0e10cSrcweir 			eAnchorId = aAnch.GetAnchorId();
676cdf0e10cSrcweir             if ( FLY_AT_PAGE != eAnchorId ||
677cdf0e10cSrcweir                  ( FLY_AT_PAGE == eAnchorId &&
678cdf0e10cSrcweir                    ( !pAnchor ||
679cdf0e10cSrcweir                      aAnch.GetPageNum() == 0 ) ) )
680cdf0e10cSrcweir             {
681cdf0e10cSrcweir 				aAnch.SetAnchor( &rAnchPos );
682cdf0e10cSrcweir             }
683cdf0e10cSrcweir 		}
684cdf0e10cSrcweir         // <--
685cdf0e10cSrcweir         pFmt->SetFmtAttr( aAnch );
686cdf0e10cSrcweir 	}
687cdf0e10cSrcweir 	else
688cdf0e10cSrcweir 		eAnchorId = pFmt->GetAnchor().GetAnchorId();
689cdf0e10cSrcweir 
690cdf0e10cSrcweir     if ( FLY_AS_CHAR == eAnchorId )
691cdf0e10cSrcweir     {
692cdf0e10cSrcweir 		xub_StrLen nStt = rAnchPos.nContent.GetIndex();
693cdf0e10cSrcweir         SwTxtNode * pTxtNode = rAnchPos.nNode.GetNode().GetTxtNode();
694cdf0e10cSrcweir 
695cdf0e10cSrcweir         ASSERT(pTxtNode!= 0, "There should be a SwTxtNode!");
696cdf0e10cSrcweir 
697cdf0e10cSrcweir         if (pTxtNode != NULL)
698cdf0e10cSrcweir         {
699cdf0e10cSrcweir             SwFmtFlyCnt aFmt( pFmt );
700cdf0e10cSrcweir             pTxtNode->InsertItem( aFmt, nStt, nStt );
701cdf0e10cSrcweir         }
702cdf0e10cSrcweir     }
703cdf0e10cSrcweir 
704cdf0e10cSrcweir 	if( SFX_ITEM_SET != pFmt->GetAttrSet().GetItemState( RES_FRM_SIZE ))
705cdf0e10cSrcweir 	{
706cdf0e10cSrcweir 		SwFmtFrmSize aFmtSize( ATT_VAR_SIZE, 0, DEF_FLY_WIDTH );
707cdf0e10cSrcweir 		const SwNoTxtNode* pNoTxtNode = rNode.GetNoTxtNode();
708cdf0e10cSrcweir 		if( pNoTxtNode )
709cdf0e10cSrcweir 		{
710cdf0e10cSrcweir 			//Groesse einstellen.
711cdf0e10cSrcweir 		 	Size aSize( pNoTxtNode->GetTwipSize() );
712cdf0e10cSrcweir 			if( MINFLY > aSize.Width() )
713cdf0e10cSrcweir 				aSize.Width() = DEF_FLY_WIDTH;
714cdf0e10cSrcweir 			aFmtSize.SetWidth( aSize.Width() );
715cdf0e10cSrcweir 			if( aSize.Height() )
716cdf0e10cSrcweir 			{
717cdf0e10cSrcweir 				aFmtSize.SetHeight( aSize.Height() );
718cdf0e10cSrcweir                 aFmtSize.SetHeightSizeType( ATT_FIX_SIZE );
719cdf0e10cSrcweir 			}
720cdf0e10cSrcweir 		}
721cdf0e10cSrcweir         pFmt->SetFmtAttr( aFmtSize );
722cdf0e10cSrcweir 	}
723cdf0e10cSrcweir 
724cdf0e10cSrcweir 	// Frames anlegen
725cdf0e10cSrcweir 	if( GetCurrentViewShell() )
726cdf0e10cSrcweir 		pFmt->MakeFrms();			// ???	//swmod 071108//swmod 071225
727cdf0e10cSrcweir 
728cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
729cdf0e10cSrcweir     {
730cdf0e10cSrcweir         sal_uLong nNodeIdx = rAnchPos.nNode.GetIndex();
731cdf0e10cSrcweir         xub_StrLen nCntIdx = rAnchPos.nContent.GetIndex();
732cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo(
733cdf0e10cSrcweir             new SwUndoInsLayFmt( pFmt, nNodeIdx, nCntIdx ));
734cdf0e10cSrcweir     }
735cdf0e10cSrcweir 
736cdf0e10cSrcweir 	SetModified();
737cdf0e10cSrcweir 	return pFmt;
738cdf0e10cSrcweir }
739cdf0e10cSrcweir 
MakeFlySection(RndStdIds eAnchorType,const SwPosition * pAnchorPos,const SfxItemSet * pFlySet,SwFrmFmt * pFrmFmt,sal_Bool bCalledFromShell)740cdf0e10cSrcweir SwFlyFrmFmt* SwDoc::MakeFlySection( RndStdIds eAnchorType,
741cdf0e10cSrcweir 									const SwPosition* pAnchorPos,
742cdf0e10cSrcweir 									const SfxItemSet* pFlySet,
743cdf0e10cSrcweir 									SwFrmFmt* pFrmFmt, sal_Bool bCalledFromShell )
744cdf0e10cSrcweir {
745cdf0e10cSrcweir 	SwFlyFrmFmt* pFmt = 0;
746cdf0e10cSrcweir 	sal_Bool bCallMake = sal_True;
747cdf0e10cSrcweir     if ( !pAnchorPos && (FLY_AT_PAGE != eAnchorType) )
748cdf0e10cSrcweir     {
749cdf0e10cSrcweir 		const SwFmtAnchor* pAnch;
750cdf0e10cSrcweir 		if( (pFlySet && SFX_ITEM_SET == pFlySet->GetItemState(
751cdf0e10cSrcweir 				RES_ANCHOR, sal_False, (const SfxPoolItem**)&pAnch )) ||
752cdf0e10cSrcweir 			( pFrmFmt && SFX_ITEM_SET == pFrmFmt->GetItemState(
753cdf0e10cSrcweir 				RES_ANCHOR, sal_True, (const SfxPoolItem**)&pAnch )) )
754cdf0e10cSrcweir 		{
755cdf0e10cSrcweir             if ( (FLY_AT_PAGE != pAnch->GetAnchorId()) )
756cdf0e10cSrcweir             {
757cdf0e10cSrcweir                 pAnchorPos = pAnch->GetCntntAnchor();
758cdf0e10cSrcweir                 if (pAnchorPos)
759cdf0e10cSrcweir                 {
760cdf0e10cSrcweir                     bCallMake = sal_False;
761cdf0e10cSrcweir                 }
762cdf0e10cSrcweir             }
763cdf0e10cSrcweir         }
764cdf0e10cSrcweir     }
765cdf0e10cSrcweir 
766cdf0e10cSrcweir 	if( bCallMake )
767cdf0e10cSrcweir 	{
768cdf0e10cSrcweir 		if( !pFrmFmt )
769cdf0e10cSrcweir 			pFrmFmt = GetFrmFmtFromPool( RES_POOLFRM_FRAME );
770cdf0e10cSrcweir 
771cdf0e10cSrcweir 		sal_uInt16 nCollId = static_cast<sal_uInt16>(
772cdf0e10cSrcweir             get(IDocumentSettingAccess::HTML_MODE) ? RES_POOLCOLL_TEXT : RES_POOLCOLL_FRAME );
773cdf0e10cSrcweir 
774cdf0e10cSrcweir         /* #109161# If there exists no adjust item in the paragraph
775cdf0e10cSrcweir             style for the content node of the new fly section
776cdf0e10cSrcweir             propagate an existing adjust item at the anchor to the new
777cdf0e10cSrcweir             content node. */
778cdf0e10cSrcweir         SwCntntNode * pNewTxtNd = GetNodes().MakeTxtNode
779cdf0e10cSrcweir             (SwNodeIndex( GetNodes().GetEndOfAutotext()),
780cdf0e10cSrcweir              GetTxtCollFromPool( nCollId ));
781cdf0e10cSrcweir         SwCntntNode * pAnchorNode = pAnchorPos->nNode.GetNode().GetCntntNode();
782cdf0e10cSrcweir 
783cdf0e10cSrcweir         const SfxPoolItem * pItem = NULL;
784cdf0e10cSrcweir 
785cdf0e10cSrcweir         if (bCalledFromShell && !lcl_IsItemSet(*pNewTxtNd, RES_PARATR_ADJUST) &&
786cdf0e10cSrcweir             SFX_ITEM_SET == pAnchorNode->GetSwAttrSet().
787cdf0e10cSrcweir             GetItemState(RES_PARATR_ADJUST, sal_True, &pItem))
788cdf0e10cSrcweir             static_cast<SwCntntNode *>(pNewTxtNd)->SetAttr(*pItem);
789cdf0e10cSrcweir 
790cdf0e10cSrcweir  		pFmt = _MakeFlySection( *pAnchorPos, *pNewTxtNd,
791cdf0e10cSrcweir 								eAnchorType, pFlySet, pFrmFmt );
792cdf0e10cSrcweir 	}
793cdf0e10cSrcweir 	return pFmt;
794cdf0e10cSrcweir }
795cdf0e10cSrcweir 
MakeFlyAndMove(const SwPaM & rPam,const SfxItemSet & rSet,const SwSelBoxes * pSelBoxes,SwFrmFmt * pParent)796cdf0e10cSrcweir SwFlyFrmFmt* SwDoc::MakeFlyAndMove( const SwPaM& rPam, const SfxItemSet& rSet,
797cdf0e10cSrcweir 									const SwSelBoxes* pSelBoxes,
798cdf0e10cSrcweir 									SwFrmFmt *pParent )
799cdf0e10cSrcweir {
800cdf0e10cSrcweir 	SwFmtAnchor& rAnch = (SwFmtAnchor&)rSet.Get( RES_ANCHOR );
801cdf0e10cSrcweir 
802cdf0e10cSrcweir     GetIDocumentUndoRedo().StartUndo( UNDO_INSLAYFMT, NULL );
803cdf0e10cSrcweir 
804cdf0e10cSrcweir 	SwFlyFrmFmt* pFmt = MakeFlySection( rAnch.GetAnchorId(), rPam.GetPoint(),
805cdf0e10cSrcweir 										&rSet, pParent );
806cdf0e10cSrcweir 
807cdf0e10cSrcweir 	// Wenn Inhalt selektiert ist, so wird dieser jetzt zum Inhalt des
808cdf0e10cSrcweir 	// neuen Rahmen. Sprich er wird in die entspr. Sektion des NodesArr
809cdf0e10cSrcweir 	//gemoved.
810cdf0e10cSrcweir 
811cdf0e10cSrcweir 	if( pFmt )
812cdf0e10cSrcweir 	{
813cdf0e10cSrcweir 		do {		// middle check loop
814cdf0e10cSrcweir 			const SwFmtCntnt &rCntnt = pFmt->GetCntnt();
815cdf0e10cSrcweir 			ASSERT( rCntnt.GetCntntIdx(), "Kein Inhalt vorbereitet." );
816cdf0e10cSrcweir 			SwNodeIndex aIndex( *(rCntnt.GetCntntIdx()), 1 );
817cdf0e10cSrcweir 			SwCntntNode *pNode = aIndex.GetNode().GetCntntNode();
818cdf0e10cSrcweir 
819cdf0e10cSrcweir 			// ACHTUNG: nicht einen Index auf dem Stack erzeugen, sonst
820cdf0e10cSrcweir 			// 		   	kann der CntntnNode am Ende nicht geloscht werden !!
821cdf0e10cSrcweir 			SwPosition aPos( aIndex );
822cdf0e10cSrcweir 			aPos.nContent.Assign( pNode, 0 );
823cdf0e10cSrcweir 
824cdf0e10cSrcweir 			if( pSelBoxes && pSelBoxes->Count() )
825cdf0e10cSrcweir 			{
826cdf0e10cSrcweir 				// Tabellenselection
827cdf0e10cSrcweir 				// kopiere Teile aus einer Tabelle: lege eine Tabelle mit der
828cdf0e10cSrcweir 				// Breite der Originalen an und move (kopiere/loesche) die
829cdf0e10cSrcweir 				// selektierten Boxen. Die Groessen werden prozentual
830cdf0e10cSrcweir 				// korrigiert.
831cdf0e10cSrcweir 
832cdf0e10cSrcweir 				SwTableNode* pTblNd = (SwTableNode*)(*pSelBoxes)[0]->
833cdf0e10cSrcweir 												GetSttNd()->FindTableNode();
834cdf0e10cSrcweir 				if( !pTblNd )
835cdf0e10cSrcweir 					break;
836cdf0e10cSrcweir 
837cdf0e10cSrcweir 				SwTable& rTbl = pTblNd->GetTable();
838cdf0e10cSrcweir 
839cdf0e10cSrcweir 				// ist die gesamte Tabelle selektiert ?
840cdf0e10cSrcweir 				if( pSelBoxes->Count() == rTbl.GetTabSortBoxes().Count() )
841cdf0e10cSrcweir 				{
842cdf0e10cSrcweir 					// verschiebe die gesamte Tabelle
843cdf0e10cSrcweir 					SwNodeRange aRg( *pTblNd, 0, *pTblNd->EndOfSectionNode(), 1 );
844cdf0e10cSrcweir 
845cdf0e10cSrcweir 					// wird die gesamte Tabelle verschoben und steht diese
846cdf0e10cSrcweir 					// in einem FlyFrame, dann erzeuge dahinter einen neuen
847cdf0e10cSrcweir 					// TextNode. Dadurch bleibt dieser Fly erhalten !
848cdf0e10cSrcweir 					if( aRg.aEnd.GetNode().IsEndNode() )
849cdf0e10cSrcweir 						GetNodes().MakeTxtNode( aRg.aStart,
850cdf0e10cSrcweir 									(SwTxtFmtColl*)GetDfltTxtFmtColl() );
851cdf0e10cSrcweir 
852cdf0e10cSrcweir                     MoveNodeRange( aRg, aPos.nNode, DOC_MOVEDEFAULT );
853cdf0e10cSrcweir                 }
854cdf0e10cSrcweir 				else
855cdf0e10cSrcweir 				{
856cdf0e10cSrcweir 					rTbl.MakeCopy( this, aPos, *pSelBoxes );
857cdf0e10cSrcweir                     // Don't delete a part of a table with row span!!
858cdf0e10cSrcweir                     // You could delete the content instead -> ToDo
859cdf0e10cSrcweir 					//rTbl.DeleteSel( this, *pSelBoxes, 0, 0, sal_True, sal_True );
860cdf0e10cSrcweir 				}
861cdf0e10cSrcweir 
862cdf0e10cSrcweir 				// wenn Tabelle im Rahmen, dann ohne nachfolgenden TextNode
863cdf0e10cSrcweir 				aIndex = rCntnt.GetCntntIdx()->GetNode().EndOfSectionIndex() - 1;
864cdf0e10cSrcweir 				ASSERT( aIndex.GetNode().GetTxtNode(),
865cdf0e10cSrcweir 						"hier sollte ein TextNode stehen" );
866cdf0e10cSrcweir 				aPos.nContent.Assign( 0, 0 );		// Index abmelden !!
867cdf0e10cSrcweir 				GetNodes().Delete( aIndex, 1 );
868cdf0e10cSrcweir 
869cdf0e10cSrcweir //JP erstmal ein Hack, solange keine Flys/Headers/Footers Undofaehig sind
870cdf0e10cSrcweir // werden erstmal alle Undo - Objecte geloescht.
871cdf0e10cSrcweir if( GetIDocumentUndoRedo().DoesUndo() )
872cdf0e10cSrcweir {
873cdf0e10cSrcweir     GetIDocumentUndoRedo().DelAllUndoObj();
874cdf0e10cSrcweir }
875cdf0e10cSrcweir 
876cdf0e10cSrcweir 			}
877cdf0e10cSrcweir 			else
878cdf0e10cSrcweir 			{
879cdf0e10cSrcweir /*
880cdf0e10cSrcweir 				// alle Pams verschieben
881cdf0e10cSrcweir 				SwPaM* pTmp = (SwPaM*)&rPam;
882cdf0e10cSrcweir 				do {
883cdf0e10cSrcweir 					if( pTmp->HasMark() &&
884cdf0e10cSrcweir 						*pTmp->GetPoint() != *pTmp->GetMark() )
885cdf0e10cSrcweir 						MoveAndJoin( *pTmp, aPos );
886cdf0e10cSrcweir 				} while( &rPam != ( pTmp = (SwPaM*)pTmp->GetNext() ) );
887cdf0e10cSrcweir */
888cdf0e10cSrcweir 				// copy all Pams and then delete all
889cdf0e10cSrcweir 				SwPaM* pTmp = (SwPaM*)&rPam;
890cdf0e10cSrcweir                 sal_Bool bOldFlag = mbCopyIsMove;
891cdf0e10cSrcweir                 bool const bOldUndo = GetIDocumentUndoRedo().DoesUndo();
892cdf0e10cSrcweir 				mbCopyIsMove = sal_True;
893cdf0e10cSrcweir                 GetIDocumentUndoRedo().DoUndo(false);
894cdf0e10cSrcweir 				do {
895cdf0e10cSrcweir 					if( pTmp->HasMark() &&
896cdf0e10cSrcweir 						*pTmp->GetPoint() != *pTmp->GetMark() )
897cdf0e10cSrcweir                     {
898cdf0e10cSrcweir                         CopyRange( *pTmp, aPos, false );
899cdf0e10cSrcweir                     }
900cdf0e10cSrcweir                     pTmp = static_cast<SwPaM*>(pTmp->GetNext());
901cdf0e10cSrcweir                 } while ( &rPam != pTmp );
902cdf0e10cSrcweir 				mbCopyIsMove = bOldFlag;
903cdf0e10cSrcweir                 GetIDocumentUndoRedo().DoUndo(bOldUndo);
904cdf0e10cSrcweir 
905cdf0e10cSrcweir 				pTmp = (SwPaM*)&rPam;
906cdf0e10cSrcweir 				do {
907cdf0e10cSrcweir 					if( pTmp->HasMark() &&
908cdf0e10cSrcweir 						*pTmp->GetPoint() != *pTmp->GetMark() )
909cdf0e10cSrcweir                     {
910cdf0e10cSrcweir 						DeleteAndJoin( *pTmp );
911cdf0e10cSrcweir                     }
912cdf0e10cSrcweir                     pTmp = static_cast<SwPaM*>(pTmp->GetNext());
913cdf0e10cSrcweir                 } while ( &rPam != pTmp );
914cdf0e10cSrcweir 			}
915cdf0e10cSrcweir 		} while( sal_False );
916cdf0e10cSrcweir 	}
917cdf0e10cSrcweir 
918cdf0e10cSrcweir 	SetModified();
919cdf0e10cSrcweir 
920cdf0e10cSrcweir     GetIDocumentUndoRedo().EndUndo( UNDO_INSLAYFMT, NULL );
921cdf0e10cSrcweir 
922cdf0e10cSrcweir 	return pFmt;
923cdf0e10cSrcweir }
924cdf0e10cSrcweir 
925cdf0e10cSrcweir 
926*5222b95bSOliver-Rainer Wittmann // Insert drawing object, which has to be already inserted in the DrawModel
InsertDrawObj(const SwPaM & rRg,SdrObject & rDrawObj,const SfxItemSet & rFlyAttrSet)927*5222b95bSOliver-Rainer Wittmann SwDrawFrmFmt* SwDoc::InsertDrawObj(
928*5222b95bSOliver-Rainer Wittmann     const SwPaM &rRg,
929cdf0e10cSrcweir     SdrObject& rDrawObj,
930*5222b95bSOliver-Rainer Wittmann     const SfxItemSet& rFlyAttrSet )
931cdf0e10cSrcweir {
932*5222b95bSOliver-Rainer Wittmann     SwDrawFrmFmt* pFmt = MakeDrawFrmFmt( aEmptyStr, GetDfltFrmFmt() );
933cdf0e10cSrcweir 
934cdf0e10cSrcweir     const SwFmtAnchor* pAnchor = 0;
935*5222b95bSOliver-Rainer Wittmann     rFlyAttrSet.GetItemState( RES_ANCHOR, sal_False, (const SfxPoolItem**) &pAnchor );
936*5222b95bSOliver-Rainer Wittmann     pFmt->SetFmtAttr( rFlyAttrSet );
937cdf0e10cSrcweir 
938*5222b95bSOliver-Rainer Wittmann     RndStdIds eAnchorId = pAnchor != NULL ? pAnchor->GetAnchorId() : pFmt->GetAnchor().GetAnchorId();
939cdf0e10cSrcweir     const bool bIsAtCntnt = (FLY_AT_PAGE != eAnchorId);
940cdf0e10cSrcweir 
941cdf0e10cSrcweir     const SwNodeIndex* pChkIdx = 0;
942*5222b95bSOliver-Rainer Wittmann     if ( pAnchor == NULL )
943cdf0e10cSrcweir     {
944cdf0e10cSrcweir         pChkIdx = &rRg.GetPoint()->nNode;
945cdf0e10cSrcweir     }
946cdf0e10cSrcweir     else if ( bIsAtCntnt )
947cdf0e10cSrcweir     {
948*5222b95bSOliver-Rainer Wittmann         pChkIdx =
949*5222b95bSOliver-Rainer Wittmann             pAnchor->GetCntntAnchor() ? &pAnchor->GetCntntAnchor()->nNode : &rRg.GetPoint()->nNode;
950cdf0e10cSrcweir     }
951cdf0e10cSrcweir 
952*5222b95bSOliver-Rainer Wittmann     // allow drawing objects in header/footer, but control objects aren't allowed in header/footer.
953*5222b95bSOliver-Rainer Wittmann     if( pChkIdx != NULL
954*5222b95bSOliver-Rainer Wittmann         && ::CheckControlLayer( &rDrawObj )
955*5222b95bSOliver-Rainer Wittmann         && IsInHeaderFooter( *pChkIdx ) )
956cdf0e10cSrcweir     {
957*5222b95bSOliver-Rainer Wittmann         // apply at-page anchor format
958*5222b95bSOliver-Rainer Wittmann         eAnchorId = FLY_AT_PAGE;
959*5222b95bSOliver-Rainer Wittmann         pFmt->SetFmtAttr( SwFmtAnchor( eAnchorId ) );
960cdf0e10cSrcweir     }
961*5222b95bSOliver-Rainer Wittmann     else if( pAnchor == NULL
962*5222b95bSOliver-Rainer Wittmann              || ( bIsAtCntnt
963*5222b95bSOliver-Rainer Wittmann                   && pAnchor->GetCntntAnchor() == NULL ) )
964cdf0e10cSrcweir     {
965*5222b95bSOliver-Rainer Wittmann         // apply anchor format
966*5222b95bSOliver-Rainer Wittmann         SwFmtAnchor aAnch( pAnchor != NULL ? *pAnchor : pFmt->GetAnchor() );
967cdf0e10cSrcweir         eAnchorId = aAnch.GetAnchorId();
968*5222b95bSOliver-Rainer Wittmann         if ( eAnchorId == FLY_AT_FLY )
969cdf0e10cSrcweir         {
970cdf0e10cSrcweir             SwPosition aPos( *rRg.GetNode()->FindFlyStartNode() );
971cdf0e10cSrcweir             aAnch.SetAnchor( &aPos );
972cdf0e10cSrcweir         }
973cdf0e10cSrcweir         else
974cdf0e10cSrcweir         {
975cdf0e10cSrcweir             aAnch.SetAnchor( rRg.GetPoint() );
976*5222b95bSOliver-Rainer Wittmann             if ( eAnchorId == FLY_AT_PAGE )
977cdf0e10cSrcweir             {
978*5222b95bSOliver-Rainer Wittmann                 eAnchorId = rDrawObj.ISA( SdrUnoObj ) ? FLY_AS_CHAR : FLY_AT_PARA;
979cdf0e10cSrcweir                 aAnch.SetType( eAnchorId );
980cdf0e10cSrcweir             }
981cdf0e10cSrcweir         }
982cdf0e10cSrcweir         pFmt->SetFmtAttr( aAnch );
983cdf0e10cSrcweir     }
984cdf0e10cSrcweir 
985*5222b95bSOliver-Rainer Wittmann     // insert text attribute for as-character anchored drawing object
986*5222b95bSOliver-Rainer Wittmann     if ( eAnchorId == FLY_AS_CHAR )
987cdf0e10cSrcweir     {
988*5222b95bSOliver-Rainer Wittmann         bool bAnchorAtPageAsFallback = true;
989*5222b95bSOliver-Rainer Wittmann         const SwFmtAnchor& rDrawObjAnchorFmt = pFmt->GetAnchor();
990*5222b95bSOliver-Rainer Wittmann         if ( rDrawObjAnchorFmt.GetCntntAnchor() != NULL )
991*5222b95bSOliver-Rainer Wittmann         {
992*5222b95bSOliver-Rainer Wittmann             SwTxtNode* pAnchorTxtNode =
993*5222b95bSOliver-Rainer Wittmann                     rDrawObjAnchorFmt.GetCntntAnchor()->nNode.GetNode().GetTxtNode();
994*5222b95bSOliver-Rainer Wittmann             if ( pAnchorTxtNode != NULL )
995*5222b95bSOliver-Rainer Wittmann             {
996*5222b95bSOliver-Rainer Wittmann                 const xub_StrLen nStt = rDrawObjAnchorFmt.GetCntntAnchor()->nContent.GetIndex();
997cdf0e10cSrcweir                 SwFmtFlyCnt aFmt( pFmt );
998*5222b95bSOliver-Rainer Wittmann                 pAnchorTxtNode->InsertItem( aFmt, nStt, nStt );
999*5222b95bSOliver-Rainer Wittmann                 bAnchorAtPageAsFallback = false;
1000*5222b95bSOliver-Rainer Wittmann             }
1001*5222b95bSOliver-Rainer Wittmann         }
1002*5222b95bSOliver-Rainer Wittmann 
1003*5222b95bSOliver-Rainer Wittmann         if ( bAnchorAtPageAsFallback )
1004*5222b95bSOliver-Rainer Wittmann         {
1005*5222b95bSOliver-Rainer Wittmann             ASSERT( false, "SwDoc::InsertDrawObj(..) - missing content anchor for as-character anchored drawing object --> anchor at-page" );
1006*5222b95bSOliver-Rainer Wittmann             pFmt->SetFmtAttr( SwFmtAnchor( FLY_AT_PAGE ) );
1007*5222b95bSOliver-Rainer Wittmann         }
1008cdf0e10cSrcweir     }
1009cdf0e10cSrcweir 
1010cdf0e10cSrcweir     SwDrawContact* pContact = new SwDrawContact( pFmt, &rDrawObj );
1011cdf0e10cSrcweir 
1012cdf0e10cSrcweir     if ( GetCurrentViewShell() )
1013cdf0e10cSrcweir     {
1014*5222b95bSOliver-Rainer Wittmann         // create layout representation
1015cdf0e10cSrcweir         pFmt->MakeFrms();
1016cdf0e10cSrcweir         if ( pContact->GetAnchorFrm() )
1017cdf0e10cSrcweir         {
1018cdf0e10cSrcweir             pContact->MoveObjToVisibleLayer( &rDrawObj );
1019cdf0e10cSrcweir         }
1020cdf0e10cSrcweir     }
1021cdf0e10cSrcweir 
1022cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
1023cdf0e10cSrcweir     {
1024cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo( new SwUndoInsLayFmt(pFmt, 0, 0) );
1025cdf0e10cSrcweir     }
1026cdf0e10cSrcweir 
1027cdf0e10cSrcweir     SetModified();
1028cdf0e10cSrcweir     return pFmt;
1029cdf0e10cSrcweir }
1030cdf0e10cSrcweir 
1031cdf0e10cSrcweir /*************************************************************************
1032cdf0e10cSrcweir |*
1033cdf0e10cSrcweir |*	SwDoc::GetAllFlyFmts
1034cdf0e10cSrcweir |*
1035cdf0e10cSrcweir |*	Ersterstellung		MA 14. Jul. 93
1036cdf0e10cSrcweir |*	Letzte Aenderung	MD 23. Feb. 95
1037cdf0e10cSrcweir |*
1038cdf0e10cSrcweir |*************************************************************************/
1039cdf0e10cSrcweir 
1040cdf0e10cSrcweir /*sal_Bool TstFlyRange( const SwPaM* pPam, sal_uInt32 nFlyPos )
1041cdf0e10cSrcweir {
1042cdf0e10cSrcweir 	sal_Bool bOk = sal_False;
1043cdf0e10cSrcweir 	const SwPaM* pTmp = pPam;
1044cdf0e10cSrcweir 	do {
1045cdf0e10cSrcweir 		bOk = pTmp->Start()->nNode.GetIndex() < nFlyPos &&
1046cdf0e10cSrcweir 				pTmp->End()->nNode.GetIndex() > nFlyPos;
1047cdf0e10cSrcweir 	} while( !bOk && pPam != ( pTmp = (const SwPaM*)pTmp->GetNext() ));
1048cdf0e10cSrcweir 	return bOk;
1049cdf0e10cSrcweir }
1050cdf0e10cSrcweir */
1051cdf0e10cSrcweir /* -----------------------------04.04.00 10:55--------------------------------
1052cdf0e10cSrcweir 	paragraph frames - o.k. if the PaM includes the paragraph from the beginning
1053cdf0e10cSrcweir 					   to the beginning of the next paragraph at least
1054cdf0e10cSrcweir 	frames at character - o.k. if the pam start at least at the same position
1055cdf0e10cSrcweir  						as the frame
1056cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
TstFlyRange(const SwPaM * pPam,const SwPosition * pFlyPos,RndStdIds nAnchorId)1057cdf0e10cSrcweir sal_Bool TstFlyRange( const SwPaM* pPam, const SwPosition* pFlyPos,
1058cdf0e10cSrcweir 						RndStdIds nAnchorId )
1059cdf0e10cSrcweir {
1060cdf0e10cSrcweir 	sal_Bool bOk = sal_False;
1061cdf0e10cSrcweir 	const SwPaM* pTmp = pPam;
1062cdf0e10cSrcweir 	do {
1063cdf0e10cSrcweir 		const sal_uInt32 nFlyIndex = pFlyPos->nNode.GetIndex();
1064cdf0e10cSrcweir 		const SwPosition* pPaMStart = pTmp->Start();
1065cdf0e10cSrcweir 		const SwPosition* pPaMEnd = pTmp->End();
1066cdf0e10cSrcweir 		const sal_uInt32 nPamStartIndex = pPaMStart->nNode.GetIndex();
1067cdf0e10cSrcweir 		const sal_uInt32 nPamEndIndex = pPaMEnd->nNode.GetIndex();
1068cdf0e10cSrcweir         if (FLY_AT_PARA == nAnchorId)
1069cdf0e10cSrcweir 			bOk = (nPamStartIndex < nFlyIndex && nPamEndIndex > nFlyIndex) ||
1070cdf0e10cSrcweir 			   (((nPamStartIndex == nFlyIndex) && (pPaMStart->nContent.GetIndex() == 0)) &&
1071cdf0e10cSrcweir 			   (nPamEndIndex > nFlyIndex));
1072cdf0e10cSrcweir 		else
1073cdf0e10cSrcweir 		{
1074cdf0e10cSrcweir 			xub_StrLen nFlyContentIndex = pFlyPos->nContent.GetIndex();
1075cdf0e10cSrcweir 			xub_StrLen nPamEndContentIndex = pPaMEnd->nContent.GetIndex();
1076cdf0e10cSrcweir 			bOk = (nPamStartIndex < nFlyIndex &&
1077cdf0e10cSrcweir 				(( nPamEndIndex > nFlyIndex )||
1078cdf0e10cSrcweir 				 ((nPamEndIndex == nFlyIndex) &&
1079cdf0e10cSrcweir                   (nPamEndContentIndex > nFlyContentIndex))) )
1080cdf0e10cSrcweir 				||
1081cdf0e10cSrcweir 			   		(((nPamStartIndex == nFlyIndex) &&
1082cdf0e10cSrcweir 					  (pPaMStart->nContent.GetIndex() <= nFlyContentIndex)) &&
1083cdf0e10cSrcweir                      ((nPamEndIndex > nFlyIndex) ||
1084cdf0e10cSrcweir                      (nPamEndContentIndex > nFlyContentIndex )));
1085cdf0e10cSrcweir 		}
1086cdf0e10cSrcweir 
1087cdf0e10cSrcweir 	} while( !bOk && pPam != ( pTmp = (const SwPaM*)pTmp->GetNext() ));
1088cdf0e10cSrcweir 	return bOk;
1089cdf0e10cSrcweir }
1090cdf0e10cSrcweir 
1091cdf0e10cSrcweir 
GetAllFlyFmts(const SwPaM * pCmpRange,sal_Bool bDrawAlso) const109237fb9221SArmin Le Grand SwPosFlyFrms SwDoc::GetAllFlyFmts( const SwPaM* pCmpRange, sal_Bool bDrawAlso ) const
1093cdf0e10cSrcweir {
109437fb9221SArmin Le Grand     SwPosFlyFrms aRetval;
1095cdf0e10cSrcweir 	SwFrmFmt *pFly;
1096cdf0e10cSrcweir 
1097cdf0e10cSrcweir 	// erstmal alle Absatzgebundenen einsammeln
1098cdf0e10cSrcweir 	for( sal_uInt16 n = 0; n < GetSpzFrmFmts()->Count(); ++n )
1099cdf0e10cSrcweir 	{
1100cdf0e10cSrcweir 		pFly = (*GetSpzFrmFmts())[ n ];
1101cdf0e10cSrcweir 		bool bDrawFmt = bDrawAlso ? RES_DRAWFRMFMT == pFly->Which() : false;
1102cdf0e10cSrcweir 		bool bFlyFmt = RES_FLYFRMFMT == pFly->Which();
1103cdf0e10cSrcweir 		if( bFlyFmt || bDrawFmt )
1104cdf0e10cSrcweir 		{
1105cdf0e10cSrcweir 			const SwFmtAnchor& rAnchor = pFly->GetAnchor();
1106cdf0e10cSrcweir             SwPosition const*const pAPos = rAnchor.GetCntntAnchor();
1107cdf0e10cSrcweir             if (pAPos &&
1108cdf0e10cSrcweir                 ((FLY_AT_PARA == rAnchor.GetAnchorId()) ||
1109cdf0e10cSrcweir                  (FLY_AT_FLY  == rAnchor.GetAnchorId()) ||
1110cdf0e10cSrcweir                  (FLY_AT_CHAR == rAnchor.GetAnchorId())))
1111cdf0e10cSrcweir 			{
1112cdf0e10cSrcweir 				if( pCmpRange &&
1113cdf0e10cSrcweir 					!TstFlyRange( pCmpRange, pAPos, rAnchor.GetAnchorId() ))
1114cdf0e10cSrcweir 						continue;		// kein gueltiger FlyFrame
111537fb9221SArmin Le Grand                 aRetval.insert(SwPosFlyFrmPtr(new SwPosFlyFrm(pAPos->nNode, pFly, aRetval.size())));
1116cdf0e10cSrcweir 			}
1117cdf0e10cSrcweir 		}
1118cdf0e10cSrcweir 	}
1119cdf0e10cSrcweir 
1120cdf0e10cSrcweir 	// kein Layout oder nur ein Teil, dann wars das
1121cdf0e10cSrcweir 	// Seitenbezogen Flys nur, wenn vollstaendig "gewuenscht" wird !
1122cdf0e10cSrcweir 	if( !GetCurrentViewShell() || pCmpRange )	//swmod 071108//swmod 071225
112337fb9221SArmin Le Grand     {
112437fb9221SArmin Le Grand 		return aRetval;
112537fb9221SArmin Le Grand     }
1126cdf0e10cSrcweir 
1127cdf0e10cSrcweir 	SwPageFrm *pPage = (SwPageFrm*)GetCurrentLayout()->GetLower();	//swmod 080218
1128cdf0e10cSrcweir 	while( pPage )
1129cdf0e10cSrcweir 	{
1130cdf0e10cSrcweir 		if( pPage->GetSortedObjs() )
1131cdf0e10cSrcweir 		{
1132cdf0e10cSrcweir             SwSortedObjs &rObjs = *pPage->GetSortedObjs();
1133cdf0e10cSrcweir 			for( sal_uInt16 i = 0; i < rObjs.Count(); ++i)
1134cdf0e10cSrcweir 			{
1135cdf0e10cSrcweir                 SwAnchoredObject* pAnchoredObj = rObjs[i];
1136cdf0e10cSrcweir                 if ( pAnchoredObj->ISA(SwFlyFrm) )
1137cdf0e10cSrcweir                     pFly = &(pAnchoredObj->GetFrmFmt());
1138cdf0e10cSrcweir 				else if ( bDrawAlso )
1139cdf0e10cSrcweir                     pFly = &(pAnchoredObj->GetFrmFmt());
1140cdf0e10cSrcweir 				else
1141cdf0e10cSrcweir 					continue;
1142cdf0e10cSrcweir 
1143cdf0e10cSrcweir 				const SwFmtAnchor& rAnchor = pFly->GetAnchor();
1144cdf0e10cSrcweir                 if ((FLY_AT_PARA != rAnchor.GetAnchorId()) &&
1145cdf0e10cSrcweir                     (FLY_AT_FLY  != rAnchor.GetAnchorId()) &&
1146cdf0e10cSrcweir                     (FLY_AT_CHAR != rAnchor.GetAnchorId()))
1147cdf0e10cSrcweir 				{
1148cdf0e10cSrcweir 					const SwCntntFrm * pCntntFrm = pPage->FindFirstBodyCntnt();
1149cdf0e10cSrcweir 					if ( !pCntntFrm )
1150cdf0e10cSrcweir 					{
1151cdf0e10cSrcweir 						//Oops! Eine leere Seite. Damit der Rahmen nicht ganz
1152cdf0e10cSrcweir 						//verlorengeht (RTF) suchen wir schnell den letzen
1153cdf0e10cSrcweir 						//Cntnt der vor der Seite steht.
1154cdf0e10cSrcweir 						SwPageFrm *pPrv = (SwPageFrm*)pPage->GetPrev();
1155cdf0e10cSrcweir 						while ( !pCntntFrm && pPrv )
1156cdf0e10cSrcweir 						{
1157cdf0e10cSrcweir 							pCntntFrm = pPrv->FindFirstBodyCntnt();
1158cdf0e10cSrcweir 							pPrv = (SwPageFrm*)pPrv->GetPrev();
1159cdf0e10cSrcweir 						}
1160cdf0e10cSrcweir 					}
1161cdf0e10cSrcweir 					if ( pCntntFrm )
1162cdf0e10cSrcweir 					{
1163cdf0e10cSrcweir 						SwNodeIndex aIdx( *pCntntFrm->GetNode() );
116437fb9221SArmin Le Grand                         aRetval.insert(SwPosFlyFrmPtr(new SwPosFlyFrm(aIdx, pFly, aRetval.size())));
1165cdf0e10cSrcweir 					}
1166cdf0e10cSrcweir 				}
1167cdf0e10cSrcweir 			}
1168cdf0e10cSrcweir 		}
1169cdf0e10cSrcweir 		pPage = (SwPageFrm*)pPage->GetNext();
1170cdf0e10cSrcweir 	}
117137fb9221SArmin Le Grand 
117237fb9221SArmin Le Grand     return aRetval;
1173cdf0e10cSrcweir }
1174cdf0e10cSrcweir 
1175cdf0e10cSrcweir /*************************************************************************
1176cdf0e10cSrcweir |*
1177cdf0e10cSrcweir |*	SwDoc::InsertLabel()
1178cdf0e10cSrcweir |*
1179cdf0e10cSrcweir |*	Ersterstellung		MA 11. Feb. 94
1180cdf0e10cSrcweir |*	Letzte Aenderung	MA 12. Nov. 97
1181cdf0e10cSrcweir |*
1182cdf0e10cSrcweir |*************************************************************************/
1183cdf0e10cSrcweir 
1184cdf0e10cSrcweir /* #i6447# changed behaviour if lcl_CpyAttr:
1185cdf0e10cSrcweir 
1186cdf0e10cSrcweir    If the old item set contains the item to set (no inheritance) copy the item
1187cdf0e10cSrcweir    into the new set.
1188cdf0e10cSrcweir 
1189cdf0e10cSrcweir    If the old item set contains the item by inheritance and the new set
1190cdf0e10cSrcweir    contains the item, too:
1191cdf0e10cSrcweir       If the two items differ copy the item from the old set to the new set.
1192cdf0e10cSrcweir 
1193cdf0e10cSrcweir    Otherwise the new set will not be changed.
1194cdf0e10cSrcweir */
1195cdf0e10cSrcweir 
lcl_CpyAttr(SfxItemSet & rNewSet,const SfxItemSet & rOldSet,sal_uInt16 nWhich)1196cdf0e10cSrcweir void lcl_CpyAttr( SfxItemSet &rNewSet, const SfxItemSet &rOldSet, sal_uInt16 nWhich )
1197cdf0e10cSrcweir {
1198cdf0e10cSrcweir 	const SfxPoolItem *pOldItem = NULL, *pNewItem = NULL;
1199cdf0e10cSrcweir 
1200cdf0e10cSrcweir     rOldSet.GetItemState( nWhich, sal_False, &pOldItem);
1201cdf0e10cSrcweir 	if (pOldItem != NULL)
1202cdf0e10cSrcweir 		rNewSet.Put( *pOldItem );
1203cdf0e10cSrcweir     else
1204cdf0e10cSrcweir     {
1205cdf0e10cSrcweir         pOldItem = rOldSet.GetItem( nWhich, sal_True);
1206cdf0e10cSrcweir         if (pOldItem != NULL)
1207cdf0e10cSrcweir         {
1208cdf0e10cSrcweir             pNewItem = rNewSet.GetItem( nWhich, sal_True);
1209cdf0e10cSrcweir             if (pNewItem != NULL)
1210cdf0e10cSrcweir             {
1211cdf0e10cSrcweir                 if (*pOldItem != *pNewItem)
1212cdf0e10cSrcweir                     rNewSet.Put( *pOldItem );
1213cdf0e10cSrcweir             }
1214cdf0e10cSrcweir             else {
1215cdf0e10cSrcweir                 ASSERT(0, "What am I doing here?");
1216cdf0e10cSrcweir             }
1217cdf0e10cSrcweir         }
1218cdf0e10cSrcweir         else {
1219cdf0e10cSrcweir             ASSERT(0, "What am I doing here?");
1220cdf0e10cSrcweir         }
1221cdf0e10cSrcweir     }
1222cdf0e10cSrcweir 
1223cdf0e10cSrcweir }
1224cdf0e10cSrcweir 
1225cdf0e10cSrcweir 
1226cdf0e10cSrcweir 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)1227cdf0e10cSrcweir lcl_InsertLabel(SwDoc & rDoc, SwTxtFmtColls *const pTxtFmtCollTbl,
1228cdf0e10cSrcweir         SwUndoInsertLabel *const pUndo,
1229cdf0e10cSrcweir         SwLabelType const eType, String const& rTxt, String const& rSeparator,
1230cdf0e10cSrcweir             const String& rNumberingSeparator,
1231cdf0e10cSrcweir 			const sal_Bool bBefore, const sal_uInt16 nId, const sal_uLong nNdIdx,
1232cdf0e10cSrcweir             const String& rCharacterStyle,
1233cdf0e10cSrcweir 			const sal_Bool bCpyBrd )
1234cdf0e10cSrcweir {
1235cdf0e10cSrcweir     ::sw::UndoGuard const undoGuard(rDoc.GetIDocumentUndoRedo());
1236cdf0e10cSrcweir 
1237cdf0e10cSrcweir     sal_Bool bTable = sal_False;    //Um etwas Code zu sparen.
1238cdf0e10cSrcweir 
1239cdf0e10cSrcweir 	//Erstmal das Feld bauen, weil ueber den Namen die TxtColl besorgt werden
1240cdf0e10cSrcweir 	//muss
1241cdf0e10cSrcweir     OSL_ENSURE( nId == USHRT_MAX  || nId < rDoc.GetFldTypes()->Count(),
1242cdf0e10cSrcweir             "FldType index out of bounds." );
1243cdf0e10cSrcweir     SwFieldType *pType = (nId != USHRT_MAX) ? (*rDoc.GetFldTypes())[nId] : NULL;
1244cdf0e10cSrcweir     OSL_ENSURE(!pType || pType->Which() == RES_SETEXPFLD, "wrong Id for Label");
1245cdf0e10cSrcweir 
1246cdf0e10cSrcweir     SwTxtFmtColl * pColl = NULL;
1247cdf0e10cSrcweir     if( pType )
1248cdf0e10cSrcweir     {
1249cdf0e10cSrcweir 	    for( sal_uInt16 i = pTxtFmtCollTbl->Count(); i; )
1250cdf0e10cSrcweir 	    {
1251cdf0e10cSrcweir 		    if( (*pTxtFmtCollTbl)[ --i ]->GetName() == pType->GetName() )
1252cdf0e10cSrcweir 		    {
1253cdf0e10cSrcweir 			    pColl = (*pTxtFmtCollTbl)[i];
1254cdf0e10cSrcweir 			    break;
1255cdf0e10cSrcweir 		    }
1256cdf0e10cSrcweir 	    }
1257cdf0e10cSrcweir         DBG_ASSERT( pColl, "no text collection found" );
1258cdf0e10cSrcweir     }
1259cdf0e10cSrcweir 
1260cdf0e10cSrcweir     if( !pColl )
1261cdf0e10cSrcweir     {
1262cdf0e10cSrcweir         pColl = rDoc.GetTxtCollFromPool( RES_POOLCOLL_LABEL );
1263cdf0e10cSrcweir     }
1264cdf0e10cSrcweir 
1265cdf0e10cSrcweir     SwTxtNode *pNew = NULL;
1266cdf0e10cSrcweir     SwFlyFrmFmt* pNewFmt = NULL;
1267cdf0e10cSrcweir 
1268cdf0e10cSrcweir 	switch ( eType )
1269cdf0e10cSrcweir 	{
1270cdf0e10cSrcweir 		case LTYPE_TABLE:
1271cdf0e10cSrcweir 			bTable = sal_True;
1272cdf0e10cSrcweir 			/* Kein Break hier */
1273cdf0e10cSrcweir 		case LTYPE_FLY:
1274cdf0e10cSrcweir 			//Am Anfang/Ende der Fly-Section den entsprechenden Node mit Feld
1275cdf0e10cSrcweir 			//einfuegen (Frame wird automatisch erzeugt).
1276cdf0e10cSrcweir 			{
1277cdf0e10cSrcweir                 SwStartNode *pSttNd = rDoc.GetNodes()[nNdIdx]->GetStartNode();
1278cdf0e10cSrcweir 				ASSERT( pSttNd, "Kein StartNode in InsertLabel." );
1279cdf0e10cSrcweir 				sal_uLong nNode;
1280cdf0e10cSrcweir 				if( bBefore )
1281cdf0e10cSrcweir 				{
1282cdf0e10cSrcweir 					nNode = pSttNd->GetIndex();
1283cdf0e10cSrcweir 					if( !bTable )
1284cdf0e10cSrcweir 						++nNode;
1285cdf0e10cSrcweir 				}
1286cdf0e10cSrcweir 				else
1287cdf0e10cSrcweir 				{
1288cdf0e10cSrcweir 					nNode = pSttNd->EndOfSectionIndex();
1289cdf0e10cSrcweir 					if( bTable )
1290cdf0e10cSrcweir 						++nNode;
1291cdf0e10cSrcweir 				}
1292cdf0e10cSrcweir 
1293cdf0e10cSrcweir 				if( pUndo )
1294cdf0e10cSrcweir 					pUndo->SetNodePos( nNode );
1295cdf0e10cSrcweir 
1296cdf0e10cSrcweir 				//Node fuer Beschriftungsabsatz erzeugen.
1297cdf0e10cSrcweir                 SwNodeIndex aIdx( rDoc.GetNodes(), nNode );
1298cdf0e10cSrcweir                 pNew = rDoc.GetNodes().MakeTxtNode( aIdx, pColl );
1299cdf0e10cSrcweir 			}
1300cdf0e10cSrcweir 			break;
1301cdf0e10cSrcweir 
1302cdf0e10cSrcweir 		case LTYPE_OBJECT:
1303cdf0e10cSrcweir 			{
1304cdf0e10cSrcweir 				//Rahmen zerstoeren, neuen Rahmen einfuegen, entsprechenden
1305cdf0e10cSrcweir 				// Node mit Feld in den neuen Rahmen, den alten Rahmen mit
1306cdf0e10cSrcweir 				// dem Object (Grafik/Ole) absatzgebunden in den neuen Rahmen,
1307cdf0e10cSrcweir 				// Frames erzeugen.
1308cdf0e10cSrcweir 
1309cdf0e10cSrcweir 				//Erstmal das Format zum Fly besorgen und das Layout entkoppeln.
1310cdf0e10cSrcweir                 SwFrmFmt *pOldFmt = rDoc.GetNodes()[nNdIdx]->GetFlyFmt();
1311cdf0e10cSrcweir 				ASSERT( pOldFmt, "Format des Fly nicht gefunden." );
1312cdf0e10cSrcweir                 // --> OD #i115719#
1313cdf0e10cSrcweir                 // <title> and <description> attributes are lost when calling <DelFrms()>.
1314cdf0e10cSrcweir                 // Thus, keep them and restore them after the calling <MakeFrms()>
1315cdf0e10cSrcweir                 const bool bIsSwFlyFrmFmtInstance( dynamic_cast<SwFlyFrmFmt*>(pOldFmt) != 0 );
1316cdf0e10cSrcweir                 const String sTitle( bIsSwFlyFrmFmtInstance
1317cdf0e10cSrcweir                                      ? static_cast<SwFlyFrmFmt*>(pOldFmt)->GetObjTitle()
1318cdf0e10cSrcweir                                      : String() );
1319cdf0e10cSrcweir                 const String sDescription( bIsSwFlyFrmFmtInstance
1320cdf0e10cSrcweir                                            ? static_cast<SwFlyFrmFmt*>(pOldFmt)->GetObjDescription()
1321cdf0e10cSrcweir                                            : String() );
1322cdf0e10cSrcweir                 // <--
1323cdf0e10cSrcweir 				pOldFmt->DelFrms();
1324cdf0e10cSrcweir 
1325cdf0e10cSrcweir                 pNewFmt = rDoc.MakeFlyFrmFmt( rDoc.GetUniqueFrameName(),
1326cdf0e10cSrcweir                                 rDoc.GetFrmFmtFromPool(RES_POOLFRM_FRAME) );
1327cdf0e10cSrcweir 
1328cdf0e10cSrcweir                 /* #i6447#: Only the selected items are copied from the old
1329cdf0e10cSrcweir                    format. */
1330cdf0e10cSrcweir 				SfxItemSet* pNewSet = pNewFmt->GetAttrSet().Clone( sal_True );
1331cdf0e10cSrcweir 
1332cdf0e10cSrcweir 
1333cdf0e10cSrcweir 				//Diejenigen Attribute uebertragen die auch gesetzt sind,
1334cdf0e10cSrcweir 				//andere sollen weiterhin aus den Vorlagen gueltig werden.
1335cdf0e10cSrcweir 				lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_PRINT );
1336cdf0e10cSrcweir 				lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_OPAQUE );
1337cdf0e10cSrcweir 				lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_PROTECT );
1338cdf0e10cSrcweir 				lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_SURROUND );
1339cdf0e10cSrcweir 				lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_VERT_ORIENT );
1340cdf0e10cSrcweir 				lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_HORI_ORIENT );
1341cdf0e10cSrcweir 				lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_LR_SPACE );
1342cdf0e10cSrcweir 				lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_UL_SPACE );
1343cdf0e10cSrcweir 				lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_BACKGROUND );
1344cdf0e10cSrcweir 				if( bCpyBrd )
1345cdf0e10cSrcweir 				{
1346cdf0e10cSrcweir 					// JP 07.07.99: Bug 67029 - if at Grafik no BoxItem but
1347cdf0e10cSrcweir 					// 				in the new Format is any, then set the
1348cdf0e10cSrcweir 					//				default item in the new Set. Because
1349cdf0e10cSrcweir 					// 				the Size of the Grafik have never been
1350cdf0e10cSrcweir 					//				changed!
1351cdf0e10cSrcweir 					const SfxPoolItem *pItem;
1352cdf0e10cSrcweir 					if( SFX_ITEM_SET == pOldFmt->GetAttrSet().
1353cdf0e10cSrcweir 							GetItemState( RES_BOX, sal_True, &pItem ))
1354cdf0e10cSrcweir 						pNewSet->Put( *pItem );
1355cdf0e10cSrcweir 					else if( SFX_ITEM_SET == pNewFmt->GetAttrSet().
1356cdf0e10cSrcweir 							GetItemState( RES_BOX, sal_True ))
1357cdf0e10cSrcweir 						pNewSet->Put( *GetDfltAttr( RES_BOX ) );
1358cdf0e10cSrcweir 
1359cdf0e10cSrcweir 					if( SFX_ITEM_SET == pOldFmt->GetAttrSet().
1360cdf0e10cSrcweir 							GetItemState( RES_SHADOW, sal_True, &pItem ))
1361cdf0e10cSrcweir 						pNewSet->Put( *pItem );
1362cdf0e10cSrcweir 					else if( SFX_ITEM_SET == pNewFmt->GetAttrSet().
1363cdf0e10cSrcweir 							GetItemState( RES_SHADOW, sal_True ))
1364cdf0e10cSrcweir 						pNewSet->Put( *GetDfltAttr( RES_SHADOW ) );
1365cdf0e10cSrcweir 				}
1366cdf0e10cSrcweir 				else
1367cdf0e10cSrcweir 				{
1368cdf0e10cSrcweir 					//Die Attribute hart setzen, weil sie sonst aus der
1369cdf0e10cSrcweir 					// Vorlage kommen koenten und dann passt die
1370cdf0e10cSrcweir 					// Grossenberechnung nicht mehr.
1371cdf0e10cSrcweir                     pNewSet->Put( SvxBoxItem(RES_BOX) );
1372cdf0e10cSrcweir                     pNewSet->Put( SvxShadowItem(RES_SHADOW) );
1373cdf0e10cSrcweir 
1374cdf0e10cSrcweir 				}
1375cdf0e10cSrcweir 
1376cdf0e10cSrcweir 				//Anker immer uebertragen, ist sowieso ein hartes Attribut.
1377cdf0e10cSrcweir 				pNewSet->Put( pOldFmt->GetAnchor() );
1378cdf0e10cSrcweir 
1379cdf0e10cSrcweir 				//In der Hoehe soll der neue Varabel sein!
1380cdf0e10cSrcweir 				SwFmtFrmSize aFrmSize( pOldFmt->GetFrmSize() );
1381cdf0e10cSrcweir                 aFrmSize.SetHeightSizeType( ATT_MIN_SIZE );
1382cdf0e10cSrcweir 				pNewSet->Put( aFrmSize );
1383cdf0e10cSrcweir 
1384cdf0e10cSrcweir                 SwStartNode* pSttNd = rDoc.GetNodes().MakeTextSection(
1385cdf0e10cSrcweir                             SwNodeIndex( rDoc.GetNodes().GetEndOfAutotext() ),
1386cdf0e10cSrcweir 							SwFlyStartNode, pColl );
1387cdf0e10cSrcweir 				pNewSet->Put( SwFmtCntnt( pSttNd ));
1388cdf0e10cSrcweir 
1389cdf0e10cSrcweir                 pNewFmt->SetFmtAttr( *pNewSet );
1390cdf0e10cSrcweir 
1391cdf0e10cSrcweir 				//Bei InCntnt's wird es spannend: Das TxtAttribut muss
1392cdf0e10cSrcweir 				//vernichtet werden. Leider reisst dies neben den Frms auch
1393cdf0e10cSrcweir 				//noch das Format mit in sein Grab. Um dass zu unterbinden
1394cdf0e10cSrcweir 				//loesen wir vorher die Verbindung zwischen Attribut und Format.
1395cdf0e10cSrcweir 
1396cdf0e10cSrcweir 				const SwFmtAnchor& rAnchor = pNewFmt->GetAnchor();
1397cdf0e10cSrcweir                 if ( FLY_AS_CHAR == rAnchor.GetAnchorId() )
1398cdf0e10cSrcweir                 {
1399cdf0e10cSrcweir 					const SwPosition *pPos = rAnchor.GetCntntAnchor();
1400cdf0e10cSrcweir 					SwTxtNode *pTxtNode = pPos->nNode.GetNode().GetTxtNode();
1401cdf0e10cSrcweir 					ASSERT( pTxtNode->HasHints(), "Missing FlyInCnt-Hint." );
1402cdf0e10cSrcweir 					const xub_StrLen nIdx = pPos->nContent.GetIndex();
1403cdf0e10cSrcweir                     SwTxtAttr * const pHnt =
1404cdf0e10cSrcweir                         pTxtNode->GetTxtAttrForCharAt(nIdx, RES_TXTATR_FLYCNT);
1405cdf0e10cSrcweir 
1406cdf0e10cSrcweir 					ASSERT( pHnt && pHnt->Which() == RES_TXTATR_FLYCNT,
1407cdf0e10cSrcweir 								"Missing FlyInCnt-Hint." );
1408cdf0e10cSrcweir                     ASSERT( pHnt && pHnt->GetFlyCnt().GetFrmFmt() == pOldFmt,
1409cdf0e10cSrcweir 								"Wrong TxtFlyCnt-Hint." );
1410cdf0e10cSrcweir 
1411cdf0e10cSrcweir                     const_cast<SwFmtFlyCnt&>(pHnt->GetFlyCnt()).SetFlyFmt(
1412cdf0e10cSrcweir                             pNewFmt );
1413cdf0e10cSrcweir                 }
1414cdf0e10cSrcweir 
1415cdf0e10cSrcweir 
1416cdf0e10cSrcweir 				//Der Alte soll keinen Umlauf haben, und er soll oben/mittig
1417cdf0e10cSrcweir 				//ausgerichtet sein.
1418cdf0e10cSrcweir 				//Ausserdem soll die Breite 100% betragen und bei Aenderungen
1419cdf0e10cSrcweir 				//Die Hoehe mit anpassen.
1420cdf0e10cSrcweir 				pNewSet->ClearItem();
1421cdf0e10cSrcweir 
1422cdf0e10cSrcweir 				pNewSet->Put( SwFmtSurround( SURROUND_NONE ) );
1423cdf0e10cSrcweir 				pNewSet->Put( SvxOpaqueItem( RES_OPAQUE, sal_True ) );
1424b7504f62SOliver-Rainer Wittmann                 pNewSet->Put( SwFmtVertOrient( 0, text::VertOrientation::TOP, text::RelOrientation::FRAME ) );
1425b7504f62SOliver-Rainer Wittmann                 pNewSet->Put( SwFmtHoriOrient( 0, text::HoriOrientation::CENTER, text::RelOrientation::FRAME ) );
1426cdf0e10cSrcweir 
1427cdf0e10cSrcweir 				aFrmSize = pOldFmt->GetFrmSize();
1428be9fb86bSTsutomu Uchino 				aFrmSize.SetWidthPercent( 0 );
1429cdf0e10cSrcweir 				aFrmSize.SetHeightPercent( 255 );
1430cdf0e10cSrcweir 				pNewSet->Put( aFrmSize );
1431cdf0e10cSrcweir 
1432cdf0e10cSrcweir 				//Die Attribute setzen wir hart, weil sie sonst aus der Vorlage
1433cdf0e10cSrcweir 				//kommen koenten und dann passt die Grossenberechnung nicht mehr.
1434cdf0e10cSrcweir 				if( bCpyBrd )
1435cdf0e10cSrcweir 				{
1436cdf0e10cSrcweir                     pNewSet->Put( SvxBoxItem(RES_BOX) );
1437cdf0e10cSrcweir                     pNewSet->Put( SvxShadowItem(RES_SHADOW) );
1438cdf0e10cSrcweir 				}
1439cdf0e10cSrcweir                 pNewSet->Put( SvxLRSpaceItem(RES_LR_SPACE) );
1440cdf0e10cSrcweir                 pNewSet->Put( SvxULSpaceItem(RES_UL_SPACE) );
1441cdf0e10cSrcweir 
1442cdf0e10cSrcweir 				//Der Alte ist absatzgebunden, und zwar am Absatz im neuen.
1443cdf0e10cSrcweir                 SwFmtAnchor aAnch( FLY_AT_PARA );
1444cdf0e10cSrcweir 				SwNodeIndex aAnchIdx( *pNewFmt->GetCntnt().GetCntntIdx(), 1 );
1445cdf0e10cSrcweir 				pNew = aAnchIdx.GetNode().GetTxtNode();
1446cdf0e10cSrcweir 				SwPosition aPos( aAnchIdx );
1447cdf0e10cSrcweir 				aAnch.SetAnchor( &aPos );
1448cdf0e10cSrcweir 				pNewSet->Put( aAnch );
1449cdf0e10cSrcweir 
1450cdf0e10cSrcweir 				if( pUndo )
1451cdf0e10cSrcweir 					pUndo->SetFlys( *pOldFmt, *pNewSet, *pNewFmt );
1452cdf0e10cSrcweir 				else
1453cdf0e10cSrcweir                     pOldFmt->SetFmtAttr( *pNewSet );
1454cdf0e10cSrcweir 
1455cdf0e10cSrcweir 				delete pNewSet;
1456cdf0e10cSrcweir 
1457cdf0e10cSrcweir 				//Nun nur noch die Flys erzeugen lassen. Das ueberlassen
1458cdf0e10cSrcweir 				//wir vorhanden Methoden (insb. fuer InCntFlys etwas aufwendig).
1459cdf0e10cSrcweir 				pNewFmt->MakeFrms();
1460cdf0e10cSrcweir                 // --> OD #i115719#
1461cdf0e10cSrcweir                 if ( bIsSwFlyFrmFmtInstance )
1462cdf0e10cSrcweir                 {
1463cdf0e10cSrcweir                     static_cast<SwFlyFrmFmt*>(pOldFmt)->SetObjTitle( sTitle );
1464cdf0e10cSrcweir                     static_cast<SwFlyFrmFmt*>(pOldFmt)->SetObjDescription( sDescription );
1465cdf0e10cSrcweir                 }
1466cdf0e10cSrcweir                 // <--
1467cdf0e10cSrcweir 			}
1468cdf0e10cSrcweir 			break;
1469cdf0e10cSrcweir 
1470cdf0e10cSrcweir 		default:
1471cdf0e10cSrcweir             OSL_ENSURE(false, "unknown LabelType?");
1472cdf0e10cSrcweir 	}
1473cdf0e10cSrcweir 	ASSERT( pNew, "No Label inserted" );
1474cdf0e10cSrcweir 	if( pNew )
1475cdf0e10cSrcweir 	{
1476cdf0e10cSrcweir         //#i61007# order of captions
1477cdf0e10cSrcweir         sal_Bool bOrderNumberingFirst = SW_MOD()->GetModuleConfig()->IsCaptionOrderNumberingFirst();
1478cdf0e10cSrcweir 		//String aufbereiten
1479cdf0e10cSrcweir         String aTxt;
1480cdf0e10cSrcweir         if( bOrderNumberingFirst )
1481cdf0e10cSrcweir         {
1482cdf0e10cSrcweir             aTxt = rNumberingSeparator;
1483cdf0e10cSrcweir         }
1484cdf0e10cSrcweir         if( pType)
1485cdf0e10cSrcweir         {
1486cdf0e10cSrcweir             aTxt += pType->GetName();
1487cdf0e10cSrcweir             if( !bOrderNumberingFirst )
1488cdf0e10cSrcweir                 aTxt += ' ';
1489cdf0e10cSrcweir         }
1490cdf0e10cSrcweir 		xub_StrLen nIdx = aTxt.Len();
1491cdf0e10cSrcweir         if( rTxt.Len() > 0 )
1492cdf0e10cSrcweir         {
1493cdf0e10cSrcweir             aTxt += rSeparator;
1494cdf0e10cSrcweir         }
1495cdf0e10cSrcweir         xub_StrLen nSepIdx = aTxt.Len();
1496cdf0e10cSrcweir         aTxt += rTxt;
1497cdf0e10cSrcweir 
1498cdf0e10cSrcweir 		//String einfuegen
1499cdf0e10cSrcweir 		SwIndex aIdx( pNew, 0 );
1500cdf0e10cSrcweir         pNew->InsertText( aTxt, aIdx );
1501cdf0e10cSrcweir 
1502cdf0e10cSrcweir         //
1503cdf0e10cSrcweir 		//Feld einfuegen
1504cdf0e10cSrcweir         if(pType)
1505cdf0e10cSrcweir         {
1506cdf0e10cSrcweir             SwSetExpField aFld( (SwSetExpFieldType*)pType, aEmptyStr, SVX_NUM_ARABIC);
1507cdf0e10cSrcweir             if( bOrderNumberingFirst )
1508cdf0e10cSrcweir                 nIdx = 0;
1509cdf0e10cSrcweir             SwFmtFld aFmt( aFld );
1510cdf0e10cSrcweir             pNew->InsertItem( aFmt, nIdx, nIdx );
1511cdf0e10cSrcweir             if(rCharacterStyle.Len())
1512cdf0e10cSrcweir             {
1513cdf0e10cSrcweir                 SwCharFmt* pCharFmt = rDoc.FindCharFmtByName(rCharacterStyle);
1514cdf0e10cSrcweir                 if( !pCharFmt )
1515cdf0e10cSrcweir                 {
1516cdf0e10cSrcweir                     const sal_uInt16 nMyId = SwStyleNameMapper::GetPoolIdFromUIName(rCharacterStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT);
1517cdf0e10cSrcweir                     pCharFmt = rDoc.GetCharFmtFromPool( nMyId );
1518cdf0e10cSrcweir                 }
1519cdf0e10cSrcweir                 if (pCharFmt)
1520cdf0e10cSrcweir                 {
1521cdf0e10cSrcweir                     SwFmtCharFmt aCharFmt( pCharFmt );
1522cdf0e10cSrcweir                     pNew->InsertItem( aCharFmt, 0,
1523cdf0e10cSrcweir                         nSepIdx + 1, nsSetAttrMode::SETATTR_DONTEXPAND );
1524cdf0e10cSrcweir                 }
1525cdf0e10cSrcweir             }
1526cdf0e10cSrcweir         }
1527cdf0e10cSrcweir 
1528cdf0e10cSrcweir 		if ( bTable )
1529cdf0e10cSrcweir 		{
1530cdf0e10cSrcweir 			if ( bBefore )
1531cdf0e10cSrcweir 			{
1532cdf0e10cSrcweir 				if ( !pNew->GetSwAttrSet().GetKeep().GetValue()  )
1533cdf0e10cSrcweir                     pNew->SetAttr( SvxFmtKeepItem( sal_True, RES_KEEP ) );
1534cdf0e10cSrcweir 			}
1535cdf0e10cSrcweir 			else
1536cdf0e10cSrcweir 			{
1537cdf0e10cSrcweir                 SwTableNode *const pNd =
1538cdf0e10cSrcweir                     rDoc.GetNodes()[nNdIdx]->GetStartNode()->GetTableNode();
1539cdf0e10cSrcweir 				SwTable &rTbl = pNd->GetTable();
1540cdf0e10cSrcweir 				if ( !rTbl.GetFrmFmt()->GetKeep().GetValue() )
1541cdf0e10cSrcweir                     rTbl.GetFrmFmt()->SetFmtAttr( SvxFmtKeepItem( sal_True, RES_KEEP ) );
1542cdf0e10cSrcweir 				if ( pUndo )
1543cdf0e10cSrcweir 					pUndo->SetUndoKeep();
1544cdf0e10cSrcweir 			}
1545cdf0e10cSrcweir 		}
1546cdf0e10cSrcweir 	    rDoc.SetModified();
1547cdf0e10cSrcweir 	}
1548cdf0e10cSrcweir 
1549cdf0e10cSrcweir 	return pNewFmt;
1550cdf0e10cSrcweir }
1551cdf0e10cSrcweir 
1552cdf0e10cSrcweir SwFlyFrmFmt *
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)1553cdf0e10cSrcweir SwDoc::InsertLabel(
1554cdf0e10cSrcweir         SwLabelType const eType, String const& rTxt, String const& rSeparator,
1555cdf0e10cSrcweir         String const& rNumberingSeparator,
1556cdf0e10cSrcweir         sal_Bool const bBefore, sal_uInt16 const nId, sal_uLong const nNdIdx,
1557cdf0e10cSrcweir         String const& rCharacterStyle,
1558cdf0e10cSrcweir         sal_Bool const bCpyBrd )
1559cdf0e10cSrcweir {
1560cdf0e10cSrcweir     SwUndoInsertLabel * pUndo(0);
1561cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
1562cdf0e10cSrcweir     {
1563cdf0e10cSrcweir         pUndo = new SwUndoInsertLabel(
1564cdf0e10cSrcweir                         eType, rTxt, rSeparator, rNumberingSeparator,
1565cdf0e10cSrcweir                         bBefore, nId, rCharacterStyle, bCpyBrd );
1566cdf0e10cSrcweir     }
1567cdf0e10cSrcweir 
1568cdf0e10cSrcweir     SwFlyFrmFmt *const pNewFmt = lcl_InsertLabel(*this, pTxtFmtCollTbl, pUndo,
1569cdf0e10cSrcweir             eType, rTxt, rSeparator, rNumberingSeparator, bBefore,
1570cdf0e10cSrcweir             nId, nNdIdx, rCharacterStyle, bCpyBrd);
1571cdf0e10cSrcweir 
1572cdf0e10cSrcweir     if (pUndo)
1573cdf0e10cSrcweir     {
1574cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo(pUndo);
1575cdf0e10cSrcweir     }
1576cdf0e10cSrcweir     else
1577cdf0e10cSrcweir     {
1578cdf0e10cSrcweir         GetIDocumentUndoRedo().DelAllUndoObj();
1579cdf0e10cSrcweir     }
1580cdf0e10cSrcweir 
1581cdf0e10cSrcweir     return pNewFmt;
1582cdf0e10cSrcweir }
1583cdf0e10cSrcweir 
1584cdf0e10cSrcweir 
1585cdf0e10cSrcweir /*************************************************************************
1586cdf0e10cSrcweir |*
1587cdf0e10cSrcweir |*	SwDoc::InsertDrawLabel()
1588cdf0e10cSrcweir |*
1589cdf0e10cSrcweir |*	Ersterstellung		MIB 7. Dez. 98
1590cdf0e10cSrcweir |*	Letzte Aenderung	MIB 7. Dez. 98
1591cdf0e10cSrcweir |*
1592cdf0e10cSrcweir |*************************************************************************/
1593cdf0e10cSrcweir 
1594cdf0e10cSrcweir 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)1595cdf0e10cSrcweir lcl_InsertDrawLabel( SwDoc & rDoc, SwTxtFmtColls *const pTxtFmtCollTbl,
1596cdf0e10cSrcweir         SwUndoInsertLabel *const pUndo, SwDrawFrmFmt *const pOldFmt,
1597cdf0e10cSrcweir         String const& rTxt,
1598cdf0e10cSrcweir                                      const String& rSeparator,
1599cdf0e10cSrcweir                                      const String& rNumberSeparator,
1600cdf0e10cSrcweir 									 const sal_uInt16 nId,
1601cdf0e10cSrcweir                                      const String& rCharacterStyle,
1602cdf0e10cSrcweir                                      SdrObject& rSdrObj )
1603cdf0e10cSrcweir {
1604cdf0e10cSrcweir     ::sw::UndoGuard const undoGuard(rDoc.GetIDocumentUndoRedo());
1605cdf0e10cSrcweir     ::sw::DrawUndoGuard const drawUndoGuard(rDoc.GetIDocumentUndoRedo());
1606cdf0e10cSrcweir 
1607cdf0e10cSrcweir 	// Erstmal das Feld bauen, weil ueber den Namen die TxtColl besorgt
1608cdf0e10cSrcweir 	// werden muss
1609cdf0e10cSrcweir     OSL_ENSURE( nId == USHRT_MAX  || nId < rDoc.GetFldTypes()->Count(),
1610cdf0e10cSrcweir             "FldType index out of bounds" );
1611cdf0e10cSrcweir     SwFieldType *pType = nId != USHRT_MAX ? (*rDoc.GetFldTypes())[nId] : 0;
1612cdf0e10cSrcweir     OSL_ENSURE( !pType || pType->Which() == RES_SETEXPFLD, "Wrong label id" );
1613cdf0e10cSrcweir 
1614cdf0e10cSrcweir     SwTxtFmtColl *pColl = NULL;
1615cdf0e10cSrcweir     if( pType )
1616cdf0e10cSrcweir     {
1617cdf0e10cSrcweir         for( sal_uInt16 i = pTxtFmtCollTbl->Count(); i; )
1618cdf0e10cSrcweir         {
1619cdf0e10cSrcweir             if( (*pTxtFmtCollTbl)[ --i ]->GetName() == pType->GetName() )
1620cdf0e10cSrcweir             {
1621cdf0e10cSrcweir                 pColl = (*pTxtFmtCollTbl)[i];
1622cdf0e10cSrcweir                 break;
1623cdf0e10cSrcweir             }
1624cdf0e10cSrcweir         }
1625cdf0e10cSrcweir         DBG_ASSERT( pColl, "no text collection found" );
1626cdf0e10cSrcweir     }
1627cdf0e10cSrcweir 
1628cdf0e10cSrcweir     if( !pColl )
1629cdf0e10cSrcweir     {
1630cdf0e10cSrcweir         pColl = rDoc.GetTxtCollFromPool( RES_POOLCOLL_LABEL );
1631cdf0e10cSrcweir     }
1632cdf0e10cSrcweir 
1633cdf0e10cSrcweir     SwTxtNode* pNew = NULL;
1634cdf0e10cSrcweir     SwFlyFrmFmt* pNewFmt = NULL;
1635cdf0e10cSrcweir 
1636cdf0e10cSrcweir 	// Rahmen zerstoeren, neuen Rahmen einfuegen, entsprechenden
1637cdf0e10cSrcweir 	// Node mit Feld in den neuen Rahmen, den alten Rahmen mit
1638cdf0e10cSrcweir 	// dem Object (Grafik/Ole) absatzgebunden in den neuen Rahmen,
1639cdf0e10cSrcweir 	// Frames erzeugen.
1640cdf0e10cSrcweir 
1641cdf0e10cSrcweir     // OD 27.11.2003 #112045# - Keep layer ID of drawing object before removing
1642cdf0e10cSrcweir     // its frames.
1643cdf0e10cSrcweir     // Note: The layer ID is passed to the undo and have to be the correct value.
1644cdf0e10cSrcweir     //       Removing the frames of the drawing object changes its layer.
1645cdf0e10cSrcweir     const SdrLayerID nLayerId = rSdrObj.GetLayer();
1646cdf0e10cSrcweir 
1647cdf0e10cSrcweir 	pOldFmt->DelFrms();
1648cdf0e10cSrcweir 
1649cdf0e10cSrcweir 	//Bei InCntnt's wird es spannend: Das TxtAttribut muss
1650cdf0e10cSrcweir 	//vernichtet werden. Leider reisst dies neben den Frms auch
1651cdf0e10cSrcweir 	//noch das Format mit in sein Grab. Um dass zu unterbinden
1652cdf0e10cSrcweir 	//loesen wir vorher die Verbindung zwischen Attribut und Format.
1653cdf0e10cSrcweir 	SfxItemSet* pNewSet = pOldFmt->GetAttrSet().Clone( sal_False );
1654cdf0e10cSrcweir 
1655cdf0e10cSrcweir 	// Ggf. Groesse und Position des Rahmens schuetzen
1656cdf0e10cSrcweir 	if ( rSdrObj.IsMoveProtect() || rSdrObj.IsResizeProtect() )
1657cdf0e10cSrcweir 	{
1658cdf0e10cSrcweir         SvxProtectItem aProtect(RES_PROTECT);
1659cdf0e10cSrcweir 		aProtect.SetCntntProtect( sal_False );
1660cdf0e10cSrcweir 		aProtect.SetPosProtect( rSdrObj.IsMoveProtect() );
1661cdf0e10cSrcweir 		aProtect.SetSizeProtect( rSdrObj.IsResizeProtect() );
1662cdf0e10cSrcweir 		pNewSet->Put( aProtect );
1663cdf0e10cSrcweir 	}
1664cdf0e10cSrcweir 
1665cdf0e10cSrcweir 	// Umlauf uebernehmen
1666cdf0e10cSrcweir 	lcl_CpyAttr( *pNewSet, pOldFmt->GetAttrSet(), RES_SURROUND );
1667cdf0e10cSrcweir 
1668cdf0e10cSrcweir 	// Den Rahmen ggf. in den Hintergrund schicken.
1669cdf0e10cSrcweir     // OD 02.07.2003 #108784# - consider 'invisible' hell layer.
1670cdf0e10cSrcweir     if ( rDoc.GetHellId() != nLayerId &&
1671cdf0e10cSrcweir          rDoc.GetInvisibleHellId() != nLayerId )
1672cdf0e10cSrcweir 	{
1673cdf0e10cSrcweir         SvxOpaqueItem aOpaque( RES_OPAQUE );
1674cdf0e10cSrcweir 		aOpaque.SetValue( sal_True );
1675cdf0e10cSrcweir 		pNewSet->Put( aOpaque );
1676cdf0e10cSrcweir 	}
1677cdf0e10cSrcweir 
1678cdf0e10cSrcweir 	// Position uebernehmen
1679cdf0e10cSrcweir     // OD 2004-04-15 #i26791# - use directly the positioning attributes of
1680cdf0e10cSrcweir     // the drawing object.
1681cdf0e10cSrcweir     pNewSet->Put( pOldFmt->GetHoriOrient() );
1682cdf0e10cSrcweir     pNewSet->Put( pOldFmt->GetVertOrient() );
1683cdf0e10cSrcweir 
1684cdf0e10cSrcweir 	pNewSet->Put( pOldFmt->GetAnchor() );
1685cdf0e10cSrcweir 
1686cdf0e10cSrcweir 	//In der Hoehe soll der neue Varabel sein!
1687cdf0e10cSrcweir  	Size aSz( rSdrObj.GetCurrentBoundRect().GetSize() );
1688cdf0e10cSrcweir 	SwFmtFrmSize aFrmSize( ATT_MIN_SIZE, aSz.Width(), aSz.Height() );
1689cdf0e10cSrcweir 	pNewSet->Put( aFrmSize );
1690cdf0e10cSrcweir 
1691cdf0e10cSrcweir 	// Abstaende auf den neuen Rahmen uebertragen. Eine Umrandung
1692cdf0e10cSrcweir 	// gibt es beu Zeichen-Objekten nicht, also muss sie geloescht
1693cdf0e10cSrcweir 	// werden.
1694cdf0e10cSrcweir 	// MA: Falsch sie wird nicht gesetzt, denn die aus der Vorlage
1695cdf0e10cSrcweir 	// soll ruhig wirksam werden
1696cdf0e10cSrcweir 	pNewSet->Put( pOldFmt->GetLRSpace() );
1697cdf0e10cSrcweir 	pNewSet->Put( pOldFmt->GetULSpace() );
1698cdf0e10cSrcweir 
1699cdf0e10cSrcweir     SwStartNode* pSttNd =
1700cdf0e10cSrcweir         rDoc.GetNodes().MakeTextSection(
1701cdf0e10cSrcweir             SwNodeIndex( rDoc.GetNodes().GetEndOfAutotext() ),
1702cdf0e10cSrcweir                                     SwFlyStartNode, pColl );
1703cdf0e10cSrcweir 
1704cdf0e10cSrcweir     pNewFmt = rDoc.MakeFlyFrmFmt( rDoc.GetUniqueFrameName(),
1705cdf0e10cSrcweir                  rDoc.GetFrmFmtFromPool( RES_POOLFRM_FRAME ) );
1706cdf0e10cSrcweir 
1707cdf0e10cSrcweir 	// JP 28.10.99: Bug 69487 - set border and shadow to default if the
1708cdf0e10cSrcweir 	// 				template contains any.
1709cdf0e10cSrcweir 	if( SFX_ITEM_SET == pNewFmt->GetAttrSet().GetItemState( RES_BOX, sal_True ))
1710cdf0e10cSrcweir 		pNewSet->Put( *GetDfltAttr( RES_BOX ) );
1711cdf0e10cSrcweir 
1712cdf0e10cSrcweir 	if( SFX_ITEM_SET == pNewFmt->GetAttrSet().GetItemState(RES_SHADOW,sal_True))
1713cdf0e10cSrcweir 		pNewSet->Put( *GetDfltAttr( RES_SHADOW ) );
1714cdf0e10cSrcweir 
1715cdf0e10cSrcweir     pNewFmt->SetFmtAttr( SwFmtCntnt( pSttNd ));
1716cdf0e10cSrcweir     pNewFmt->SetFmtAttr( *pNewSet );
1717cdf0e10cSrcweir 
1718cdf0e10cSrcweir 	const SwFmtAnchor& rAnchor = pNewFmt->GetAnchor();
1719cdf0e10cSrcweir     if ( FLY_AS_CHAR == rAnchor.GetAnchorId() )
1720cdf0e10cSrcweir 	{
1721cdf0e10cSrcweir 		const SwPosition *pPos = rAnchor.GetCntntAnchor();
1722cdf0e10cSrcweir 		SwTxtNode *pTxtNode = pPos->nNode.GetNode().GetTxtNode();
1723cdf0e10cSrcweir 		ASSERT( pTxtNode->HasHints(), "Missing FlyInCnt-Hint." );
1724cdf0e10cSrcweir 		const xub_StrLen nIdx = pPos->nContent.GetIndex();
1725cdf0e10cSrcweir         SwTxtAttr * const pHnt =
1726cdf0e10cSrcweir             pTxtNode->GetTxtAttrForCharAt( nIdx, RES_TXTATR_FLYCNT );
1727cdf0e10cSrcweir 
1728cdf0e10cSrcweir #ifdef DBG_UTIL
1729cdf0e10cSrcweir 		ASSERT( pHnt && pHnt->Which() == RES_TXTATR_FLYCNT,
1730cdf0e10cSrcweir 					"Missing FlyInCnt-Hint." );
1731cdf0e10cSrcweir 		ASSERT( pHnt && ((SwFmtFlyCnt&)pHnt->GetFlyCnt()).
1732cdf0e10cSrcweir 					GetFrmFmt() == (SwFrmFmt*)pOldFmt,
1733cdf0e10cSrcweir 					"Wrong TxtFlyCnt-Hint." );
1734cdf0e10cSrcweir #endif
1735cdf0e10cSrcweir         const_cast<SwFmtFlyCnt&>(pHnt->GetFlyCnt()).SetFlyFmt( pNewFmt );
1736cdf0e10cSrcweir     }
1737cdf0e10cSrcweir 
1738cdf0e10cSrcweir 
1739cdf0e10cSrcweir 	//Der Alte soll keinen Umlauf haben, und er soll oben/mittig
1740cdf0e10cSrcweir 	//ausgerichtet sein.
1741cdf0e10cSrcweir 	pNewSet->ClearItem();
1742cdf0e10cSrcweir 
1743cdf0e10cSrcweir 	pNewSet->Put( SwFmtSurround( SURROUND_NONE ) );
1744cdf0e10cSrcweir     if (nLayerId == rDoc.GetHellId())
1745cdf0e10cSrcweir     {
1746cdf0e10cSrcweir         rSdrObj.SetLayer( rDoc.GetHeavenId() );
1747cdf0e10cSrcweir     }
1748cdf0e10cSrcweir     // OD 02.07.2003 #108784# - consider drawing objects in 'invisible' hell layer
1749cdf0e10cSrcweir     else if (nLayerId == rDoc.GetInvisibleHellId())
1750cdf0e10cSrcweir     {
1751cdf0e10cSrcweir         rSdrObj.SetLayer( rDoc.GetInvisibleHeavenId() );
1752cdf0e10cSrcweir     }
1753cdf0e10cSrcweir     pNewSet->Put( SvxLRSpaceItem( RES_LR_SPACE ) );
1754cdf0e10cSrcweir     pNewSet->Put( SvxULSpaceItem( RES_UL_SPACE ) );
1755cdf0e10cSrcweir 
1756cdf0e10cSrcweir     // OD 2004-04-15 #i26791# - set position of the drawing object, which is labeled.
1757cdf0e10cSrcweir     pNewSet->Put( SwFmtVertOrient( 0, text::VertOrientation::TOP, text::RelOrientation::FRAME ) );
1758cdf0e10cSrcweir     pNewSet->Put( SwFmtHoriOrient( 0, text::HoriOrientation::CENTER, text::RelOrientation::FRAME ) );
1759cdf0e10cSrcweir 
1760cdf0e10cSrcweir 	//Der Alte ist absatzgebunden, und zwar am Absatz im neuen.
1761cdf0e10cSrcweir     SwFmtAnchor aAnch( FLY_AT_PARA );
1762cdf0e10cSrcweir 	SwNodeIndex aAnchIdx( *pNewFmt->GetCntnt().GetCntntIdx(), 1 );
1763cdf0e10cSrcweir 	pNew = aAnchIdx.GetNode().GetTxtNode();
1764cdf0e10cSrcweir 	SwPosition aPos( aAnchIdx );
1765cdf0e10cSrcweir 	aAnch.SetAnchor( &aPos );
1766cdf0e10cSrcweir 	pNewSet->Put( aAnch );
1767cdf0e10cSrcweir 
1768cdf0e10cSrcweir 	if( pUndo )
1769cdf0e10cSrcweir 	{
1770cdf0e10cSrcweir 		pUndo->SetFlys( *pOldFmt, *pNewSet, *pNewFmt );
1771cdf0e10cSrcweir         // OD 2004-04-15 #i26791# - position no longer needed
1772cdf0e10cSrcweir         pUndo->SetDrawObj( nLayerId );
1773cdf0e10cSrcweir 	}
1774cdf0e10cSrcweir 	else
1775cdf0e10cSrcweir         pOldFmt->SetFmtAttr( *pNewSet );
1776cdf0e10cSrcweir 
1777cdf0e10cSrcweir 	delete pNewSet;
1778cdf0e10cSrcweir 
1779cdf0e10cSrcweir 	//Nun nur noch die Flys erzeugen lassen. Das ueberlassen
1780cdf0e10cSrcweir 	//wir vorhanden Methoden (insb. fuer InCntFlys etwas aufwendig).
1781cdf0e10cSrcweir 	pNewFmt->MakeFrms();
1782cdf0e10cSrcweir 
1783cdf0e10cSrcweir 	ASSERT( pNew, "No Label inserted" );
1784cdf0e10cSrcweir 
1785cdf0e10cSrcweir 	if( pNew )
1786cdf0e10cSrcweir 	{
1787cdf0e10cSrcweir         //#i61007# order of captions
1788cdf0e10cSrcweir         sal_Bool bOrderNumberingFirst = SW_MOD()->GetModuleConfig()->IsCaptionOrderNumberingFirst();
1789cdf0e10cSrcweir 
1790cdf0e10cSrcweir         // prepare string
1791cdf0e10cSrcweir         String aTxt;
1792cdf0e10cSrcweir         if( bOrderNumberingFirst )
1793cdf0e10cSrcweir         {
1794cdf0e10cSrcweir             aTxt = rNumberSeparator;
1795cdf0e10cSrcweir         }
1796cdf0e10cSrcweir         if ( pType )
1797cdf0e10cSrcweir         {
1798cdf0e10cSrcweir             aTxt += pType->GetName();
1799cdf0e10cSrcweir             if( !bOrderNumberingFirst )
1800cdf0e10cSrcweir                 aTxt += ' ';
1801cdf0e10cSrcweir         }
1802cdf0e10cSrcweir 		xub_StrLen nIdx = aTxt.Len();
1803cdf0e10cSrcweir         aTxt += rSeparator;
1804cdf0e10cSrcweir         xub_StrLen nSepIdx = aTxt.Len();
1805cdf0e10cSrcweir         aTxt += rTxt;
1806cdf0e10cSrcweir 
1807cdf0e10cSrcweir         // insert text
1808cdf0e10cSrcweir 		SwIndex aIdx( pNew, 0 );
1809cdf0e10cSrcweir         pNew->InsertText( aTxt, aIdx );
1810cdf0e10cSrcweir 
1811cdf0e10cSrcweir         // insert field
1812cdf0e10cSrcweir         if ( pType )
1813cdf0e10cSrcweir         {
1814cdf0e10cSrcweir             SwSetExpField aFld( (SwSetExpFieldType*)pType, aEmptyStr, SVX_NUM_ARABIC );
1815cdf0e10cSrcweir             if( bOrderNumberingFirst )
1816cdf0e10cSrcweir                 nIdx = 0;
1817cdf0e10cSrcweir             SwFmtFld aFmt( aFld );
1818cdf0e10cSrcweir             pNew->InsertItem( aFmt, nIdx, nIdx );
1819cdf0e10cSrcweir             if ( rCharacterStyle.Len() )
1820cdf0e10cSrcweir             {
1821cdf0e10cSrcweir                 SwCharFmt * pCharFmt = rDoc.FindCharFmtByName(rCharacterStyle);
1822cdf0e10cSrcweir                 if ( !pCharFmt )
1823cdf0e10cSrcweir                 {
1824cdf0e10cSrcweir                     const sal_uInt16 nMyId = SwStyleNameMapper::GetPoolIdFromUIName( rCharacterStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
1825cdf0e10cSrcweir                     pCharFmt = rDoc.GetCharFmtFromPool( nMyId );
1826cdf0e10cSrcweir                 }
1827cdf0e10cSrcweir                 if ( pCharFmt )
1828cdf0e10cSrcweir                 {
1829cdf0e10cSrcweir                     SwFmtCharFmt aCharFmt( pCharFmt );
1830cdf0e10cSrcweir                     pNew->InsertItem( aCharFmt, 0, nSepIdx + 1,
1831cdf0e10cSrcweir                             nsSetAttrMode::SETATTR_DONTEXPAND );
1832cdf0e10cSrcweir                 }
1833cdf0e10cSrcweir             }
1834cdf0e10cSrcweir         }
1835cdf0e10cSrcweir     }
1836cdf0e10cSrcweir 
1837cdf0e10cSrcweir 	return pNewFmt;
1838cdf0e10cSrcweir }
1839cdf0e10cSrcweir 
InsertDrawLabel(String const & rTxt,String const & rSeparator,String const & rNumberSeparator,sal_uInt16 const nId,String const & rCharacterStyle,SdrObject & rSdrObj)1840cdf0e10cSrcweir SwFlyFrmFmt* SwDoc::InsertDrawLabel(
1841cdf0e10cSrcweir         String const& rTxt,
1842cdf0e10cSrcweir         String const& rSeparator,
1843cdf0e10cSrcweir         String const& rNumberSeparator,
1844cdf0e10cSrcweir         sal_uInt16 const nId,
1845cdf0e10cSrcweir         String const& rCharacterStyle,
1846cdf0e10cSrcweir         SdrObject& rSdrObj )
1847cdf0e10cSrcweir {
1848cdf0e10cSrcweir     SwDrawContact *const pContact =
1849cdf0e10cSrcweir         static_cast<SwDrawContact*>(GetUserCall( &rSdrObj ));
1850cdf0e10cSrcweir     OSL_ENSURE( RES_DRAWFRMFMT == pContact->GetFmt()->Which(),
1851cdf0e10cSrcweir             "InsertDrawLabel(): not a DrawFrmFmt" );
1852cdf0e10cSrcweir     if (!pContact)
1853cdf0e10cSrcweir         return 0;
1854cdf0e10cSrcweir 
1855cdf0e10cSrcweir     SwDrawFrmFmt* pOldFmt = (SwDrawFrmFmt *)pContact->GetFmt();
1856cdf0e10cSrcweir     if (!pOldFmt)
1857cdf0e10cSrcweir         return 0;
1858cdf0e10cSrcweir 
1859cdf0e10cSrcweir     SwUndoInsertLabel * pUndo = 0;
1860cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
1861cdf0e10cSrcweir     {
1862cdf0e10cSrcweir         GetIDocumentUndoRedo().ClearRedo();
1863cdf0e10cSrcweir         pUndo = new SwUndoInsertLabel(
1864cdf0e10cSrcweir             LTYPE_DRAW, rTxt, rSeparator, rNumberSeparator, sal_False,
1865cdf0e10cSrcweir             nId, rCharacterStyle, sal_False );
1866cdf0e10cSrcweir     }
1867cdf0e10cSrcweir 
1868cdf0e10cSrcweir     SwFlyFrmFmt *const pNewFmt = lcl_InsertDrawLabel(
1869cdf0e10cSrcweir         *this, pTxtFmtCollTbl, pUndo, pOldFmt,
1870cdf0e10cSrcweir         rTxt, rSeparator, rNumberSeparator, nId, rCharacterStyle, rSdrObj);
1871cdf0e10cSrcweir 
1872cdf0e10cSrcweir     if (pUndo)
1873cdf0e10cSrcweir     {
1874cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo( pUndo );
1875cdf0e10cSrcweir     }
1876cdf0e10cSrcweir     else
1877cdf0e10cSrcweir     {
1878cdf0e10cSrcweir         GetIDocumentUndoRedo().DelAllUndoObj();
1879cdf0e10cSrcweir     }
1880cdf0e10cSrcweir 
1881cdf0e10cSrcweir     return pNewFmt;
1882cdf0e10cSrcweir }
1883cdf0e10cSrcweir 
1884cdf0e10cSrcweir 
1885cdf0e10cSrcweir /*************************************************************************
1886cdf0e10cSrcweir |*
1887cdf0e10cSrcweir |*	IDocumentTimerAccess-methods
1888cdf0e10cSrcweir |*
1889cdf0e10cSrcweir |*************************************************************************/
1890cdf0e10cSrcweir 
StartIdling()1891cdf0e10cSrcweir void SwDoc::StartIdling()
1892cdf0e10cSrcweir {
1893cdf0e10cSrcweir     mbStartIdleTimer = sal_True;
1894cdf0e10cSrcweir     if( !mIdleBlockCount )
1895cdf0e10cSrcweir         aIdleTimer.Start();
1896cdf0e10cSrcweir }
1897cdf0e10cSrcweir 
StopIdling()1898cdf0e10cSrcweir void SwDoc::StopIdling()
1899cdf0e10cSrcweir {
1900cdf0e10cSrcweir     mbStartIdleTimer = sal_False;
1901cdf0e10cSrcweir     aIdleTimer.Stop();
1902cdf0e10cSrcweir }
1903cdf0e10cSrcweir 
BlockIdling()1904cdf0e10cSrcweir void SwDoc::BlockIdling()
1905cdf0e10cSrcweir {
1906cdf0e10cSrcweir     aIdleTimer.Stop();
1907cdf0e10cSrcweir     ++mIdleBlockCount;
1908cdf0e10cSrcweir }
1909cdf0e10cSrcweir 
UnblockIdling()1910cdf0e10cSrcweir void SwDoc::UnblockIdling()
1911cdf0e10cSrcweir {
1912cdf0e10cSrcweir     --mIdleBlockCount;
1913cdf0e10cSrcweir     if( !mIdleBlockCount && mbStartIdleTimer && !aIdleTimer.IsActive() )
1914cdf0e10cSrcweir         aIdleTimer.Start();
1915cdf0e10cSrcweir }
1916cdf0e10cSrcweir 
1917cdf0e10cSrcweir 
1918cdf0e10cSrcweir /*************************************************************************
1919cdf0e10cSrcweir |*
1920cdf0e10cSrcweir |*	SwDoc::DoIdleJobs()
1921cdf0e10cSrcweir |*
1922cdf0e10cSrcweir |*	Ersterstellung		OK 30.03.94
1923cdf0e10cSrcweir |*	Letzte Aenderung	MA 09. Jun. 95
1924cdf0e10cSrcweir |*
1925cdf0e10cSrcweir |*************************************************************************/
1926cdf0e10cSrcweir 
IMPL_LINK(SwDoc,DoIdleJobs,Timer *,pTimer)1927cdf0e10cSrcweir IMPL_LINK( SwDoc, DoIdleJobs, Timer *, pTimer )
1928cdf0e10cSrcweir {
1929cdf0e10cSrcweir #ifdef TIMELOG
1930cdf0e10cSrcweir 	static ::rtl::Logfile* pModLogFile = 0;
1931cdf0e10cSrcweir 	if( !pModLogFile )
1932cdf0e10cSrcweir 		pModLogFile = new ::rtl::Logfile( "First DoIdleJobs" );
1933cdf0e10cSrcweir #endif
1934cdf0e10cSrcweir 
1935cdf0e10cSrcweir 	SwRootFrm* pTmpRoot = GetCurrentLayout();//swmod 080219
1936cdf0e10cSrcweir 	if( pTmpRoot &&
1937cdf0e10cSrcweir         !SfxProgress::GetActiveProgress( pDocShell ) )
1938cdf0e10cSrcweir 	{
1939cdf0e10cSrcweir 		ViewShell *pSh, *pStartSh;
1940cdf0e10cSrcweir 		pSh = pStartSh = GetCurrentViewShell();
1941cdf0e10cSrcweir 		do {
1942cdf0e10cSrcweir 			if( pSh->ActionPend() )
1943cdf0e10cSrcweir             {
1944cdf0e10cSrcweir                 if( pTimer )
1945cdf0e10cSrcweir                     pTimer->Start();
1946cdf0e10cSrcweir 				return 0;
1947cdf0e10cSrcweir             }
1948cdf0e10cSrcweir 			pSh = (ViewShell*)pSh->GetNext();
1949cdf0e10cSrcweir 		} while( pSh != pStartSh );
1950cdf0e10cSrcweir 
1951cdf0e10cSrcweir         if( pTmpRoot->IsNeedGrammarCheck() )
1952cdf0e10cSrcweir         {
1953cdf0e10cSrcweir             sal_Bool bIsOnlineSpell = pSh->GetViewOptions()->IsOnlineSpell();
1954cdf0e10cSrcweir             sal_Bool bIsAutoGrammar = sal_False;
1955cdf0e10cSrcweir             SvtLinguConfig().GetProperty( ::rtl::OUString::createFromAscii(
1956cdf0e10cSrcweir                         UPN_IS_GRAMMAR_AUTO ) ) >>= bIsAutoGrammar;
1957cdf0e10cSrcweir 
1958cdf0e10cSrcweir             if (bIsOnlineSpell && bIsAutoGrammar)
1959cdf0e10cSrcweir                 StartGrammarChecking( *this );
1960cdf0e10cSrcweir         }
1961cdf0e10cSrcweir 		SwFldUpdateFlags nFldUpdFlag;
1962cdf0e10cSrcweir 		std::set<SwRootFrm*> aAllLayouts = GetAllLayouts();//swmod 080320
1963cdf0e10cSrcweir 		std::set<SwRootFrm*>::iterator pLayIter = aAllLayouts.begin();
1964cdf0e10cSrcweir 		for ( ;pLayIter != aAllLayouts.end();pLayIter++ )
1965cdf0e10cSrcweir 		{
1966cdf0e10cSrcweir 			if ((*pLayIter)->IsIdleFormat())
1967cdf0e10cSrcweir 			{
1968cdf0e10cSrcweir 				(*pLayIter)->GetCurrShell()->LayoutIdle();
1969cdf0e10cSrcweir 				break;
1970cdf0e10cSrcweir 			}
1971cdf0e10cSrcweir 		}
1972cdf0e10cSrcweir 	    bool bAllValid = pLayIter == aAllLayouts.end() ? 1 : 0;
1973cdf0e10cSrcweir         if( bAllValid && ( AUTOUPD_FIELD_ONLY ==
1974cdf0e10cSrcweir                  ( nFldUpdFlag = getFieldUpdateFlags(true) )
1975cdf0e10cSrcweir 					|| AUTOUPD_FIELD_AND_CHARTS == nFldUpdFlag ) &&
1976cdf0e10cSrcweir 				GetUpdtFlds().IsFieldsDirty() &&
1977cdf0e10cSrcweir 				!GetUpdtFlds().IsInUpdateFlds() &&
1978cdf0e10cSrcweir 				!IsExpFldsLocked()
1979cdf0e10cSrcweir 				// das umschalten der Feldname fuehrt zu keinem Update der
1980cdf0e10cSrcweir 				// Felder, also der "Hintergrund-Update" immer erfolgen
1981cdf0e10cSrcweir 				/* && !pStartSh->GetViewOptions()->IsFldName()*/ )
1982cdf0e10cSrcweir 		{
1983cdf0e10cSrcweir 			// chaos::Action-Klammerung!
1984cdf0e10cSrcweir 			GetUpdtFlds().SetInUpdateFlds( sal_True );
1985cdf0e10cSrcweir 
1986cdf0e10cSrcweir 			pTmpRoot->StartAllAction();
1987cdf0e10cSrcweir 
1988cdf0e10cSrcweir             // no jump on update of fields #i85168#
1989cdf0e10cSrcweir             const sal_Bool bOldLockView = pStartSh->IsViewLocked();
1990cdf0e10cSrcweir             pStartSh->LockView( sal_True );
1991cdf0e10cSrcweir 
1992cdf0e10cSrcweir 			GetSysFldType( RES_CHAPTERFLD )->ModifyNotification( 0, 0 );	// KapitelFld
1993cdf0e10cSrcweir 			UpdateExpFlds( 0, sal_False );		// Expression-Felder Updaten
1994cdf0e10cSrcweir 			UpdateTblFlds(NULL);				// Tabellen
1995cdf0e10cSrcweir 			UpdateRefFlds(NULL);				// Referenzen
1996cdf0e10cSrcweir 
1997cdf0e10cSrcweir 			pTmpRoot->EndAllAction();
1998cdf0e10cSrcweir 
1999cdf0e10cSrcweir             pStartSh->LockView( bOldLockView );
2000cdf0e10cSrcweir 
2001cdf0e10cSrcweir 			GetUpdtFlds().SetInUpdateFlds( sal_False );
2002cdf0e10cSrcweir 			GetUpdtFlds().SetFieldsDirty( sal_False );
2003cdf0e10cSrcweir 		}
2004cdf0e10cSrcweir 	}	//swmod 080219
2005cdf0e10cSrcweir #ifdef TIMELOG
2006cdf0e10cSrcweir 	if( pModLogFile && 1 != (long)pModLogFile )
2007cdf0e10cSrcweir 		delete pModLogFile, ((long&)pModLogFile) = 1;
2008cdf0e10cSrcweir #endif
2009cdf0e10cSrcweir     if( pTimer )
2010cdf0e10cSrcweir         pTimer->Start();
2011cdf0e10cSrcweir 	return 0;
2012cdf0e10cSrcweir }
2013cdf0e10cSrcweir 
IMPL_STATIC_LINK(SwDoc,BackgroundDone,SvxBrushItem *,EMPTYARG)2014cdf0e10cSrcweir IMPL_STATIC_LINK( SwDoc, BackgroundDone, SvxBrushItem*, EMPTYARG )
2015cdf0e10cSrcweir {
2016cdf0e10cSrcweir 	ViewShell *pSh, *pStartSh;
2017cdf0e10cSrcweir 	pSh = pStartSh = pThis->GetCurrentViewShell();	//swmod 071108//swmod 071225
2018cdf0e10cSrcweir 	if( pStartSh )
2019cdf0e10cSrcweir 		do {
2020cdf0e10cSrcweir 			if( pSh->GetWin() )
2021cdf0e10cSrcweir 			{
2022cdf0e10cSrcweir 				//Fuer Repaint mir virtuellen Device sorgen.
2023cdf0e10cSrcweir 				pSh->LockPaint();
2024cdf0e10cSrcweir 				pSh->UnlockPaint( sal_True );
2025cdf0e10cSrcweir 			}
2026cdf0e10cSrcweir 			pSh = (ViewShell*)pSh->GetNext();
2027cdf0e10cSrcweir 		} while( pSh != pStartSh );
2028cdf0e10cSrcweir 	return 0;
2029cdf0e10cSrcweir }
2030cdf0e10cSrcweir 
lcl_GetUniqueFlyName(const SwDoc * pDoc,sal_uInt16 nDefStrId)2031cdf0e10cSrcweir static String lcl_GetUniqueFlyName( const SwDoc* pDoc, sal_uInt16 nDefStrId )
2032cdf0e10cSrcweir {
2033cdf0e10cSrcweir 	ResId aId( nDefStrId, *pSwResMgr );
2034cdf0e10cSrcweir 	String aName( aId );
2035cdf0e10cSrcweir 	xub_StrLen nNmLen = aName.Len();
2036cdf0e10cSrcweir 
2037cdf0e10cSrcweir 	const SwSpzFrmFmts& rFmts = *pDoc->GetSpzFrmFmts();
2038cdf0e10cSrcweir 
2039cdf0e10cSrcweir 	sal_uInt16 nNum, nTmp, nFlagSize = ( rFmts.Count() / 8 ) +2;
2040cdf0e10cSrcweir 	sal_uInt8* pSetFlags = new sal_uInt8[ nFlagSize ];
2041cdf0e10cSrcweir 	sal_uInt16 n;
2042cdf0e10cSrcweir 
2043cdf0e10cSrcweir 	memset( pSetFlags, 0, nFlagSize );
2044cdf0e10cSrcweir 
2045cdf0e10cSrcweir 	for( n = 0; n < rFmts.Count(); ++n )
2046cdf0e10cSrcweir 	{
2047cdf0e10cSrcweir 		const SwFrmFmt* pFlyFmt = rFmts[ n ];
2048cdf0e10cSrcweir 		if( RES_FLYFRMFMT == pFlyFmt->Which() &&
2049cdf0e10cSrcweir 			pFlyFmt->GetName().Match( aName ) == nNmLen )
2050cdf0e10cSrcweir 		{
2051cdf0e10cSrcweir 			// Nummer bestimmen und das Flag setzen
2052cdf0e10cSrcweir             nNum = static_cast< sal_uInt16 >( pFlyFmt->GetName().Copy( nNmLen ).ToInt32() );
2053cdf0e10cSrcweir 			if( nNum-- && nNum < rFmts.Count() )
2054cdf0e10cSrcweir 				pSetFlags[ nNum / 8 ] |= (0x01 << ( nNum & 0x07 ));
2055cdf0e10cSrcweir 		}
2056cdf0e10cSrcweir 	}
2057cdf0e10cSrcweir 
2058cdf0e10cSrcweir 	// alle Nummern entsprechend geflag, also bestimme die richtige Nummer
2059cdf0e10cSrcweir 	nNum = rFmts.Count();
2060cdf0e10cSrcweir 	for( n = 0; n < nFlagSize; ++n )
2061cdf0e10cSrcweir 		if( 0xff != ( nTmp = pSetFlags[ n ] ))
2062cdf0e10cSrcweir 		{
2063cdf0e10cSrcweir 			// also die Nummer bestimmen
2064cdf0e10cSrcweir 			nNum = n * 8;
2065cdf0e10cSrcweir 			while( nTmp & 1 )
2066cdf0e10cSrcweir 				++nNum, nTmp >>= 1;
2067cdf0e10cSrcweir 			break;
2068cdf0e10cSrcweir 		}
2069cdf0e10cSrcweir 
2070cdf0e10cSrcweir 	delete [] pSetFlags;
2071cdf0e10cSrcweir 	return aName += String::CreateFromInt32( ++nNum );
2072cdf0e10cSrcweir }
2073cdf0e10cSrcweir 
GetUniqueGrfName() const2074cdf0e10cSrcweir String SwDoc::GetUniqueGrfName() const
2075cdf0e10cSrcweir {
2076cdf0e10cSrcweir 	return lcl_GetUniqueFlyName( this, STR_GRAPHIC_DEFNAME );
2077cdf0e10cSrcweir }
2078cdf0e10cSrcweir 
GetUniqueOLEName() const2079cdf0e10cSrcweir String SwDoc::GetUniqueOLEName() const
2080cdf0e10cSrcweir {
2081cdf0e10cSrcweir 	return lcl_GetUniqueFlyName( this, STR_OBJECT_DEFNAME );
2082cdf0e10cSrcweir }
2083cdf0e10cSrcweir 
GetUniqueFrameName() const2084cdf0e10cSrcweir String SwDoc::GetUniqueFrameName() const
2085cdf0e10cSrcweir {
2086cdf0e10cSrcweir 	return lcl_GetUniqueFlyName( this, STR_FRAME_DEFNAME );
2087cdf0e10cSrcweir }
2088cdf0e10cSrcweir 
FindFlyByName(const String & rName,sal_Int8 nNdTyp) const2089cdf0e10cSrcweir const SwFlyFrmFmt* SwDoc::FindFlyByName( const String& rName, sal_Int8 nNdTyp ) const
2090cdf0e10cSrcweir {
2091cdf0e10cSrcweir 	const SwSpzFrmFmts& rFmts = *GetSpzFrmFmts();
2092cdf0e10cSrcweir 	for( sal_uInt16 n = rFmts.Count(); n; )
2093cdf0e10cSrcweir 	{
2094cdf0e10cSrcweir 		const SwFrmFmt* pFlyFmt = rFmts[ --n ];
2095cdf0e10cSrcweir 		const SwNodeIndex* pIdx;
2096cdf0e10cSrcweir 		if( RES_FLYFRMFMT == pFlyFmt->Which() && pFlyFmt->GetName() == rName &&
2097cdf0e10cSrcweir 			0 != ( pIdx = pFlyFmt->GetCntnt().GetCntntIdx() ) &&
2098cdf0e10cSrcweir 			pIdx->GetNode().GetNodes().IsDocNodes() )
2099cdf0e10cSrcweir 		{
2100cdf0e10cSrcweir 			if( nNdTyp )
2101cdf0e10cSrcweir 			{
2102cdf0e10cSrcweir 				// dann noch auf den richtigen Node-Typ abfragen
2103cdf0e10cSrcweir 				const SwNode* pNd = GetNodes()[ pIdx->GetIndex()+1 ];
2104cdf0e10cSrcweir 				if( nNdTyp == ND_TEXTNODE
2105cdf0e10cSrcweir 						? !pNd->IsNoTxtNode()
2106cdf0e10cSrcweir 						: nNdTyp == pNd->GetNodeType() )
2107cdf0e10cSrcweir 					return (SwFlyFrmFmt*)pFlyFmt;
2108cdf0e10cSrcweir 			}
2109cdf0e10cSrcweir 			else
2110cdf0e10cSrcweir 				return (SwFlyFrmFmt*)pFlyFmt;
2111cdf0e10cSrcweir 		}
2112cdf0e10cSrcweir 	}
2113cdf0e10cSrcweir 	return 0;
2114cdf0e10cSrcweir }
2115cdf0e10cSrcweir 
SetFlyName(SwFlyFrmFmt & rFmt,const String & rName)2116cdf0e10cSrcweir void SwDoc::SetFlyName( SwFlyFrmFmt& rFmt, const String& rName )
2117cdf0e10cSrcweir {
2118cdf0e10cSrcweir 	String sName( rName );
2119cdf0e10cSrcweir 	if( !rName.Len() || FindFlyByName( rName ) )
2120cdf0e10cSrcweir 	{
2121cdf0e10cSrcweir 		sal_uInt16 nTyp = STR_FRAME_DEFNAME;
2122cdf0e10cSrcweir 		const SwNodeIndex* pIdx = rFmt.GetCntnt().GetCntntIdx();
2123cdf0e10cSrcweir 		if( pIdx && pIdx->GetNode().GetNodes().IsDocNodes() )
2124cdf0e10cSrcweir 			switch( GetNodes()[ pIdx->GetIndex() + 1 ]->GetNodeType() )
2125cdf0e10cSrcweir 			{
2126cdf0e10cSrcweir 			case ND_GRFNODE:	nTyp = STR_GRAPHIC_DEFNAME;	break;
2127cdf0e10cSrcweir 			case ND_OLENODE:	nTyp = STR_OBJECT_DEFNAME;	break;
2128cdf0e10cSrcweir 			}
2129cdf0e10cSrcweir 		sName = lcl_GetUniqueFlyName( this, nTyp );
2130cdf0e10cSrcweir 	}
2131cdf0e10cSrcweir 	rFmt.SetName( sName, sal_True );
2132cdf0e10cSrcweir     SetModified();
2133cdf0e10cSrcweir }
2134cdf0e10cSrcweir 
SetAllUniqueFlyNames()2135cdf0e10cSrcweir void SwDoc::SetAllUniqueFlyNames()
2136cdf0e10cSrcweir {
2137cdf0e10cSrcweir 	sal_uInt16 n, nFlyNum = 0, nGrfNum = 0, nOLENum = 0;
2138cdf0e10cSrcweir 
2139cdf0e10cSrcweir 	ResId nFrmId( STR_FRAME_DEFNAME, *pSwResMgr ),
2140cdf0e10cSrcweir 		  nGrfId( STR_GRAPHIC_DEFNAME, *pSwResMgr ),
2141cdf0e10cSrcweir 		  nOLEId( STR_OBJECT_DEFNAME, *pSwResMgr );
2142cdf0e10cSrcweir 	String sFlyNm( nFrmId );
2143cdf0e10cSrcweir 	String sGrfNm( nGrfId );
2144cdf0e10cSrcweir 	String sOLENm( nOLEId );
2145cdf0e10cSrcweir 
2146cdf0e10cSrcweir 	if( 255 < ( n = GetSpzFrmFmts()->Count() ))
2147cdf0e10cSrcweir 		n = 255;
2148cdf0e10cSrcweir 	SwSpzFrmFmts aArr( (sal_Int8)n, 10 );
2149cdf0e10cSrcweir 	SwFrmFmtPtr pFlyFmt;
21506fddd742SOliver-Rainer Wittmann 	bool bContainsAtPageObjWithContentAnchor = false;
2151cdf0e10cSrcweir 
2152cdf0e10cSrcweir 	for( n = GetSpzFrmFmts()->Count(); n; )
2153cdf0e10cSrcweir 	{
2154cdf0e10cSrcweir 		if( RES_FLYFRMFMT == (pFlyFmt = (*GetSpzFrmFmts())[ --n ])->Which() )
2155cdf0e10cSrcweir 		{
2156cdf0e10cSrcweir 			sal_uInt16 *pNum = 0;
2157cdf0e10cSrcweir 			xub_StrLen nLen;
2158cdf0e10cSrcweir 			const String& rNm = pFlyFmt->GetName();
2159cdf0e10cSrcweir 			if( rNm.Len() )
2160cdf0e10cSrcweir 			{
2161cdf0e10cSrcweir 				if( rNm.Match( sGrfNm ) == ( nLen = sGrfNm.Len() ))
2162cdf0e10cSrcweir 					pNum = &nGrfNum;
2163cdf0e10cSrcweir 				else if( rNm.Match( sFlyNm ) == ( nLen = sFlyNm.Len() ))
2164cdf0e10cSrcweir 					pNum = &nFlyNum;
2165cdf0e10cSrcweir 				else if( rNm.Match( sOLENm ) == ( nLen = sOLENm.Len() ))
2166cdf0e10cSrcweir 					pNum = &nOLENum;
2167cdf0e10cSrcweir 
2168cdf0e10cSrcweir                 if ( pNum && *pNum < ( nLen = static_cast< xub_StrLen >( rNm.Copy( nLen ).ToInt32() ) ) )
2169cdf0e10cSrcweir 					*pNum = nLen;
2170cdf0e10cSrcweir 			}
2171cdf0e10cSrcweir 			else
2172cdf0e10cSrcweir 				// das wollen wir nachher setzen
2173cdf0e10cSrcweir 				aArr.Insert( pFlyFmt, aArr.Count() );
2174cdf0e10cSrcweir 
2175cdf0e10cSrcweir 		}
21766fddd742SOliver-Rainer Wittmann 		if ( !bContainsAtPageObjWithContentAnchor )
2177cdf0e10cSrcweir 		{
2178cdf0e10cSrcweir 			const SwFmtAnchor& rAnchor = pFlyFmt->GetAnchor();
21796fddd742SOliver-Rainer Wittmann             if ( (FLY_AT_PAGE == rAnchor.GetAnchorId()) &&
21806fddd742SOliver-Rainer Wittmann                  rAnchor.GetCntntAnchor() )
2181cdf0e10cSrcweir             {
21826fddd742SOliver-Rainer Wittmann 				bContainsAtPageObjWithContentAnchor = true;
2183cdf0e10cSrcweir             }
2184cdf0e10cSrcweir 		}
2185cdf0e10cSrcweir 	}
21866fddd742SOliver-Rainer Wittmann     SetContainsAtPageObjWithContentAnchor( bContainsAtPageObjWithContentAnchor );
2187cdf0e10cSrcweir 
2188cdf0e10cSrcweir 	const SwNodeIndex* pIdx;
2189cdf0e10cSrcweir 
2190cdf0e10cSrcweir 	for( n = aArr.Count(); n; )
2191cdf0e10cSrcweir 		if( 0 != ( pIdx = ( pFlyFmt = aArr[ --n ])->GetCntnt().GetCntntIdx() )
2192cdf0e10cSrcweir 			&& pIdx->GetNode().GetNodes().IsDocNodes() )
2193cdf0e10cSrcweir 		{
2194cdf0e10cSrcweir 			sal_uInt16 nNum;
2195cdf0e10cSrcweir 			String sNm;
2196cdf0e10cSrcweir 			switch( GetNodes()[ pIdx->GetIndex() + 1 ]->GetNodeType() )
2197cdf0e10cSrcweir 			{
2198cdf0e10cSrcweir 			case ND_GRFNODE:
2199cdf0e10cSrcweir 				sNm = sGrfNm;
2200cdf0e10cSrcweir 				nNum = ++nGrfNum;
2201cdf0e10cSrcweir 				break;
2202cdf0e10cSrcweir 			case ND_OLENODE:
2203cdf0e10cSrcweir 				sNm = sOLENm;
2204cdf0e10cSrcweir 				nNum = ++nOLENum;
2205cdf0e10cSrcweir 				break;
2206cdf0e10cSrcweir 			default:
2207cdf0e10cSrcweir 				sNm = sFlyNm;
2208cdf0e10cSrcweir 				nNum = ++nFlyNum;
2209cdf0e10cSrcweir 				break;
2210cdf0e10cSrcweir 			}
2211cdf0e10cSrcweir 			pFlyFmt->SetName( sNm += String::CreateFromInt32( nNum ));
2212cdf0e10cSrcweir 		}
2213cdf0e10cSrcweir 	aArr.Remove( 0, aArr.Count() );
2214cdf0e10cSrcweir 
2215cdf0e10cSrcweir 	if( GetFtnIdxs().Count() )
2216cdf0e10cSrcweir 	{
2217cdf0e10cSrcweir 		SwTxtFtn::SetUniqueSeqRefNo( *this );
2218cdf0e10cSrcweir         // --> FME 2005-08-02 #i52775# Chapter footnotes did not
2219cdf0e10cSrcweir         // get updated correctly. Calling UpdateAllFtn() instead of
2220cdf0e10cSrcweir         // UpdateFtn() solves this problem, but I do not dare to
2221cdf0e10cSrcweir         // call UpdateAllFtn() in all cases: Safety first.
2222cdf0e10cSrcweir         if ( FTNNUM_CHAPTER == GetFtnInfo().eNum )
2223cdf0e10cSrcweir         {
2224cdf0e10cSrcweir             GetFtnIdxs().UpdateAllFtn();
2225cdf0e10cSrcweir         }
2226cdf0e10cSrcweir         // <--
2227cdf0e10cSrcweir         else
2228cdf0e10cSrcweir         {
2229cdf0e10cSrcweir             SwNodeIndex aTmp( GetNodes() );
2230cdf0e10cSrcweir             GetFtnIdxs().UpdateFtn( aTmp );
2231cdf0e10cSrcweir         }
2232cdf0e10cSrcweir     }
2233cdf0e10cSrcweir }
2234cdf0e10cSrcweir 
IsInHeaderFooter(const SwNodeIndex & rIdx) const2235cdf0e10cSrcweir sal_Bool SwDoc::IsInHeaderFooter( const SwNodeIndex& rIdx ) const
2236cdf0e10cSrcweir {
2237cdf0e10cSrcweir 	// gibt es ein Layout, dann ueber das laufen!!
2238cdf0e10cSrcweir 	//	(Das kann dann auch Fly in Fly in Kopfzeile !)
2239cdf0e10cSrcweir 	// MIB 9.2.98: Wird auch vom sw3io benutzt, um festzustellen, ob sich
2240cdf0e10cSrcweir 	// ein Redline-Objekt in einer Kopf- oder Fusszeile befindet. Da
2241cdf0e10cSrcweir 	// Redlines auch an Start- und Endnodes haengen, muss der Index nicht
2242cdf0e10cSrcweir 	// unbedingt der eines Content-Nodes sein.
2243cdf0e10cSrcweir 	SwNode* pNd = &rIdx.GetNode();
2244cdf0e10cSrcweir 	if( pNd->IsCntntNode() && pCurrentView )//swmod 071029//swmod 071225
2245cdf0e10cSrcweir 	{
2246cdf0e10cSrcweir         const SwFrm *pFrm = pNd->GetCntntNode()->getLayoutFrm( GetCurrentLayout() );
2247cdf0e10cSrcweir 		if( pFrm )
2248cdf0e10cSrcweir 		{
2249cdf0e10cSrcweir             const SwFrm *pUp = pFrm->GetUpper();
2250cdf0e10cSrcweir 			while ( pUp && !pUp->IsHeaderFrm() && !pUp->IsFooterFrm() )
2251cdf0e10cSrcweir 			{
2252cdf0e10cSrcweir 				if ( pUp->IsFlyFrm() )
2253cdf0e10cSrcweir                     pUp = ((SwFlyFrm*)pUp)->GetAnchorFrm();
2254cdf0e10cSrcweir 				pUp = pUp->GetUpper();
2255cdf0e10cSrcweir 			}
2256cdf0e10cSrcweir 			if ( pUp )
2257cdf0e10cSrcweir 				return sal_True;
2258cdf0e10cSrcweir 
2259cdf0e10cSrcweir 			return sal_False;
2260cdf0e10cSrcweir 		}
2261cdf0e10cSrcweir 	}
2262cdf0e10cSrcweir 
2263cdf0e10cSrcweir 
2264cdf0e10cSrcweir 	const SwNode* pFlyNd = pNd->FindFlyStartNode();
2265cdf0e10cSrcweir 	while( pFlyNd )
2266cdf0e10cSrcweir 	{
2267cdf0e10cSrcweir 		// dann ueber den Anker nach oben "hangeln"
2268cdf0e10cSrcweir 		sal_uInt16 n;
2269cdf0e10cSrcweir 		for( n = 0; n < GetSpzFrmFmts()->Count(); ++n )
2270cdf0e10cSrcweir 		{
2271cdf0e10cSrcweir 			const SwFrmFmt* pFmt = (*GetSpzFrmFmts())[ n ];
2272cdf0e10cSrcweir 			const SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
2273cdf0e10cSrcweir 			if( pIdx && pFlyNd == &pIdx->GetNode() )
2274cdf0e10cSrcweir 			{
2275cdf0e10cSrcweir 				const SwFmtAnchor& rAnchor = pFmt->GetAnchor();
2276cdf0e10cSrcweir                 if ((FLY_AT_PAGE == rAnchor.GetAnchorId()) ||
2277cdf0e10cSrcweir 					!rAnchor.GetCntntAnchor() )
2278cdf0e10cSrcweir                 {
2279cdf0e10cSrcweir 					return sal_False;
2280cdf0e10cSrcweir                 }
2281cdf0e10cSrcweir 
2282cdf0e10cSrcweir 				pNd = &rAnchor.GetCntntAnchor()->nNode.GetNode();
2283cdf0e10cSrcweir 				pFlyNd = pNd->FindFlyStartNode();
2284cdf0e10cSrcweir 				break;
2285cdf0e10cSrcweir 			}
2286cdf0e10cSrcweir 		}
2287cdf0e10cSrcweir 		if( n >= GetSpzFrmFmts()->Count() )
2288cdf0e10cSrcweir 		{
2289cdf0e10cSrcweir 			ASSERT( mbInReading, "Fly-Section aber kein Format gefunden" );
2290cdf0e10cSrcweir 			return sal_False;
2291cdf0e10cSrcweir 		}
2292cdf0e10cSrcweir 	}
2293cdf0e10cSrcweir 
2294cdf0e10cSrcweir 	return 0 != pNd->FindHeaderStartNode() ||
2295cdf0e10cSrcweir 			0 != pNd->FindFooterStartNode();
2296cdf0e10cSrcweir }
2297cdf0e10cSrcweir 
GetTextDirection(const SwPosition & rPos,const Point * pPt) const2298cdf0e10cSrcweir short SwDoc::GetTextDirection( const SwPosition& rPos,
2299cdf0e10cSrcweir                                const Point* pPt ) const
2300cdf0e10cSrcweir {
2301cdf0e10cSrcweir     short nRet = -1;
2302cdf0e10cSrcweir 
2303cdf0e10cSrcweir 	SwCntntNode *pNd = rPos.nNode.GetNode().GetCntntNode();
2304cdf0e10cSrcweir 
2305cdf0e10cSrcweir     // --> OD 2005-02-21 #i42921# - use new method <SwCntntNode::GetTextDirection(..)>
2306cdf0e10cSrcweir     if ( pNd )
2307cdf0e10cSrcweir     {
2308cdf0e10cSrcweir         nRet = pNd->GetTextDirection( rPos, pPt );
2309cdf0e10cSrcweir     }
2310cdf0e10cSrcweir     if ( nRet == -1 )
2311cdf0e10cSrcweir     // <--
2312cdf0e10cSrcweir 	{
2313cdf0e10cSrcweir 		const SvxFrameDirectionItem* pItem = 0;
2314cdf0e10cSrcweir 		if( pNd )
2315cdf0e10cSrcweir 		{
2316cdf0e10cSrcweir 			// in a flyframe? Then look at that for the correct attribute
2317cdf0e10cSrcweir 			const SwFrmFmt* pFlyFmt = pNd->GetFlyFmt();
2318cdf0e10cSrcweir 			while( pFlyFmt )
2319cdf0e10cSrcweir 			{
2320cdf0e10cSrcweir 				pItem = &pFlyFmt->GetFrmDir();
2321cdf0e10cSrcweir 				if( FRMDIR_ENVIRONMENT == pItem->GetValue() )
2322cdf0e10cSrcweir 				{
2323cdf0e10cSrcweir 					pItem = 0;
2324cdf0e10cSrcweir 					const SwFmtAnchor* pAnchor = &pFlyFmt->GetAnchor();
2325cdf0e10cSrcweir                     if ((FLY_AT_PAGE != pAnchor->GetAnchorId()) &&
2326cdf0e10cSrcweir                         pAnchor->GetCntntAnchor())
2327cdf0e10cSrcweir                     {
2328cdf0e10cSrcweir 						pFlyFmt = pAnchor->GetCntntAnchor()->nNode.
2329cdf0e10cSrcweir 											GetNode().GetFlyFmt();
2330cdf0e10cSrcweir                     }
2331cdf0e10cSrcweir 					else
2332cdf0e10cSrcweir 						pFlyFmt = 0;
2333cdf0e10cSrcweir 				}
2334cdf0e10cSrcweir 				else
2335cdf0e10cSrcweir 					pFlyFmt = 0;
2336cdf0e10cSrcweir 			}
2337cdf0e10cSrcweir 
2338cdf0e10cSrcweir 			if( !pItem )
2339cdf0e10cSrcweir 			{
2340cdf0e10cSrcweir 				const SwPageDesc* pPgDsc = pNd->FindPageDesc( sal_False );
2341cdf0e10cSrcweir 				if( pPgDsc )
2342cdf0e10cSrcweir 					pItem = &pPgDsc->GetMaster().GetFrmDir();
2343cdf0e10cSrcweir 			}
2344cdf0e10cSrcweir 		}
2345cdf0e10cSrcweir 		if( !pItem )
2346cdf0e10cSrcweir 			pItem = (SvxFrameDirectionItem*)&GetAttrPool().GetDefaultItem(
2347cdf0e10cSrcweir 															RES_FRAMEDIR );
2348cdf0e10cSrcweir         nRet = pItem->GetValue();
2349cdf0e10cSrcweir 	}
2350cdf0e10cSrcweir     return nRet;
2351cdf0e10cSrcweir }
2352cdf0e10cSrcweir 
IsInVerticalText(const SwPosition & rPos,const Point * pPt) const2353cdf0e10cSrcweir sal_Bool SwDoc::IsInVerticalText( const SwPosition& rPos, const Point* pPt ) const
2354cdf0e10cSrcweir {
2355cdf0e10cSrcweir     const short nDir = GetTextDirection( rPos, pPt );
2356cdf0e10cSrcweir     return FRMDIR_VERT_TOP_RIGHT == nDir || FRMDIR_VERT_TOP_LEFT == nDir;
2357cdf0e10cSrcweir }
2358cdf0e10cSrcweir 
SetCurrentViewShell(ViewShell * pNew)2359cdf0e10cSrcweir void SwDoc::SetCurrentViewShell( ViewShell* pNew )
2360cdf0e10cSrcweir {
2361cdf0e10cSrcweir     pCurrentView = pNew;
2362cdf0e10cSrcweir }
2363cdf0e10cSrcweir 
GetLayouter()2364cdf0e10cSrcweir SwLayouter* SwDoc::GetLayouter()
2365cdf0e10cSrcweir {
2366cdf0e10cSrcweir     return pLayouter;
2367cdf0e10cSrcweir }
2368cdf0e10cSrcweir 
GetLayouter() const2369cdf0e10cSrcweir const SwLayouter* SwDoc::GetLayouter() const
2370cdf0e10cSrcweir {
2371cdf0e10cSrcweir     return pLayouter;
2372cdf0e10cSrcweir }
2373cdf0e10cSrcweir 
SetLayouter(SwLayouter * pNew)2374cdf0e10cSrcweir void SwDoc::SetLayouter( SwLayouter* pNew )
2375cdf0e10cSrcweir {
2376cdf0e10cSrcweir     pLayouter = pNew;
2377cdf0e10cSrcweir }
2378cdf0e10cSrcweir 
GetCurrentViewShell() const2379cdf0e10cSrcweir const ViewShell *SwDoc::GetCurrentViewShell() const
2380cdf0e10cSrcweir {
2381cdf0e10cSrcweir     return pCurrentView;
2382cdf0e10cSrcweir }
2383cdf0e10cSrcweir 
GetCurrentViewShell()2384cdf0e10cSrcweir ViewShell *SwDoc::GetCurrentViewShell()
2385cdf0e10cSrcweir {
2386cdf0e10cSrcweir     return pCurrentView;
2387cdf0e10cSrcweir }	//swmod 080219 It must be able to communicate to a ViewShell.This is going to be removedd later.
2388cdf0e10cSrcweir 
GetCurrentLayout() const2389cdf0e10cSrcweir const SwRootFrm *SwDoc::GetCurrentLayout() const
2390cdf0e10cSrcweir {
2391cdf0e10cSrcweir 	if(GetCurrentViewShell())
2392cdf0e10cSrcweir 		return GetCurrentViewShell()->GetLayout();
2393cdf0e10cSrcweir 	return 0;
2394cdf0e10cSrcweir }
2395cdf0e10cSrcweir 
GetCurrentLayout()2396cdf0e10cSrcweir SwRootFrm *SwDoc::GetCurrentLayout()
2397cdf0e10cSrcweir {
2398cdf0e10cSrcweir 	if(GetCurrentViewShell())
2399cdf0e10cSrcweir 		return GetCurrentViewShell()->GetLayout();
2400cdf0e10cSrcweir 	return 0;
2401cdf0e10cSrcweir }
2402cdf0e10cSrcweir 
HasLayout() const2403cdf0e10cSrcweir bool SwDoc::HasLayout() const
2404cdf0e10cSrcweir {
2405cdf0e10cSrcweir     // if there is a view, there is always a layout
2406cdf0e10cSrcweir     return (pCurrentView != 0);
2407cdf0e10cSrcweir }
2408cdf0e10cSrcweir 
GetAllLayouts()2409cdf0e10cSrcweir std::set<SwRootFrm*> SwDoc::GetAllLayouts()
2410cdf0e10cSrcweir {
2411cdf0e10cSrcweir     std::set<SwRootFrm*> aAllLayouts;
2412cdf0e10cSrcweir     ViewShell *pStart = GetCurrentViewShell();
2413cdf0e10cSrcweir     ViewShell *pTemp = pStart;
2414cdf0e10cSrcweir     if ( pTemp )
2415cdf0e10cSrcweir     {
2416cdf0e10cSrcweir         do
2417cdf0e10cSrcweir         {
2418cdf0e10cSrcweir             if (pTemp->GetLayout())
2419cdf0e10cSrcweir             {
2420cdf0e10cSrcweir                 aAllLayouts.insert(pTemp->GetLayout());
2421cdf0e10cSrcweir                 pTemp = (ViewShell*)pTemp->GetNext();
2422cdf0e10cSrcweir             }
2423cdf0e10cSrcweir         } while(pTemp!=pStart);
2424cdf0e10cSrcweir     }
2425cdf0e10cSrcweir 
2426cdf0e10cSrcweir     return aAllLayouts;
2427cdf0e10cSrcweir }//swmod 070825
24288bfab1dfSMathias Bauer 
24298bfab1dfSMathias Bauer 
ShareLayout(boost::shared_ptr<SwRootFrm> & rPtr)24308bfab1dfSMathias Bauer void SwDoc::ShareLayout(boost::shared_ptr<SwRootFrm>& rPtr)
24318bfab1dfSMathias Bauer {
24328bfab1dfSMathias Bauer     pLayoutPtr = rPtr;
24338bfab1dfSMathias Bauer }
24348bfab1dfSMathias Bauer 
2435