xref: /aoo41x/main/sw/source/core/txtnode/ndtxt.cxx (revision 808c4840)
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
10efeef26fSAndrew Rist  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12efeef26fSAndrew Rist  *
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.
19efeef26fSAndrew Rist  *
20efeef26fSAndrew Rist  *************************************************************/
21efeef26fSAndrew Rist 
22efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir #include <hintids.hxx>
27cdf0e10cSrcweir #include <hints.hxx>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <editeng/fontitem.hxx>
30cdf0e10cSrcweir #include <editeng/brkitem.hxx>
31cdf0e10cSrcweir #include <editeng/escpitem.hxx>
32cdf0e10cSrcweir #include <editeng/lrspitem.hxx>
33cdf0e10cSrcweir #include <editeng/tstpitem.hxx>
34cdf0e10cSrcweir #include <svl/urihelper.hxx>
35cdf0e10cSrcweir #ifndef _SVSTDARR_HXX
36cdf0e10cSrcweir #define _SVSTDARR_ULONGS
37cdf0e10cSrcweir #include <svl/svstdarr.hxx>
38cdf0e10cSrcweir #endif
39cdf0e10cSrcweir #include <svl/ctloptions.hxx>
40cdf0e10cSrcweir #include <swmodule.hxx>
41cdf0e10cSrcweir #include <txtfld.hxx>
42cdf0e10cSrcweir #include <txtinet.hxx>
43cdf0e10cSrcweir #include <fmtinfmt.hxx>
44cdf0e10cSrcweir #include <fmtpdsc.hxx>
45cdf0e10cSrcweir #include <txtatr.hxx>
46cdf0e10cSrcweir #include <fmtrfmrk.hxx>
47cdf0e10cSrcweir #include <txttxmrk.hxx>
48cdf0e10cSrcweir #include <fchrfmt.hxx>
49cdf0e10cSrcweir #include <txtftn.hxx>
50cdf0e10cSrcweir #include <fmtflcnt.hxx>
51cdf0e10cSrcweir #include <fmtfld.hxx>
52cdf0e10cSrcweir #include <frmatr.hxx>
53cdf0e10cSrcweir #include <charatr.hxx>
54cdf0e10cSrcweir #include <ftnidx.hxx>
55cdf0e10cSrcweir #include <ftninfo.hxx>
56cdf0e10cSrcweir #include <fmtftn.hxx>
57cdf0e10cSrcweir #include <fmtmeta.hxx>
58cdf0e10cSrcweir #include <charfmt.hxx>
59cdf0e10cSrcweir #include <ndtxt.hxx>
60cdf0e10cSrcweir #include <doc.hxx>
61cdf0e10cSrcweir #include <IDocumentUndoRedo.hxx>
62cdf0e10cSrcweir #include <docary.hxx>
63cdf0e10cSrcweir #include <pam.hxx>					// fuer SwPosition
64cdf0e10cSrcweir #include <fldbas.hxx>
65cdf0e10cSrcweir #include <errhdl.hxx>
66cdf0e10cSrcweir #include <paratr.hxx>
67cdf0e10cSrcweir #include <txtfrm.hxx>
68cdf0e10cSrcweir #include <ftnfrm.hxx>
69cdf0e10cSrcweir #include <ftnboss.hxx>
70cdf0e10cSrcweir #include <rootfrm.hxx>
71cdf0e10cSrcweir #include <pagedesc.hxx>				// fuer SwPageDesc
72cdf0e10cSrcweir #include <expfld.hxx>				// fuer SwTblField
73cdf0e10cSrcweir #include <section.hxx>				// fuer SwSection
74cdf0e10cSrcweir #include <mvsave.hxx>
75cdf0e10cSrcweir #include <swcache.hxx>
76cdf0e10cSrcweir #include <SwGrammarMarkUp.hxx>
77cdf0e10cSrcweir #include <dcontact.hxx>
78cdf0e10cSrcweir #include <redline.hxx>
79cdf0e10cSrcweir #include <doctxm.hxx>
80cdf0e10cSrcweir #include <IMark.hxx>
81cdf0e10cSrcweir #include <scriptinfo.hxx>
82cdf0e10cSrcweir #include <istyleaccess.hxx>
83cdf0e10cSrcweir #include <SwStyleNameMapper.hxx>
84cdf0e10cSrcweir #include <numrule.hxx>
85cdf0e10cSrcweir #include <svl/intitem.hxx>
86cdf0e10cSrcweir #include <swtable.hxx>
87cdf0e10cSrcweir #include <docsh.hxx>
88cdf0e10cSrcweir #include <SwNodeNum.hxx>
89cdf0e10cSrcweir #include <svl/intitem.hxx>
90cdf0e10cSrcweir #include <list.hxx>
91cdf0e10cSrcweir #include <switerator.hxx>
92cdf0e10cSrcweir #include <attrhint.hxx>
93cdf0e10cSrcweir 
94cdf0e10cSrcweir 
95cdf0e10cSrcweir using namespace ::com::sun::star;
96cdf0e10cSrcweir 
97cdf0e10cSrcweir 
98cdf0e10cSrcweir SV_DECL_PTRARR( TmpHints, SwTxtAttr*, 0, 4 )
99cdf0e10cSrcweir 
TYPEINIT1(SwTxtNode,SwCntntNode)100cdf0e10cSrcweir TYPEINIT1( SwTxtNode, SwCntntNode )
101cdf0e10cSrcweir 
102cdf0e10cSrcweir SV_DECL_PTRARR(SwpHts,SwTxtAttr*,1,1)
103cdf0e10cSrcweir 
104cdf0e10cSrcweir // Leider ist das SwpHints nicht ganz wasserdicht:
105cdf0e10cSrcweir // Jeder darf an den Hints rumfummeln, ohne die Sortierreihenfolge
106cdf0e10cSrcweir // und Verkettung sicherstellen zu muessen.
107cdf0e10cSrcweir #ifdef DBG_UTIL
108cdf0e10cSrcweir #define CHECK_SWPHINTS(pNd)  { if( pNd->GetpSwpHints() && \
109cdf0e10cSrcweir                                    !pNd->GetDoc()->IsInReading() ) \
110cdf0e10cSrcweir 								  pNd->GetpSwpHints()->Check(); }
111cdf0e10cSrcweir #else
112cdf0e10cSrcweir #define CHECK_SWPHINTS(pNd)
113cdf0e10cSrcweir #endif
114cdf0e10cSrcweir 
115cdf0e10cSrcweir SwTxtNode *SwNodes::MakeTxtNode( const SwNodeIndex & rWhere,
116cdf0e10cSrcweir 								 SwTxtFmtColl *pColl,
117cdf0e10cSrcweir 								 SwAttrSet* pAutoAttr )
118cdf0e10cSrcweir {
119cdf0e10cSrcweir 	ASSERT( pColl, "Collectionpointer ist 0." );
120cdf0e10cSrcweir 
121cdf0e10cSrcweir 	SwTxtNode *pNode = new SwTxtNode( rWhere, pColl, pAutoAttr );
122cdf0e10cSrcweir 
123cdf0e10cSrcweir 	SwNodeIndex aIdx( *pNode );
124cdf0e10cSrcweir 
125cdf0e10cSrcweir     // --> OD 2005-11-03 #125329#
126cdf0e10cSrcweir     // call method <UpdateOutlineNode(..)> only for the document nodes array
127cdf0e10cSrcweir     if ( IsDocNodes() )
128cdf0e10cSrcweir         UpdateOutlineNode(*pNode);
129cdf0e10cSrcweir 
130cdf0e10cSrcweir 	//Wenn es noch kein Layout gibt oder in einer versteckten Section
131cdf0e10cSrcweir 	// stehen, brauchen wir uns um das MakeFrms nicht bemuehen.
132cdf0e10cSrcweir 	const SwSectionNode* pSectNd;
133cdf0e10cSrcweir 	if( !GetDoc()->GetCurrentViewShell() ||	//swmod 071108//swmod 071225
134cdf0e10cSrcweir 		( 0 != (pSectNd = pNode->FindSectionNode()) &&
135cdf0e10cSrcweir 			pSectNd->GetSection().IsHiddenFlag() ))
136cdf0e10cSrcweir 		return pNode;
137cdf0e10cSrcweir 
138cdf0e10cSrcweir 	SwNodeIndex aTmp( rWhere );
139cdf0e10cSrcweir 	do {
140cdf0e10cSrcweir 		// max. 2 Durchlaeufe:
141cdf0e10cSrcweir 		// 1. den Nachfolger nehmen
142cdf0e10cSrcweir 		// 2. den Vorgaenger
143cdf0e10cSrcweir 
144cdf0e10cSrcweir         SwNode * pNd = & aTmp.GetNode();
145cdf0e10cSrcweir         switch (pNd->GetNodeType())
146cdf0e10cSrcweir 		{
147cdf0e10cSrcweir 		case ND_TABLENODE:
148cdf0e10cSrcweir 			((SwTableNode*)pNd)->MakeFrms( aIdx );
149cdf0e10cSrcweir 			return pNode;
150cdf0e10cSrcweir 
151cdf0e10cSrcweir 		case ND_SECTIONNODE:
152cdf0e10cSrcweir 			if( ((SwSectionNode*)pNd)->GetSection().IsHidden() ||
153cdf0e10cSrcweir 				((SwSectionNode*)pNd)->IsCntntHidden() )
154cdf0e10cSrcweir 			{
155cdf0e10cSrcweir 				SwNodeIndex aTmpIdx( *pNode );
156cdf0e10cSrcweir 				pNd = FindPrvNxtFrmNode( aTmpIdx, pNode );
157cdf0e10cSrcweir 				if( !pNd )
158cdf0e10cSrcweir 					return pNode;
159cdf0e10cSrcweir 				aTmp = *pNd;
160cdf0e10cSrcweir 				break;
161cdf0e10cSrcweir 			}
162cdf0e10cSrcweir 			((SwSectionNode*)pNd)->MakeFrms( aIdx );
163cdf0e10cSrcweir 			return pNode;
164cdf0e10cSrcweir 
165cdf0e10cSrcweir 		case ND_TEXTNODE:
166cdf0e10cSrcweir 		case ND_GRFNODE:
167cdf0e10cSrcweir 		case ND_OLENODE:
168cdf0e10cSrcweir 			((SwCntntNode*)pNd)->MakeFrms( *pNode );
169cdf0e10cSrcweir 			return pNode;
170cdf0e10cSrcweir 
171cdf0e10cSrcweir 		case ND_ENDNODE:
172cdf0e10cSrcweir             if( pNd->StartOfSectionNode()->IsSectionNode() &&
173cdf0e10cSrcweir 				aTmp.GetIndex() < rWhere.GetIndex() )
174cdf0e10cSrcweir 			{
175cdf0e10cSrcweir                 if( pNd->StartOfSectionNode()->GetSectionNode()->GetSection().IsHiddenFlag())
176cdf0e10cSrcweir 				{
177cdf0e10cSrcweir 					if( !GoPrevSection( &aTmp, sal_True, sal_False ) ||
178cdf0e10cSrcweir 						aTmp.GetNode().FindTableNode() !=
179cdf0e10cSrcweir 							pNode->FindTableNode() )
180cdf0e10cSrcweir 						return pNode;		// schade, das wars
181cdf0e10cSrcweir 				}
182cdf0e10cSrcweir 				else
183cdf0e10cSrcweir                     aTmp = *pNd->StartOfSectionNode();
184cdf0e10cSrcweir 				break;
185cdf0e10cSrcweir 			}
186cdf0e10cSrcweir             else if( pNd->StartOfSectionNode()->IsTableNode() &&
187cdf0e10cSrcweir 					aTmp.GetIndex() < rWhere.GetIndex() )
188cdf0e10cSrcweir 			{
189cdf0e10cSrcweir 				// wir stehen hinter einem TabellenNode
190cdf0e10cSrcweir                 aTmp = *pNd->StartOfSectionNode();
191cdf0e10cSrcweir 				break;
192cdf0e10cSrcweir 			}
193cdf0e10cSrcweir 			// kein break !!!
194cdf0e10cSrcweir 		default:
195cdf0e10cSrcweir 			if( rWhere == aTmp )
196cdf0e10cSrcweir 				aTmp -= 2;
197cdf0e10cSrcweir 			else
198cdf0e10cSrcweir 				return pNode;
199cdf0e10cSrcweir 			break;
200cdf0e10cSrcweir 		}
201cdf0e10cSrcweir 	} while( sal_True );
202cdf0e10cSrcweir }
203cdf0e10cSrcweir 
204cdf0e10cSrcweir // --------------------
205cdf0e10cSrcweir // SwTxtNode
206cdf0e10cSrcweir // --------------------
207cdf0e10cSrcweir 
SwTxtNode(const SwNodeIndex & rWhere,SwTxtFmtColl * pTxtColl,const SfxItemSet * pAutoAttr)208cdf0e10cSrcweir SwTxtNode::SwTxtNode( const SwNodeIndex &rWhere,
209cdf0e10cSrcweir                       SwTxtFmtColl *pTxtColl,
210cdf0e10cSrcweir                       const SfxItemSet* pAutoAttr )
211cdf0e10cSrcweir 	: SwCntntNode( rWhere, ND_TEXTNODE, pTxtColl ),
212cdf0e10cSrcweir       m_pSwpHints( 0 ),
213cdf0e10cSrcweir       mpNodeNum( 0 ),
214cdf0e10cSrcweir       m_bLastOutlineState( false ),
215cdf0e10cSrcweir       m_bNotifiable( false ),
216cdf0e10cSrcweir       // --> OD 2008-11-19 #i70748#
217cdf0e10cSrcweir       mbEmptyListStyleSetDueToSetOutlineLevelAttr( false ),
218cdf0e10cSrcweir       // <--
219cdf0e10cSrcweir       // --> OD 2008-05-06 #refactorlists#
220cdf0e10cSrcweir       mbInSetOrResetAttr( false ),
221cdf0e10cSrcweir       mpList( 0 )
222cdf0e10cSrcweir       // <--
223cdf0e10cSrcweir {
224cdf0e10cSrcweir     InitSwParaStatistics( true );
225cdf0e10cSrcweir 
226cdf0e10cSrcweir 	// soll eine Harte-Attributierung gesetzt werden?
227cdf0e10cSrcweir     if( pAutoAttr )
228cdf0e10cSrcweir         SetAttr( *pAutoAttr );
229cdf0e10cSrcweir 
230cdf0e10cSrcweir     // --> OD 2008-03-13 #refactorlists# - no longed needed
231cdf0e10cSrcweir //    SyncNumberAndNumRule();
232cdf0e10cSrcweir     if ( !IsInList() && GetNumRule() && GetListId().Len() > 0 )
233cdf0e10cSrcweir     {
234cdf0e10cSrcweir         // --> OD 2009-08-27 #i101516#
235cdf0e10cSrcweir         // apply paragraph style's assigned outline style list level as
236cdf0e10cSrcweir         // list level of the paragraph, if it has none set already.
237cdf0e10cSrcweir         if ( !HasAttrListLevel() &&
238cdf0e10cSrcweir              pTxtColl && pTxtColl->IsAssignedToListLevelOfOutlineStyle() )
239cdf0e10cSrcweir         {
240cdf0e10cSrcweir             SetAttrListLevel( pTxtColl->GetAssignedOutlineStyleLevel() );
241cdf0e10cSrcweir         }
242cdf0e10cSrcweir         // <--
243cdf0e10cSrcweir         AddToList();
244cdf0e10cSrcweir     }
245cdf0e10cSrcweir     // <--
246cdf0e10cSrcweir     GetNodes().UpdateOutlineNode(*this);
247cdf0e10cSrcweir 
248cdf0e10cSrcweir     m_bNotifiable = true;
249cdf0e10cSrcweir 
250cdf0e10cSrcweir     m_bContainsHiddenChars = m_bHiddenCharsHidePara = false;
251cdf0e10cSrcweir     m_bRecalcHiddenCharFlags = true;
252cdf0e10cSrcweir }
253cdf0e10cSrcweir 
~SwTxtNode()254cdf0e10cSrcweir SwTxtNode::~SwTxtNode()
255cdf0e10cSrcweir {
25669a74367SOliver-Rainer Wittmann     // delete loescht nur die Pointer, nicht die Arrayelemente!
257cdf0e10cSrcweir     if ( m_pSwpHints )
25869a74367SOliver-Rainer Wittmann     {
25969a74367SOliver-Rainer Wittmann         // damit Attribute die ihren Inhalt entfernen nicht doppelt
26069a74367SOliver-Rainer Wittmann         // geloescht werden.
261cdf0e10cSrcweir         SwpHints* pTmpHints = m_pSwpHints;
262cdf0e10cSrcweir         m_pSwpHints = 0;
263cdf0e10cSrcweir 
26469a74367SOliver-Rainer Wittmann         for( sal_uInt16 j = pTmpHints->Count(); j; )
26569a74367SOliver-Rainer Wittmann         {
26669a74367SOliver-Rainer Wittmann             // erst muss das Attribut aus dem Array entfernt werden,
26769a74367SOliver-Rainer Wittmann             // denn sonst wuerde es sich selbst loeschen (Felder) !!!!
268cdf0e10cSrcweir             DestroyAttr( pTmpHints->GetTextHint( --j ) );
26969a74367SOliver-Rainer Wittmann         }
270cdf0e10cSrcweir 
27169a74367SOliver-Rainer Wittmann         delete pTmpHints;
27269a74367SOliver-Rainer Wittmann     }
273cdf0e10cSrcweir 
274cdf0e10cSrcweir     RemoveFromList();
275cdf0e10cSrcweir 
276cdf0e10cSrcweir     InitSwParaStatistics( false );
277cdf0e10cSrcweir }
278cdf0e10cSrcweir 
MakeFrm(SwFrm * pSib)279cdf0e10cSrcweir SwCntntFrm *SwTxtNode::MakeFrm( SwFrm* pSib )
280cdf0e10cSrcweir {
28169a74367SOliver-Rainer Wittmann     SwCntntFrm *pFrm = new SwTxtFrm( this, pSib );
28269a74367SOliver-Rainer Wittmann     return pFrm;
283cdf0e10cSrcweir }
284cdf0e10cSrcweir 
Len() const285cdf0e10cSrcweir xub_StrLen SwTxtNode::Len() const
286cdf0e10cSrcweir {
287cdf0e10cSrcweir     return m_Text.Len();
288cdf0e10cSrcweir }
289cdf0e10cSrcweir 
290cdf0e10cSrcweir /*---------------------------------------------------------------------------
291cdf0e10cSrcweir  * lcl_ChangeFtnRef
292cdf0e10cSrcweir  * 	After a split node, it's necessary to actualize the ref-pointer of the
293cdf0e10cSrcweir  *  ftnfrms.
294cdf0e10cSrcweir  * --------------------------------------------------------------------------*/
295cdf0e10cSrcweir 
lcl_ChangeFtnRef(SwTxtNode & rNode)296cdf0e10cSrcweir void lcl_ChangeFtnRef( SwTxtNode &rNode )
297cdf0e10cSrcweir {
298cdf0e10cSrcweir 	SwpHints *pSwpHints = rNode.GetpSwpHints();
299cdf0e10cSrcweir 	if( pSwpHints && rNode.GetDoc()->GetCurrentViewShell() )	//swmod 071108//swmod 071225
300cdf0e10cSrcweir 	{
301cdf0e10cSrcweir 		SwTxtAttr* pHt;
302cdf0e10cSrcweir 		SwCntntFrm* pFrm = NULL;
303cdf0e10cSrcweir         // OD 07.11.2002 #104840# - local variable to remember first footnote
304cdf0e10cSrcweir         // of node <rNode> in order to invalidate position of its first content.
305cdf0e10cSrcweir         // Thus, in its <MakeAll()> it will checked its position relative to its reference.
306cdf0e10cSrcweir         SwFtnFrm* pFirstFtnOfNode = 0;
307cdf0e10cSrcweir 		for( sal_uInt16 j = pSwpHints->Count(); j; )
308cdf0e10cSrcweir         {
309cdf0e10cSrcweir             pHt = pSwpHints->GetTextHint(--j);
310cdf0e10cSrcweir             if (RES_TXTATR_FTN == pHt->Which())
311cdf0e10cSrcweir             {
312cdf0e10cSrcweir 				if( !pFrm )
313cdf0e10cSrcweir 				{
314cdf0e10cSrcweir 					pFrm = SwIterator<SwCntntFrm,SwTxtNode>::FirstElement( rNode );
315cdf0e10cSrcweir 					if( !pFrm )
316cdf0e10cSrcweir 						return;
317cdf0e10cSrcweir 				}
318cdf0e10cSrcweir 				SwTxtFtn *pAttr = (SwTxtFtn*)pHt;
319cdf0e10cSrcweir 				ASSERT( pAttr->GetStartNode(), "FtnAtr ohne StartNode." );
320cdf0e10cSrcweir 				SwNodeIndex aIdx( *pAttr->GetStartNode(), 1 );
321cdf0e10cSrcweir 				SwCntntNode *pNd = aIdx.GetNode().GetCntntNode();
322cdf0e10cSrcweir 				if ( !pNd )
323cdf0e10cSrcweir 					pNd = pFrm->GetAttrSet()->GetDoc()->
324cdf0e10cSrcweir 			  			  GetNodes().GoNextSection( &aIdx, sal_True, sal_False );
325cdf0e10cSrcweir 				if ( !pNd )
326cdf0e10cSrcweir 					continue;
327cdf0e10cSrcweir 
328cdf0e10cSrcweir             	SwIterator<SwCntntFrm,SwCntntNode> aIter( *pNd );
329cdf0e10cSrcweir 				SwCntntFrm* pCntnt = aIter.First();
330cdf0e10cSrcweir 				if( pCntnt )
331cdf0e10cSrcweir 				{
332cdf0e10cSrcweir 					ASSERT( pCntnt->getRootFrm() == pFrm->getRootFrm(),
333cdf0e10cSrcweir 							"lcl_ChangeFtnRef: Layout double?" );
334cdf0e10cSrcweir 					SwFtnFrm *pFtn = pCntnt->FindFtnFrm();
335cdf0e10cSrcweir 					if( pFtn && pFtn->GetAttr() == pAttr )
336cdf0e10cSrcweir 					{
337cdf0e10cSrcweir 						while( pFtn->GetMaster() )
338cdf0e10cSrcweir 							pFtn = pFtn->GetMaster();
339cdf0e10cSrcweir                         // OD 07.11.2002 #104840# - remember footnote frame
340cdf0e10cSrcweir                         pFirstFtnOfNode = pFtn;
341cdf0e10cSrcweir                         while ( pFtn )
342cdf0e10cSrcweir 						{
343cdf0e10cSrcweir 							pFtn->SetRef( pFrm );
344cdf0e10cSrcweir 							pFtn = pFtn->GetFollow();
345cdf0e10cSrcweir 							((SwTxtFrm*)pFrm)->SetFtn( sal_True );
346cdf0e10cSrcweir 						}
347cdf0e10cSrcweir 					}
348cdf0e10cSrcweir #ifdef DBG_UTIL
349cdf0e10cSrcweir 					while( 0 != (pCntnt = aIter.Next()) )
350cdf0e10cSrcweir 					{
351cdf0e10cSrcweir 						SwFtnFrm *pDbgFtn = pCntnt->FindFtnFrm();
352cdf0e10cSrcweir 						ASSERT( !pDbgFtn || pDbgFtn->GetRef() == pFrm,
353cdf0e10cSrcweir 								"lcl_ChangeFtnRef: Who's that guy?" );
354cdf0e10cSrcweir 					}
355cdf0e10cSrcweir #endif
356cdf0e10cSrcweir 				}
357cdf0e10cSrcweir 			}
358cdf0e10cSrcweir         } // end of for-loop on <SwpHints>
359cdf0e10cSrcweir         // OD 08.11.2002 #104840# - invalidate
360cdf0e10cSrcweir         if ( pFirstFtnOfNode )
361cdf0e10cSrcweir         {
362cdf0e10cSrcweir             SwCntntFrm* pCntnt = pFirstFtnOfNode->ContainsCntnt();
363cdf0e10cSrcweir             if ( pCntnt )
364cdf0e10cSrcweir             {
365cdf0e10cSrcweir                 pCntnt->_InvalidatePos();
366cdf0e10cSrcweir             }
367cdf0e10cSrcweir         }
368cdf0e10cSrcweir 	}
369cdf0e10cSrcweir }
370cdf0e10cSrcweir 
SplitCntntNode(const SwPosition & rPos)371cdf0e10cSrcweir SwCntntNode *SwTxtNode::SplitCntntNode( const SwPosition &rPos )
372cdf0e10cSrcweir {
373cdf0e10cSrcweir 	// lege den Node "vor" mir an
374cdf0e10cSrcweir     const xub_StrLen nSplitPos = rPos.nContent.GetIndex();
375cdf0e10cSrcweir     const xub_StrLen nTxtLen = m_Text.Len();
376cdf0e10cSrcweir     SwTxtNode* const pNode =
377cdf0e10cSrcweir         _MakeNewTxtNode( rPos.nNode, sal_False, nSplitPos==nTxtLen );
378cdf0e10cSrcweir 
379cdf0e10cSrcweir     // the first paragraph gets the XmlId,
380cdf0e10cSrcweir     // _except_ if it is empty and the second is not empty
381cdf0e10cSrcweir     if (nSplitPos != 0) {
382cdf0e10cSrcweir         pNode->RegisterAsCopyOf(*this, true);
383cdf0e10cSrcweir         if (nSplitPos == nTxtLen)
384cdf0e10cSrcweir         {
385cdf0e10cSrcweir             this->RemoveMetadataReference();
386cdf0e10cSrcweir             // NB: SwUndoSplitNode will call pNode->JoinNext,
387cdf0e10cSrcweir             // which is sufficient even in this case!
388cdf0e10cSrcweir         }
389cdf0e10cSrcweir     }
390cdf0e10cSrcweir 
391cdf0e10cSrcweir     // --> OD 2008-03-27 #refactorlists#
392cdf0e10cSrcweir //    // --> OD 2007-07-09 #i77372#
393cdf0e10cSrcweir //    // reset numbering attribute at current node, only if it is numbered.
394cdf0e10cSrcweir //    if ( GetNumRule() != NULL )
395cdf0e10cSrcweir //    {
396cdf0e10cSrcweir //        SetRestart(false);
397cdf0e10cSrcweir //        SetStart(1);
398cdf0e10cSrcweir //        SetCounted(true);
399cdf0e10cSrcweir //    }
400cdf0e10cSrcweir     ResetAttr( RES_PARATR_LIST_ISRESTART );
401cdf0e10cSrcweir     ResetAttr( RES_PARATR_LIST_RESTARTVALUE );
402cdf0e10cSrcweir     ResetAttr( RES_PARATR_LIST_ISCOUNTED );
403cdf0e10cSrcweir     if ( GetNumRule() == 0 )
404cdf0e10cSrcweir     {
405cdf0e10cSrcweir         ResetAttr( RES_PARATR_LIST_ID );
406cdf0e10cSrcweir         ResetAttr( RES_PARATR_LIST_LEVEL );
407cdf0e10cSrcweir     }
408cdf0e10cSrcweir     // <--
409cdf0e10cSrcweir 
410cdf0e10cSrcweir     if ( GetDepends() && m_Text.Len() && (nTxtLen / 2) < nSplitPos )
411cdf0e10cSrcweir     {
412cdf0e10cSrcweir // JP 25.04.95: Optimierung fuer SplitNode:
413cdf0e10cSrcweir //				Wird am Ende vom Node gesplittet, dann verschiebe die
414cdf0e10cSrcweir //				Frames vom akt. auf den neuen und erzeuge fuer den akt.
415cdf0e10cSrcweir //				neue. Dadurch entfaellt das neu aufbauen vom Layout.
416cdf0e10cSrcweir 
417cdf0e10cSrcweir 		LockModify();	// Benachrichtigungen abschalten
418cdf0e10cSrcweir 
419cdf0e10cSrcweir 		// werden FlyFrames mit verschoben, so muessen diese nicht ihre
420cdf0e10cSrcweir 		// Frames zerstoeren. Im SwTxtFly::SetAnchor wird es abgefragt!
421cdf0e10cSrcweir         if ( HasHints() )
422cdf0e10cSrcweir         {
423cdf0e10cSrcweir             pNode->GetOrCreateSwpHints().SetInSplitNode(true);
424cdf0e10cSrcweir         }
425cdf0e10cSrcweir 
426cdf0e10cSrcweir 		//Ersten Teil des Inhalts in den neuen Node uebertragen und
427cdf0e10cSrcweir 		//im alten Node loeschen.
428cdf0e10cSrcweir 		SwIndex aIdx( this );
429cdf0e10cSrcweir         CutText( pNode, aIdx, nSplitPos );
430cdf0e10cSrcweir 
431cdf0e10cSrcweir 		if( GetWrong() )
432cdf0e10cSrcweir         {
433cdf0e10cSrcweir             pNode->SetWrong( GetWrong()->SplitList( nSplitPos ) );
434cdf0e10cSrcweir         }
435cdf0e10cSrcweir         SetWrongDirty( true );
436cdf0e10cSrcweir 
437cdf0e10cSrcweir         if( GetGrammarCheck() )
438cdf0e10cSrcweir         {
439cdf0e10cSrcweir             pNode->SetGrammarCheck( GetGrammarCheck()->SplitGrammarList( nSplitPos ) );
440cdf0e10cSrcweir         }
441cdf0e10cSrcweir         SetGrammarCheckDirty( true );
442cdf0e10cSrcweir 
443cdf0e10cSrcweir         SetWordCountDirty( true );
444cdf0e10cSrcweir 
445cdf0e10cSrcweir         // SMARTTAGS
446cdf0e10cSrcweir         if( GetSmartTags() )
447cdf0e10cSrcweir         {
448cdf0e10cSrcweir             pNode->SetSmartTags( GetSmartTags()->SplitList( nSplitPos ) );
449cdf0e10cSrcweir         }
450cdf0e10cSrcweir         SetSmartTagDirty( true );
451cdf0e10cSrcweir 
452cdf0e10cSrcweir         if ( pNode->HasHints() )
453cdf0e10cSrcweir         {
454cdf0e10cSrcweir             if ( pNode->m_pSwpHints->CanBeDeleted() )
455cdf0e10cSrcweir             {
456cdf0e10cSrcweir                 delete pNode->m_pSwpHints;
457cdf0e10cSrcweir                 pNode->m_pSwpHints = 0;
458cdf0e10cSrcweir             }
459cdf0e10cSrcweir             else
460cdf0e10cSrcweir             {
461cdf0e10cSrcweir                 pNode->m_pSwpHints->SetInSplitNode(false);
462cdf0e10cSrcweir             }
463cdf0e10cSrcweir 
464cdf0e10cSrcweir 			// alle zeichengebundenen Rahmen, die im neuen Absatz laden
465cdf0e10cSrcweir 			// muessen aus den alten Frame entfernt werden:
466cdf0e10cSrcweir 			// JP 01.10.96: alle leeren und nicht zu expandierenden
467cdf0e10cSrcweir 			//				Attribute loeschen
468cdf0e10cSrcweir             if ( HasHints() )
469cdf0e10cSrcweir 			{
470cdf0e10cSrcweir                 for ( sal_uInt16 j = m_pSwpHints->Count(); j; )
471cdf0e10cSrcweir                 {
472cdf0e10cSrcweir                     SwTxtAttr* const pHt = m_pSwpHints->GetTextHint( --j );
473cdf0e10cSrcweir                     if ( RES_TXTATR_FLYCNT == pHt ->Which() )
474cdf0e10cSrcweir                     {
475cdf0e10cSrcweir                         pHt->GetFlyCnt().GetFrmFmt()->DelFrms();
476cdf0e10cSrcweir                     }
477cdf0e10cSrcweir                     else if ( pHt->DontExpand() )
478cdf0e10cSrcweir                     {
479cdf0e10cSrcweir                         const xub_StrLen* const pEnd = pHt->GetEnd();
480cdf0e10cSrcweir                         if (pEnd && *pHt->GetStart() == *pEnd )
481cdf0e10cSrcweir                         {
482cdf0e10cSrcweir                             // delete it!
483cdf0e10cSrcweir                             m_pSwpHints->DeleteAtPos( j );
484cdf0e10cSrcweir                             DestroyAttr( pHt );
485cdf0e10cSrcweir                         }
486cdf0e10cSrcweir                     }
487cdf0e10cSrcweir                 }
488cdf0e10cSrcweir 			}
489cdf0e10cSrcweir 
490cdf0e10cSrcweir 		}
491cdf0e10cSrcweir 
492cdf0e10cSrcweir 		SwIterator<SwCntntFrm,SwTxtNode> aIter( *this );
493cdf0e10cSrcweir         for( SwCntntFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() )
494cdf0e10cSrcweir 		{
495cdf0e10cSrcweir             pFrm->RegisterToNode( *pNode );
496cdf0e10cSrcweir 	        if( pFrm->IsTxtFrm() && !pFrm->IsFollow() && ((SwTxtFrm*)pFrm)->GetOfst() )
497cdf0e10cSrcweir 				((SwTxtFrm*)pFrm)->SetOfst( 0 );
498cdf0e10cSrcweir         }
499cdf0e10cSrcweir 
500cdf0e10cSrcweir 		if ( IsInCache() )
501cdf0e10cSrcweir 		{
502cdf0e10cSrcweir 			SwFrm::GetCache().Delete( this );
503cdf0e10cSrcweir 			SetInCache( sal_False );
504cdf0e10cSrcweir 		}
505cdf0e10cSrcweir 
506cdf0e10cSrcweir 		UnlockModify();	// Benachrichtigungen wieder freischalten
507cdf0e10cSrcweir 
508cdf0e10cSrcweir 		// If there is an accessible layout we must call modify even
509cdf0e10cSrcweir 		// with length zero, because we have to notify about the changed
510cdf0e10cSrcweir 		// text node.
511cdf0e10cSrcweir 		const SwRootFrm *pRootFrm;
512cdf0e10cSrcweir         if ( (nTxtLen != nSplitPos) ||
513cdf0e10cSrcweir 			( (pRootFrm = pNode->GetDoc()->GetCurrentLayout()) != 0 &&
514cdf0e10cSrcweir               pRootFrm->IsAnyShellAccessible() ) )	//swmod 080218
515cdf0e10cSrcweir 		{
516cdf0e10cSrcweir 			// dann sage den Frames noch, das am Ende etwas "geloescht" wurde
517cdf0e10cSrcweir 			if( 1 == nTxtLen - nSplitPos )
518cdf0e10cSrcweir 			{
519cdf0e10cSrcweir 				SwDelChr aHint( nSplitPos );
520cdf0e10cSrcweir 				pNode->NotifyClients( 0, &aHint );
521cdf0e10cSrcweir 			}
522cdf0e10cSrcweir 			else
523cdf0e10cSrcweir 			{
524cdf0e10cSrcweir 				SwDelTxt aHint( nSplitPos, nTxtLen - nSplitPos );
525cdf0e10cSrcweir 				pNode->NotifyClients( 0, &aHint );
526cdf0e10cSrcweir 			}
527cdf0e10cSrcweir 		}
528cdf0e10cSrcweir         if ( HasHints() )
529cdf0e10cSrcweir         {
530cdf0e10cSrcweir 			MoveTxtAttr_To_AttrSet();
531cdf0e10cSrcweir         }
532cdf0e10cSrcweir 		pNode->MakeFrms( *this );		// neue Frames anlegen.
533cdf0e10cSrcweir 		lcl_ChangeFtnRef( *this );
534cdf0e10cSrcweir 	}
535cdf0e10cSrcweir 	else
536cdf0e10cSrcweir 	{
537cdf0e10cSrcweir         SwWrongList *pList = GetWrong();
538cdf0e10cSrcweir         SetWrong( 0, false );
539cdf0e10cSrcweir         SetWrongDirty( true );
540cdf0e10cSrcweir 
541cdf0e10cSrcweir         SwGrammarMarkUp *pList3 = GetGrammarCheck();
542cdf0e10cSrcweir         SetGrammarCheck( 0, false );
543cdf0e10cSrcweir         SetGrammarCheckDirty( true );
544cdf0e10cSrcweir 
545cdf0e10cSrcweir         SetWordCountDirty( true );
546cdf0e10cSrcweir 
547cdf0e10cSrcweir         // SMARTTAGS
548cdf0e10cSrcweir         SwWrongList *pList2 = GetSmartTags();
549cdf0e10cSrcweir         SetSmartTags( 0, false );
550cdf0e10cSrcweir         SetSmartTagDirty( true );
551cdf0e10cSrcweir 
552cdf0e10cSrcweir 		SwIndex aIdx( this );
553cdf0e10cSrcweir         CutText( pNode, aIdx, nSplitPos );
554cdf0e10cSrcweir 
555cdf0e10cSrcweir 		// JP 01.10.96: alle leeren und nicht zu expandierenden
556cdf0e10cSrcweir 		//				Attribute loeschen
557cdf0e10cSrcweir         if ( HasHints() )
558cdf0e10cSrcweir 		{
559cdf0e10cSrcweir             for ( sal_uInt16 j = m_pSwpHints->Count(); j; )
560cdf0e10cSrcweir             {
561cdf0e10cSrcweir                 SwTxtAttr* const pHt = m_pSwpHints->GetTextHint( --j );
562cdf0e10cSrcweir                 const xub_StrLen* const pEnd = pHt->GetEnd();
563cdf0e10cSrcweir                 if ( pHt->DontExpand() && pEnd && (*pHt->GetStart() == *pEnd) )
564cdf0e10cSrcweir                 {
565cdf0e10cSrcweir                     // delete it!
566cdf0e10cSrcweir                     m_pSwpHints->DeleteAtPos( j );
567cdf0e10cSrcweir 					DestroyAttr( pHt );
568cdf0e10cSrcweir 				}
569cdf0e10cSrcweir             }
570cdf0e10cSrcweir 			MoveTxtAttr_To_AttrSet();
571cdf0e10cSrcweir 		}
572cdf0e10cSrcweir 
573cdf0e10cSrcweir         if( pList )
574cdf0e10cSrcweir         {
575cdf0e10cSrcweir             pNode->SetWrong( pList->SplitList( nSplitPos ) );
576cdf0e10cSrcweir             SetWrong( pList, false );
577cdf0e10cSrcweir         }
578cdf0e10cSrcweir 
579cdf0e10cSrcweir         if( pList3 )
580cdf0e10cSrcweir         {
581cdf0e10cSrcweir             pNode->SetGrammarCheck( pList3->SplitGrammarList( nSplitPos ) );
582cdf0e10cSrcweir             SetGrammarCheck( pList3, false );
583cdf0e10cSrcweir         }
584cdf0e10cSrcweir 
585cdf0e10cSrcweir         // SMARTTAGS
586cdf0e10cSrcweir         if( pList2 )
587cdf0e10cSrcweir         {
588cdf0e10cSrcweir             pNode->SetSmartTags( pList2->SplitList( nSplitPos ) );
589cdf0e10cSrcweir             SetSmartTags( pList2, false );
590cdf0e10cSrcweir         }
591cdf0e10cSrcweir 
592cdf0e10cSrcweir 		if ( GetDepends() )
593cdf0e10cSrcweir         {
594cdf0e10cSrcweir 			MakeFrms( *pNode );		// neue Frames anlegen.
595cdf0e10cSrcweir         }
596cdf0e10cSrcweir 		lcl_ChangeFtnRef( *pNode );
597cdf0e10cSrcweir 	}
598cdf0e10cSrcweir 
599cdf0e10cSrcweir 	{
600cdf0e10cSrcweir 		//Hint fuer Pagedesc versenden. Das mueste eigntlich das Layout im
601cdf0e10cSrcweir 		//Paste der Frames selbst erledigen, aber das fuehrt dann wiederum
602cdf0e10cSrcweir 		//zu weiteren Folgefehlern, die mit Laufzeitkosten geloest werden
603cdf0e10cSrcweir 		//muesten. #56977# #55001# #56135#
604cdf0e10cSrcweir 		const SfxPoolItem *pItem;
605cdf0e10cSrcweir 		if( GetDepends() && SFX_ITEM_SET == pNode->GetSwAttrSet().
606cdf0e10cSrcweir 			GetItemState( RES_PAGEDESC, sal_True, &pItem ) )
607cdf0e10cSrcweir         {
608cdf0e10cSrcweir 			pNode->ModifyNotification( (SfxPoolItem*)pItem, (SfxPoolItem*)pItem );
609cdf0e10cSrcweir         }
610cdf0e10cSrcweir 	}
611cdf0e10cSrcweir 	return pNode;
612cdf0e10cSrcweir }
613cdf0e10cSrcweir 
MoveTxtAttr_To_AttrSet()614cdf0e10cSrcweir void SwTxtNode::MoveTxtAttr_To_AttrSet()
615cdf0e10cSrcweir {
616cdf0e10cSrcweir     ASSERT( m_pSwpHints, "MoveTxtAttr_To_AttrSet without SwpHints?" );
617cdf0e10cSrcweir     for ( sal_uInt16 i = 0; m_pSwpHints && i < m_pSwpHints->Count(); ++i )
618cdf0e10cSrcweir     {
619cdf0e10cSrcweir         SwTxtAttr *pHt = m_pSwpHints->GetTextHint(i);
620cdf0e10cSrcweir 
621cdf0e10cSrcweir 		if( *pHt->GetStart() )
622cdf0e10cSrcweir 			break;
623cdf0e10cSrcweir 
624cdf0e10cSrcweir 		const xub_StrLen* pHtEndIdx = pHt->GetEnd();
625cdf0e10cSrcweir 
626cdf0e10cSrcweir 		if( !pHtEndIdx )
627cdf0e10cSrcweir 			continue;
628cdf0e10cSrcweir 
629cdf0e10cSrcweir         if ( *pHtEndIdx < m_Text.Len() || pHt->IsCharFmtAttr() )
630cdf0e10cSrcweir 			break;
631cdf0e10cSrcweir 
632cdf0e10cSrcweir 		if( !pHt->IsDontMoveAttr() &&
633cdf0e10cSrcweir             SetAttr( pHt->GetAttr() ) )
634cdf0e10cSrcweir 		{
635cdf0e10cSrcweir             m_pSwpHints->DeleteAtPos(i);
636cdf0e10cSrcweir 			DestroyAttr( pHt );
637cdf0e10cSrcweir 			--i;
638cdf0e10cSrcweir 		}
639cdf0e10cSrcweir 	}
640cdf0e10cSrcweir 
641cdf0e10cSrcweir }
642cdf0e10cSrcweir 
JoinNext()643cdf0e10cSrcweir SwCntntNode *SwTxtNode::JoinNext()
644cdf0e10cSrcweir {
645cdf0e10cSrcweir 	SwNodes& rNds = GetNodes();
646cdf0e10cSrcweir 	SwNodeIndex aIdx( *this );
647cdf0e10cSrcweir 	if( SwCntntNode::CanJoinNext( &aIdx ) )
648cdf0e10cSrcweir 	{
649cdf0e10cSrcweir 		SwDoc* pDoc = rNds.GetDoc();
650cdf0e10cSrcweir 		SvULongs aBkmkArr( 15, 15 );
651cdf0e10cSrcweir 		_SaveCntntIdx( pDoc, aIdx.GetIndex(), USHRT_MAX, aBkmkArr, SAVEFLY );
652cdf0e10cSrcweir 		SwTxtNode *pTxtNode = aIdx.GetNode().GetTxtNode();
653cdf0e10cSrcweir         xub_StrLen nOldLen = m_Text.Len();
654cdf0e10cSrcweir 
655cdf0e10cSrcweir         // METADATA: merge
656cdf0e10cSrcweir         this->JoinMetadatable(*pTxtNode, !this->Len(), !pTxtNode->Len());
657cdf0e10cSrcweir 
658cdf0e10cSrcweir         SwWrongList *pList = GetWrong();
659cdf0e10cSrcweir         if( pList )
660cdf0e10cSrcweir         {
661cdf0e10cSrcweir             pList->JoinList( pTxtNode->GetWrong(), nOldLen );
662cdf0e10cSrcweir             SetWrongDirty( true );
663cdf0e10cSrcweir             SetWrong( 0, false );
664cdf0e10cSrcweir         }
665cdf0e10cSrcweir         else
666cdf0e10cSrcweir         {
667cdf0e10cSrcweir             pList = pTxtNode->GetWrong();
668cdf0e10cSrcweir             if( pList )
669cdf0e10cSrcweir             {
670cdf0e10cSrcweir                 pList->Move( 0, nOldLen );
671cdf0e10cSrcweir                 SetWrongDirty( true );
672cdf0e10cSrcweir                 pTxtNode->SetWrong( 0, false );
673cdf0e10cSrcweir             }
674cdf0e10cSrcweir         }
675cdf0e10cSrcweir 
676cdf0e10cSrcweir         SwGrammarMarkUp *pList3 = GetGrammarCheck();
677cdf0e10cSrcweir         if( pList3 )
678cdf0e10cSrcweir         {
679cdf0e10cSrcweir             pList3->JoinGrammarList( pTxtNode->GetGrammarCheck(), nOldLen );
680cdf0e10cSrcweir             SetGrammarCheckDirty( true );
681cdf0e10cSrcweir             SetGrammarCheck( 0, false );
682cdf0e10cSrcweir         }
683cdf0e10cSrcweir         else
684cdf0e10cSrcweir         {
685cdf0e10cSrcweir             pList3 = pTxtNode->GetGrammarCheck();
686cdf0e10cSrcweir             if( pList3 )
687cdf0e10cSrcweir             {
688cdf0e10cSrcweir                 pList3->MoveGrammar( 0, nOldLen );
689cdf0e10cSrcweir                 SetGrammarCheckDirty( true );
690cdf0e10cSrcweir                 pTxtNode->SetGrammarCheck( 0, false );
691cdf0e10cSrcweir             }
692cdf0e10cSrcweir         }
693cdf0e10cSrcweir 
694cdf0e10cSrcweir         // SMARTTAGS
695cdf0e10cSrcweir         SwWrongList *pList2 = GetSmartTags();
696cdf0e10cSrcweir         if( pList2 )
697cdf0e10cSrcweir         {
698cdf0e10cSrcweir             pList2->JoinList( pTxtNode->GetSmartTags(), nOldLen );
699cdf0e10cSrcweir             SetSmartTagDirty( true );
700cdf0e10cSrcweir             SetSmartTags( 0, false );
701cdf0e10cSrcweir         }
702cdf0e10cSrcweir         else
703cdf0e10cSrcweir         {
704cdf0e10cSrcweir             pList2 = pTxtNode->GetSmartTags();
705cdf0e10cSrcweir             if( pList2 )
706cdf0e10cSrcweir             {
707cdf0e10cSrcweir                 pList2->Move( 0, nOldLen );
708cdf0e10cSrcweir                 SetSmartTagDirty( true );
709cdf0e10cSrcweir                 pTxtNode->SetSmartTags( 0, false );
710cdf0e10cSrcweir             }
711cdf0e10cSrcweir         }
712cdf0e10cSrcweir 
713cdf0e10cSrcweir         { // wg. SwIndex
714cdf0e10cSrcweir             pTxtNode->CutText( this, SwIndex(pTxtNode), pTxtNode->Len() );
715cdf0e10cSrcweir         }
716cdf0e10cSrcweir 		// verschiebe noch alle Bookmarks/TOXMarks
717cdf0e10cSrcweir 		if( aBkmkArr.Count() )
718cdf0e10cSrcweir 			_RestoreCntntIdx( pDoc, aBkmkArr, GetIndex(), nOldLen );
719cdf0e10cSrcweir 
720cdf0e10cSrcweir 		if( pTxtNode->HasAnyIndex() )
721cdf0e10cSrcweir 		{
722cdf0e10cSrcweir 			// alle Crsr/StkCrsr/UnoCrsr aus dem Loeschbereich verschieben
723cdf0e10cSrcweir 			pDoc->CorrAbs( aIdx, SwPosition( *this ), nOldLen, sal_True );
724cdf0e10cSrcweir 		}
725cdf0e10cSrcweir 		rNds.Delete(aIdx);
726cdf0e10cSrcweir         SetWrong( pList, false );
727cdf0e10cSrcweir         SetGrammarCheck( pList3, false );
728cdf0e10cSrcweir         SetSmartTags( pList2, false ); // SMARTTAGS
729cdf0e10cSrcweir 		InvalidateNumRule();
730cdf0e10cSrcweir 	}
731cdf0e10cSrcweir 	else {
732cdf0e10cSrcweir 		ASSERT( sal_False, "kein TxtNode." );
733cdf0e10cSrcweir     }
734cdf0e10cSrcweir 
735cdf0e10cSrcweir 	return this;
736cdf0e10cSrcweir }
737cdf0e10cSrcweir 
JoinPrev()738cdf0e10cSrcweir SwCntntNode *SwTxtNode::JoinPrev()
739cdf0e10cSrcweir {
740cdf0e10cSrcweir 	SwNodes& rNds = GetNodes();
741cdf0e10cSrcweir 	SwNodeIndex aIdx( *this );
742cdf0e10cSrcweir 	if( SwCntntNode::CanJoinPrev( &aIdx ) )
743cdf0e10cSrcweir 	{
744cdf0e10cSrcweir 		SwDoc* pDoc = rNds.GetDoc();
745cdf0e10cSrcweir 		SvULongs aBkmkArr( 15, 15 );
746cdf0e10cSrcweir 		_SaveCntntIdx( pDoc, aIdx.GetIndex(), USHRT_MAX, aBkmkArr, SAVEFLY );
747cdf0e10cSrcweir 		SwTxtNode *pTxtNode = aIdx.GetNode().GetTxtNode();
748cdf0e10cSrcweir 		xub_StrLen nLen = pTxtNode->Len();
749cdf0e10cSrcweir 
750cdf0e10cSrcweir         SwWrongList *pList = pTxtNode->GetWrong();
751cdf0e10cSrcweir         if( pList )
752cdf0e10cSrcweir         {
753cdf0e10cSrcweir             pList->JoinList( GetWrong(), Len() );
754cdf0e10cSrcweir             SetWrongDirty( true );
755cdf0e10cSrcweir             pTxtNode->SetWrong( 0, false );
756cdf0e10cSrcweir             SetWrong( NULL );
757cdf0e10cSrcweir         }
758cdf0e10cSrcweir         else
759cdf0e10cSrcweir         {
760cdf0e10cSrcweir             pList = GetWrong();
761cdf0e10cSrcweir             if( pList )
762cdf0e10cSrcweir             {
763cdf0e10cSrcweir                 pList->Move( 0, nLen );
764cdf0e10cSrcweir                 SetWrongDirty( true );
765cdf0e10cSrcweir                 SetWrong( 0, false );
766cdf0e10cSrcweir             }
767cdf0e10cSrcweir         }
768cdf0e10cSrcweir 
769cdf0e10cSrcweir         SwGrammarMarkUp *pList3 = pTxtNode->GetGrammarCheck();
770cdf0e10cSrcweir         if( pList3 )
771cdf0e10cSrcweir         {
772cdf0e10cSrcweir             pList3->JoinGrammarList( GetGrammarCheck(), Len() );
773cdf0e10cSrcweir             SetGrammarCheckDirty( true );
774cdf0e10cSrcweir             pTxtNode->SetGrammarCheck( 0, false );
775cdf0e10cSrcweir             SetGrammarCheck( NULL );
776cdf0e10cSrcweir         }
777cdf0e10cSrcweir         else
778cdf0e10cSrcweir         {
779cdf0e10cSrcweir             pList3 = GetGrammarCheck();
780cdf0e10cSrcweir             if( pList3 )
781cdf0e10cSrcweir             {
782cdf0e10cSrcweir                 pList3->MoveGrammar( 0, nLen );
783cdf0e10cSrcweir                 SetGrammarCheckDirty( true );
784cdf0e10cSrcweir                 SetGrammarCheck( 0, false );
785cdf0e10cSrcweir             }
786cdf0e10cSrcweir         }
787cdf0e10cSrcweir 
788cdf0e10cSrcweir         // SMARTTAGS
789cdf0e10cSrcweir         SwWrongList *pList2 = pTxtNode->GetSmartTags();
790cdf0e10cSrcweir         if( pList2 )
791cdf0e10cSrcweir         {
792cdf0e10cSrcweir             pList2->JoinList( GetSmartTags(), Len() );
793cdf0e10cSrcweir             SetSmartTagDirty( true );
794cdf0e10cSrcweir             pTxtNode->SetSmartTags( 0, false );
795cdf0e10cSrcweir             SetSmartTags( NULL );
796cdf0e10cSrcweir         }
797cdf0e10cSrcweir         else
798cdf0e10cSrcweir         {
799cdf0e10cSrcweir             pList2 = GetSmartTags();
800cdf0e10cSrcweir             if( pList2 )
801cdf0e10cSrcweir             {
802cdf0e10cSrcweir                 pList2->Move( 0, nLen );
803cdf0e10cSrcweir                 SetSmartTagDirty( true );
804cdf0e10cSrcweir                 SetSmartTags( 0, false );
805cdf0e10cSrcweir             }
806cdf0e10cSrcweir         }
807cdf0e10cSrcweir 
808cdf0e10cSrcweir 		{ // wg. SwIndex
809cdf0e10cSrcweir             pTxtNode->CutText( this, SwIndex(this), SwIndex(pTxtNode), nLen );
810cdf0e10cSrcweir         }
811cdf0e10cSrcweir 		// verschiebe noch alle Bookmarks/TOXMarks
812cdf0e10cSrcweir 		if( aBkmkArr.Count() )
813cdf0e10cSrcweir 			_RestoreCntntIdx( pDoc, aBkmkArr, GetIndex() );
814cdf0e10cSrcweir 
815cdf0e10cSrcweir 		if( pTxtNode->HasAnyIndex() )
816cdf0e10cSrcweir 		{
817cdf0e10cSrcweir 			// alle Crsr/StkCrsr/UnoCrsr aus dem Loeschbereich verschieben
818cdf0e10cSrcweir 			pDoc->CorrAbs( aIdx, SwPosition( *this ), nLen, sal_True );
819cdf0e10cSrcweir 		}
820cdf0e10cSrcweir 		rNds.Delete(aIdx);
821cdf0e10cSrcweir         SetWrong( pList, false );
822cdf0e10cSrcweir         SetGrammarCheck( pList3, false );
823cdf0e10cSrcweir         SetSmartTags( pList2, false );
824cdf0e10cSrcweir 		InvalidateNumRule();
825cdf0e10cSrcweir 	}
826cdf0e10cSrcweir 	else {
827cdf0e10cSrcweir 		ASSERT( sal_False, "kein TxtNode." );
828cdf0e10cSrcweir     }
829cdf0e10cSrcweir 
830cdf0e10cSrcweir 	return this;
831cdf0e10cSrcweir }
832cdf0e10cSrcweir 
833cdf0e10cSrcweir // erzeugt einen AttrSet mit Bereichen fuer Frame-/Para/Char-Attributen
NewAttrSet(SwAttrPool & rPool)834cdf0e10cSrcweir void SwTxtNode::NewAttrSet( SwAttrPool& rPool )
835cdf0e10cSrcweir {
836cdf0e10cSrcweir     ASSERT( !mpAttrSet.get(), "AttrSet ist doch gesetzt" );
837cdf0e10cSrcweir     SwAttrSet aNewAttrSet( rPool, aTxtNodeSetRange );
838cdf0e10cSrcweir 
839cdf0e10cSrcweir     // put names of parent style and conditional style:
840cdf0e10cSrcweir     const SwFmtColl* pAnyFmtColl = &GetAnyFmtColl();
841cdf0e10cSrcweir     const SwFmtColl* pFmtColl = GetFmtColl();
842cdf0e10cSrcweir     String sVal;
843cdf0e10cSrcweir 	SwStyleNameMapper::FillProgName( pAnyFmtColl->GetName(), sVal, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, sal_True );
844cdf0e10cSrcweir     SfxStringItem aAnyFmtColl( RES_FRMATR_STYLE_NAME, sVal );
845cdf0e10cSrcweir     if ( pFmtColl != pAnyFmtColl )
846cdf0e10cSrcweir     	SwStyleNameMapper::FillProgName( pFmtColl->GetName(), sVal, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, sal_True );
847cdf0e10cSrcweir     SfxStringItem aFmtColl( RES_FRMATR_CONDITIONAL_STYLE_NAME, sVal );
848cdf0e10cSrcweir     aNewAttrSet.Put( aAnyFmtColl );
849cdf0e10cSrcweir     aNewAttrSet.Put( aFmtColl );
850cdf0e10cSrcweir 
851cdf0e10cSrcweir     aNewAttrSet.SetParent( &pAnyFmtColl->GetAttrSet() );
852cdf0e10cSrcweir     mpAttrSet = GetDoc()->GetIStyleAccess().getAutomaticStyle( aNewAttrSet, IStyleAccess::AUTO_STYLE_PARA );
853cdf0e10cSrcweir }
854cdf0e10cSrcweir 
855cdf0e10cSrcweir 
856cdf0e10cSrcweir // override SwIndexReg::Update => text hints do not need SwIndex for start/end!
Update(SwIndex const & rPos,const xub_StrLen nChangeLen,const bool bNegative,const bool bDelete)85769a74367SOliver-Rainer Wittmann void SwTxtNode::Update(
85869a74367SOliver-Rainer Wittmann     SwIndex const & rPos,
85969a74367SOliver-Rainer Wittmann     const xub_StrLen nChangeLen,
86069a74367SOliver-Rainer Wittmann     const bool bNegative,
86169a74367SOliver-Rainer Wittmann     const bool bDelete )
862cdf0e10cSrcweir {
86369a74367SOliver-Rainer Wittmann     SetAutoCompleteWordDirty( sal_True );
864cdf0e10cSrcweir 
865cdf0e10cSrcweir     ::std::auto_ptr<TmpHints> pCollector;
866cdf0e10cSrcweir     const xub_StrLen nChangePos = rPos.GetIndex();
867cdf0e10cSrcweir 
868cdf0e10cSrcweir     if ( HasHints() )
869cdf0e10cSrcweir     {
870cdf0e10cSrcweir         if ( bNegative )
871cdf0e10cSrcweir         {
872cdf0e10cSrcweir             const xub_StrLen nChangeEnd = nChangePos + nChangeLen;
873cdf0e10cSrcweir             for ( sal_uInt16 n = 0; n < m_pSwpHints->Count(); ++n )
874cdf0e10cSrcweir             {
87569a74367SOliver-Rainer Wittmann                 bool bTxtAttrChanged = false;
87669a74367SOliver-Rainer Wittmann                 bool bStartOfTxtAttrChanged = false;
877cdf0e10cSrcweir                 SwTxtAttr * const pHint = m_pSwpHints->GetTextHint(n);
878cdf0e10cSrcweir                 xub_StrLen * const pStart = pHint->GetStart();
879cdf0e10cSrcweir                 if ( *pStart > nChangePos )
880cdf0e10cSrcweir                 {
881cdf0e10cSrcweir                     if ( *pStart > nChangeEnd )
882cdf0e10cSrcweir                     {
883cdf0e10cSrcweir                          *pStart = *pStart - nChangeLen;
884cdf0e10cSrcweir                     }
885cdf0e10cSrcweir                     else
886cdf0e10cSrcweir                     {
887cdf0e10cSrcweir                          *pStart = nChangePos;
888cdf0e10cSrcweir                     }
88969a74367SOliver-Rainer Wittmann                     bStartOfTxtAttrChanged = true;
890cdf0e10cSrcweir                 }
891cdf0e10cSrcweir 
892cdf0e10cSrcweir                 xub_StrLen * const pEnd = pHint->GetEnd();
893cdf0e10cSrcweir                 if (pEnd)
894cdf0e10cSrcweir                 {
895cdf0e10cSrcweir                     if ( *pEnd > nChangePos )
896cdf0e10cSrcweir                     {
897cdf0e10cSrcweir                         if( *pEnd > nChangeEnd )
898cdf0e10cSrcweir                         {
899cdf0e10cSrcweir                             *pEnd = *pEnd - nChangeLen;
900cdf0e10cSrcweir                         }
901cdf0e10cSrcweir                         else
902cdf0e10cSrcweir                         {
903cdf0e10cSrcweir                             *pEnd = nChangePos;
904cdf0e10cSrcweir                         }
90569a74367SOliver-Rainer Wittmann                         bTxtAttrChanged = !bStartOfTxtAttrChanged;
90669a74367SOliver-Rainer Wittmann                     }
90769a74367SOliver-Rainer Wittmann                 }
90869a74367SOliver-Rainer Wittmann 
90969a74367SOliver-Rainer Wittmann                 if ( bTxtAttrChanged
91069a74367SOliver-Rainer Wittmann                      && pHint->Which() == RES_TXTATR_INPUTFIELD )
91169a74367SOliver-Rainer Wittmann                 {
91269a74367SOliver-Rainer Wittmann                     SwTxtInputFld* pTxtInputFld = dynamic_cast<SwTxtInputFld*>(pHint);
91369a74367SOliver-Rainer Wittmann                     if ( pTxtInputFld )
91469a74367SOliver-Rainer Wittmann                     {
91569a74367SOliver-Rainer Wittmann                         pTxtInputFld->UpdateFieldContent();
916cdf0e10cSrcweir                     }
917cdf0e10cSrcweir                 }
918cdf0e10cSrcweir             }
919cdf0e10cSrcweir 
920cdf0e10cSrcweir             m_pSwpHints->MergePortions( *this );
921cdf0e10cSrcweir         }
922cdf0e10cSrcweir         else
923cdf0e10cSrcweir         {
924cdf0e10cSrcweir             bool bNoExp = false;
925cdf0e10cSrcweir             bool bResort = false;
92669a74367SOliver-Rainer Wittmann             const sal_uInt16 coArrSz =
92769a74367SOliver-Rainer Wittmann                 static_cast<sal_uInt16>(RES_TXTATR_WITHEND_END) - static_cast<sal_uInt16>(RES_CHRATR_BEGIN);
928cdf0e10cSrcweir 
92969a74367SOliver-Rainer Wittmann             sal_Bool aDontExp[ coArrSz ];
93069a74367SOliver-Rainer Wittmann             memset( &aDontExp, 0, coArrSz * sizeof(sal_Bool) );
931cdf0e10cSrcweir 
932cdf0e10cSrcweir             for ( sal_uInt16 n = 0; n < m_pSwpHints->Count(); ++n )
933cdf0e10cSrcweir             {
93469a74367SOliver-Rainer Wittmann                 bool bTxtAttrChanged = false;
935cdf0e10cSrcweir                 SwTxtAttr * const pHint = m_pSwpHints->GetTextHint(n);
936cdf0e10cSrcweir                 xub_StrLen * const pStart = pHint->GetStart();
937cdf0e10cSrcweir                 xub_StrLen * const pEnd = pHint->GetEnd();
938cdf0e10cSrcweir                 if ( *pStart >= nChangePos )
939cdf0e10cSrcweir                 {
940cdf0e10cSrcweir                     *pStart = *pStart + nChangeLen;
941cdf0e10cSrcweir                     if ( pEnd )
942cdf0e10cSrcweir                     {
943cdf0e10cSrcweir                         *pEnd = *pEnd + nChangeLen;
944cdf0e10cSrcweir                     }
945cdf0e10cSrcweir                 }
946cdf0e10cSrcweir                 else if ( pEnd && (*pEnd >= nChangePos) )
947cdf0e10cSrcweir                 {
948cdf0e10cSrcweir                     if ( (*pEnd > nChangePos) || IsIgnoreDontExpand() )
949cdf0e10cSrcweir                     {
950cdf0e10cSrcweir                         *pEnd = *pEnd + nChangeLen;
95169a74367SOliver-Rainer Wittmann                         bTxtAttrChanged = true;
952cdf0e10cSrcweir                     }
953cdf0e10cSrcweir                     else // *pEnd == nChangePos
954cdf0e10cSrcweir                     {
955cdf0e10cSrcweir                         sal_uInt16 nWhPos;
956cdf0e10cSrcweir                         const sal_uInt16 nWhich = pHint->Which();
957cdf0e10cSrcweir 
958cdf0e10cSrcweir                         ASSERT(!isCHRATR(nWhich), "Update: char attr hint?");
959cdf0e10cSrcweir                         if (isCHRATR(nWhich) || isTXTATR_WITHEND(nWhich))
960cdf0e10cSrcweir                         {
961cdf0e10cSrcweir                             nWhPos = static_cast<sal_uInt16>(nWhich -
962cdf0e10cSrcweir                                         RES_CHRATR_BEGIN);
963cdf0e10cSrcweir                         }
96469a74367SOliver-Rainer Wittmann                         else
96569a74367SOliver-Rainer Wittmann                             continue;
966cdf0e10cSrcweir 
96769a74367SOliver-Rainer Wittmann                         if( aDontExp[ nWhPos ] )
96869a74367SOliver-Rainer Wittmann                             continue;
969cdf0e10cSrcweir 
970cdf0e10cSrcweir                         if ( pHint->DontExpand() )
971cdf0e10cSrcweir                         {
972cdf0e10cSrcweir                             pHint->SetDontExpand( false );
973cdf0e10cSrcweir                             bResort = true;
974cdf0e10cSrcweir                             if ( pHint->IsCharFmtAttr() )
975cdf0e10cSrcweir                             {
976cdf0e10cSrcweir                                 bNoExp = true;
97769a74367SOliver-Rainer Wittmann                                 aDontExp[ static_cast<sal_uInt16>(RES_TXTATR_CHARFMT) - static_cast<sal_uInt16>(RES_CHRATR_BEGIN) ]
97869a74367SOliver-Rainer Wittmann                                     = sal_True;
97969a74367SOliver-Rainer Wittmann                                 aDontExp[ static_cast<sal_uInt16>(RES_TXTATR_INETFMT) - static_cast<sal_uInt16>(RES_CHRATR_BEGIN) ]
98069a74367SOliver-Rainer Wittmann                                     = sal_True;
98169a74367SOliver-Rainer Wittmann                             }
98269a74367SOliver-Rainer Wittmann                             else
98369a74367SOliver-Rainer Wittmann                                 aDontExp[ nWhPos ] = sal_True;
98469a74367SOliver-Rainer Wittmann                         }
98569a74367SOliver-Rainer Wittmann                         else if( bNoExp )
98669a74367SOliver-Rainer Wittmann                         {
987cdf0e10cSrcweir                              if ( !pCollector.get() )
988cdf0e10cSrcweir                              {
989cdf0e10cSrcweir                                 pCollector.reset( new TmpHints );
990cdf0e10cSrcweir                              }
99169a74367SOliver-Rainer Wittmann                              sal_uInt16 nCollCnt = pCollector->Count();
99269a74367SOliver-Rainer Wittmann                              for( sal_uInt16 i = 0; i < nCollCnt; ++i )
99369a74367SOliver-Rainer Wittmann                              {
99469a74367SOliver-Rainer Wittmann                                  SwTxtAttr *pTmp = (*pCollector)[ i ];
99569a74367SOliver-Rainer Wittmann                                  if( nWhich == pTmp->Which() )
99669a74367SOliver-Rainer Wittmann                                  {
99769a74367SOliver-Rainer Wittmann                                      pCollector->Remove( i );
99869a74367SOliver-Rainer Wittmann                                      SwTxtAttr::Destroy( pTmp, GetDoc()->GetAttrPool() );
99969a74367SOliver-Rainer Wittmann                                      break;
100069a74367SOliver-Rainer Wittmann                                  }
100169a74367SOliver-Rainer Wittmann                              }
100269a74367SOliver-Rainer Wittmann                              SwTxtAttr * const pTmp =
100369a74367SOliver-Rainer Wittmann                                  MakeTxtAttr( *GetDoc(), pHint->GetAttr(), nChangePos, nChangePos + nChangeLen);
100469a74367SOliver-Rainer Wittmann                              pCollector->C40_INSERT( SwTxtAttr, pTmp, pCollector->Count() );
1005cdf0e10cSrcweir                         }
1006cdf0e10cSrcweir                         else
1007cdf0e10cSrcweir                         {
1008cdf0e10cSrcweir                             *pEnd = *pEnd + nChangeLen;
100969a74367SOliver-Rainer Wittmann                             bTxtAttrChanged = true;
1010cdf0e10cSrcweir                         }
1011cdf0e10cSrcweir                     }
1012cdf0e10cSrcweir                 }
101369a74367SOliver-Rainer Wittmann 
101469a74367SOliver-Rainer Wittmann                 if ( bTxtAttrChanged
101569a74367SOliver-Rainer Wittmann                      && pHint->Which() == RES_TXTATR_INPUTFIELD )
101669a74367SOliver-Rainer Wittmann                 {
101769a74367SOliver-Rainer Wittmann                     SwTxtInputFld* pTxtInputFld = dynamic_cast<SwTxtInputFld*>(pHint);
101869a74367SOliver-Rainer Wittmann                     if ( pTxtInputFld )
101969a74367SOliver-Rainer Wittmann                     {
102069a74367SOliver-Rainer Wittmann                         pTxtInputFld->UpdateFieldContent();
102169a74367SOliver-Rainer Wittmann                     }
102269a74367SOliver-Rainer Wittmann                 }
1023cdf0e10cSrcweir             }
1024cdf0e10cSrcweir             if ( bResort )
1025cdf0e10cSrcweir             {
1026cdf0e10cSrcweir                 m_pSwpHints->Resort();
1027cdf0e10cSrcweir             }
1028cdf0e10cSrcweir         }
1029cdf0e10cSrcweir     }
1030cdf0e10cSrcweir 
10315b9fe260SOliver-Rainer Wittmann     bool bSortMarks = false;
103269a74367SOliver-Rainer Wittmann     SwIndexReg aTmpIdxReg;
1033cdf0e10cSrcweir     if ( !bNegative && !bDelete )
1034cdf0e10cSrcweir     {
103569a74367SOliver-Rainer Wittmann         const SwRedlineTbl& rTbl = GetDoc()->GetRedlineTbl();
1036cdf0e10cSrcweir         for ( sal_uInt16 i = 0; i < rTbl.Count(); ++i )
1037cdf0e10cSrcweir         {
1038cdf0e10cSrcweir             SwRedline *const pRedl = rTbl[ i ];
1039cdf0e10cSrcweir             if ( pRedl->HasMark() )
1040cdf0e10cSrcweir             {
1041cdf0e10cSrcweir                 SwPosition* const pEnd = pRedl->End();
1042cdf0e10cSrcweir                 if ( this == &pEnd->nNode.GetNode() &&
1043cdf0e10cSrcweir                      *pRedl->GetPoint() != *pRedl->GetMark() )
1044cdf0e10cSrcweir                 {
1045cdf0e10cSrcweir                     SwIndex & rIdx = pEnd->nContent;
1046cdf0e10cSrcweir                     if (nChangePos == rIdx.GetIndex())
1047cdf0e10cSrcweir                     {
1048cdf0e10cSrcweir                         rIdx.Assign( &aTmpIdxReg, rIdx.GetIndex() );
1049cdf0e10cSrcweir                     }
1050cdf0e10cSrcweir                 }
1051cdf0e10cSrcweir             }
1052cdf0e10cSrcweir             else if ( this == &pRedl->GetPoint()->nNode.GetNode() )
1053cdf0e10cSrcweir             {
1054cdf0e10cSrcweir                 SwIndex & rIdx = pRedl->GetPoint()->nContent;
1055cdf0e10cSrcweir                 if (nChangePos == rIdx.GetIndex())
1056cdf0e10cSrcweir                 {
1057cdf0e10cSrcweir                     rIdx.Assign( &aTmpIdxReg, rIdx.GetIndex() );
1058cdf0e10cSrcweir                     // mst: FIXME: why does this adjust the unused position???
1059cdf0e10cSrcweir                     SwIndex * pIdx;
1060cdf0e10cSrcweir                     if ( &pRedl->GetBound( true ) == pRedl->GetPoint() )
1061cdf0e10cSrcweir                     {
1062cdf0e10cSrcweir                         pRedl->GetBound( false ) = pRedl->GetBound( true );
1063cdf0e10cSrcweir                         pIdx = &pRedl->GetBound( false ).nContent;
1064cdf0e10cSrcweir                     }
1065cdf0e10cSrcweir                     else
1066cdf0e10cSrcweir                     {
1067cdf0e10cSrcweir                         pRedl->GetBound( true ) = pRedl->GetBound( false );
1068cdf0e10cSrcweir                         pIdx = &pRedl->GetBound( true ).nContent;
1069cdf0e10cSrcweir                     }
1070cdf0e10cSrcweir                     pIdx->Assign( &aTmpIdxReg, pIdx->GetIndex() );
1071cdf0e10cSrcweir                 }
1072cdf0e10cSrcweir             }
1073cdf0e10cSrcweir         }
1074cdf0e10cSrcweir 
1075dec99bbdSOliver-Rainer Wittmann         // Bookmarks must never grow to either side, when editing (directly) to the left or right (#i29942#)!
1076dec99bbdSOliver-Rainer Wittmann         // And a bookmark with same start and end must remain to the left of the inserted text (used in XML import).
1077dec99bbdSOliver-Rainer Wittmann         {
107849bb35beSOliver-Rainer Wittmann             bool bAtLeastOneBookmarkMoved = false;
107949bb35beSOliver-Rainer Wittmann             bool bAtLeastOneExpandedBookmarkAtInsertionPosition = false;
1080dec99bbdSOliver-Rainer Wittmann             const IDocumentMarkAccess* const pMarkAccess = getIDocumentMarkAccess();
1081dec99bbdSOliver-Rainer Wittmann             for ( IDocumentMarkAccess::const_iterator_t ppMark = pMarkAccess->getAllMarksBegin();
1082dec99bbdSOliver-Rainer Wittmann                 ppMark != pMarkAccess->getAllMarksEnd();
1083dec99bbdSOliver-Rainer Wittmann                 ppMark++ )
1084dec99bbdSOliver-Rainer Wittmann             {
1085dec99bbdSOliver-Rainer Wittmann                 const ::sw::mark::IMark* const pMark = ppMark->get();
1086dec99bbdSOliver-Rainer Wittmann                 const SwPosition* pEnd = &pMark->GetMarkEnd();
108749bb35beSOliver-Rainer Wittmann                 SwIndex & rEndIdx = const_cast<SwIndex&>(pEnd->nContent);
1088dec99bbdSOliver-Rainer Wittmann                 if( this == &pEnd->nNode.GetNode() &&
108949bb35beSOliver-Rainer Wittmann                     rPos.GetIndex() == rEndIdx.GetIndex() )
1090dec99bbdSOliver-Rainer Wittmann                 {
109149bb35beSOliver-Rainer Wittmann                     rEndIdx.Assign( &aTmpIdxReg, rEndIdx.GetIndex() );
109249bb35beSOliver-Rainer Wittmann                     bAtLeastOneBookmarkMoved = true;
109349bb35beSOliver-Rainer Wittmann                 }
109449bb35beSOliver-Rainer Wittmann                 else if ( !bAtLeastOneExpandedBookmarkAtInsertionPosition )
109549bb35beSOliver-Rainer Wittmann                 {
109649bb35beSOliver-Rainer Wittmann                     if ( pMark->IsExpanded() )
109749bb35beSOliver-Rainer Wittmann                     {
109849bb35beSOliver-Rainer Wittmann                         const SwPosition* pStart = &pMark->GetMarkStart();
109949bb35beSOliver-Rainer Wittmann                         if ( this == &pStart->nNode.GetNode()
110049bb35beSOliver-Rainer Wittmann                              && rPos.GetIndex() == pStart->nContent.GetIndex() )
110149bb35beSOliver-Rainer Wittmann                         {
110249bb35beSOliver-Rainer Wittmann                             bAtLeastOneExpandedBookmarkAtInsertionPosition = true;
110349bb35beSOliver-Rainer Wittmann                         }
110449bb35beSOliver-Rainer Wittmann                     }
1105dec99bbdSOliver-Rainer Wittmann                 }
1106cdf0e10cSrcweir             }
110749bb35beSOliver-Rainer Wittmann 
110849bb35beSOliver-Rainer Wittmann             bSortMarks = bAtLeastOneBookmarkMoved && bAtLeastOneExpandedBookmarkAtInsertionPosition;
1109cdf0e10cSrcweir         }
1110cdf0e10cSrcweir     }
1111cdf0e10cSrcweir 
1112cdf0e10cSrcweir     // base class
1113cdf0e10cSrcweir     SwIndexReg::Update( rPos, nChangeLen, bNegative, bDelete );
1114cdf0e10cSrcweir 
1115cdf0e10cSrcweir     if ( pCollector.get() )
1116cdf0e10cSrcweir     {
1117cdf0e10cSrcweir         const sal_uInt16 nCount = pCollector->Count();
1118cdf0e10cSrcweir         for ( sal_uInt16 i = 0; i < nCount; ++i )
1119cdf0e10cSrcweir         {
1120cdf0e10cSrcweir             m_pSwpHints->TryInsertHint( (*pCollector)[ i ], *this );
1121cdf0e10cSrcweir         }
1122cdf0e10cSrcweir     }
1123cdf0e10cSrcweir 
112469a74367SOliver-Rainer Wittmann     aTmpIdxReg.MoveTo( *this );
11255b9fe260SOliver-Rainer Wittmann     if ( bSortMarks )
11265b9fe260SOliver-Rainer Wittmann     {
11275b9fe260SOliver-Rainer Wittmann         getIDocumentMarkAccess()->assureSortedMarkContainers();
11285b9fe260SOliver-Rainer Wittmann     }
1129cdf0e10cSrcweir }
1130cdf0e10cSrcweir 
_ChgTxtCollUpdateNum(const SwTxtFmtColl * pOldColl,const SwTxtFmtColl * pNewColl)1131cdf0e10cSrcweir void SwTxtNode::_ChgTxtCollUpdateNum( const SwTxtFmtColl *pOldColl,
1132cdf0e10cSrcweir 										const SwTxtFmtColl *pNewColl)
1133cdf0e10cSrcweir {
1134cdf0e10cSrcweir 	SwDoc* pDoc = GetDoc();
1135cdf0e10cSrcweir 	ASSERT( pDoc, "Kein Doc?" );
1136cdf0e10cSrcweir 	// erfrage die OutlineLevel und update gegebenenfalls das Nodes-Array,
1137cdf0e10cSrcweir 	// falls sich die Level geaendert haben !
1138cdf0e10cSrcweir 	//const sal_uInt8 nOldLevel = pOldColl ? pOldColl->GetOutlineLevel():NO_NUMBERING;//#outline level,removed by zhaojianwei
1139cdf0e10cSrcweir 	//const sal_uInt8 nNewLevel = pNewColl ? pNewColl->GetOutlineLevel():NO_NUMBERING;//<-end,zhaojianwei
1140cdf0e10cSrcweir 	const int nOldLevel = pOldColl && pOldColl->IsAssignedToListLevelOfOutlineStyle() ?
1141cdf0e10cSrcweir 	                 pOldColl->GetAssignedOutlineStyleLevel() : MAXLEVEL;
1142cdf0e10cSrcweir     const int nNewLevel = pNewColl && pNewColl->IsAssignedToListLevelOfOutlineStyle() ?
1143cdf0e10cSrcweir 					 pNewColl->GetAssignedOutlineStyleLevel() : MAXLEVEL;
1144cdf0e10cSrcweir 
1145cdf0e10cSrcweir //	if ( NO_NUMBERING != nNewLevel )	//#outline level,zhaojianwei
1146cdf0e10cSrcweir 	if ( MAXLEVEL != nNewLevel )	//<-end,zhaojianwei
1147cdf0e10cSrcweir     {
1148cdf0e10cSrcweir         SetAttrListLevel(nNewLevel);
1149cdf0e10cSrcweir     }
1150cdf0e10cSrcweir 
1151cdf0e10cSrcweir 	{
1152cdf0e10cSrcweir         if (pDoc)
1153cdf0e10cSrcweir             pDoc->GetNodes().UpdateOutlineNode(*this);
1154cdf0e10cSrcweir     }
1155cdf0e10cSrcweir 
1156cdf0e10cSrcweir 
1157cdf0e10cSrcweir 	SwNodes& rNds = GetNodes();
1158cdf0e10cSrcweir 	// Update beim Level 0 noch die Fussnoten !!
1159cdf0e10cSrcweir 	if( ( !nNewLevel || !nOldLevel) && pDoc->GetFtnIdxs().Count() &&
1160cdf0e10cSrcweir 		FTNNUM_CHAPTER == pDoc->GetFtnInfo().eNum &&
1161cdf0e10cSrcweir 		rNds.IsDocNodes() )
1162cdf0e10cSrcweir 	{
1163cdf0e10cSrcweir 		SwNodeIndex aTmpIndex( rNds, GetIndex());
1164cdf0e10cSrcweir 
1165cdf0e10cSrcweir 		pDoc->GetFtnIdxs().UpdateFtn( aTmpIndex);
1166cdf0e10cSrcweir 	}
1167cdf0e10cSrcweir 
1168cdf0e10cSrcweir //FEATURE::CONDCOLL
1169cdf0e10cSrcweir 	if( /*pOldColl != pNewColl && pNewColl && */
1170cdf0e10cSrcweir 		RES_CONDTXTFMTCOLL == pNewColl->Which() )
1171cdf0e10cSrcweir 	{
1172cdf0e10cSrcweir 		// Erfrage die akt. Condition des TextNodes:
1173cdf0e10cSrcweir 		ChkCondColl();
1174cdf0e10cSrcweir 	}
1175cdf0e10cSrcweir //FEATURE::CONDCOLL
1176cdf0e10cSrcweir }
1177cdf0e10cSrcweir 
1178cdf0e10cSrcweir // Wenn man sich genau am Ende einer Text- bzw. INetvorlage befindet,
1179cdf0e10cSrcweir // bekommt diese das DontExpand-Flag verpasst
1180cdf0e10cSrcweir 
DontExpandFmt(const SwIndex & rIdx,bool bFlag,sal_Bool bFmtToTxtAttributes)1181cdf0e10cSrcweir sal_Bool SwTxtNode::DontExpandFmt( const SwIndex& rIdx, bool bFlag,
1182cdf0e10cSrcweir 								sal_Bool bFmtToTxtAttributes )
1183cdf0e10cSrcweir {
1184cdf0e10cSrcweir 	const xub_StrLen nIdx = rIdx.GetIndex();
1185cdf0e10cSrcweir     if ( bFmtToTxtAttributes && nIdx == m_Text.Len() )
1186cdf0e10cSrcweir     {
1187cdf0e10cSrcweir         FmtToTxtAttr( this );
1188cdf0e10cSrcweir     }
1189cdf0e10cSrcweir 
1190cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
1191cdf0e10cSrcweir     if ( HasHints() )
1192cdf0e10cSrcweir     {
1193cdf0e10cSrcweir         const sal_uInt16 nEndCnt = m_pSwpHints->GetEndCount();
1194cdf0e10cSrcweir 		sal_uInt16 nPos = nEndCnt;
1195cdf0e10cSrcweir 		while( nPos )
1196cdf0e10cSrcweir         {
1197cdf0e10cSrcweir             SwTxtAttr *pTmp = m_pSwpHints->GetEnd( --nPos );
1198cdf0e10cSrcweir 			xub_StrLen *pEnd = pTmp->GetEnd();
1199cdf0e10cSrcweir 			if( !pEnd || *pEnd > nIdx )
1200cdf0e10cSrcweir 				continue;
1201cdf0e10cSrcweir 			if( nIdx != *pEnd )
1202cdf0e10cSrcweir 				nPos = 0;
1203cdf0e10cSrcweir 			else if( bFlag != pTmp->DontExpand() && !pTmp->IsLockExpandFlag()
1204cdf0e10cSrcweir 					 && *pEnd > *pTmp->GetStart())
1205cdf0e10cSrcweir 			{
1206cdf0e10cSrcweir 				bRet = sal_True;
1207cdf0e10cSrcweir                 m_pSwpHints->NoteInHistory( pTmp );
1208cdf0e10cSrcweir 				pTmp->SetDontExpand( bFlag );
1209cdf0e10cSrcweir 			}
1210cdf0e10cSrcweir 		}
1211cdf0e10cSrcweir 	}
1212cdf0e10cSrcweir 	return bRet;
1213cdf0e10cSrcweir }
1214cdf0e10cSrcweir 
lcl_GetTxtAttrDefault(xub_StrLen const nIndex,xub_StrLen const nHintStart,xub_StrLen const nHintEnd)1215cdf0e10cSrcweir static bool lcl_GetTxtAttrDefault(xub_StrLen const nIndex,
1216cdf0e10cSrcweir     xub_StrLen const nHintStart, xub_StrLen const nHintEnd)
1217cdf0e10cSrcweir {
1218cdf0e10cSrcweir     return ((nHintStart <= nIndex) && (nIndex <  nHintEnd));
1219cdf0e10cSrcweir }
lcl_GetTxtAttrExpand(xub_StrLen const nIndex,xub_StrLen const nHintStart,xub_StrLen const nHintEnd)1220cdf0e10cSrcweir static bool lcl_GetTxtAttrExpand(xub_StrLen const nIndex,
1221cdf0e10cSrcweir     xub_StrLen const nHintStart, xub_StrLen const nHintEnd)
1222cdf0e10cSrcweir {
1223cdf0e10cSrcweir     return ((nHintStart <  nIndex) && (nIndex <= nHintEnd));
1224cdf0e10cSrcweir }
lcl_GetTxtAttrParent(xub_StrLen const nIndex,xub_StrLen const nHintStart,xub_StrLen const nHintEnd)1225cdf0e10cSrcweir static bool lcl_GetTxtAttrParent(xub_StrLen const nIndex,
1226cdf0e10cSrcweir     xub_StrLen const nHintStart, xub_StrLen const nHintEnd)
1227cdf0e10cSrcweir {
1228cdf0e10cSrcweir     return ((nHintStart <  nIndex) && (nIndex <  nHintEnd));
1229cdf0e10cSrcweir }
1230cdf0e10cSrcweir 
1231cdf0e10cSrcweir static void
lcl_GetTxtAttrs(::std::vector<SwTxtAttr * > * const pVector,SwTxtAttr ** const ppTxtAttr,SwpHints * const pSwpHints,xub_StrLen const nIndex,RES_TXTATR const nWhich,enum SwTxtNode::GetTxtAttrMode const eMode)1232cdf0e10cSrcweir lcl_GetTxtAttrs(
123369a74367SOliver-Rainer Wittmann     ::std::vector<SwTxtAttr *> *const pVector,
123469a74367SOliver-Rainer Wittmann     SwTxtAttr **const ppTxtAttr,
1235cdf0e10cSrcweir     SwpHints *const pSwpHints,
123669a74367SOliver-Rainer Wittmann     xub_StrLen const nIndex,
123769a74367SOliver-Rainer Wittmann     RES_TXTATR const nWhich,
1238cdf0e10cSrcweir     enum SwTxtNode::GetTxtAttrMode const eMode)
1239cdf0e10cSrcweir {
1240cdf0e10cSrcweir     sal_uInt16 const nSize = (pSwpHints) ? pSwpHints->Count() : 0;
1241cdf0e10cSrcweir     xub_StrLen nPreviousIndex(0); // index of last hint with nWhich
1242cdf0e10cSrcweir     bool (*pMatchFunc)(xub_StrLen const, xub_StrLen const, xub_StrLen const)=0;
1243cdf0e10cSrcweir     switch (eMode)
1244cdf0e10cSrcweir     {
1245cdf0e10cSrcweir         case SwTxtNode::DEFAULT:   pMatchFunc = &lcl_GetTxtAttrDefault; break;
1246cdf0e10cSrcweir         case SwTxtNode::EXPAND:    pMatchFunc = &lcl_GetTxtAttrExpand;  break;
1247cdf0e10cSrcweir         case SwTxtNode::PARENT:    pMatchFunc = &lcl_GetTxtAttrParent;  break;
1248cdf0e10cSrcweir         default: OSL_ASSERT(false);
1249cdf0e10cSrcweir     }
1250cdf0e10cSrcweir 
125169a74367SOliver-Rainer Wittmann     for( sal_uInt16 i = 0; i < nSize; ++i )
1252cdf0e10cSrcweir     {
1253cdf0e10cSrcweir         SwTxtAttr *const pHint = pSwpHints->GetTextHint(i);
1254cdf0e10cSrcweir         xub_StrLen const nHintStart( *(pHint->GetStart()) );
1255cdf0e10cSrcweir         if (nIndex < nHintStart)
1256cdf0e10cSrcweir         {
1257cdf0e10cSrcweir             return; // hints are sorted by start, so we are done...
1258cdf0e10cSrcweir         }
1259cdf0e10cSrcweir 
1260cdf0e10cSrcweir         if (pHint->Which() != nWhich)
1261cdf0e10cSrcweir         {
1262cdf0e10cSrcweir             continue;
1263cdf0e10cSrcweir         }
1264cdf0e10cSrcweir 
1265cdf0e10cSrcweir         xub_StrLen const*const pEndIdx = pHint->GetEnd();
126669a74367SOliver-Rainer Wittmann         ASSERT(pEndIdx || pHint->HasDummyChar(), "hint with no end and no dummy char?");
126769a74367SOliver-Rainer Wittmann         // Wenn bExpand gesetzt ist, wird das Verhalten bei Eingabe
126869a74367SOliver-Rainer Wittmann         // simuliert, d.h. der Start wuede verschoben, das Ende expandiert,
1269cdf0e10cSrcweir         bool const bContained( (pEndIdx)
1270cdf0e10cSrcweir             ? (*pMatchFunc)(nIndex, nHintStart, *pEndIdx)
1271cdf0e10cSrcweir             : (nHintStart == nIndex) );
1272cdf0e10cSrcweir         if (bContained)
1273cdf0e10cSrcweir         {
1274cdf0e10cSrcweir             if (pVector)
1275cdf0e10cSrcweir             {
1276cdf0e10cSrcweir                 if (nPreviousIndex < nHintStart)
1277cdf0e10cSrcweir                 {
1278cdf0e10cSrcweir                     pVector->clear(); // clear hints that are outside pHint
1279cdf0e10cSrcweir                     nPreviousIndex = nHintStart;
1280cdf0e10cSrcweir                 }
1281cdf0e10cSrcweir                 pVector->push_back(pHint);
1282cdf0e10cSrcweir             }
1283cdf0e10cSrcweir             else
1284cdf0e10cSrcweir             {
1285cdf0e10cSrcweir                 *ppTxtAttr = pHint; // and possibly overwrite outer hint
1286cdf0e10cSrcweir             }
1287cdf0e10cSrcweir             if (!pEndIdx)
1288cdf0e10cSrcweir             {
1289cdf0e10cSrcweir                 break;
1290cdf0e10cSrcweir             }
1291cdf0e10cSrcweir         }
1292cdf0e10cSrcweir     }
1293cdf0e10cSrcweir }
1294cdf0e10cSrcweir 
1295cdf0e10cSrcweir ::std::vector<SwTxtAttr *>
GetTxtAttrsAt(xub_StrLen const nIndex,RES_TXTATR const nWhich,enum GetTxtAttrMode const eMode) const1296cdf0e10cSrcweir SwTxtNode::GetTxtAttrsAt(xub_StrLen const nIndex, RES_TXTATR const nWhich,
1297cdf0e10cSrcweir                         enum GetTxtAttrMode const eMode) const
1298cdf0e10cSrcweir {
1299cdf0e10cSrcweir     ::std::vector<SwTxtAttr *> ret;
1300cdf0e10cSrcweir     lcl_GetTxtAttrs(& ret, 0, m_pSwpHints, nIndex, nWhich, eMode);
1301cdf0e10cSrcweir     return ret;
1302cdf0e10cSrcweir }
1303cdf0e10cSrcweir 
1304cdf0e10cSrcweir SwTxtAttr *
GetTxtAttrAt(xub_StrLen const nIndex,RES_TXTATR const nWhich,enum GetTxtAttrMode const eMode) const1305cdf0e10cSrcweir SwTxtNode::GetTxtAttrAt(xub_StrLen const nIndex, RES_TXTATR const nWhich,
1306cdf0e10cSrcweir                         enum GetTxtAttrMode const eMode) const
1307cdf0e10cSrcweir {
1308cdf0e10cSrcweir     ASSERT(    (nWhich == RES_TXTATR_META)
1309cdf0e10cSrcweir             || (nWhich == RES_TXTATR_METAFIELD)
1310cdf0e10cSrcweir             || (nWhich == RES_TXTATR_AUTOFMT)
1311cdf0e10cSrcweir             || (nWhich == RES_TXTATR_INETFMT)
1312cdf0e10cSrcweir             || (nWhich == RES_TXTATR_CJK_RUBY)
131369a74367SOliver-Rainer Wittmann             || (nWhich == RES_TXTATR_UNKNOWN_CONTAINER)
131469a74367SOliver-Rainer Wittmann             || (nWhich == RES_TXTATR_INPUTFIELD ),
1315cdf0e10cSrcweir         "GetTxtAttrAt() will give wrong result for this hint!");
1316cdf0e10cSrcweir 
1317cdf0e10cSrcweir     SwTxtAttr * pRet(0);
1318cdf0e10cSrcweir     lcl_GetTxtAttrs(0, & pRet, m_pSwpHints, nIndex, nWhich, eMode);
1319cdf0e10cSrcweir     return pRet;
1320cdf0e10cSrcweir }
1321cdf0e10cSrcweir 
GetOverlappingInputFld(const SwTxtAttr & rTxtAttr) const132269a74367SOliver-Rainer Wittmann const SwTxtInputFld* SwTxtNode::GetOverlappingInputFld( const SwTxtAttr& rTxtAttr ) const
132369a74367SOliver-Rainer Wittmann {
132469a74367SOliver-Rainer Wittmann     const SwTxtInputFld* pTxtInputFld = NULL;
132569a74367SOliver-Rainer Wittmann 
132669a74367SOliver-Rainer Wittmann     pTxtInputFld = dynamic_cast<const SwTxtInputFld*>(GetTxtAttrAt( *(rTxtAttr.GetStart()), RES_TXTATR_INPUTFIELD, PARENT ));
132769a74367SOliver-Rainer Wittmann 
132869a74367SOliver-Rainer Wittmann     if ( pTxtInputFld == NULL && rTxtAttr.End() != NULL )
132969a74367SOliver-Rainer Wittmann     {
133069a74367SOliver-Rainer Wittmann         pTxtInputFld = dynamic_cast<const SwTxtInputFld*>(GetTxtAttrAt( *(rTxtAttr.End()), RES_TXTATR_INPUTFIELD, PARENT ));
133169a74367SOliver-Rainer Wittmann     }
133269a74367SOliver-Rainer Wittmann 
133369a74367SOliver-Rainer Wittmann     return pTxtInputFld;
133469a74367SOliver-Rainer Wittmann }
133569a74367SOliver-Rainer Wittmann 
GetFldTxtAttrAt(const xub_StrLen nIndex,const bool bIncludeInputFldAtStart) const133669a74367SOliver-Rainer Wittmann SwTxtFld* SwTxtNode::GetFldTxtAttrAt(
133769a74367SOliver-Rainer Wittmann     const xub_StrLen nIndex,
133869a74367SOliver-Rainer Wittmann     const bool bIncludeInputFldAtStart ) const
133969a74367SOliver-Rainer Wittmann {
134069a74367SOliver-Rainer Wittmann     SwTxtFld* pTxtFld = NULL;
134169a74367SOliver-Rainer Wittmann 
134269a74367SOliver-Rainer Wittmann     pTxtFld = dynamic_cast<SwTxtFld*>(GetTxtAttrForCharAt( nIndex, RES_TXTATR_FIELD ));
134369a74367SOliver-Rainer Wittmann     if ( pTxtFld == NULL )
1344dec99bbdSOliver-Rainer Wittmann     {
1345dec99bbdSOliver-Rainer Wittmann         pTxtFld = dynamic_cast<SwTxtFld*>(GetTxtAttrForCharAt( nIndex, RES_TXTATR_ANNOTATION ));
1346dec99bbdSOliver-Rainer Wittmann     }
1347dec99bbdSOliver-Rainer Wittmann     if ( pTxtFld == NULL )
134869a74367SOliver-Rainer Wittmann     {
134969a74367SOliver-Rainer Wittmann         pTxtFld =
135069a74367SOliver-Rainer Wittmann             dynamic_cast<SwTxtFld*>( GetTxtAttrAt(
135169a74367SOliver-Rainer Wittmann                 nIndex,
135269a74367SOliver-Rainer Wittmann                 RES_TXTATR_INPUTFIELD,
135369a74367SOliver-Rainer Wittmann                 bIncludeInputFldAtStart ? DEFAULT : PARENT ));
135469a74367SOliver-Rainer Wittmann     }
135569a74367SOliver-Rainer Wittmann 
135669a74367SOliver-Rainer Wittmann     return pTxtFld;
135769a74367SOliver-Rainer Wittmann }
135869a74367SOliver-Rainer Wittmann 
135969a74367SOliver-Rainer Wittmann 
1360cdf0e10cSrcweir /*************************************************************************
1361cdf0e10cSrcweir  *							CopyHint()
1362cdf0e10cSrcweir  *************************************************************************/
1363cdf0e10cSrcweir 
lcl_FindCharFmt(const SwCharFmts * pCharFmts,const XubString & rName)1364cdf0e10cSrcweir SwCharFmt* lcl_FindCharFmt( const SwCharFmts* pCharFmts, const XubString& rName )
1365cdf0e10cSrcweir {
1366cdf0e10cSrcweir 	if( rName.Len() )
1367cdf0e10cSrcweir 	{
1368cdf0e10cSrcweir 		SwCharFmt* pFmt;
1369cdf0e10cSrcweir 		sal_uInt16 nArrLen = pCharFmts->Count();
1370cdf0e10cSrcweir 		for( sal_uInt16 i = 1; i < nArrLen; i++ )
1371cdf0e10cSrcweir 		{
1372cdf0e10cSrcweir 			pFmt = (*pCharFmts)[ i ];
1373cdf0e10cSrcweir 			if( pFmt->GetName().CompareTo( rName ) == COMPARE_EQUAL )
1374cdf0e10cSrcweir 				return pFmt;
1375cdf0e10cSrcweir 		}
1376cdf0e10cSrcweir 	}
1377cdf0e10cSrcweir 	return NULL;
1378cdf0e10cSrcweir }
1379cdf0e10cSrcweir 
lcl_CopyHint(const sal_uInt16 nWhich,const SwTxtAttr * const pHt,SwTxtAttr * const pNewHt,SwDoc * const pOtherDoc,SwTxtNode * const pDest)138069a74367SOliver-Rainer Wittmann void lcl_CopyHint(
138169a74367SOliver-Rainer Wittmann     const sal_uInt16 nWhich,
138269a74367SOliver-Rainer Wittmann     const SwTxtAttr * const pHt,
138369a74367SOliver-Rainer Wittmann     SwTxtAttr *const pNewHt,
138469a74367SOliver-Rainer Wittmann     SwDoc *const pOtherDoc,
138569a74367SOliver-Rainer Wittmann     SwTxtNode *const pDest )
1386cdf0e10cSrcweir {
138769a74367SOliver-Rainer Wittmann     ASSERT( nWhich == pHt->Which(), "Falsche Hint-Id" );
138869a74367SOliver-Rainer Wittmann     switch( nWhich )
138969a74367SOliver-Rainer Wittmann     {
139069a74367SOliver-Rainer Wittmann     // copy nodesarray section with footnote content
139169a74367SOliver-Rainer Wittmann     case RES_TXTATR_FTN :
1392cdf0e10cSrcweir             ASSERT(pDest, "lcl_CopyHint: no destination text node?");
139369a74367SOliver-Rainer Wittmann             static_cast<const SwTxtFtn*>(pHt)->CopyFtn( *static_cast<SwTxtFtn*>(pNewHt), *pDest);
139469a74367SOliver-Rainer Wittmann             break;
1395cdf0e10cSrcweir 
139669a74367SOliver-Rainer Wittmann     // Beim Kopieren von Feldern in andere Dokumente
139769a74367SOliver-Rainer Wittmann     // muessen die Felder bei ihren neuen Feldtypen angemeldet werden.
1398cdf0e10cSrcweir 
139969a74367SOliver-Rainer Wittmann     // TabellenFormel muessen relativ kopiert werden.
140069a74367SOliver-Rainer Wittmann     case RES_TXTATR_FIELD :
140169a74367SOliver-Rainer Wittmann         {
1402dec99bbdSOliver-Rainer Wittmann             if( pOtherDoc != NULL )
140369a74367SOliver-Rainer Wittmann             {
140469a74367SOliver-Rainer Wittmann                 static_cast<const SwTxtFld*>(pHt)->CopyTxtFld( static_cast<SwTxtFld*>(pNewHt) );
140569a74367SOliver-Rainer Wittmann             }
1406cdf0e10cSrcweir 
140769a74367SOliver-Rainer Wittmann             // Tabellenformel ??
140869a74367SOliver-Rainer Wittmann             const SwFmtFld& rFld = pHt->GetFmtFld();
140969a74367SOliver-Rainer Wittmann             if( RES_TABLEFLD == rFld.GetField()->GetTyp()->Which()
141069a74367SOliver-Rainer Wittmann                 && static_cast<const SwTblField*>(rFld.GetField())->IsIntrnlName())
141169a74367SOliver-Rainer Wittmann             {
141269a74367SOliver-Rainer Wittmann                 // wandel die interne in eine externe Formel um
141369a74367SOliver-Rainer Wittmann                 const SwTableNode* const pDstTblNd =
141469a74367SOliver-Rainer Wittmann                     static_cast<const SwTxtFld*>(pHt)->GetTxtNode().FindTableNode();
141569a74367SOliver-Rainer Wittmann                 if( pDstTblNd )
1416c0286415SOliver-Rainer Wittmann                 {
1417dec99bbdSOliver-Rainer Wittmann                     SwTblField* const pTblFld =
1418dec99bbdSOliver-Rainer Wittmann                         const_cast<SwTblField*>(static_cast<const SwTblField*>(
1419dec99bbdSOliver-Rainer Wittmann                             pNewHt->GetFmtFld().GetField()));
142069a74367SOliver-Rainer Wittmann                     pTblFld->PtrToBoxNm( &pDstTblNd->GetTable() );
1421c0286415SOliver-Rainer Wittmann                 }
1422c0286415SOliver-Rainer Wittmann             }
142369a74367SOliver-Rainer Wittmann         }
142469a74367SOliver-Rainer Wittmann         break;
1425cdf0e10cSrcweir 
1426dec99bbdSOliver-Rainer Wittmann     case RES_TXTATR_INPUTFIELD :
1427dec99bbdSOliver-Rainer Wittmann     case RES_TXTATR_ANNOTATION :
1428dec99bbdSOliver-Rainer Wittmann         if( pOtherDoc != NULL )
1429dec99bbdSOliver-Rainer Wittmann         {
1430dec99bbdSOliver-Rainer Wittmann             static_cast<const SwTxtFld*>(pHt)->CopyTxtFld( static_cast<SwTxtFld*>(pNewHt) );
1431dec99bbdSOliver-Rainer Wittmann         }
1432dec99bbdSOliver-Rainer Wittmann         break;
1433dec99bbdSOliver-Rainer Wittmann 
143469a74367SOliver-Rainer Wittmann     case RES_TXTATR_TOXMARK :
143569a74367SOliver-Rainer Wittmann         if( pOtherDoc && pDest && pDest->GetpSwpHints()
143669a74367SOliver-Rainer Wittmann             && USHRT_MAX != pDest->GetpSwpHints()->GetPos( pNewHt ) )
143769a74367SOliver-Rainer Wittmann         {
143869a74367SOliver-Rainer Wittmann             // Beim Kopieren von TOXMarks(Client) in andere Dokumente
143969a74367SOliver-Rainer Wittmann             // muss der Verzeichnis (Modify) ausgetauscht werden
144069a74367SOliver-Rainer Wittmann             static_cast<SwTxtTOXMark*>(pNewHt)->CopyTOXMark( pOtherDoc );
144169a74367SOliver-Rainer Wittmann         }
144269a74367SOliver-Rainer Wittmann         break;
1443cdf0e10cSrcweir 
144469a74367SOliver-Rainer Wittmann     case RES_TXTATR_CHARFMT :
144569a74367SOliver-Rainer Wittmann         // Wenn wir es mit einer Zeichenvorlage zu tun haben,
144669a74367SOliver-Rainer Wittmann         // muessen wir natuerlich auch die Formate kopieren.
144769a74367SOliver-Rainer Wittmann         if( pDest && pDest->GetpSwpHints()
144869a74367SOliver-Rainer Wittmann             && USHRT_MAX != pDest->GetpSwpHints()->GetPos( pNewHt ) )
144969a74367SOliver-Rainer Wittmann         {
145069a74367SOliver-Rainer Wittmann             SwCharFmt* pFmt =
145169a74367SOliver-Rainer Wittmann                 static_cast<SwCharFmt*>(pHt->GetCharFmt().GetCharFmt());
1452cdf0e10cSrcweir 
145369a74367SOliver-Rainer Wittmann             if( pFmt && pOtherDoc )
145469a74367SOliver-Rainer Wittmann             {
145569a74367SOliver-Rainer Wittmann                 pFmt = pOtherDoc->CopyCharFmt( *pFmt );
145669a74367SOliver-Rainer Wittmann             }
145769a74367SOliver-Rainer Wittmann             const_cast<SwFmtCharFmt&>( static_cast<const SwFmtCharFmt&>(
145869a74367SOliver-Rainer Wittmann                 pNewHt->GetCharFmt() ) ).SetCharFmt( pFmt );
145969a74367SOliver-Rainer Wittmann         }
146069a74367SOliver-Rainer Wittmann         break;
146169a74367SOliver-Rainer Wittmann     case RES_TXTATR_INETFMT :
1462cdf0e10cSrcweir         {
146369a74367SOliver-Rainer Wittmann             // Wenn wir es mit benutzerdefinierten INet-Zeichenvorlagen
146469a74367SOliver-Rainer Wittmann             // zu tun haben, muessen wir natuerlich auch die Formate kopieren.
146569a74367SOliver-Rainer Wittmann             if( pOtherDoc && pDest && pDest->GetpSwpHints()
146669a74367SOliver-Rainer Wittmann                 && USHRT_MAX != pDest->GetpSwpHints()->GetPos( pNewHt ) )
146769a74367SOliver-Rainer Wittmann             {
1468cdf0e10cSrcweir                 const SwDoc* const pDoc = static_cast<const SwTxtINetFmt*>(pHt)
146969a74367SOliver-Rainer Wittmann                     ->GetTxtNode().GetDoc();
1470cdf0e10cSrcweir                 if ( pDoc )
147169a74367SOliver-Rainer Wittmann                 {
147269a74367SOliver-Rainer Wittmann                     const SwCharFmts* pCharFmts = pDoc->GetCharFmts();
147369a74367SOliver-Rainer Wittmann                     const SwFmtINetFmt& rFmt = pHt->GetINetFmt();
147469a74367SOliver-Rainer Wittmann                     SwCharFmt* pFmt;
147569a74367SOliver-Rainer Wittmann                     pFmt = lcl_FindCharFmt( pCharFmts, rFmt.GetINetFmt() );
147669a74367SOliver-Rainer Wittmann                     if( pFmt )
147769a74367SOliver-Rainer Wittmann                         pOtherDoc->CopyCharFmt( *pFmt );
147869a74367SOliver-Rainer Wittmann                     pFmt = lcl_FindCharFmt( pCharFmts, rFmt.GetVisitedFmt() );
147969a74367SOliver-Rainer Wittmann                     if( pFmt )
148069a74367SOliver-Rainer Wittmann                         pOtherDoc->CopyCharFmt( *pFmt );
148169a74367SOliver-Rainer Wittmann                 }
148269a74367SOliver-Rainer Wittmann             }
148369a74367SOliver-Rainer Wittmann             //JP 24.04.98: Bug 49753 - ein TextNode muss am Attribut
148469a74367SOliver-Rainer Wittmann             //				gesetzt sein, damit die Vorlagen erzeugt
148569a74367SOliver-Rainer Wittmann             //				werden koenne
1486cdf0e10cSrcweir             SwTxtINetFmt* const pINetHt = static_cast<SwTxtINetFmt*>(pNewHt);
1487cdf0e10cSrcweir             if ( !pINetHt->GetpTxtNode() )
1488cdf0e10cSrcweir             {
1489cdf0e10cSrcweir                 pINetHt->ChgTxtNode( pDest );
1490cdf0e10cSrcweir             }
1491cdf0e10cSrcweir 
149269a74367SOliver-Rainer Wittmann             //JP 22.10.97: Bug 44875 - Verbindung zum Format herstellen
1493cdf0e10cSrcweir             pINetHt->GetCharFmt();
1494cdf0e10cSrcweir             break;
149569a74367SOliver-Rainer Wittmann         }
149669a74367SOliver-Rainer Wittmann     case RES_TXTATR_META:
149769a74367SOliver-Rainer Wittmann     case RES_TXTATR_METAFIELD:
149869a74367SOliver-Rainer Wittmann         OSL_ENSURE( pNewHt, "copying Meta should not fail!" );
149969a74367SOliver-Rainer Wittmann         OSL_ENSURE( pDest
150069a74367SOliver-Rainer Wittmann                     && (CH_TXTATR_INWORD == pDest->GetTxt().GetChar(*pNewHt->GetStart())),
150169a74367SOliver-Rainer Wittmann             "missing CH_TXTATR?");
150269a74367SOliver-Rainer Wittmann         break;
1503cdf0e10cSrcweir     }
1504cdf0e10cSrcweir }
1505cdf0e10cSrcweir 
1506cdf0e10cSrcweir /*************************************************************************
1507cdf0e10cSrcweir |*	SwTxtNode::CopyAttr()
1508cdf0e10cSrcweir |*	Beschreibung	kopiert Attribute an der Position nStart in pDest.
1509cdf0e10cSrcweir |*	BP 7.6.93:		Es werden mit Absicht nur die Attribute _mit_ EndIdx
1510cdf0e10cSrcweir |*					kopiert! CopyAttr wird vornehmlich dann gerufen,
1511cdf0e10cSrcweir |*					wenn Attribute fuer einen Node mit leerem String
1512cdf0e10cSrcweir |*					gesetzt werden sollen.
1513cdf0e10cSrcweir *************************************************************************/
1514cdf0e10cSrcweir 
CopyAttr(SwTxtNode * pDest,const xub_StrLen nTxtStartIdx,const xub_StrLen nOldPos)1515cdf0e10cSrcweir void SwTxtNode::CopyAttr( SwTxtNode *pDest, const xub_StrLen nTxtStartIdx,
151669a74367SOliver-Rainer Wittmann                           const xub_StrLen nOldPos )
1517cdf0e10cSrcweir {
1518cdf0e10cSrcweir     if ( HasHints() )    // keine Attribute, keine Kekse
1519cdf0e10cSrcweir     {
1520cdf0e10cSrcweir         SwDoc* const pOtherDoc = (pDest->GetDoc() != GetDoc()) ?
1521cdf0e10cSrcweir                 pDest->GetDoc() : 0;
1522cdf0e10cSrcweir 
1523cdf0e10cSrcweir         for ( sal_uInt16 i = 0; i < m_pSwpHints->Count(); i++ )
1524cdf0e10cSrcweir         {
1525cdf0e10cSrcweir             SwTxtAttr *const pHt = m_pSwpHints->GetTextHint(i);
1526cdf0e10cSrcweir             xub_StrLen const nAttrStartIdx = *pHt->GetStart();
1527cdf0e10cSrcweir             if ( nTxtStartIdx < nAttrStartIdx )
152869a74367SOliver-Rainer Wittmann                 break; // ueber das Textende, da nLen == 0
1529cdf0e10cSrcweir 
1530cdf0e10cSrcweir             const xub_StrLen *const pEndIdx = pHt->GetEnd();
1531cdf0e10cSrcweir             if ( pEndIdx && !pHt->HasDummyChar() )
153269a74367SOliver-Rainer Wittmann             {
153369a74367SOliver-Rainer Wittmann                 if ( ( *pEndIdx > nTxtStartIdx
153469a74367SOliver-Rainer Wittmann                        || ( *pEndIdx == nTxtStartIdx
153569a74367SOliver-Rainer Wittmann                             && nAttrStartIdx == nTxtStartIdx ) ) )
153669a74367SOliver-Rainer Wittmann                 {
1537cdf0e10cSrcweir                     sal_uInt16 const nWhich = pHt->Which();
1538cdf0e10cSrcweir                     if ( RES_TXTATR_REFMARK != nWhich )
1539cdf0e10cSrcweir                     {
1540cdf0e10cSrcweir                         // attribute in the area => copy
154169a74367SOliver-Rainer Wittmann                         SwTxtAttr *const pNewHt =
154269a74367SOliver-Rainer Wittmann                             pDest->InsertItem( pHt->GetAttr(), nOldPos, nOldPos, nsSetAttrMode::SETATTR_IS_COPY);
1543cdf0e10cSrcweir                         if ( pNewHt )
1544cdf0e10cSrcweir                         {
1545cdf0e10cSrcweir                             lcl_CopyHint( nWhich, pHt, pNewHt,
154669a74367SOliver-Rainer Wittmann                                 pOtherDoc, pDest );
1547cdf0e10cSrcweir                         }
1548cdf0e10cSrcweir                     }
154969a74367SOliver-Rainer Wittmann                     else if( !pOtherDoc
155069a74367SOliver-Rainer Wittmann                              ? GetDoc()->IsCopyIsMove()
155169a74367SOliver-Rainer Wittmann                              : 0 == pOtherDoc->GetRefMark( pHt->GetRefMark().GetRefName() ) )
1552cdf0e10cSrcweir                     {
155369a74367SOliver-Rainer Wittmann                         pDest->InsertItem(
155469a74367SOliver-Rainer Wittmann                             pHt->GetAttr(), nOldPos, nOldPos, nsSetAttrMode::SETATTR_IS_COPY);
1555cdf0e10cSrcweir                     }
155669a74367SOliver-Rainer Wittmann                 }
155769a74367SOliver-Rainer Wittmann             }
155869a74367SOliver-Rainer Wittmann         }
155969a74367SOliver-Rainer Wittmann     }
1560cdf0e10cSrcweir 
156169a74367SOliver-Rainer Wittmann     if( this != pDest )
156269a74367SOliver-Rainer Wittmann     {
156369a74367SOliver-Rainer Wittmann         // Frames benachrichtigen, sonst verschwinden die Ftn-Nummern
156469a74367SOliver-Rainer Wittmann         SwUpdateAttr aHint( nOldPos, nOldPos, 0 );
156569a74367SOliver-Rainer Wittmann         pDest->ModifyNotification( 0, &aHint );
156669a74367SOliver-Rainer Wittmann     }
1567cdf0e10cSrcweir }
1568cdf0e10cSrcweir 
1569cdf0e10cSrcweir /*************************************************************************
1570cdf0e10cSrcweir |*	SwTxtNode::Copy()
1571cdf0e10cSrcweir |*	Beschreibung		kopiert Zeichen und Attibute in pDest,
1572cdf0e10cSrcweir |*						wird angehaengt
1573cdf0e10cSrcweir *************************************************************************/
1574cdf0e10cSrcweir 
1575cdf0e10cSrcweir // introduction of new optional parameter to control, if all attributes have to be copied.
CopyText(SwTxtNode * const pDest,const SwIndex & rStart,const xub_StrLen nLen,const bool bForceCopyOfAllAttrs)1576cdf0e10cSrcweir void SwTxtNode::CopyText( SwTxtNode *const pDest,
1577cdf0e10cSrcweir                       const SwIndex &rStart,
1578cdf0e10cSrcweir                       const xub_StrLen nLen,
1579cdf0e10cSrcweir                       const bool bForceCopyOfAllAttrs )
1580cdf0e10cSrcweir {
1581cdf0e10cSrcweir     SwIndex aIdx( pDest, pDest->m_Text.Len() );
1582cdf0e10cSrcweir     CopyText( pDest, aIdx, rStart, nLen, bForceCopyOfAllAttrs );
1583cdf0e10cSrcweir }
1584cdf0e10cSrcweir 
1585cdf0e10cSrcweir // introduction of new optional parameter to control, if all attributes have to be copied.
CopyText(SwTxtNode * const pDest,const SwIndex & rDestStart,const SwIndex & rStart,xub_StrLen nLen,const bool bForceCopyOfAllAttrs)1586cdf0e10cSrcweir void SwTxtNode::CopyText( SwTxtNode *const pDest,
1587cdf0e10cSrcweir                       const SwIndex &rDestStart,
1588cdf0e10cSrcweir                       const SwIndex &rStart,
1589cdf0e10cSrcweir                       xub_StrLen nLen,
1590cdf0e10cSrcweir                       const bool bForceCopyOfAllAttrs )
1591cdf0e10cSrcweir {
159269a74367SOliver-Rainer Wittmann     xub_StrLen nTxtStartIdx = rStart.GetIndex();
159369a74367SOliver-Rainer Wittmann     xub_StrLen nDestStart = rDestStart.GetIndex();		// alte Pos merken
1594cdf0e10cSrcweir 
1595cdf0e10cSrcweir     if (pDest->GetDoc()->IsClipBoard() && this->GetNum())
1596cdf0e10cSrcweir     {
1597cdf0e10cSrcweir         // #i111677# cache expansion of source (for clipboard)
1598cdf0e10cSrcweir         pDest->m_pNumStringCache.reset(
1599cdf0e10cSrcweir             new ::rtl::OUString(this->GetNumString()));
1600cdf0e10cSrcweir     }
1601cdf0e10cSrcweir 
1602cdf0e10cSrcweir 	if( !nLen )
1603cdf0e10cSrcweir 	{
1604cdf0e10cSrcweir 		// wurde keine Laenge angegeben, dann Kopiere die Attribute
1605cdf0e10cSrcweir 		// an der Position rStart.
1606cdf0e10cSrcweir 		CopyAttr( pDest, nTxtStartIdx, nDestStart );
1607cdf0e10cSrcweir 
1608cdf0e10cSrcweir 		// harte Absatz umspannende Attribute kopieren
1609cdf0e10cSrcweir         if( HasSwAttrSet() )
1610cdf0e10cSrcweir 		{
1611cdf0e10cSrcweir 			// alle, oder nur die CharAttribute ?
1612cdf0e10cSrcweir             // --> OD 2008-11-18 #i96213#
1613cdf0e10cSrcweir             if ( !bForceCopyOfAllAttrs &&
1614cdf0e10cSrcweir                  ( nDestStart ||
1615cdf0e10cSrcweir                    pDest->HasSwAttrSet() ||
1616cdf0e10cSrcweir                    nLen != pDest->GetTxt().Len() ) )
1617cdf0e10cSrcweir             // <--
1618cdf0e10cSrcweir 			{
1619cdf0e10cSrcweir 				SfxItemSet aCharSet( pDest->GetDoc()->GetAttrPool(),
1620cdf0e10cSrcweir 									RES_CHRATR_BEGIN, RES_CHRATR_END-1,
1621cdf0e10cSrcweir                                     RES_TXTATR_INETFMT, RES_TXTATR_INETFMT,
1622cdf0e10cSrcweir                                     RES_TXTATR_CHARFMT, RES_TXTATR_CHARFMT,
1623cdf0e10cSrcweir 									RES_UNKNOWNATR_BEGIN, RES_UNKNOWNATR_END-1,
1624cdf0e10cSrcweir 									0 );
1625cdf0e10cSrcweir 				aCharSet.Put( *GetpSwAttrSet() );
1626cdf0e10cSrcweir 				if( aCharSet.Count() )
1627cdf0e10cSrcweir                 {
1628cdf0e10cSrcweir                     pDest->SetAttr( aCharSet, nDestStart, nDestStart );
1629cdf0e10cSrcweir                 }
1630cdf0e10cSrcweir 			}
1631cdf0e10cSrcweir 			else
1632cdf0e10cSrcweir             {
1633cdf0e10cSrcweir 				GetpSwAttrSet()->CopyToModify( *pDest );
1634cdf0e10cSrcweir             }
1635cdf0e10cSrcweir 		}
1636cdf0e10cSrcweir 		return;
1637cdf0e10cSrcweir 	}
1638cdf0e10cSrcweir 
1639cdf0e10cSrcweir 	// 1. Text kopieren
1640cdf0e10cSrcweir     const xub_StrLen oldLen = pDest->m_Text.Len();
1641cdf0e10cSrcweir 	//JP 15.02.96: Bug 25537 - Attributbehandlung am Ende fehlt! Darum
1642cdf0e10cSrcweir 	//				ueber die InsertMethode den Text einfuegen und nicht
1643cdf0e10cSrcweir 	//				selbst direkt
1644cdf0e10cSrcweir     pDest->InsertText( m_Text.Copy( nTxtStartIdx, nLen ), rDestStart,
1645cdf0e10cSrcweir                    IDocumentContentOperations::INS_EMPTYEXPAND );
1646cdf0e10cSrcweir 
164769a74367SOliver-Rainer Wittmann     // um reale Groesse Updaten !
1648cdf0e10cSrcweir     nLen = pDest->m_Text.Len() - oldLen;
1649cdf0e10cSrcweir     if ( !nLen ) // string not longer?
1650cdf0e10cSrcweir         return;
1651cdf0e10cSrcweir 
165269a74367SOliver-Rainer Wittmann     SwDoc* const pOtherDoc = (pDest->GetDoc() != GetDoc()) ? pDest->GetDoc() : 0;
1653cdf0e10cSrcweir 
165469a74367SOliver-Rainer Wittmann     // harte Absatz umspannende Attribute kopieren
1655cdf0e10cSrcweir     if( HasSwAttrSet() )
165669a74367SOliver-Rainer Wittmann     {
165769a74367SOliver-Rainer Wittmann         // alle, oder nur die CharAttribute ?
165869a74367SOliver-Rainer Wittmann         if ( !bForceCopyOfAllAttrs
165969a74367SOliver-Rainer Wittmann              && ( nDestStart
166069a74367SOliver-Rainer Wittmann                   || pDest->HasSwAttrSet()
166169a74367SOliver-Rainer Wittmann                   || nLen != pDest->GetTxt().Len() ) )
166269a74367SOliver-Rainer Wittmann         {
166369a74367SOliver-Rainer Wittmann             SfxItemSet aCharSet( pDest->GetDoc()->GetAttrPool(),
166469a74367SOliver-Rainer Wittmann                 RES_CHRATR_BEGIN, RES_CHRATR_END-1,
166569a74367SOliver-Rainer Wittmann                 RES_TXTATR_INETFMT, RES_TXTATR_INETFMT,
166669a74367SOliver-Rainer Wittmann                 RES_TXTATR_CHARFMT, RES_TXTATR_CHARFMT,
166769a74367SOliver-Rainer Wittmann                 RES_UNKNOWNATR_BEGIN, RES_UNKNOWNATR_END-1,
166869a74367SOliver-Rainer Wittmann                 0 );
166969a74367SOliver-Rainer Wittmann             aCharSet.Put( *GetpSwAttrSet() );
167069a74367SOliver-Rainer Wittmann             if( aCharSet.Count() )
1671cdf0e10cSrcweir             {
1672cdf0e10cSrcweir                 pDest->SetAttr( aCharSet, nDestStart, nDestStart + nLen );
1673cdf0e10cSrcweir             }
167469a74367SOliver-Rainer Wittmann         }
167569a74367SOliver-Rainer Wittmann         else
1676cdf0e10cSrcweir         {
167769a74367SOliver-Rainer Wittmann             GetpSwAttrSet()->CopyToModify( *pDest );
1678cdf0e10cSrcweir         }
167969a74367SOliver-Rainer Wittmann     }
1680cdf0e10cSrcweir 
1681cdf0e10cSrcweir     bool const bUndoNodes = !pOtherDoc
168269a74367SOliver-Rainer Wittmann                             && GetDoc()->GetIDocumentUndoRedo().IsUndoNodes(GetNodes());
1683cdf0e10cSrcweir 
168469a74367SOliver-Rainer Wittmann     // Ende erst jetzt holen, weil beim Kopieren in sich selbst der
168569a74367SOliver-Rainer Wittmann     // Start-Index und alle Attribute vorher aktualisiert werden.
168669a74367SOliver-Rainer Wittmann     nTxtStartIdx = rStart.GetIndex();
1687cdf0e10cSrcweir     const xub_StrLen nEnd = nTxtStartIdx + nLen;
1688cdf0e10cSrcweir 
168969a74367SOliver-Rainer Wittmann     // 2. Attribute kopieren
169069a74367SOliver-Rainer Wittmann     // durch das Attribute-Array, bis der Anfang des Geltungsbereiches
169169a74367SOliver-Rainer Wittmann     // des Attributs hinter dem zu kopierenden Bereich liegt
1692cdf0e10cSrcweir     const sal_uInt16 nSize = m_pSwpHints ? m_pSwpHints->Count() : 0;
1693cdf0e10cSrcweir 
169469a74367SOliver-Rainer Wittmann     // wird in sich selbst kopiert, dann kann beim Einfuegen ein
169569a74367SOliver-Rainer Wittmann     // Attribut geloescht werden. Darum erst ins Tmp-Array kopieren und
169669a74367SOliver-Rainer Wittmann     // dann erst ins eigene uebertragen.
169769a74367SOliver-Rainer Wittmann     SwpHts aArr( 5 );
1698cdf0e10cSrcweir 
169969a74367SOliver-Rainer Wittmann     // Del-Array fuer alle RefMarks ohne Ausdehnung
170069a74367SOliver-Rainer Wittmann     SwpHts aRefMrkArr;
1701cdf0e10cSrcweir 
1702cdf0e10cSrcweir     sal_uInt16 nDeletedDummyChars(0);
170369a74367SOliver-Rainer Wittmann     //Achtung: kann ungueltig sein!!
1704cdf0e10cSrcweir     for (sal_uInt16 n = 0; ( n < nSize ); ++n)
1705cdf0e10cSrcweir     {
1706cdf0e10cSrcweir         const xub_StrLen nAttrStartIdx = *(*m_pSwpHints)[n]->GetStart();
170769a74367SOliver-Rainer Wittmann         if ( !( nAttrStartIdx < nEnd) )
1708cdf0e10cSrcweir             break;
1709cdf0e10cSrcweir 
1710cdf0e10cSrcweir         SwTxtAttr * const pHt = m_pSwpHints->GetTextHint(n);
1711cdf0e10cSrcweir         const xub_StrLen * const pEndIdx = pHt->GetEnd();
1712cdf0e10cSrcweir         const sal_uInt16 nWhich = pHt->Which();
1713cdf0e10cSrcweir 
171469a74367SOliver-Rainer Wittmann         // JP 26.04.94: REFMARK's werden nie kopiert. Hat das Refmark aber
171569a74367SOliver-Rainer Wittmann         //				keinen Bereich umspannt, so steht im Text ein 255
171669a74367SOliver-Rainer Wittmann         //				dieses muss entfernt werden. Trick: erst kopieren,
171769a74367SOliver-Rainer Wittmann         //				erkennen und sammeln, nach dem kopieren Loeschen.
171869a74367SOliver-Rainer Wittmann         //				Nimmt sein Zeichen mit ins Grab !!
171969a74367SOliver-Rainer Wittmann         // JP 14.08.95:	Duerfen RefMarks gemovt werden?
172069a74367SOliver-Rainer Wittmann         const bool bCopyRefMark = RES_TXTATR_REFMARK == nWhich
172169a74367SOliver-Rainer Wittmann                                   && ( bUndoNodes
172269a74367SOliver-Rainer Wittmann                                        || ( !pOtherDoc
172369a74367SOliver-Rainer Wittmann                                             ? GetDoc()->IsCopyIsMove()
172469a74367SOliver-Rainer Wittmann                                             : 0 == pOtherDoc->GetRefMark( pHt->GetRefMark().GetRefName() ) ) );
172569a74367SOliver-Rainer Wittmann 
172669a74367SOliver-Rainer Wittmann         if ( pEndIdx
172769a74367SOliver-Rainer Wittmann              && RES_TXTATR_REFMARK == nWhich
172869a74367SOliver-Rainer Wittmann              && !bCopyRefMark )
172969a74367SOliver-Rainer Wittmann         {
173069a74367SOliver-Rainer Wittmann             continue;
173169a74367SOliver-Rainer Wittmann         }
173269a74367SOliver-Rainer Wittmann 
173369a74367SOliver-Rainer Wittmann         // Input Fields are only copied, if completely covered by copied text
173469a74367SOliver-Rainer Wittmann         if ( nWhich == RES_TXTATR_INPUTFIELD )
173569a74367SOliver-Rainer Wittmann         {
173669a74367SOliver-Rainer Wittmann             ASSERT( pEndIdx != NULL,
173769a74367SOliver-Rainer Wittmann                     "<SwTxtNode::CopyText(..)> - RES_TXTATR_INPUTFIELD without EndIndex!" );
173869a74367SOliver-Rainer Wittmann             if ( nAttrStartIdx < nTxtStartIdx
173969a74367SOliver-Rainer Wittmann                  || ( pEndIdx != NULL
174069a74367SOliver-Rainer Wittmann                       && *(pEndIdx) > nEnd ) )
174169a74367SOliver-Rainer Wittmann             {
174269a74367SOliver-Rainer Wittmann                 continue;
174369a74367SOliver-Rainer Wittmann             }
174469a74367SOliver-Rainer Wittmann         }
1745cdf0e10cSrcweir 
1746cdf0e10cSrcweir         xub_StrLen nAttrStt;
1747cdf0e10cSrcweir         xub_StrLen nAttrEnd;
1748cdf0e10cSrcweir 
174969a74367SOliver-Rainer Wittmann         if( nAttrStartIdx < nTxtStartIdx )
175069a74367SOliver-Rainer Wittmann         {
1751cdf0e10cSrcweir             // start is before selection
1752cdf0e10cSrcweir             // copy hints with end and CH_TXTATR only if dummy char is copied
1753cdf0e10cSrcweir             if ( pEndIdx && (*pEndIdx > nTxtStartIdx) && !pHt->HasDummyChar() )
1754cdf0e10cSrcweir             {
1755cdf0e10cSrcweir                 // attribute with extent and the end is in the selection
175669a74367SOliver-Rainer Wittmann                 nAttrStt = nDestStart;
1757cdf0e10cSrcweir                 nAttrEnd = (*pEndIdx > nEnd)
175869a74367SOliver-Rainer Wittmann                     ? rDestStart.GetIndex()
175969a74367SOliver-Rainer Wittmann                     : nDestStart + (*pEndIdx) - nTxtStartIdx;
176069a74367SOliver-Rainer Wittmann             }
176169a74367SOliver-Rainer Wittmann             else
176269a74367SOliver-Rainer Wittmann             {
176369a74367SOliver-Rainer Wittmann                 continue;
176469a74367SOliver-Rainer Wittmann             }
176569a74367SOliver-Rainer Wittmann         }
176669a74367SOliver-Rainer Wittmann         else
176769a74367SOliver-Rainer Wittmann         {
1768cdf0e10cSrcweir             // start is in the selection
176969a74367SOliver-Rainer Wittmann             nAttrStt = nDestStart + ( nAttrStartIdx - nTxtStartIdx );
177069a74367SOliver-Rainer Wittmann             if( pEndIdx )
1771cdf0e10cSrcweir             {
177269a74367SOliver-Rainer Wittmann                 nAttrEnd = *pEndIdx > nEnd
177369a74367SOliver-Rainer Wittmann                     ? rDestStart.GetIndex()
177469a74367SOliver-Rainer Wittmann                     : nDestStart + ( *pEndIdx - nTxtStartIdx );
1775cdf0e10cSrcweir             }
177669a74367SOliver-Rainer Wittmann             else
1777cdf0e10cSrcweir             {
177869a74367SOliver-Rainer Wittmann                 nAttrEnd = nAttrStt;
1779cdf0e10cSrcweir             }
178069a74367SOliver-Rainer Wittmann         }
1781cdf0e10cSrcweir 
1782cdf0e10cSrcweir         SwTxtAttr * pNewHt = 0;
1783cdf0e10cSrcweir 
178469a74367SOliver-Rainer Wittmann         if( pDest == this )
1785cdf0e10cSrcweir         {
1786cdf0e10cSrcweir             // copy the hint here, but insert it later
1787cdf0e10cSrcweir             pNewHt = MakeTxtAttr( *GetDoc(), pHt->GetAttr(),
1788cdf0e10cSrcweir                     nAttrStt, nAttrEnd, COPY, pDest );
1789cdf0e10cSrcweir 
1790cdf0e10cSrcweir             lcl_CopyHint(nWhich, pHt, pNewHt, 0, pDest);
179169a74367SOliver-Rainer Wittmann             aArr.C40_INSERT( SwTxtAttr, pNewHt, aArr.Count() );
179269a74367SOliver-Rainer Wittmann         }
179369a74367SOliver-Rainer Wittmann         else
179469a74367SOliver-Rainer Wittmann         {
1795dec99bbdSOliver-Rainer Wittmann             pNewHt = pDest->InsertItem(
1796dec99bbdSOliver-Rainer Wittmann                 pHt->GetAttr(),
1797dec99bbdSOliver-Rainer Wittmann                 nAttrStt - nDeletedDummyChars,
1798cdf0e10cSrcweir                 nAttrEnd - nDeletedDummyChars,
1799dec99bbdSOliver-Rainer Wittmann                 nsSetAttrMode::SETATTR_NOTXTATRCHR | nsSetAttrMode::SETATTR_IS_COPY);
1800cdf0e10cSrcweir             if (pNewHt)
1801cdf0e10cSrcweir             {
1802cdf0e10cSrcweir                 lcl_CopyHint( nWhich, pHt, pNewHt, pOtherDoc, pDest );
1803cdf0e10cSrcweir             }
1804cdf0e10cSrcweir             else if (pHt->HasDummyChar())
1805cdf0e10cSrcweir             {
1806cdf0e10cSrcweir                 // The attribute that has failed to be copied would insert
1807cdf0e10cSrcweir                 // dummy char, so positions of the following attributes have
1808cdf0e10cSrcweir                 // to be shifted by one to compensate for that missing char.
1809cdf0e10cSrcweir                 ++nDeletedDummyChars;
1810cdf0e10cSrcweir             }
1811cdf0e10cSrcweir         }
1812cdf0e10cSrcweir 
181369a74367SOliver-Rainer Wittmann         if( RES_TXTATR_REFMARK == nWhich && !pEndIdx && !bCopyRefMark )
181469a74367SOliver-Rainer Wittmann         {
181569a74367SOliver-Rainer Wittmann             aRefMrkArr.C40_INSERT( SwTxtAttr, pNewHt, aRefMrkArr.Count() );
181669a74367SOliver-Rainer Wittmann         }
181769a74367SOliver-Rainer Wittmann     }
1818cdf0e10cSrcweir 
181969a74367SOliver-Rainer Wittmann     // nur falls im Array Attribute stehen (kann nur beim Kopieren
182069a74367SOliver-Rainer Wittmann     // sich selbst passieren!!)
1821cdf0e10cSrcweir     for ( sal_uInt16 i = 0; i < aArr.Count(); ++i )
1822cdf0e10cSrcweir     {
1823cdf0e10cSrcweir         InsertHint( aArr[ i ], nsSetAttrMode::SETATTR_NOTXTATRCHR );
1824cdf0e10cSrcweir     }
1825cdf0e10cSrcweir 
182669a74367SOliver-Rainer Wittmann     if( pDest->GetpSwpHints() )
1827cdf0e10cSrcweir     {
1828cdf0e10cSrcweir         for ( sal_uInt16 i = 0; i < aRefMrkArr.Count(); ++i )
182969a74367SOliver-Rainer Wittmann         {
1830cdf0e10cSrcweir             SwTxtAttr * const pNewHt = aRefMrkArr[i];
183169a74367SOliver-Rainer Wittmann             if( pNewHt->GetEnd() )
183269a74367SOliver-Rainer Wittmann             {
183369a74367SOliver-Rainer Wittmann                 pDest->GetpSwpHints()->Delete( pNewHt );
183469a74367SOliver-Rainer Wittmann                 pDest->DestroyAttr( pNewHt );
183569a74367SOliver-Rainer Wittmann             }
183669a74367SOliver-Rainer Wittmann             else
183769a74367SOliver-Rainer Wittmann             {
183869a74367SOliver-Rainer Wittmann                 const SwIndex aIdx( pDest, *pNewHt->GetStart() );
1839cdf0e10cSrcweir                 pDest->EraseText( aIdx, 1 );
1840cdf0e10cSrcweir             }
1841cdf0e10cSrcweir         }
1842cdf0e10cSrcweir     }
1843cdf0e10cSrcweir 
184469a74367SOliver-Rainer Wittmann     CHECK_SWPHINTS(this);
1845cdf0e10cSrcweir }
1846cdf0e10cSrcweir 
1847cdf0e10cSrcweir 
InsertText(const XubString & rStr,const SwIndex & rIdx,const IDocumentContentOperations::InsertFlags nMode)1848cdf0e10cSrcweir void SwTxtNode::InsertText( const XubString & rStr, const SwIndex & rIdx,
1849cdf0e10cSrcweir         const IDocumentContentOperations::InsertFlags nMode )
1850cdf0e10cSrcweir {
1851cdf0e10cSrcweir     ASSERT( rIdx <= m_Text.Len(), "SwTxtNode::InsertText: invalid index." );
1852cdf0e10cSrcweir     ASSERT( (sal_uLong)m_Text.Len() + (sal_uLong)rStr.Len() <= STRING_LEN,
1853cdf0e10cSrcweir             "SwTxtNode::InsertText: node text with insertion > STRING_LEN." );
1854cdf0e10cSrcweir 
1855cdf0e10cSrcweir 	xub_StrLen aPos = rIdx.GetIndex();
1856cdf0e10cSrcweir     xub_StrLen nLen = m_Text.Len() - aPos;
1857cdf0e10cSrcweir     m_Text.Insert( rStr, aPos );
1858cdf0e10cSrcweir     nLen = m_Text.Len() - aPos - nLen;
1859cdf0e10cSrcweir 
1860cdf0e10cSrcweir     if ( !nLen ) return;
1861cdf0e10cSrcweir 
1862cdf0e10cSrcweir     sal_Bool bOldExpFlg = IsIgnoreDontExpand();
1863cdf0e10cSrcweir     if (nMode & IDocumentContentOperations::INS_FORCEHINTEXPAND)
1864cdf0e10cSrcweir     {
1865cdf0e10cSrcweir         SetIgnoreDontExpand( sal_True );
1866cdf0e10cSrcweir     }
1867cdf0e10cSrcweir 
1868cdf0e10cSrcweir     Update( rIdx, nLen ); // text content changed!
1869cdf0e10cSrcweir 
1870cdf0e10cSrcweir     if (nMode & IDocumentContentOperations::INS_FORCEHINTEXPAND)
1871cdf0e10cSrcweir     {
1872cdf0e10cSrcweir         SetIgnoreDontExpand( bOldExpFlg );
1873cdf0e10cSrcweir     }
1874cdf0e10cSrcweir 
1875cdf0e10cSrcweir 	// analog zu Insert(char) in txtedt.cxx:
1876cdf0e10cSrcweir 	// 1) bei bHintExp leere Hints an rIdx.GetIndex suchen und aufspannen
1877cdf0e10cSrcweir 	// 2) bei bHintExp == sal_False mitgezogene Feldattribute zuruecksetzen
1878cdf0e10cSrcweir 
1879cdf0e10cSrcweir     if ( HasHints() )
1880cdf0e10cSrcweir     {
1881cdf0e10cSrcweir         for ( sal_uInt16 i = 0; i < m_pSwpHints->Count() &&
1882cdf0e10cSrcweir                 rIdx >= *(*m_pSwpHints)[i]->GetStart(); ++i )
1883cdf0e10cSrcweir         {
1884cdf0e10cSrcweir             SwTxtAttr * const pHt = m_pSwpHints->GetTextHint( i );
1885cdf0e10cSrcweir             xub_StrLen * const pEndIdx = pHt->GetEnd();
1886cdf0e10cSrcweir 			if( !pEndIdx )
1887cdf0e10cSrcweir 				continue;
1888cdf0e10cSrcweir 
1889cdf0e10cSrcweir 			if( rIdx == *pEndIdx )
1890cdf0e10cSrcweir 			{
1891cdf0e10cSrcweir                 if (  (nMode & IDocumentContentOperations::INS_NOHINTEXPAND) ||
1892cdf0e10cSrcweir                     (!(nMode & IDocumentContentOperations::INS_FORCEHINTEXPAND)
1893cdf0e10cSrcweir                      && pHt->DontExpand()) )
1894cdf0e10cSrcweir 				{
1895cdf0e10cSrcweir 					// bei leeren Attributen auch Start veraendern
1896cdf0e10cSrcweir 					if( rIdx == *pHt->GetStart() )
1897cdf0e10cSrcweir 						*pHt->GetStart() = *pHt->GetStart() - nLen;
1898cdf0e10cSrcweir 					*pEndIdx = *pEndIdx - nLen;
1899cdf0e10cSrcweir                     m_pSwpHints->DeleteAtPos(i);
1900cdf0e10cSrcweir                     InsertHint( pHt, nsSetAttrMode::SETATTR_NOHINTADJUST );
1901cdf0e10cSrcweir                 }
1902cdf0e10cSrcweir                 // empty hints at insert position?
1903cdf0e10cSrcweir                 else if ( (nMode & IDocumentContentOperations::INS_EMPTYEXPAND)
1904cdf0e10cSrcweir                         && (*pEndIdx == *pHt->GetStart()) )
1905cdf0e10cSrcweir 				{
1906cdf0e10cSrcweir 					*pHt->GetStart() = *pHt->GetStart() - nLen;
1907cdf0e10cSrcweir                     const sal_uInt16 nAktLen = m_pSwpHints->Count();
1908cdf0e10cSrcweir                     m_pSwpHints->DeleteAtPos(i);
1909cdf0e10cSrcweir                     InsertHint( pHt/* AUTOSTYLES:, nsSetAttrMode::SETATTR_NOHINTADJUST*/ );
1910cdf0e10cSrcweir                     if ( nAktLen > m_pSwpHints->Count() && i )
1911cdf0e10cSrcweir                     {
1912cdf0e10cSrcweir 						--i;
1913cdf0e10cSrcweir                     }
1914cdf0e10cSrcweir 					continue;
1915cdf0e10cSrcweir 				}
1916cdf0e10cSrcweir 				else
1917cdf0e10cSrcweir                 {
1918cdf0e10cSrcweir 					continue;
1919cdf0e10cSrcweir                 }
1920cdf0e10cSrcweir 			}
1921cdf0e10cSrcweir             if ( !(nMode & IDocumentContentOperations::INS_NOHINTEXPAND) &&
1922cdf0e10cSrcweir 				 rIdx == nLen && *pHt->GetStart() == rIdx.GetIndex() &&
1923cdf0e10cSrcweir 				 !pHt->IsDontExpandStartAttr() )
1924cdf0e10cSrcweir 			{
1925cdf0e10cSrcweir 				// Kein Feld, am Absatzanfang, HintExpand
1926cdf0e10cSrcweir                 m_pSwpHints->DeleteAtPos(i);
1927cdf0e10cSrcweir 				*pHt->GetStart() = *pHt->GetStart() - nLen;
1928cdf0e10cSrcweir                 InsertHint( pHt, nsSetAttrMode::SETATTR_NOHINTADJUST );
1929cdf0e10cSrcweir             }
1930cdf0e10cSrcweir         }
1931cdf0e10cSrcweir         TryDeleteSwpHints();
1932cdf0e10cSrcweir     }
1933cdf0e10cSrcweir 
1934cdf0e10cSrcweir 	if ( GetDepends() )
1935cdf0e10cSrcweir 	{
1936cdf0e10cSrcweir 		SwInsTxt aHint( aPos, nLen );
1937cdf0e10cSrcweir 		NotifyClients( 0, &aHint );
1938cdf0e10cSrcweir 	}
1939cdf0e10cSrcweir 
1940cdf0e10cSrcweir     // By inserting a character, the hidden flags
1941cdf0e10cSrcweir     // at the TxtNode can become invalid:
1942cdf0e10cSrcweir     SetCalcHiddenCharFlags();
1943cdf0e10cSrcweir 
1944cdf0e10cSrcweir 	CHECK_SWPHINTS(this);
1945cdf0e10cSrcweir }
1946cdf0e10cSrcweir 
1947cdf0e10cSrcweir /*************************************************************************
1948cdf0e10cSrcweir |*
1949cdf0e10cSrcweir |*	SwTxtNode::Cut()
1950cdf0e10cSrcweir |*
1951cdf0e10cSrcweir |*	Beschreibung		text.doc
1952cdf0e10cSrcweir |*	Ersterstellung		VB 20.03.91
1953cdf0e10cSrcweir |*	Letzte Aenderung	JP 11.08.94
1954cdf0e10cSrcweir |*
1955cdf0e10cSrcweir *************************************************************************/
1956cdf0e10cSrcweir 
CutText(SwTxtNode * const pDest,const SwIndex & rStart,const xub_StrLen nLen)1957cdf0e10cSrcweir void SwTxtNode::CutText( SwTxtNode * const pDest,
1958cdf0e10cSrcweir             const SwIndex & rStart, const xub_StrLen nLen )
1959cdf0e10cSrcweir {
1960cdf0e10cSrcweir 	if(pDest)
1961cdf0e10cSrcweir 	{
1962cdf0e10cSrcweir 		SwIndex aDestStt( pDest, pDest->GetTxt().Len() );
1963cdf0e10cSrcweir         CutImpl( pDest, aDestStt, rStart, nLen, false );
1964cdf0e10cSrcweir     }
1965cdf0e10cSrcweir     else
1966cdf0e10cSrcweir     {
1967cdf0e10cSrcweir         ASSERT(false,
1968cdf0e10cSrcweir             "mst: entering dead and bitrotted code; fasten your seatbelts!");
1969cdf0e10cSrcweir         EraseText( rStart, nLen );
1970cdf0e10cSrcweir     }
1971cdf0e10cSrcweir }
1972cdf0e10cSrcweir 
1973cdf0e10cSrcweir 
CutImpl(SwTxtNode * const pDest,const SwIndex & rDestStart,const SwIndex & rStart,xub_StrLen nLen,const bool bUpdate)1974cdf0e10cSrcweir void SwTxtNode::CutImpl( SwTxtNode * const pDest, const SwIndex & rDestStart,
1975cdf0e10cSrcweir          const SwIndex & rStart, /*const*/ xub_StrLen nLen, const bool bUpdate )
1976cdf0e10cSrcweir {
1977cdf0e10cSrcweir 	if(!pDest)
1978cdf0e10cSrcweir     {
1979cdf0e10cSrcweir         ASSERT(false,
1980cdf0e10cSrcweir             "mst: entering dead and bitrotted code; fasten your seatbelts!");
1981cdf0e10cSrcweir         EraseText( rStart, nLen );
1982cdf0e10cSrcweir 		return;
1983cdf0e10cSrcweir 	}
1984cdf0e10cSrcweir 
1985cdf0e10cSrcweir 	// nicht im Dokument verschieben ?
1986cdf0e10cSrcweir 	if( GetDoc() != pDest->GetDoc() )
1987cdf0e10cSrcweir 	{
1988cdf0e10cSrcweir         ASSERT(false,
1989cdf0e10cSrcweir             "mst: entering dead and bitrotted code; fasten your seatbelts!");
1990cdf0e10cSrcweir         CopyText( pDest, rDestStart, rStart, nLen);
1991cdf0e10cSrcweir         EraseText(rStart, nLen);
1992cdf0e10cSrcweir 		return;
1993cdf0e10cSrcweir 	}
1994cdf0e10cSrcweir 
1995cdf0e10cSrcweir 	if( !nLen )
1996cdf0e10cSrcweir 	{
1997cdf0e10cSrcweir 		// wurde keine Laenge angegeben, dann Kopiere die Attribute
1998cdf0e10cSrcweir 		// an der Position rStart.
1999cdf0e10cSrcweir 		CopyAttr( pDest, rStart.GetIndex(), rDestStart.GetIndex() );
2000cdf0e10cSrcweir 		return;
2001cdf0e10cSrcweir 	}
2002cdf0e10cSrcweir 
2003cdf0e10cSrcweir 	xub_StrLen nTxtStartIdx = rStart.GetIndex();
2004cdf0e10cSrcweir 	xub_StrLen nDestStart = rDestStart.GetIndex();		// alte Pos merken
2005cdf0e10cSrcweir     const xub_StrLen nInitSize = pDest->m_Text.Len();
2006cdf0e10cSrcweir 
2007cdf0e10cSrcweir 	// wird in sich selbst verschoben, muss es gesondert behandelt werden !!
2008cdf0e10cSrcweir 	if( pDest == this )
2009cdf0e10cSrcweir 	{
2010cdf0e10cSrcweir         ASSERT(false,
2011cdf0e10cSrcweir             "mst: entering dead and bitrotted code; fasten your seatbelts!");
2012cdf0e10cSrcweir         m_Text.Insert( m_Text, nTxtStartIdx, nLen, nDestStart );
2013cdf0e10cSrcweir         m_Text.Erase( nTxtStartIdx + (nDestStart<nTxtStartIdx ? nLen : 0), nLen );
2014cdf0e10cSrcweir 
2015cdf0e10cSrcweir         const xub_StrLen nEnd = rStart.GetIndex() + nLen;
2016cdf0e10cSrcweir 
2017cdf0e10cSrcweir 		// dann suche mal alle Attribute zusammen, die im verschobenen
2018cdf0e10cSrcweir 		// Bereich liegen. Diese werden in das extra Array verschoben,
2019cdf0e10cSrcweir 		// damit sich die Indizies beim Updaten nicht veraendern !!!
2020cdf0e10cSrcweir 		SwpHts aArr( 5 );
2021cdf0e10cSrcweir 
2022cdf0e10cSrcweir 		// 2. Attribute verschieben
2023cdf0e10cSrcweir 		// durch das Attribute-Array, bis der Anfang des Geltungsbereiches
2024cdf0e10cSrcweir 		// des Attributs hinter dem zu verschiebenden Bereich liegt
2025cdf0e10cSrcweir         sal_uInt16 nAttrCnt = 0;
2026cdf0e10cSrcweir         while ( m_pSwpHints && nAttrCnt < m_pSwpHints->Count() )
2027cdf0e10cSrcweir         {
2028cdf0e10cSrcweir             SwTxtAttr * const pHt = m_pSwpHints->GetTextHint(nAttrCnt);
2029cdf0e10cSrcweir             const xub_StrLen nAttrStartIdx = *pHt->GetStart();
2030cdf0e10cSrcweir             if (!( nAttrStartIdx < nEnd ))
2031cdf0e10cSrcweir                 break;
2032cdf0e10cSrcweir             const xub_StrLen * const pEndIdx = pHt->GetEnd();
2033cdf0e10cSrcweir             const sal_uInt16 nWhich = pHt->Which();
2034cdf0e10cSrcweir             SwTxtAttr *pNewHt = 0;
2035cdf0e10cSrcweir 
2036cdf0e10cSrcweir 			if(nAttrStartIdx < nTxtStartIdx)
2037cdf0e10cSrcweir 			{
2038cdf0e10cSrcweir 				// Anfang liegt vor dem Bereich
2039cdf0e10cSrcweir                 if ( RES_TXTATR_REFMARK != nWhich && !pHt->HasDummyChar() &&
2040cdf0e10cSrcweir 					pEndIdx && *pEndIdx > nTxtStartIdx )
2041cdf0e10cSrcweir 				{
2042cdf0e10cSrcweir 					// Attribut mit einem Bereich
2043cdf0e10cSrcweir 					// und das Ende des Attribut liegt im Bereich
2044cdf0e10cSrcweir                     pNewHt = MakeTxtAttr( *GetDoc(), pHt->GetAttr(), 0,
2045cdf0e10cSrcweir 										*pEndIdx > nEnd
2046cdf0e10cSrcweir 											? nLen
2047cdf0e10cSrcweir 											: *pEndIdx - nTxtStartIdx );
2048cdf0e10cSrcweir 				}
2049cdf0e10cSrcweir 			}
2050cdf0e10cSrcweir 			else
2051cdf0e10cSrcweir 			{
2052cdf0e10cSrcweir 				// der Anfang liegt vollstaendig im Bereich
2053cdf0e10cSrcweir 				if( !pEndIdx || *pEndIdx < nEnd )
2054cdf0e10cSrcweir 				{
2055cdf0e10cSrcweir 					// Attribut verschieben
2056cdf0e10cSrcweir                     m_pSwpHints->Delete( pHt );
2057cdf0e10cSrcweir 					// die Start/End Indicies neu setzen
2058cdf0e10cSrcweir 					*pHt->GetStart() = nAttrStartIdx - nTxtStartIdx;
2059cdf0e10cSrcweir 					if( pEndIdx )
2060cdf0e10cSrcweir 						*pHt->GetEnd() = *pEndIdx - nTxtStartIdx;
2061cdf0e10cSrcweir 					aArr.C40_INSERT( SwTxtAttr, pHt, aArr.Count() );
2062cdf0e10cSrcweir 					continue;			// while-Schleife weiter, ohne ++ !
2063cdf0e10cSrcweir 				}
2064cdf0e10cSrcweir 					// das Ende liegt dahinter
2065cdf0e10cSrcweir                 else if (RES_TXTATR_REFMARK != nWhich && !pHt->HasDummyChar())
2066cdf0e10cSrcweir 				{
2067cdf0e10cSrcweir                     pNewHt = MakeTxtAttr( *GetDoc(), pHt->GetAttr(),
2068cdf0e10cSrcweir 							nAttrStartIdx - nTxtStartIdx,
2069cdf0e10cSrcweir 							!pEndIdx ? 0
2070cdf0e10cSrcweir 									 : ( *pEndIdx > nEnd
2071cdf0e10cSrcweir 											? nLen
2072cdf0e10cSrcweir 											: *pEndIdx - nTxtStartIdx ));
2073cdf0e10cSrcweir 				}
2074cdf0e10cSrcweir 			}
2075cdf0e10cSrcweir 			if( pNewHt )
2076cdf0e10cSrcweir 			{
2077cdf0e10cSrcweir 				// die Daten kopieren
2078cdf0e10cSrcweir 				lcl_CopyHint( nWhich, pHt, pNewHt, 0, this );
2079cdf0e10cSrcweir 				aArr.C40_INSERT( SwTxtAttr, pNewHt, aArr.Count() );
2080cdf0e10cSrcweir 			}
2081cdf0e10cSrcweir 			++nAttrCnt;
2082cdf0e10cSrcweir 		}
2083cdf0e10cSrcweir 
2084cdf0e10cSrcweir 		if( bUpdate )
2085cdf0e10cSrcweir         {
2086cdf0e10cSrcweir 			// Update aller Indizies
2087cdf0e10cSrcweir 			Update( rDestStart, nLen, sal_False, sal_True );
2088cdf0e10cSrcweir         }
2089cdf0e10cSrcweir #ifdef CUTNOEXPAND
2090cdf0e10cSrcweir 		else
2091cdf0e10cSrcweir 			// wird am Ende eingefuegt, nur die Attribut-Indizies verschieben
2092cdf0e10cSrcweir             if ( 0 < nLen && 0 < nInitSize && m_pSwpHints )
2093cdf0e10cSrcweir             {
2094cdf0e10cSrcweir                 // check if there was the end of an attribute at the insertion
2095cdf0e10cSrcweir                 // position: if it is not a field, it must be expanded
2096cdf0e10cSrcweir                 for ( sal_uInt16 n = 0; n < m_pSwpHints->Count(); n++ )
2097cdf0e10cSrcweir                 {
2098cdf0e10cSrcweir                     SwTxtAttr * const pHt = m_pSwpHints->GetTextHint(n);
2099cdf0e10cSrcweir                     const xub_StrLen * const pEndIdx = pHt->GetEnd();
2100cdf0e10cSrcweir                     if ( pEndIdx  && (*pEndIdx == nInitSize) )
2101cdf0e10cSrcweir                     {
2102cdf0e10cSrcweir                         *pEndIdx = *pEndIdx + nLen;
2103cdf0e10cSrcweir                     }
2104cdf0e10cSrcweir                 }
2105cdf0e10cSrcweir             }
2106cdf0e10cSrcweir #endif
2107cdf0e10cSrcweir 		CHECK_SWPHINTS(this);
2108cdf0e10cSrcweir 
2109cdf0e10cSrcweir 		Update( rStart, nLen, sal_True, sal_True );
2110cdf0e10cSrcweir 
2111cdf0e10cSrcweir 		CHECK_SWPHINTS(this);
2112cdf0e10cSrcweir 
2113cdf0e10cSrcweir 		// dann setze die kopierten/geloeschten Attribute in den Node
2114cdf0e10cSrcweir 		if( nDestStart <= nTxtStartIdx )
2115cdf0e10cSrcweir         {
2116cdf0e10cSrcweir 			nTxtStartIdx = nTxtStartIdx + nLen;
2117cdf0e10cSrcweir         }
2118cdf0e10cSrcweir 		else
2119cdf0e10cSrcweir         {
2120cdf0e10cSrcweir 			nDestStart = nDestStart - nLen;
2121cdf0e10cSrcweir         }
2122cdf0e10cSrcweir 
2123cdf0e10cSrcweir         for ( sal_uInt16 n = 0; n < aArr.Count(); ++n )
2124cdf0e10cSrcweir         {
2125cdf0e10cSrcweir             SwTxtAttr *const pNewHt = aArr[n];
2126cdf0e10cSrcweir 			*pNewHt->GetStart() = nDestStart + *pNewHt->GetStart();
2127cdf0e10cSrcweir             xub_StrLen * const pEndIdx = pNewHt->GetEnd();
2128cdf0e10cSrcweir             if ( pEndIdx )
2129cdf0e10cSrcweir             {
2130cdf0e10cSrcweir                 *pEndIdx = nDestStart + *pEndIdx;
2131cdf0e10cSrcweir             }
2132cdf0e10cSrcweir             InsertHint( pNewHt, nsSetAttrMode::SETATTR_NOTXTATRCHR );
2133cdf0e10cSrcweir         }
2134cdf0e10cSrcweir     }
2135cdf0e10cSrcweir     else
2136cdf0e10cSrcweir     {
2137cdf0e10cSrcweir         pDest->m_Text.Insert( m_Text, nTxtStartIdx, nLen, nDestStart );
2138cdf0e10cSrcweir         m_Text.Erase( nTxtStartIdx, nLen );
2139cdf0e10cSrcweir         nLen = pDest->m_Text.Len() - nInitSize; // update w/ current size!
2140cdf0e10cSrcweir 		if( !nLen )					// String nicht gewachsen ??
2141cdf0e10cSrcweir 			return;
2142cdf0e10cSrcweir 
2143cdf0e10cSrcweir 		if( bUpdate )
2144cdf0e10cSrcweir         {
2145cdf0e10cSrcweir 			// Update aller Indizies
2146cdf0e10cSrcweir 			pDest->Update( rDestStart, nLen, sal_False, sal_True);
2147cdf0e10cSrcweir         }
2148cdf0e10cSrcweir #ifdef CUTNOEXPAND
2149cdf0e10cSrcweir 		else
2150cdf0e10cSrcweir 			// wird am Ende eingefuegt, nur die Attribut-Indizies verschieben
2151cdf0e10cSrcweir             if ( 0 < nLen && 0 < nInitSize && pDest->m_pSwpHints )
2152cdf0e10cSrcweir             {
2153cdf0e10cSrcweir                 // check if there was the end of an attribute at the insertion
2154cdf0e10cSrcweir                 // position: if it is not a field, it must be expanded
2155cdf0e10cSrcweir                 for ( sal_uInt16 n = 0; n < pDest->m_pSwpHints->Count(); n++ )
2156cdf0e10cSrcweir                 {
2157cdf0e10cSrcweir                     SwTxtAttr * const pHt = pDest->m_pSwpHints->GetTextHint(n);
2158cdf0e10cSrcweir                     const xub_StrLen * const pEndIdx = pHt->GetEnd();
2159cdf0e10cSrcweir                     if ( pEndIdx  && (*pEndIdx == nInitSize) )
2160cdf0e10cSrcweir                     {
2161cdf0e10cSrcweir                         *pEndIdx = *pEndIdx + nLen;
2162cdf0e10cSrcweir                     }
2163cdf0e10cSrcweir                 }
2164cdf0e10cSrcweir             }
2165cdf0e10cSrcweir #endif
2166cdf0e10cSrcweir 		CHECK_SWPHINTS(pDest);
2167cdf0e10cSrcweir 
2168cdf0e10cSrcweir         const xub_StrLen nEnd = rStart.GetIndex() + nLen;
2169cdf0e10cSrcweir         SwDoc* const pOtherDoc = (pDest->GetDoc() != GetDoc())
2170cdf0e10cSrcweir             ? pDest->GetDoc() : 0;
2171cdf0e10cSrcweir         bool const bUndoNodes = !pOtherDoc
2172cdf0e10cSrcweir             && GetDoc()->GetIDocumentUndoRedo().IsUndoNodes(GetNodes());
2173cdf0e10cSrcweir 
2174cdf0e10cSrcweir         ASSERT(!pOtherDoc,
2175cdf0e10cSrcweir             "mst: entering dead and bitrotted code; fasten your seatbelts!");
2176cdf0e10cSrcweir 
2177cdf0e10cSrcweir 		// harte Absatz umspannende Attribute kopieren
2178cdf0e10cSrcweir         if( HasSwAttrSet() )
2179cdf0e10cSrcweir 		{
2180cdf0e10cSrcweir 			// alle, oder nur die CharAttribute ?
2181cdf0e10cSrcweir             if( nInitSize || pDest->HasSwAttrSet() ||
2182cdf0e10cSrcweir 				nLen != pDest->GetTxt().Len() )
2183cdf0e10cSrcweir 			{
2184cdf0e10cSrcweir 				SfxItemSet aCharSet( pDest->GetDoc()->GetAttrPool(),
2185cdf0e10cSrcweir 									RES_CHRATR_BEGIN, RES_CHRATR_END-1,
2186cdf0e10cSrcweir                                     RES_TXTATR_INETFMT, RES_TXTATR_INETFMT,
2187cdf0e10cSrcweir                                     RES_TXTATR_CHARFMT, RES_TXTATR_CHARFMT,
2188cdf0e10cSrcweir 									RES_UNKNOWNATR_BEGIN, RES_UNKNOWNATR_END-1,
2189cdf0e10cSrcweir 									0 );
2190cdf0e10cSrcweir 				aCharSet.Put( *GetpSwAttrSet() );
2191cdf0e10cSrcweir 				if( aCharSet.Count() )
2192cdf0e10cSrcweir                     pDest->SetAttr( aCharSet, nDestStart, nDestStart + nLen );
2193cdf0e10cSrcweir 			}
2194cdf0e10cSrcweir 			else
2195cdf0e10cSrcweir             {
2196cdf0e10cSrcweir 				GetpSwAttrSet()->CopyToModify( *pDest );
2197cdf0e10cSrcweir             }
2198cdf0e10cSrcweir 		}
2199cdf0e10cSrcweir 
2200cdf0e10cSrcweir 		// 2. Attribute verschieben
2201cdf0e10cSrcweir 		// durch das Attribute-Array, bis der Anfang des Geltungsbereiches
2202cdf0e10cSrcweir 		// des Attributs hinter dem zu verschiebenden Bereich liegt
2203cdf0e10cSrcweir         sal_uInt16 nAttrCnt = 0;
2204cdf0e10cSrcweir         while ( m_pSwpHints && (nAttrCnt < m_pSwpHints->Count()) )
2205cdf0e10cSrcweir         {
2206cdf0e10cSrcweir             SwTxtAttr * const pHt = m_pSwpHints->GetTextHint(nAttrCnt);
2207cdf0e10cSrcweir             const xub_StrLen nAttrStartIdx = *pHt->GetStart();
2208cdf0e10cSrcweir             if (!( nAttrStartIdx < nEnd ))
2209cdf0e10cSrcweir                 break;
2210cdf0e10cSrcweir             const xub_StrLen * const pEndIdx = pHt->GetEnd();
2211cdf0e10cSrcweir             const sal_uInt16 nWhich = pHt->Which();
2212cdf0e10cSrcweir             SwTxtAttr *pNewHt = 0;
2213cdf0e10cSrcweir 
2214cdf0e10cSrcweir             // if the hint has a dummy character, then it must not be split!
2215cdf0e10cSrcweir 			if(nAttrStartIdx < nTxtStartIdx)
2216cdf0e10cSrcweir 			{
2217cdf0e10cSrcweir 				// Anfang liegt vor dem Bereich
2218cdf0e10cSrcweir                 if( !pHt->HasDummyChar() && ( RES_TXTATR_REFMARK != nWhich
2219cdf0e10cSrcweir 					|| bUndoNodes ) && pEndIdx && *pEndIdx > nTxtStartIdx )
2220cdf0e10cSrcweir 				{
2221cdf0e10cSrcweir 					// Attribut mit einem Bereich
2222cdf0e10cSrcweir 					// und das Ende des Attribut liegt im Bereich
2223cdf0e10cSrcweir                     pNewHt = MakeTxtAttr( *pDest->GetDoc(), pHt->GetAttr(),
2224cdf0e10cSrcweir                                     nDestStart,
2225cdf0e10cSrcweir                                     nDestStart + (
2226cdf0e10cSrcweir 										*pEndIdx > nEnd
2227cdf0e10cSrcweir 											? nLen
2228cdf0e10cSrcweir 											: *pEndIdx - nTxtStartIdx ) );
2229cdf0e10cSrcweir 				}
2230cdf0e10cSrcweir 			}
2231cdf0e10cSrcweir 			else
2232cdf0e10cSrcweir 			{
2233cdf0e10cSrcweir 				// der Anfang liegt vollstaendig im Bereich
2234cdf0e10cSrcweir 				if( !pEndIdx || *pEndIdx < nEnd ||
2235cdf0e10cSrcweir 					(!pOtherDoc && !bUndoNodes && RES_TXTATR_REFMARK == nWhich)
2236cdf0e10cSrcweir                     || pHt->HasDummyChar() )
2237cdf0e10cSrcweir 				{
2238cdf0e10cSrcweir 					// do not delete note and later add it -> sidebar flickering
2239cdf0e10cSrcweir 					if ( GetDoc()->GetDocShell() )
2240cdf0e10cSrcweir                     {
2241cdf0e10cSrcweir 						GetDoc()->GetDocShell()->Broadcast( SfxSimpleHint(SFX_HINT_USER04));
2242cdf0e10cSrcweir                     }
2243cdf0e10cSrcweir 					// Attribut verschieben
2244cdf0e10cSrcweir                     m_pSwpHints->Delete( pHt );
2245cdf0e10cSrcweir 					// die Start/End Indicies neu setzen
2246cdf0e10cSrcweir 					*pHt->GetStart() =
2247cdf0e10cSrcweir 							nDestStart + (nAttrStartIdx - nTxtStartIdx);
2248cdf0e10cSrcweir 					if( pEndIdx )
2249cdf0e10cSrcweir                     {
2250cdf0e10cSrcweir 						*pHt->GetEnd() = nDestStart + (
2251cdf0e10cSrcweir 										*pEndIdx > nEnd
2252cdf0e10cSrcweir 											? nLen
2253cdf0e10cSrcweir 											: *pEndIdx - nTxtStartIdx );
2254cdf0e10cSrcweir                     }
2255cdf0e10cSrcweir                     pDest->InsertHint( pHt,
2256cdf0e10cSrcweir                               nsSetAttrMode::SETATTR_NOTXTATRCHR
2257cdf0e10cSrcweir                             | nsSetAttrMode::SETATTR_DONTREPLACE );
2258cdf0e10cSrcweir 					if ( GetDoc()->GetDocShell() )
2259cdf0e10cSrcweir                     {
2260cdf0e10cSrcweir 						GetDoc()->GetDocShell()->Broadcast( SfxSimpleHint(SFX_HINT_USER04));
2261cdf0e10cSrcweir                     }
2262cdf0e10cSrcweir 					continue;			// while-Schleife weiter, ohne ++ !
2263cdf0e10cSrcweir 				}
2264cdf0e10cSrcweir 					// das Ende liegt dahinter
2265cdf0e10cSrcweir 				else if( RES_TXTATR_REFMARK != nWhich || bUndoNodes )
2266cdf0e10cSrcweir 				{
2267cdf0e10cSrcweir                     pNewHt = MakeTxtAttr( *GetDoc(), pHt->GetAttr(),
2268cdf0e10cSrcweir 							nDestStart + (nAttrStartIdx - nTxtStartIdx),
2269cdf0e10cSrcweir 							!pEndIdx ? 0
2270cdf0e10cSrcweir 									 : nDestStart + ( *pEndIdx > nEnd
2271cdf0e10cSrcweir 											? nLen
2272cdf0e10cSrcweir 											: *pEndIdx - nTxtStartIdx ));
2273cdf0e10cSrcweir 				}
2274cdf0e10cSrcweir 			}
2275cdf0e10cSrcweir 			if ( pNewHt )
2276cdf0e10cSrcweir             {
2277cdf0e10cSrcweir                 const bool bSuccess( pDest->InsertHint( pNewHt,
2278cdf0e10cSrcweir                               nsSetAttrMode::SETATTR_NOTXTATRCHR
2279cdf0e10cSrcweir                             | nsSetAttrMode::SETATTR_DONTREPLACE
2280cdf0e10cSrcweir                             | nsSetAttrMode::SETATTR_IS_COPY) );
2281cdf0e10cSrcweir                 if (bSuccess)
2282cdf0e10cSrcweir                 {
2283cdf0e10cSrcweir                     lcl_CopyHint( nWhich, pHt, pNewHt, pOtherDoc, pDest );
2284cdf0e10cSrcweir                 }
2285cdf0e10cSrcweir             }
2286cdf0e10cSrcweir 			++nAttrCnt;
2287cdf0e10cSrcweir 		}
2288cdf0e10cSrcweir 		// sollten jetzt noch leere Attribute rumstehen, dann haben diese
2289cdf0e10cSrcweir 		// eine hoehere Praezedenz. Also herausholen und das Array updaten.
2290cdf0e10cSrcweir 		// Die dabei entstehenden leeren Hints werden von den gesicherten
2291cdf0e10cSrcweir 		// "uebergeplaettet".	(Bug: 6977)
2292cdf0e10cSrcweir         if( m_pSwpHints && nAttrCnt < m_pSwpHints->Count() )
2293cdf0e10cSrcweir         {
2294cdf0e10cSrcweir             SwpHts aArr( 5 );
2295cdf0e10cSrcweir             while ( nAttrCnt < m_pSwpHints->Count() )
2296cdf0e10cSrcweir             {
2297cdf0e10cSrcweir                 SwTxtAttr * const pHt = m_pSwpHints->GetTextHint(nAttrCnt);
2298cdf0e10cSrcweir                 if ( nEnd != *pHt->GetStart() )
2299cdf0e10cSrcweir                     break;
2300cdf0e10cSrcweir                 const xub_StrLen * const pEndIdx = pHt->GetEnd();
2301cdf0e10cSrcweir                 if ( pEndIdx && *pEndIdx == nEnd )
2302cdf0e10cSrcweir                 {
2303cdf0e10cSrcweir 					aArr.C40_INSERT( SwTxtAttr, pHt, aArr.Count() );
2304cdf0e10cSrcweir                     m_pSwpHints->Delete( pHt );
2305cdf0e10cSrcweir                 }
2306cdf0e10cSrcweir                 else
2307cdf0e10cSrcweir                 {
2308cdf0e10cSrcweir                     ++nAttrCnt;
2309cdf0e10cSrcweir                 }
2310cdf0e10cSrcweir 			}
2311cdf0e10cSrcweir 			Update( rStart, nLen, sal_True, sal_True );
2312cdf0e10cSrcweir 
2313cdf0e10cSrcweir             for ( sal_uInt16 n = 0; n < aArr.Count(); ++n )
2314cdf0e10cSrcweir 			{
2315cdf0e10cSrcweir                 SwTxtAttr * const pHt = aArr[ n ];
2316cdf0e10cSrcweir 				*pHt->GetStart() = *pHt->GetEnd() = rStart.GetIndex();
2317cdf0e10cSrcweir                 InsertHint( pHt );
2318cdf0e10cSrcweir             }
2319cdf0e10cSrcweir         }
2320cdf0e10cSrcweir 		else
2321cdf0e10cSrcweir         {
2322cdf0e10cSrcweir 			Update( rStart, nLen, sal_True, sal_True );
2323cdf0e10cSrcweir         }
2324cdf0e10cSrcweir 
2325cdf0e10cSrcweir 		CHECK_SWPHINTS(this);
2326cdf0e10cSrcweir 	}
2327cdf0e10cSrcweir 
2328cdf0e10cSrcweir     TryDeleteSwpHints();
2329cdf0e10cSrcweir 
2330cdf0e10cSrcweir 	// Frames benachrichtigen;
2331cdf0e10cSrcweir 	SwInsTxt aInsHint( nDestStart, nLen );
2332cdf0e10cSrcweir     pDest->ModifyNotification( 0, &aInsHint );
2333cdf0e10cSrcweir 	SwDelTxt aDelHint( nTxtStartIdx, nLen );
2334cdf0e10cSrcweir     ModifyNotification( 0, &aDelHint );
2335cdf0e10cSrcweir }
2336cdf0e10cSrcweir 
2337cdf0e10cSrcweir 
EraseText(const SwIndex & rIdx,const xub_StrLen nCount,const IDocumentContentOperations::InsertFlags nMode)2338cdf0e10cSrcweir void SwTxtNode::EraseText(const SwIndex &rIdx, const xub_StrLen nCount,
2339cdf0e10cSrcweir         const IDocumentContentOperations::InsertFlags nMode )
2340cdf0e10cSrcweir {
2341cdf0e10cSrcweir     ASSERT( rIdx <= m_Text.Len(), "SwTxtNode::EraseText: invalid index." );
2342cdf0e10cSrcweir 
2343cdf0e10cSrcweir     const xub_StrLen nStartIdx = rIdx.GetIndex();
2344cdf0e10cSrcweir     const xub_StrLen nCnt = (STRING_LEN == nCount)
2345cdf0e10cSrcweir                       ? m_Text.Len() - nStartIdx : nCount;
2346cdf0e10cSrcweir     const xub_StrLen nEndIdx = nStartIdx + nCnt;
2347cdf0e10cSrcweir     m_Text.Erase( nStartIdx, nCnt );
2348cdf0e10cSrcweir 
2349cdf0e10cSrcweir 	/* GCAttr(); alle leeren weggwerfen ist zu brutal.
2350cdf0e10cSrcweir 	 * Es duerfen nur die wegggeworfen werden,
2351cdf0e10cSrcweir 	 * die im Bereich liegen und nicht am Ende des Bereiches liegen
2352cdf0e10cSrcweir 	 */
2353cdf0e10cSrcweir 
2354cdf0e10cSrcweir     for ( sal_uInt16 i = 0; m_pSwpHints && i < m_pSwpHints->Count(); ++i )
2355cdf0e10cSrcweir     {
2356cdf0e10cSrcweir         SwTxtAttr *pHt = m_pSwpHints->GetTextHint(i);
2357cdf0e10cSrcweir 
2358cdf0e10cSrcweir         const xub_StrLen nHintStart = *pHt->GetStart();
2359cdf0e10cSrcweir 
2360cdf0e10cSrcweir         if ( nHintStart < nStartIdx )
236169a74367SOliver-Rainer Wittmann             continue;
2362cdf0e10cSrcweir 
2363cdf0e10cSrcweir         if ( nHintStart > nEndIdx )
2364cdf0e10cSrcweir             break; // hints are sorted by end, so break here
2365cdf0e10cSrcweir 
236669a74367SOliver-Rainer Wittmann         const xub_StrLen* pHtEndIdx = pHt->GetEnd();
236769a74367SOliver-Rainer Wittmann         const sal_uInt16 nWhich = pHt->Which();
2368cdf0e10cSrcweir 
236969a74367SOliver-Rainer Wittmann         if( !pHtEndIdx )
2370cdf0e10cSrcweir         {
2371cdf0e10cSrcweir             ASSERT(pHt->HasDummyChar(),
2372cdf0e10cSrcweir                     "attribute with neither end nor CH_TXTATR?");
2373cdf0e10cSrcweir             if (isTXTATR(nWhich) &&
2374cdf0e10cSrcweir                 (nHintStart >= nStartIdx) && (nHintStart < nEndIdx))
2375cdf0e10cSrcweir             {
2376cdf0e10cSrcweir                 m_pSwpHints->DeleteAtPos(i);
237769a74367SOliver-Rainer Wittmann                 DestroyAttr( pHt );
237869a74367SOliver-Rainer Wittmann                 --i;
237969a74367SOliver-Rainer Wittmann             }
238069a74367SOliver-Rainer Wittmann             continue;
238169a74367SOliver-Rainer Wittmann         }
2382cdf0e10cSrcweir 
2383cdf0e10cSrcweir         ASSERT (!( (nHintStart < nEndIdx) && (*pHtEndIdx > nEndIdx)
2384cdf0e10cSrcweir                     && pHt->HasDummyChar() )
2385cdf0e10cSrcweir                 // next line: deleting exactly dummy char: DeleteAttributes
2386cdf0e10cSrcweir                 || ((nHintStart == nStartIdx) && (nHintStart + 1 == nEndIdx)),
2387cdf0e10cSrcweir                 "ERROR: deleting left-overlapped attribute with CH_TXTATR");
2388cdf0e10cSrcweir 
2389cdf0e10cSrcweir         // Delete the hint if:
2390cdf0e10cSrcweir         // 1. The hint ends before the deletion end position or
2391cdf0e10cSrcweir         // 2. The hint ends at the deletion end position and
2392cdf0e10cSrcweir         //    we are not in empty expand mode and
239369a74367SOliver-Rainer Wittmann         //    the hint is a [toxmark|refmark|ruby|inputfield] text attribute
2394cdf0e10cSrcweir         // 3. deleting exactly the dummy char of an hint with end and dummy
2395cdf0e10cSrcweir         //    char deletes the hint
2396cdf0e10cSrcweir         if (   (*pHtEndIdx < nEndIdx)
2397cdf0e10cSrcweir             || ( (*pHtEndIdx == nEndIdx)     &&
2398cdf0e10cSrcweir                  !(IDocumentContentOperations::INS_EMPTYEXPAND & nMode)  &&
2399cdf0e10cSrcweir                  (  (RES_TXTATR_TOXMARK == nWhich)  ||
2400cdf0e10cSrcweir                     (RES_TXTATR_REFMARK == nWhich)  ||
240169a74367SOliver-Rainer Wittmann                     (RES_TXTATR_CJK_RUBY == nWhich) ||
240269a74367SOliver-Rainer Wittmann                     (RES_TXTATR_INPUTFIELD == nWhich) ) )
2403cdf0e10cSrcweir             || ( (nHintStart < nEndIdx)     &&
2404cdf0e10cSrcweir                  pHt->HasDummyChar()        )
2405cdf0e10cSrcweir            )
2406cdf0e10cSrcweir         {
2407cdf0e10cSrcweir             m_pSwpHints->DeleteAtPos(i);
2408cdf0e10cSrcweir             DestroyAttr( pHt );
2409cdf0e10cSrcweir             --i;
2410cdf0e10cSrcweir         }
2411cdf0e10cSrcweir     }
2412cdf0e10cSrcweir 
2413cdf0e10cSrcweir     ASSERT(rIdx.GetIndex() == nStartIdx, "huh? start index has changed?");
2414cdf0e10cSrcweir 
2415cdf0e10cSrcweir     TryDeleteSwpHints();
2416cdf0e10cSrcweir 
241769a74367SOliver-Rainer Wittmann     Update( rIdx, nCnt, sal_True );
2418cdf0e10cSrcweir 
241969a74367SOliver-Rainer Wittmann     if( 1 == nCnt )
242069a74367SOliver-Rainer Wittmann     {
2421cdf0e10cSrcweir         SwDelChr aHint( nStartIdx );
242269a74367SOliver-Rainer Wittmann         NotifyClients( 0, &aHint );
2423cdf0e10cSrcweir     }
2424cdf0e10cSrcweir     else
2425cdf0e10cSrcweir     {
2426cdf0e10cSrcweir         SwDelTxt aHint( nStartIdx, nCnt );
242769a74367SOliver-Rainer Wittmann         NotifyClients( 0, &aHint );
242869a74367SOliver-Rainer Wittmann     }
2429cdf0e10cSrcweir 
2430cdf0e10cSrcweir     ASSERT(rIdx.GetIndex() == nStartIdx, "huh? start index has changed?");
2431cdf0e10cSrcweir 
2432cdf0e10cSrcweir     // By deleting a character, the hidden flags
2433cdf0e10cSrcweir     // at the TxtNode can become invalid:
2434cdf0e10cSrcweir     SetCalcHiddenCharFlags();
2435cdf0e10cSrcweir 
243669a74367SOliver-Rainer Wittmann     CHECK_SWPHINTS(this);
2437cdf0e10cSrcweir }
2438cdf0e10cSrcweir 
2439cdf0e10cSrcweir /***********************************************************************
2440cdf0e10cSrcweir #*	Class		:	SwTxtNode
2441cdf0e10cSrcweir #*	Methode 	:	GCAttr
2442cdf0e10cSrcweir #*
2443cdf0e10cSrcweir #*	Beschreibung
2444cdf0e10cSrcweir #*					text.doc
2445cdf0e10cSrcweir #*
2446cdf0e10cSrcweir #*	Datum		:	MS 28.11.90
2447cdf0e10cSrcweir #*	Update		:	VB 24.07.91
2448cdf0e10cSrcweir #***********************************************************************/
2449cdf0e10cSrcweir 
GCAttr()2450cdf0e10cSrcweir void SwTxtNode::GCAttr()
2451cdf0e10cSrcweir {
2452cdf0e10cSrcweir     if ( !HasHints() )
2453cdf0e10cSrcweir         return;
2454cdf0e10cSrcweir 
2455cdf0e10cSrcweir     bool   bChanged = false;
245669a74367SOliver-Rainer Wittmann     sal_uInt16 nMin = m_Text.Len();
245769a74367SOliver-Rainer Wittmann     sal_uInt16 nMax = 0;
245869a74367SOliver-Rainer Wittmann     const bool bAll = nMin != 0; // Bei leeren Absaetzen werden nur die INet-Formate entfernt.
2459cdf0e10cSrcweir 
2460cdf0e10cSrcweir     for ( sal_uInt16 i = 0; m_pSwpHints && i < m_pSwpHints->Count(); ++i )
2461cdf0e10cSrcweir     {
2462cdf0e10cSrcweir         SwTxtAttr * const pHt = m_pSwpHints->GetTextHint(i);
2463cdf0e10cSrcweir 
246469a74367SOliver-Rainer Wittmann         // wenn Ende und Start gleich sind --> loeschen
2465cdf0e10cSrcweir         const xub_StrLen * const pEndIdx = pHt->GetEnd();
2466cdf0e10cSrcweir         if (pEndIdx && !pHt->HasDummyChar() && (*pEndIdx == *pHt->GetStart())
246769a74367SOliver-Rainer Wittmann             && ( bAll || pHt->Which() == RES_TXTATR_INETFMT ) )
2468cdf0e10cSrcweir         {
2469cdf0e10cSrcweir             bChanged = true;
247069a74367SOliver-Rainer Wittmann             nMin = Min( nMin, *pHt->GetStart() );
247169a74367SOliver-Rainer Wittmann             nMax = Max( nMax, *pHt->GetEnd() );
2472cdf0e10cSrcweir             DestroyAttr( m_pSwpHints->Cut(i) );
247369a74367SOliver-Rainer Wittmann             --i;
2474cdf0e10cSrcweir         }
2475cdf0e10cSrcweir         else
2476cdf0e10cSrcweir         {
2477cdf0e10cSrcweir             pHt->SetDontExpand( false );
2478cdf0e10cSrcweir         }
2479cdf0e10cSrcweir     }
2480cdf0e10cSrcweir     TryDeleteSwpHints();
2481cdf0e10cSrcweir 
248269a74367SOliver-Rainer Wittmann     if(bChanged)
248369a74367SOliver-Rainer Wittmann     {
248469a74367SOliver-Rainer Wittmann         //TxtFrm's reagieren auf aHint, andere auf aNew
248569a74367SOliver-Rainer Wittmann         SwUpdateAttr aHint( nMin, nMax, 0 );
248669a74367SOliver-Rainer Wittmann         NotifyClients( 0, &aHint );
248769a74367SOliver-Rainer Wittmann         SwFmtChg aNew( GetTxtColl() );
248869a74367SOliver-Rainer Wittmann         NotifyClients( 0, &aNew );
248969a74367SOliver-Rainer Wittmann     }
2490cdf0e10cSrcweir }
2491cdf0e10cSrcweir 
2492cdf0e10cSrcweir // #i23726#
_GetNumRule(sal_Bool bInParent) const2493cdf0e10cSrcweir SwNumRule* SwTxtNode::_GetNumRule(sal_Bool bInParent) const
2494cdf0e10cSrcweir {
2495cdf0e10cSrcweir     SwNumRule* pRet = 0;
2496cdf0e10cSrcweir 
2497cdf0e10cSrcweir     const SfxPoolItem* pItem = GetNoCondAttr( RES_PARATR_NUMRULE, bInParent );
2498cdf0e10cSrcweir     bool bNoNumRule = false;
2499cdf0e10cSrcweir     if ( pItem )
2500cdf0e10cSrcweir     {
2501cdf0e10cSrcweir         String sNumRuleName = static_cast<const SwNumRuleItem *>(pItem)->GetValue();
2502cdf0e10cSrcweir         if (sNumRuleName.Len() > 0)
2503cdf0e10cSrcweir         {
2504cdf0e10cSrcweir             pRet = GetDoc()->FindNumRulePtr( sNumRuleName );
2505cdf0e10cSrcweir         }
2506cdf0e10cSrcweir         else // numbering is turned off
2507cdf0e10cSrcweir             bNoNumRule = true;
2508cdf0e10cSrcweir     }
2509cdf0e10cSrcweir 
2510cdf0e10cSrcweir     if ( !bNoNumRule )
2511cdf0e10cSrcweir     {
2512cdf0e10cSrcweir         if ( pRet && pRet == GetDoc()->GetOutlineNumRule() &&
2513cdf0e10cSrcweir              ( !HasSwAttrSet() ||
2514cdf0e10cSrcweir                SFX_ITEM_SET !=
2515cdf0e10cSrcweir                 GetpSwAttrSet()->GetItemState( RES_PARATR_NUMRULE, sal_False ) ) )
2516cdf0e10cSrcweir         {
2517cdf0e10cSrcweir             SwTxtFmtColl* pColl = GetTxtColl();
2518cdf0e10cSrcweir             if ( pColl )
2519cdf0e10cSrcweir             {
2520cdf0e10cSrcweir                 const SwNumRuleItem& rDirectItem = pColl->GetNumRule( sal_False );
2521cdf0e10cSrcweir                 if ( rDirectItem.GetValue().Len() == 0 )
2522cdf0e10cSrcweir                 {
2523cdf0e10cSrcweir                     pRet = 0L;
2524cdf0e10cSrcweir                 }
2525cdf0e10cSrcweir             }
2526cdf0e10cSrcweir         }
2527cdf0e10cSrcweir     }
2528cdf0e10cSrcweir 
252969a74367SOliver-Rainer Wittmann     return pRet;
2530cdf0e10cSrcweir }
2531cdf0e10cSrcweir 
GetNumRule(sal_Bool bInParent) const2532cdf0e10cSrcweir SwNumRule* SwTxtNode::GetNumRule(sal_Bool bInParent) const
2533cdf0e10cSrcweir {
2534cdf0e10cSrcweir     SwNumRule * pRet = _GetNumRule(bInParent);
2535cdf0e10cSrcweir 
2536cdf0e10cSrcweir     return pRet;
2537cdf0e10cSrcweir }
2538cdf0e10cSrcweir 
NumRuleChgd()2539cdf0e10cSrcweir void SwTxtNode::NumRuleChgd()
2540cdf0e10cSrcweir {
2541cdf0e10cSrcweir     // --> OD 2008-04-04 #refactorlists#
2542cdf0e10cSrcweir     if ( IsInList() )
2543cdf0e10cSrcweir     {
2544cdf0e10cSrcweir         SwNumRule* pNumRule = GetNumRule();
2545cdf0e10cSrcweir         if ( pNumRule && pNumRule != GetNum()->GetNumRule() )
2546cdf0e10cSrcweir         {
2547cdf0e10cSrcweir             mpNodeNum->ChangeNumRule( *pNumRule );
2548cdf0e10cSrcweir         }
2549cdf0e10cSrcweir     }
2550cdf0e10cSrcweir     // <--
2551cdf0e10cSrcweir 
2552cdf0e10cSrcweir     if( IsInCache() )
2553cdf0e10cSrcweir 	{
2554cdf0e10cSrcweir 		SwFrm::GetCache().Delete( this );
2555cdf0e10cSrcweir 		SetInCache( sal_False );
2556cdf0e10cSrcweir 	}
2557cdf0e10cSrcweir 	SetInSwFntCache( sal_False );
2558cdf0e10cSrcweir 
2559cdf0e10cSrcweir     // Sending "noop" modify in order to cause invalidations of registered
2560cdf0e10cSrcweir     // <SwTxtFrm> instances to get the list style change respectively the change
2561cdf0e10cSrcweir     // in the list tree reflected in the layout.
2562cdf0e10cSrcweir     // Important note:
2563cdf0e10cSrcweir     {
2564cdf0e10cSrcweir         SvxLRSpaceItem& rLR = (SvxLRSpaceItem&)GetSwAttrSet().GetLRSpace();
2565cdf0e10cSrcweir         NotifyClients( &rLR, &rLR );
2566cdf0e10cSrcweir     }
2567cdf0e10cSrcweir }
2568cdf0e10cSrcweir 
2569cdf0e10cSrcweir // -> #i27615#
IsNumbered() const2570cdf0e10cSrcweir sal_Bool SwTxtNode::IsNumbered() const
2571cdf0e10cSrcweir {
2572cdf0e10cSrcweir     sal_Bool bResult = sal_False;
2573cdf0e10cSrcweir 
2574cdf0e10cSrcweir     SwNumRule* pRule = GetNum() ? GetNum()->GetNumRule() : 0L;
2575cdf0e10cSrcweir     if ( pRule && IsCountedInList() )
2576cdf0e10cSrcweir         bResult = sal_True;
2577cdf0e10cSrcweir 
2578cdf0e10cSrcweir     return bResult;
2579cdf0e10cSrcweir }
2580cdf0e10cSrcweir 
2581cdf0e10cSrcweir // --> OD 2008-04-02 #refactorlists#
HasMarkedLabel() const2582cdf0e10cSrcweir bool SwTxtNode::HasMarkedLabel() const
2583cdf0e10cSrcweir {
2584cdf0e10cSrcweir     bool bResult = false;
2585cdf0e10cSrcweir 
2586cdf0e10cSrcweir     if ( IsInList() )
2587cdf0e10cSrcweir     {
2588cdf0e10cSrcweir         bResult =
2589cdf0e10cSrcweir             GetDoc()->getListByName( GetListId() )->IsListLevelMarked( GetActualListLevel() );
2590cdf0e10cSrcweir     }
2591cdf0e10cSrcweir 
2592cdf0e10cSrcweir     return bResult;
2593cdf0e10cSrcweir }
2594cdf0e10cSrcweir // <--
2595cdf0e10cSrcweir // <- #i27615#
2596cdf0e10cSrcweir 
_MakeNewTxtNode(const SwNodeIndex & rPos,sal_Bool bNext,sal_Bool bChgFollow)2597cdf0e10cSrcweir SwTxtNode* SwTxtNode::_MakeNewTxtNode( const SwNodeIndex& rPos, sal_Bool bNext,
2598cdf0e10cSrcweir 										sal_Bool bChgFollow )
2599cdf0e10cSrcweir {
2600cdf0e10cSrcweir 	/* hartes PageBreak/PageDesc/ColumnBreak aus AUTO-Set ignorieren */
2601cdf0e10cSrcweir 	SwAttrSet* pNewAttrSet = 0;
2602cdf0e10cSrcweir     // --> OD 2007-07-10 #i75353#
2603cdf0e10cSrcweir     bool bClearHardSetNumRuleWhenFmtCollChanges( false );
2604cdf0e10cSrcweir     // <--
2605cdf0e10cSrcweir     if( HasSwAttrSet() )
2606cdf0e10cSrcweir 	{
2607cdf0e10cSrcweir 		pNewAttrSet = new SwAttrSet( *GetpSwAttrSet() );
2608cdf0e10cSrcweir         const SfxItemSet* pTmpSet = GetpSwAttrSet();
2609cdf0e10cSrcweir 
2610cdf0e10cSrcweir 		if( bNext )		// der naechste erbt keine Breaks!
2611cdf0e10cSrcweir 			pTmpSet = pNewAttrSet;
2612cdf0e10cSrcweir 
2613cdf0e10cSrcweir 		// PageBreaks/PageDesc/ColBreak rausschmeissen.
2614cdf0e10cSrcweir         sal_Bool bRemoveFromCache = sal_False;
2615cdf0e10cSrcweir         std::vector<sal_uInt16> aClearWhichIds;
2616cdf0e10cSrcweir         if ( bNext )
2617cdf0e10cSrcweir             bRemoveFromCache = ( 0 != pNewAttrSet->ClearItem( RES_PAGEDESC ) );
2618cdf0e10cSrcweir         else
2619cdf0e10cSrcweir             aClearWhichIds.push_back( RES_PAGEDESC );
2620cdf0e10cSrcweir 
2621cdf0e10cSrcweir 		if( SFX_ITEM_SET == pTmpSet->GetItemState( RES_BREAK, sal_False ) )
2622cdf0e10cSrcweir 		{
2623cdf0e10cSrcweir             if ( bNext )
2624cdf0e10cSrcweir                 pNewAttrSet->ClearItem( RES_BREAK );
2625cdf0e10cSrcweir             else
2626cdf0e10cSrcweir                 aClearWhichIds.push_back( RES_BREAK );
2627cdf0e10cSrcweir             bRemoveFromCache = sal_True;
2628cdf0e10cSrcweir 		}
2629cdf0e10cSrcweir 		if( SFX_ITEM_SET == pTmpSet->GetItemState( RES_KEEP, sal_False ) )
2630cdf0e10cSrcweir 		{
2631cdf0e10cSrcweir             if ( bNext )
2632cdf0e10cSrcweir                 pNewAttrSet->ClearItem( RES_KEEP );
2633cdf0e10cSrcweir             else
2634cdf0e10cSrcweir                 aClearWhichIds.push_back( RES_KEEP );
2635cdf0e10cSrcweir             bRemoveFromCache = sal_True;
2636cdf0e10cSrcweir 		}
2637cdf0e10cSrcweir 		if( SFX_ITEM_SET == pTmpSet->GetItemState( RES_PARATR_SPLIT, sal_False ) )
2638cdf0e10cSrcweir 		{
2639cdf0e10cSrcweir             if ( bNext )
2640cdf0e10cSrcweir                 pNewAttrSet->ClearItem( RES_PARATR_SPLIT );
2641cdf0e10cSrcweir             else
2642cdf0e10cSrcweir                 aClearWhichIds.push_back( RES_PARATR_SPLIT );
2643cdf0e10cSrcweir             bRemoveFromCache = sal_True;
2644cdf0e10cSrcweir 		}
2645cdf0e10cSrcweir 		if(SFX_ITEM_SET == pTmpSet->GetItemState(RES_PARATR_NUMRULE, sal_False))
2646cdf0e10cSrcweir         {
2647cdf0e10cSrcweir             SwNumRule * pRule = GetNumRule();
2648cdf0e10cSrcweir 
2649cdf0e10cSrcweir             if (pRule && IsOutline())
2650cdf0e10cSrcweir             {
2651cdf0e10cSrcweir                 if ( bNext )
2652cdf0e10cSrcweir                     pNewAttrSet->ClearItem(RES_PARATR_NUMRULE);
2653cdf0e10cSrcweir                 else
2654cdf0e10cSrcweir                 {
2655cdf0e10cSrcweir                     // --> OD 2007-07-10 #i75353#
2656cdf0e10cSrcweir                     // No clear of hard set numbering rule at an outline paragraph at this point.
2657cdf0e10cSrcweir                     // Only if the paragraph style changes - see below.
2658cdf0e10cSrcweir //                    aClearWhichIds.push_back( RES_PARATR_NUMRULE );
2659cdf0e10cSrcweir                     bClearHardSetNumRuleWhenFmtCollChanges = true;
2660cdf0e10cSrcweir                     // <--
2661cdf0e10cSrcweir                 }
2662cdf0e10cSrcweir                 bRemoveFromCache = sal_True;
2663cdf0e10cSrcweir             }
2664cdf0e10cSrcweir         }
2665cdf0e10cSrcweir 
2666cdf0e10cSrcweir         if ( 0 != aClearWhichIds.size() )
2667cdf0e10cSrcweir             bRemoveFromCache = 0 != ClearItemsFromAttrSet( aClearWhichIds );
2668cdf0e10cSrcweir 
2669cdf0e10cSrcweir 		if( !bNext && bRemoveFromCache && IsInCache() )
2670cdf0e10cSrcweir 		{
2671cdf0e10cSrcweir 			SwFrm::GetCache().Delete( this );
2672cdf0e10cSrcweir 			SetInCache( sal_False );
2673cdf0e10cSrcweir 		}
2674cdf0e10cSrcweir 	}
2675cdf0e10cSrcweir 	SwNodes& rNds = GetNodes();
2676cdf0e10cSrcweir 
2677cdf0e10cSrcweir 	SwTxtFmtColl* pColl = GetTxtColl();
2678cdf0e10cSrcweir 
2679cdf0e10cSrcweir 	SwTxtNode *pNode = new SwTxtNode( rPos, pColl, pNewAttrSet );
2680cdf0e10cSrcweir 
2681cdf0e10cSrcweir 	if( pNewAttrSet )
2682cdf0e10cSrcweir 		delete pNewAttrSet;
2683cdf0e10cSrcweir 
2684cdf0e10cSrcweir 	const SwNumRule* pRule = GetNumRule();
2685cdf0e10cSrcweir 	if( pRule && pRule == pNode->GetNumRule() && rNds.IsDocNodes() ) // #115901#
2686cdf0e10cSrcweir 	{
2687cdf0e10cSrcweir         // --> OD 2005-10-18 #i55459#
2688cdf0e10cSrcweir         // - correction: parameter <bNext> has to be checked, as it was in the
2689cdf0e10cSrcweir         //   previous implementation.
2690cdf0e10cSrcweir         if ( !bNext && !IsCountedInList() )
2691cdf0e10cSrcweir             SetCountedInList(true);
2692cdf0e10cSrcweir         // <--
2693cdf0e10cSrcweir 	}
2694cdf0e10cSrcweir 
2695cdf0e10cSrcweir 	// jetzt kann es sein, das durch die Nummerierung dem neuen Node eine
2696cdf0e10cSrcweir 	// Vorlage aus dem Pool zugewiesen wurde. Dann darf diese nicht
2697cdf0e10cSrcweir 	// nochmal uebergeplaettet werden !!
2698cdf0e10cSrcweir 	if( pColl != pNode->GetTxtColl() ||
2699cdf0e10cSrcweir 		( bChgFollow && pColl != GetTxtColl() ))
2700cdf0e10cSrcweir 		return pNode;		// mehr duerfte nicht gemacht werden oder ????
2701cdf0e10cSrcweir 
2702cdf0e10cSrcweir 	pNode->_ChgTxtCollUpdateNum( 0, pColl ); // fuer Nummerierung/Gliederung
2703cdf0e10cSrcweir 	if( bNext || !bChgFollow )
2704cdf0e10cSrcweir 		return pNode;
2705cdf0e10cSrcweir 
2706cdf0e10cSrcweir 	SwTxtFmtColl *pNextColl = &pColl->GetNextTxtFmtColl();
2707cdf0e10cSrcweir     // --> OD 2009-08-12 #i101870#
2708cdf0e10cSrcweir     // perform action on different paragraph styles before applying the new paragraph style
2709cdf0e10cSrcweir     if (pNextColl != pColl)
2710cdf0e10cSrcweir     {
2711cdf0e10cSrcweir         // --> OD 2007-07-10 #i75353#
2712cdf0e10cSrcweir         if ( bClearHardSetNumRuleWhenFmtCollChanges )
2713cdf0e10cSrcweir         {
2714cdf0e10cSrcweir             std::vector<sal_uInt16> aClearWhichIds;
2715cdf0e10cSrcweir             aClearWhichIds.push_back( RES_PARATR_NUMRULE );
2716cdf0e10cSrcweir             if ( ClearItemsFromAttrSet( aClearWhichIds ) != 0 && IsInCache() )
2717cdf0e10cSrcweir             {
2718cdf0e10cSrcweir                 SwFrm::GetCache().Delete( this );
2719cdf0e10cSrcweir                 SetInCache( sal_False );
2720cdf0e10cSrcweir             }
2721cdf0e10cSrcweir         }
2722cdf0e10cSrcweir         // <--
2723cdf0e10cSrcweir     }
2724cdf0e10cSrcweir     // <--
2725cdf0e10cSrcweir 	ChgFmtColl( pNextColl );
2726cdf0e10cSrcweir 
2727cdf0e10cSrcweir 	return pNode;
2728cdf0e10cSrcweir }
2729cdf0e10cSrcweir 
AppendNode(const SwPosition & rPos)2730cdf0e10cSrcweir SwCntntNode* SwTxtNode::AppendNode( const SwPosition & rPos )
2731cdf0e10cSrcweir {
273269a74367SOliver-Rainer Wittmann     // Position hinter dem eingefuegt wird
273369a74367SOliver-Rainer Wittmann     SwNodeIndex aIdx( rPos.nNode, 1 );
273469a74367SOliver-Rainer Wittmann     SwTxtNode* pNew = _MakeNewTxtNode( aIdx, sal_True );
2735cdf0e10cSrcweir 
2736cdf0e10cSrcweir     // reset list attributes at appended text node
2737cdf0e10cSrcweir     pNew->ResetAttr( RES_PARATR_LIST_ISRESTART );
2738cdf0e10cSrcweir     pNew->ResetAttr( RES_PARATR_LIST_RESTARTVALUE );
2739cdf0e10cSrcweir     pNew->ResetAttr( RES_PARATR_LIST_ISCOUNTED );
2740cdf0e10cSrcweir     if ( pNew->GetNumRule() == 0 )
2741cdf0e10cSrcweir     {
2742cdf0e10cSrcweir         pNew->ResetAttr( RES_PARATR_LIST_ID );
2743cdf0e10cSrcweir         pNew->ResetAttr( RES_PARATR_LIST_LEVEL );
2744cdf0e10cSrcweir     }
274569a74367SOliver-Rainer Wittmann 
2746cdf0e10cSrcweir     if ( !IsInList() && GetNumRule() && GetListId().Len() > 0 )
2747cdf0e10cSrcweir     {
2748cdf0e10cSrcweir         AddToList();
2749cdf0e10cSrcweir     }
2750cdf0e10cSrcweir 
275169a74367SOliver-Rainer Wittmann     if( GetDepends() )
275269a74367SOliver-Rainer Wittmann         MakeFrms( *pNew );
275369a74367SOliver-Rainer Wittmann     return pNew;
2754cdf0e10cSrcweir }
2755cdf0e10cSrcweir 
2756cdf0e10cSrcweir /*************************************************************************
2757cdf0e10cSrcweir  *						SwTxtNode::GetTxtAttr
2758cdf0e10cSrcweir  *************************************************************************/
2759cdf0e10cSrcweir 
GetTxtAttrForCharAt(const xub_StrLen nIndex,const RES_TXTATR nWhich) const276069a74367SOliver-Rainer Wittmann SwTxtAttr * SwTxtNode::GetTxtAttrForCharAt(
276169a74367SOliver-Rainer Wittmann     const xub_StrLen nIndex,
2762cdf0e10cSrcweir     const RES_TXTATR nWhich ) const
2763cdf0e10cSrcweir {
2764cdf0e10cSrcweir     if ( HasHints() )
2765cdf0e10cSrcweir     {
2766cdf0e10cSrcweir         for ( sal_uInt16 i = 0; i < m_pSwpHints->Count(); ++i )
2767cdf0e10cSrcweir         {
2768cdf0e10cSrcweir             SwTxtAttr * const pHint = m_pSwpHints->GetTextHint(i);
2769cdf0e10cSrcweir             const xub_StrLen nStartPos = *pHint->GetStart();
2770cdf0e10cSrcweir             if ( nIndex < nStartPos )
2771cdf0e10cSrcweir             {
2772cdf0e10cSrcweir                 return 0;
2773cdf0e10cSrcweir             }
2774cdf0e10cSrcweir             if ( (nIndex == nStartPos) && pHint->HasDummyChar() )
2775cdf0e10cSrcweir             {
2776cdf0e10cSrcweir                 return ( RES_TXTATR_END == nWhich || nWhich == pHint->Which() )
277769a74367SOliver-Rainer Wittmann                        ? pHint : 0;
2778cdf0e10cSrcweir             }
2779cdf0e10cSrcweir         }
2780cdf0e10cSrcweir     }
2781cdf0e10cSrcweir     return 0;
2782cdf0e10cSrcweir }
2783cdf0e10cSrcweir 
2784cdf0e10cSrcweir // -> #i29560#
HasNumber() const2785cdf0e10cSrcweir sal_Bool SwTxtNode::HasNumber() const
2786cdf0e10cSrcweir {
2787cdf0e10cSrcweir     sal_Bool bResult = sal_False;
2788cdf0e10cSrcweir 
2789cdf0e10cSrcweir     const SwNumRule* pRule = GetNum() ? GetNum()->GetNumRule() : 0L;
2790cdf0e10cSrcweir     if ( pRule )
2791cdf0e10cSrcweir     {
2792cdf0e10cSrcweir         SwNumFmt aFmt(pRule->Get( static_cast<sal_uInt16>(GetActualListLevel())));
2793cdf0e10cSrcweir 
2794cdf0e10cSrcweir         // #i40041#
2795cdf0e10cSrcweir         bResult = aFmt.IsEnumeration() &&
2796cdf0e10cSrcweir             SVX_NUM_NUMBER_NONE != aFmt.GetNumberingType();
2797cdf0e10cSrcweir     }
2798cdf0e10cSrcweir 
2799cdf0e10cSrcweir     return bResult;
2800cdf0e10cSrcweir }
2801cdf0e10cSrcweir 
HasBullet() const2802cdf0e10cSrcweir sal_Bool SwTxtNode::HasBullet() const
2803cdf0e10cSrcweir {
2804cdf0e10cSrcweir     sal_Bool bResult = sal_False;
2805cdf0e10cSrcweir 
2806cdf0e10cSrcweir     const SwNumRule* pRule = GetNum() ? GetNum()->GetNumRule() : 0L;
2807cdf0e10cSrcweir     if ( pRule )
2808cdf0e10cSrcweir     {
2809cdf0e10cSrcweir         SwNumFmt aFmt(pRule->Get( static_cast<sal_uInt16>(GetActualListLevel())));
2810cdf0e10cSrcweir 
2811cdf0e10cSrcweir         bResult = aFmt.IsItemize();
2812cdf0e10cSrcweir     }
2813cdf0e10cSrcweir 
2814cdf0e10cSrcweir     return bResult;
2815cdf0e10cSrcweir }
2816cdf0e10cSrcweir // <- #i29560#
2817cdf0e10cSrcweir 
2818cdf0e10cSrcweir // --> OD 2005-11-17 #128041# - introduce parameter <_bInclPrefixAndSuffixStrings>
2819cdf0e10cSrcweir //i53420 added max outline parameter
GetNumString(const bool _bInclPrefixAndSuffixStrings,const unsigned int _nRestrictToThisLevel) const2820cdf0e10cSrcweir XubString SwTxtNode::GetNumString( const bool _bInclPrefixAndSuffixStrings, const unsigned int _nRestrictToThisLevel ) const
2821cdf0e10cSrcweir {
2822cdf0e10cSrcweir     if (GetDoc()->IsClipBoard() && m_pNumStringCache.get())
2823cdf0e10cSrcweir     {
2824cdf0e10cSrcweir         // #i111677# do not expand number strings in clipboard documents
2825cdf0e10cSrcweir         return *m_pNumStringCache;
2826cdf0e10cSrcweir     }
2827cdf0e10cSrcweir     const SwNumRule* pRule = GetNum() ? GetNum()->GetNumRule() : 0L;
2828cdf0e10cSrcweir     if ( pRule &&
2829cdf0e10cSrcweir          IsCountedInList() )
2830cdf0e10cSrcweir     {
2831cdf0e10cSrcweir         SvxNumberType const& rNumberType(
2832cdf0e10cSrcweir                 pRule->Get( static_cast<sal_uInt16>(GetActualListLevel()) ) );
2833cdf0e10cSrcweir         if (rNumberType.IsTxtFmt() ||
2834cdf0e10cSrcweir         // #b6432095#
2835cdf0e10cSrcweir             (style::NumberingType::NUMBER_NONE == rNumberType.GetNumberingType()))
2836cdf0e10cSrcweir         {
2837cdf0e10cSrcweir             return pRule->MakeNumString( GetNum()->GetNumberVector(),
2838cdf0e10cSrcweir                                      _bInclPrefixAndSuffixStrings ? sal_True : sal_False,
2839cdf0e10cSrcweir                                      sal_False,
2840cdf0e10cSrcweir                                      _nRestrictToThisLevel );
2841cdf0e10cSrcweir         }
2842cdf0e10cSrcweir     }
2843cdf0e10cSrcweir 
2844cdf0e10cSrcweir     return aEmptyStr;
2845cdf0e10cSrcweir }
2846cdf0e10cSrcweir 
GetLeftMarginWithNum(sal_Bool bTxtLeft) const2847cdf0e10cSrcweir long SwTxtNode::GetLeftMarginWithNum( sal_Bool bTxtLeft ) const
2848cdf0e10cSrcweir {
2849cdf0e10cSrcweir     long nRet = 0;
2850cdf0e10cSrcweir     const SwNumRule* pRule = GetNum() ? GetNum()->GetNumRule() : 0L;
2851cdf0e10cSrcweir 	if( pRule )
2852cdf0e10cSrcweir 	{
2853cdf0e10cSrcweir         const SwNumFmt& rFmt = pRule->Get(static_cast<sal_uInt16>(GetActualListLevel()));
2854cdf0e10cSrcweir         // --> OD 2008-01-16 #newlistlevelattrs#
2855cdf0e10cSrcweir         if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2856cdf0e10cSrcweir         {
2857cdf0e10cSrcweir             nRet = rFmt.GetAbsLSpace();
2858cdf0e10cSrcweir 
2859cdf0e10cSrcweir             if( !bTxtLeft )
2860cdf0e10cSrcweir             {
2861cdf0e10cSrcweir                 if( 0 > rFmt.GetFirstLineOffset() &&
2862cdf0e10cSrcweir                     nRet > -rFmt.GetFirstLineOffset() )
2863cdf0e10cSrcweir                     nRet = nRet + rFmt.GetFirstLineOffset();
2864cdf0e10cSrcweir                 else
2865cdf0e10cSrcweir                     nRet = 0;
2866cdf0e10cSrcweir             }
2867cdf0e10cSrcweir 
2868cdf0e10cSrcweir             if( pRule->IsAbsSpaces() )
2869cdf0e10cSrcweir                 nRet = nRet - GetSwAttrSet().GetLRSpace().GetLeft();
2870cdf0e10cSrcweir         }
2871cdf0e10cSrcweir         else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
2872cdf0e10cSrcweir         {
2873cdf0e10cSrcweir             if ( AreListLevelIndentsApplicable() )
2874cdf0e10cSrcweir             {
2875cdf0e10cSrcweir                 nRet = rFmt.GetIndentAt();
2876cdf0e10cSrcweir                 // --> OD 2008-06-06 #i90401#
2877cdf0e10cSrcweir                 // Only negative first line indents have consider for the left margin
2878cdf0e10cSrcweir                 if ( !bTxtLeft &&
2879cdf0e10cSrcweir                      rFmt.GetFirstLineIndent() < 0 )
2880cdf0e10cSrcweir                 {
2881cdf0e10cSrcweir                     nRet = nRet + rFmt.GetFirstLineIndent();
2882cdf0e10cSrcweir                 }
2883cdf0e10cSrcweir                 // <--
2884cdf0e10cSrcweir             }
2885cdf0e10cSrcweir         }
2886cdf0e10cSrcweir         // <--
2887cdf0e10cSrcweir 	}
2888cdf0e10cSrcweir 
2889cdf0e10cSrcweir     return nRet;
2890cdf0e10cSrcweir }
2891cdf0e10cSrcweir 
GetFirstLineOfsWithNum(short & rFLOffset) const2892cdf0e10cSrcweir sal_Bool SwTxtNode::GetFirstLineOfsWithNum( short& rFLOffset ) const
2893cdf0e10cSrcweir {
2894cdf0e10cSrcweir     sal_Bool bRet( sal_False );
2895cdf0e10cSrcweir     // --> OD 2009-09-08 #i95907#, #b6879723#
2896cdf0e10cSrcweir     rFLOffset = 0;
2897cdf0e10cSrcweir     // <--
2898cdf0e10cSrcweir 
2899cdf0e10cSrcweir     // --> OD 2005-11-02 #i51089 - TUNING#
2900cdf0e10cSrcweir     const SwNumRule* pRule = GetNum() ? GetNum()->GetNumRule() : 0L;
2901cdf0e10cSrcweir     if ( pRule )
2902cdf0e10cSrcweir 	{
2903cdf0e10cSrcweir         if ( IsCountedInList() )
2904cdf0e10cSrcweir         {
2905cdf0e10cSrcweir             // --> OD 2008-01-16 #newlistlevelattrs#
2906cdf0e10cSrcweir             const SwNumFmt& rFmt = pRule->Get(static_cast<sal_uInt16>(GetActualListLevel()));
2907cdf0e10cSrcweir             if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2908cdf0e10cSrcweir             {
2909cdf0e10cSrcweir                 rFLOffset = pRule->Get( static_cast<sal_uInt16>(GetActualListLevel() )).GetFirstLineOffset();
2910cdf0e10cSrcweir 
2911cdf0e10cSrcweir                 if (!getIDocumentSettingAccess()->get(IDocumentSettingAccess::IGNORE_FIRST_LINE_INDENT_IN_NUMBERING))
2912cdf0e10cSrcweir                 {
2913cdf0e10cSrcweir                     SvxLRSpaceItem aItem = GetSwAttrSet().GetLRSpace();
2914cdf0e10cSrcweir                     rFLOffset = rFLOffset + aItem.GetTxtFirstLineOfst();
2915cdf0e10cSrcweir                 }
2916cdf0e10cSrcweir             }
2917cdf0e10cSrcweir             else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
2918cdf0e10cSrcweir             {
2919cdf0e10cSrcweir                 if ( AreListLevelIndentsApplicable() )
2920cdf0e10cSrcweir                 {
2921cdf0e10cSrcweir                     rFLOffset = static_cast<sal_uInt16>(rFmt.GetFirstLineIndent());
2922cdf0e10cSrcweir                 }
2923cdf0e10cSrcweir                 else if (!getIDocumentSettingAccess()->get(IDocumentSettingAccess::IGNORE_FIRST_LINE_INDENT_IN_NUMBERING))
2924cdf0e10cSrcweir                 {
2925cdf0e10cSrcweir                     SvxLRSpaceItem aItem = GetSwAttrSet().GetLRSpace();
2926cdf0e10cSrcweir                     rFLOffset = aItem.GetTxtFirstLineOfst();
2927cdf0e10cSrcweir                 }
2928cdf0e10cSrcweir             }
2929cdf0e10cSrcweir             // <--
2930cdf0e10cSrcweir         }
2931cdf0e10cSrcweir 
2932cdf0e10cSrcweir         bRet = sal_True;
2933cdf0e10cSrcweir 	}
2934cdf0e10cSrcweir     else
2935cdf0e10cSrcweir     {
2936cdf0e10cSrcweir         rFLOffset = GetSwAttrSet().GetLRSpace().GetTxtFirstLineOfst();
2937cdf0e10cSrcweir     }
2938cdf0e10cSrcweir 
2939cdf0e10cSrcweir     return bRet;
2940cdf0e10cSrcweir }
2941cdf0e10cSrcweir 
2942cdf0e10cSrcweir // --> OD 2010-01-05 #b6884103#
GetAdditionalIndentForStartingNewList() const2943cdf0e10cSrcweir SwTwips SwTxtNode::GetAdditionalIndentForStartingNewList() const
2944cdf0e10cSrcweir {
2945cdf0e10cSrcweir     SwTwips nAdditionalIndent = 0;
2946cdf0e10cSrcweir 
2947cdf0e10cSrcweir     const SwNumRule* pRule = GetNum() ? GetNum()->GetNumRule() : 0L;
2948cdf0e10cSrcweir     if ( pRule )
2949cdf0e10cSrcweir     {
2950cdf0e10cSrcweir         const SwNumFmt& rFmt = pRule->Get(static_cast<sal_uInt16>(GetActualListLevel()));
2951cdf0e10cSrcweir         if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2952cdf0e10cSrcweir         {
2953cdf0e10cSrcweir             nAdditionalIndent = GetSwAttrSet().GetLRSpace().GetLeft();
2954cdf0e10cSrcweir 
2955cdf0e10cSrcweir             if (getIDocumentSettingAccess()->get(IDocumentSettingAccess::IGNORE_FIRST_LINE_INDENT_IN_NUMBERING))
2956cdf0e10cSrcweir             {
2957cdf0e10cSrcweir                 nAdditionalIndent = nAdditionalIndent -
2958cdf0e10cSrcweir                                     GetSwAttrSet().GetLRSpace().GetTxtFirstLineOfst();
2959cdf0e10cSrcweir             }
2960cdf0e10cSrcweir         }
2961cdf0e10cSrcweir         else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
2962cdf0e10cSrcweir         {
2963cdf0e10cSrcweir             if ( AreListLevelIndentsApplicable() )
2964cdf0e10cSrcweir             {
2965cdf0e10cSrcweir                 nAdditionalIndent = rFmt.GetIndentAt() + rFmt.GetFirstLineIndent();
2966cdf0e10cSrcweir             }
2967cdf0e10cSrcweir             else
2968cdf0e10cSrcweir             {
2969cdf0e10cSrcweir                 nAdditionalIndent = GetSwAttrSet().GetLRSpace().GetLeft();
2970cdf0e10cSrcweir                 if (getIDocumentSettingAccess()->get(IDocumentSettingAccess::IGNORE_FIRST_LINE_INDENT_IN_NUMBERING))
2971cdf0e10cSrcweir                 {
2972cdf0e10cSrcweir                     nAdditionalIndent = nAdditionalIndent -
2973cdf0e10cSrcweir                                         GetSwAttrSet().GetLRSpace().GetTxtFirstLineOfst();
2974cdf0e10cSrcweir                 }
2975cdf0e10cSrcweir             }
2976cdf0e10cSrcweir         }
2977cdf0e10cSrcweir     }
2978cdf0e10cSrcweir     else
2979cdf0e10cSrcweir     {
2980cdf0e10cSrcweir         nAdditionalIndent = GetSwAttrSet().GetLRSpace().GetLeft();
2981cdf0e10cSrcweir     }
2982cdf0e10cSrcweir 
2983cdf0e10cSrcweir     return nAdditionalIndent;
2984cdf0e10cSrcweir }
2985cdf0e10cSrcweir // <--
2986cdf0e10cSrcweir 
2987cdf0e10cSrcweir // --> OD 2008-12-02 #i96772#
ClearLRSpaceItemDueToListLevelIndents(SvxLRSpaceItem & o_rLRSpaceItem) const2988cdf0e10cSrcweir void SwTxtNode::ClearLRSpaceItemDueToListLevelIndents( SvxLRSpaceItem& o_rLRSpaceItem ) const
2989cdf0e10cSrcweir {
2990cdf0e10cSrcweir     if ( AreListLevelIndentsApplicable() )
2991cdf0e10cSrcweir     {
2992cdf0e10cSrcweir         const SwNumRule* pRule = GetNumRule();
2993cdf0e10cSrcweir         if ( pRule && GetActualListLevel() >= 0 )
2994cdf0e10cSrcweir         {
2995cdf0e10cSrcweir             const SwNumFmt& rFmt = pRule->Get(static_cast<sal_uInt16>(GetActualListLevel()));
2996cdf0e10cSrcweir             if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
2997cdf0e10cSrcweir             {
2998cdf0e10cSrcweir                 SvxLRSpaceItem aLR( RES_LR_SPACE );
2999cdf0e10cSrcweir                 o_rLRSpaceItem = aLR;
3000cdf0e10cSrcweir             }
3001cdf0e10cSrcweir         }
3002cdf0e10cSrcweir     }
3003cdf0e10cSrcweir }
3004cdf0e10cSrcweir // <--
3005cdf0e10cSrcweir 
3006cdf0e10cSrcweir // --> OD 2008-07-01 #i91133#
GetLeftMarginForTabCalculation() const3007cdf0e10cSrcweir long SwTxtNode::GetLeftMarginForTabCalculation() const
3008cdf0e10cSrcweir {
3009cdf0e10cSrcweir     long nLeftMarginForTabCalc = 0;
3010cdf0e10cSrcweir 
3011cdf0e10cSrcweir     bool bLeftMarginForTabCalcSetToListLevelIndent( false );
3012cdf0e10cSrcweir     const SwNumRule* pRule = GetNum() ? GetNum()->GetNumRule() : 0;
3013cdf0e10cSrcweir     if( pRule )
3014cdf0e10cSrcweir     {
3015cdf0e10cSrcweir         const SwNumFmt& rFmt = pRule->Get(static_cast<sal_uInt16>(GetActualListLevel()));
3016cdf0e10cSrcweir         if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
3017cdf0e10cSrcweir         {
3018cdf0e10cSrcweir             if ( AreListLevelIndentsApplicable() )
3019cdf0e10cSrcweir             {
3020cdf0e10cSrcweir                 nLeftMarginForTabCalc = rFmt.GetIndentAt();
3021cdf0e10cSrcweir                 bLeftMarginForTabCalcSetToListLevelIndent = true;
3022cdf0e10cSrcweir             }
3023cdf0e10cSrcweir         }
3024cdf0e10cSrcweir     }
3025cdf0e10cSrcweir     if ( !bLeftMarginForTabCalcSetToListLevelIndent )
3026cdf0e10cSrcweir     {
3027cdf0e10cSrcweir         nLeftMarginForTabCalc = GetSwAttrSet().GetLRSpace().GetTxtLeft();
3028cdf0e10cSrcweir     }
3029cdf0e10cSrcweir 
3030cdf0e10cSrcweir     return nLeftMarginForTabCalc;
3031cdf0e10cSrcweir }
3032cdf0e10cSrcweir // <--
3033cdf0e10cSrcweir 
Replace0xFF(XubString & rTxt,xub_StrLen & rTxtStt,xub_StrLen nEndPos,sal_Bool bExpandFlds) const3034dec99bbdSOliver-Rainer Wittmann void SwTxtNode::Replace0xFF(
3035dec99bbdSOliver-Rainer Wittmann     XubString& rTxt,
3036dec99bbdSOliver-Rainer Wittmann     xub_StrLen& rTxtStt,
3037dec99bbdSOliver-Rainer Wittmann     xub_StrLen nEndPos,
3038dec99bbdSOliver-Rainer Wittmann     sal_Bool bExpandFlds ) const
3039cdf0e10cSrcweir {
3040dec99bbdSOliver-Rainer Wittmann     if( GetpSwpHints() )
3041dec99bbdSOliver-Rainer Wittmann     {
3042dec99bbdSOliver-Rainer Wittmann         sal_Unicode cSrchChr = CH_TXTATR_BREAKWORD;
3043dec99bbdSOliver-Rainer Wittmann         for( int nSrchIter = 0; 2 > nSrchIter; ++nSrchIter, cSrchChr = CH_TXTATR_INWORD )
3044dec99bbdSOliver-Rainer Wittmann         {
3045dec99bbdSOliver-Rainer Wittmann             xub_StrLen nPos = rTxt.Search( cSrchChr );
3046dec99bbdSOliver-Rainer Wittmann             while( STRING_NOTFOUND != nPos && nPos < nEndPos )
3047cdf0e10cSrcweir             {
3048cdf0e10cSrcweir                 const SwTxtAttr* const pAttr =
3049cdf0e10cSrcweir                     GetTxtAttrForCharAt( rTxtStt + nPos );
3050dec99bbdSOliver-Rainer Wittmann                 if( pAttr )
3051dec99bbdSOliver-Rainer Wittmann                 {
3052dec99bbdSOliver-Rainer Wittmann                     switch( pAttr->Which() )
3053dec99bbdSOliver-Rainer Wittmann                     {
3054dec99bbdSOliver-Rainer Wittmann                     case RES_TXTATR_FIELD:
3055dec99bbdSOliver-Rainer Wittmann                     case RES_TXTATR_ANNOTATION:
3056dec99bbdSOliver-Rainer Wittmann                         rTxt.Erase( nPos, 1 );
3057dec99bbdSOliver-Rainer Wittmann                         if( bExpandFlds )
3058dec99bbdSOliver-Rainer Wittmann                         {
3059cdf0e10cSrcweir                             const XubString aExpand(
3060c0286415SOliver-Rainer Wittmann                                 static_cast<SwTxtFld const*>(pAttr)->GetFmtFld().GetField()->ExpandField(true));
3061dec99bbdSOliver-Rainer Wittmann                             rTxt.Insert( aExpand, nPos );
3062dec99bbdSOliver-Rainer Wittmann                             nPos = nPos + aExpand.Len();
3063dec99bbdSOliver-Rainer Wittmann                             nEndPos = nEndPos + aExpand.Len();
3064dec99bbdSOliver-Rainer Wittmann                             rTxtStt = rTxtStt - aExpand.Len();
3065dec99bbdSOliver-Rainer Wittmann                         }
3066dec99bbdSOliver-Rainer Wittmann                         ++rTxtStt;
3067dec99bbdSOliver-Rainer Wittmann                         break;
3068dec99bbdSOliver-Rainer Wittmann 
3069dec99bbdSOliver-Rainer Wittmann                     case RES_TXTATR_FTN:
3070dec99bbdSOliver-Rainer Wittmann                         rTxt.Erase( nPos, 1 );
3071dec99bbdSOliver-Rainer Wittmann                         if( bExpandFlds )
3072dec99bbdSOliver-Rainer Wittmann                         {
3073dec99bbdSOliver-Rainer Wittmann                             const SwFmtFtn& rFtn = pAttr->GetFtn();
3074dec99bbdSOliver-Rainer Wittmann                             XubString sExpand;
3075dec99bbdSOliver-Rainer Wittmann                             if( rFtn.GetNumStr().Len() )
3076dec99bbdSOliver-Rainer Wittmann                                 sExpand = rFtn.GetNumStr();
3077dec99bbdSOliver-Rainer Wittmann                             else if( rFtn.IsEndNote() )
3078dec99bbdSOliver-Rainer Wittmann                                 sExpand = GetDoc()->GetEndNoteInfo().aFmt.
3079dec99bbdSOliver-Rainer Wittmann                                 GetNumStr( rFtn.GetNumber() );
3080dec99bbdSOliver-Rainer Wittmann                             else
3081dec99bbdSOliver-Rainer Wittmann                                 sExpand = GetDoc()->GetFtnInfo().aFmt.
3082dec99bbdSOliver-Rainer Wittmann                                 GetNumStr( rFtn.GetNumber() );
3083dec99bbdSOliver-Rainer Wittmann                             rTxt.Insert( sExpand, nPos );
3084dec99bbdSOliver-Rainer Wittmann                             nPos = nPos + sExpand.Len();
3085dec99bbdSOliver-Rainer Wittmann                             nEndPos = nEndPos + sExpand.Len();
3086dec99bbdSOliver-Rainer Wittmann                             rTxtStt = rTxtStt - sExpand.Len();
3087dec99bbdSOliver-Rainer Wittmann                         }
3088dec99bbdSOliver-Rainer Wittmann                         ++rTxtStt;
3089dec99bbdSOliver-Rainer Wittmann                         break;
3090dec99bbdSOliver-Rainer Wittmann 
3091dec99bbdSOliver-Rainer Wittmann                     default:
3092dec99bbdSOliver-Rainer Wittmann                         rTxt.Erase( nPos, 1 );
3093dec99bbdSOliver-Rainer Wittmann                         ++rTxtStt;
3094dec99bbdSOliver-Rainer Wittmann                     }
3095dec99bbdSOliver-Rainer Wittmann                 }
3096dec99bbdSOliver-Rainer Wittmann                 else
3097dec99bbdSOliver-Rainer Wittmann                     ++nPos, ++nEndPos;
3098dec99bbdSOliver-Rainer Wittmann                 nPos = rTxt.Search( cSrchChr, nPos );
3099dec99bbdSOliver-Rainer Wittmann             }
3100dec99bbdSOliver-Rainer Wittmann         }
3101dec99bbdSOliver-Rainer Wittmann     }
3102cdf0e10cSrcweir }
3103cdf0e10cSrcweir 
3104cdf0e10cSrcweir /*************************************************************************
3105cdf0e10cSrcweir  *                      SwTxtNode::GetExpandTxt
3106cdf0e10cSrcweir  * Expand fields
3107cdf0e10cSrcweir  *************************************************************************/
3108cdf0e10cSrcweir // --> OD 2007-11-15 #i83479# - handling of new parameters
GetExpandTxt(const xub_StrLen nIdx,const xub_StrLen nLen,const bool bWithNum,const bool bAddSpaceAfterListLabelStr,const bool bWithSpacesForLevel) const3109cdf0e10cSrcweir XubString SwTxtNode::GetExpandTxt( const xub_StrLen nIdx,
3110cdf0e10cSrcweir                                    const xub_StrLen nLen,
3111cdf0e10cSrcweir                                    const bool bWithNum,
3112cdf0e10cSrcweir                                    const bool bAddSpaceAfterListLabelStr,
3113cdf0e10cSrcweir                                    const bool bWithSpacesForLevel ) const
3114cdf0e10cSrcweir {
311569a74367SOliver-Rainer Wittmann     XubString aTxt( GetTxt().Copy( nIdx, nLen ) );
311669a74367SOliver-Rainer Wittmann     xub_StrLen nTxtStt = nIdx;
311769a74367SOliver-Rainer Wittmann     Replace0xFF( aTxt, nTxtStt, aTxt.Len(), sal_True );
311869a74367SOliver-Rainer Wittmann 
311969a74367SOliver-Rainer Wittmann     // remove dummy characters of Input Fields
312069a74367SOliver-Rainer Wittmann     aTxt.EraseAllChars( CH_TXT_ATR_INPUTFIELDSTART );
312169a74367SOliver-Rainer Wittmann     aTxt.EraseAllChars( CH_TXT_ATR_INPUTFIELDEND );
312269a74367SOliver-Rainer Wittmann 
312369a74367SOliver-Rainer Wittmann     if( bWithNum )
3124cdf0e10cSrcweir     {
3125cdf0e10cSrcweir         XubString aListLabelStr = GetNumString();
3126cdf0e10cSrcweir         if ( aListLabelStr.Len() > 0 )
3127cdf0e10cSrcweir         {
3128cdf0e10cSrcweir             if ( bAddSpaceAfterListLabelStr )
3129cdf0e10cSrcweir             {
3130cdf0e10cSrcweir                 const sal_Unicode aSpace = ' ';
3131cdf0e10cSrcweir                 aTxt.Insert( aSpace, 0 );
3132cdf0e10cSrcweir             }
3133cdf0e10cSrcweir             aTxt.Insert( GetNumString(), 0 );
3134cdf0e10cSrcweir         }
3135cdf0e10cSrcweir     }
3136cdf0e10cSrcweir 
3137cdf0e10cSrcweir     if ( bWithSpacesForLevel && GetActualListLevel() > 0 )
3138cdf0e10cSrcweir     {
3139cdf0e10cSrcweir         int nLevel( GetActualListLevel() );
3140cdf0e10cSrcweir         while ( nLevel > 0 )
3141cdf0e10cSrcweir         {
3142cdf0e10cSrcweir             const sal_Unicode aSpace = ' ';
3143cdf0e10cSrcweir             aTxt.Insert( aSpace , 0 );
3144cdf0e10cSrcweir             aTxt.Insert( aSpace , 0 );
3145cdf0e10cSrcweir             --nLevel;
3146cdf0e10cSrcweir         }
3147cdf0e10cSrcweir     }
3148cdf0e10cSrcweir 
3149cdf0e10cSrcweir 	return aTxt;
3150cdf0e10cSrcweir }
3151cdf0e10cSrcweir // <--
3152cdf0e10cSrcweir 
GetExpandTxt(SwTxtNode & rDestNd,const SwIndex * pDestIdx,xub_StrLen nIdx,xub_StrLen nLen,sal_Bool bWithNum,sal_Bool bWithFtn,sal_Bool bReplaceTabsWithSpaces) const3153cdf0e10cSrcweir sal_Bool SwTxtNode::GetExpandTxt( SwTxtNode& rDestNd, const SwIndex* pDestIdx,
3154cdf0e10cSrcweir                         xub_StrLen nIdx, xub_StrLen nLen, sal_Bool bWithNum,
3155cdf0e10cSrcweir                         sal_Bool bWithFtn, sal_Bool bReplaceTabsWithSpaces ) const
3156cdf0e10cSrcweir {
3157cdf0e10cSrcweir 	if( &rDestNd == this )
3158cdf0e10cSrcweir 		return sal_False;
3159cdf0e10cSrcweir 
3160cdf0e10cSrcweir 	SwIndex aDestIdx( &rDestNd, rDestNd.GetTxt().Len() );
3161cdf0e10cSrcweir 	if( pDestIdx )
3162cdf0e10cSrcweir 		aDestIdx = *pDestIdx;
3163cdf0e10cSrcweir 	xub_StrLen nDestStt = aDestIdx.GetIndex();
3164cdf0e10cSrcweir 
3165cdf0e10cSrcweir 	// Text einfuegen
3166cdf0e10cSrcweir     String sTmpText = GetTxt();
3167cdf0e10cSrcweir     if( bReplaceTabsWithSpaces )
3168cdf0e10cSrcweir         sTmpText.SearchAndReplaceAll('\t', ' ');
3169cdf0e10cSrcweir 
3170cdf0e10cSrcweir     // mask hidden characters
3171cdf0e10cSrcweir     const xub_Unicode cChar = CH_TXTATR_BREAKWORD;
3172cdf0e10cSrcweir     sal_uInt16 nHiddenChrs =
3173cdf0e10cSrcweir         SwScriptInfo::MaskHiddenRanges( *this, sTmpText, 0, sTmpText.Len(), cChar );
3174cdf0e10cSrcweir 
3175cdf0e10cSrcweir     sTmpText = sTmpText.Copy( nIdx, nLen );
317669a74367SOliver-Rainer Wittmann     // remove dummy characters of Input Fields
317769a74367SOliver-Rainer Wittmann     {
317869a74367SOliver-Rainer Wittmann         sTmpText.EraseAllChars( CH_TXT_ATR_INPUTFIELDSTART );
317969a74367SOliver-Rainer Wittmann         sTmpText.EraseAllChars( CH_TXT_ATR_INPUTFIELDEND );
318069a74367SOliver-Rainer Wittmann     }
3181cdf0e10cSrcweir     rDestNd.InsertText( sTmpText, aDestIdx );
318269a74367SOliver-Rainer Wittmann     nLen = aDestIdx.GetIndex() - nDestStt;
3183cdf0e10cSrcweir 
3184cdf0e10cSrcweir 	// alle FontAttribute mit CHARSET Symbol in dem Bereich setzen
3185cdf0e10cSrcweir     if ( HasHints() )
3186cdf0e10cSrcweir     {
3187cdf0e10cSrcweir 		xub_StrLen nInsPos = nDestStt - nIdx;
3188cdf0e10cSrcweir         for ( sal_uInt16 i = 0; i < m_pSwpHints->Count(); i++ )
3189cdf0e10cSrcweir         {
3190cdf0e10cSrcweir             const SwTxtAttr* pHt = (*m_pSwpHints)[i];
3191cdf0e10cSrcweir             const xub_StrLen nAttrStartIdx = *pHt->GetStart();
3192cdf0e10cSrcweir             const sal_uInt16 nWhich = pHt->Which();
3193cdf0e10cSrcweir             if (nIdx + nLen <= nAttrStartIdx)
3194cdf0e10cSrcweir 				break;		// ueber das Textende
3195cdf0e10cSrcweir 
319669a74367SOliver-Rainer Wittmann 			const xub_StrLen *pEndIdx = pHt->End();
3197cdf0e10cSrcweir 			if( pEndIdx && *pEndIdx > nIdx &&
3198cdf0e10cSrcweir 				( RES_CHRATR_FONT == nWhich ||
3199cdf0e10cSrcweir                   RES_TXTATR_CHARFMT == nWhich ||
3200cdf0e10cSrcweir                   RES_TXTATR_AUTOFMT == nWhich ))
3201cdf0e10cSrcweir             {
3202cdf0e10cSrcweir                 const SvxFontItem* const pFont =
3203cdf0e10cSrcweir                     static_cast<const SvxFontItem*>(
3204cdf0e10cSrcweir                         CharFmt::GetItem( *pHt, RES_CHRATR_FONT ));
3205cdf0e10cSrcweir                 if ( pFont && RTL_TEXTENCODING_SYMBOL == pFont->GetCharSet() )
3206cdf0e10cSrcweir                 {
3207cdf0e10cSrcweir                     // attribute in area => copy
3208cdf0e10cSrcweir                     rDestNd.InsertItem( *const_cast<SvxFontItem*>(pFont),
3209cdf0e10cSrcweir                             nInsPos + nAttrStartIdx, nInsPos + *pEndIdx );
3210cdf0e10cSrcweir                 }
3211cdf0e10cSrcweir             }
3212cdf0e10cSrcweir             else if ( pHt->HasDummyChar() && (nAttrStartIdx >= nIdx) )
3213dec99bbdSOliver-Rainer Wittmann             {
3214dec99bbdSOliver-Rainer Wittmann                 aDestIdx = nInsPos + nAttrStartIdx;
3215dec99bbdSOliver-Rainer Wittmann                 switch( nWhich )
3216dec99bbdSOliver-Rainer Wittmann                 {
3217dec99bbdSOliver-Rainer Wittmann                 case RES_TXTATR_FIELD:
3218dec99bbdSOliver-Rainer Wittmann                 case RES_TXTATR_ANNOTATION:
3219dec99bbdSOliver-Rainer Wittmann                     {
3220cdf0e10cSrcweir                         XubString const aExpand(
3221c0286415SOliver-Rainer Wittmann                             static_cast<SwTxtFld const*>(pHt)->GetFmtFld().GetField()->ExpandField(true) );
3222dec99bbdSOliver-Rainer Wittmann                         if( aExpand.Len() )
3223dec99bbdSOliver-Rainer Wittmann                         {
3224dec99bbdSOliver-Rainer Wittmann                             aDestIdx++;		// dahinter einfuegen;
3225cdf0e10cSrcweir                             rDestNd.InsertText( aExpand, aDestIdx );
3226dec99bbdSOliver-Rainer Wittmann                             aDestIdx = nInsPos + nAttrStartIdx;
3227dec99bbdSOliver-Rainer Wittmann                             nInsPos = nInsPos + aExpand.Len();
3228cdf0e10cSrcweir                         }
3229cdf0e10cSrcweir                         rDestNd.EraseText( aDestIdx, 1 );
3230dec99bbdSOliver-Rainer Wittmann                         --nInsPos;
3231dec99bbdSOliver-Rainer Wittmann                     }
3232dec99bbdSOliver-Rainer Wittmann                     break;
3233cdf0e10cSrcweir 
3234dec99bbdSOliver-Rainer Wittmann                 case RES_TXTATR_FTN:
3235dec99bbdSOliver-Rainer Wittmann                     {
3236cdf0e10cSrcweir                         if ( bWithFtn )
3237cdf0e10cSrcweir                         {
3238cdf0e10cSrcweir                             const SwFmtFtn& rFtn = pHt->GetFtn();
3239cdf0e10cSrcweir                             XubString sExpand;
3240cdf0e10cSrcweir                             if( rFtn.GetNumStr().Len() )
3241cdf0e10cSrcweir                                 sExpand = rFtn.GetNumStr();
3242cdf0e10cSrcweir                             else if( rFtn.IsEndNote() )
3243cdf0e10cSrcweir                                 sExpand = GetDoc()->GetEndNoteInfo().aFmt.
3244dec99bbdSOliver-Rainer Wittmann                                 GetNumStr( rFtn.GetNumber() );
3245cdf0e10cSrcweir                             else
3246cdf0e10cSrcweir                                 sExpand = GetDoc()->GetFtnInfo().aFmt.
3247dec99bbdSOliver-Rainer Wittmann                                 GetNumStr( rFtn.GetNumber() );
3248cdf0e10cSrcweir                             if( sExpand.Len() )
3249cdf0e10cSrcweir                             {
3250cdf0e10cSrcweir                                 aDestIdx++;     // insert behind
3251cdf0e10cSrcweir                                 SvxEscapementItem aItem(
3252dec99bbdSOliver-Rainer Wittmann                                     SVX_ESCAPEMENT_SUPERSCRIPT );
3253dec99bbdSOliver-Rainer Wittmann                                 rDestNd.InsertItem(
3254dec99bbdSOliver-Rainer Wittmann                                     aItem,
3255dec99bbdSOliver-Rainer Wittmann                                     aDestIdx.GetIndex(),
3256dec99bbdSOliver-Rainer Wittmann                                     aDestIdx.GetIndex() );
3257dec99bbdSOliver-Rainer Wittmann                                 rDestNd.InsertText( sExpand, aDestIdx, IDocumentContentOperations::INS_EMPTYEXPAND);
3258cdf0e10cSrcweir                                 aDestIdx = nInsPos + nAttrStartIdx;
3259cdf0e10cSrcweir                                 nInsPos = nInsPos + sExpand.Len();
3260cdf0e10cSrcweir                             }
3261cdf0e10cSrcweir                         }
3262cdf0e10cSrcweir                         rDestNd.EraseText( aDestIdx, 1 );
3263dec99bbdSOliver-Rainer Wittmann                         --nInsPos;
3264dec99bbdSOliver-Rainer Wittmann                     }
3265dec99bbdSOliver-Rainer Wittmann                     break;
3266cdf0e10cSrcweir 
3267dec99bbdSOliver-Rainer Wittmann                 default:
3268cdf0e10cSrcweir                     rDestNd.EraseText( aDestIdx, 1 );
3269dec99bbdSOliver-Rainer Wittmann                     --nInsPos;
3270dec99bbdSOliver-Rainer Wittmann                 }
3271dec99bbdSOliver-Rainer Wittmann             }
3272dec99bbdSOliver-Rainer Wittmann         }
3273dec99bbdSOliver-Rainer Wittmann     }
3274cdf0e10cSrcweir 
3275dec99bbdSOliver-Rainer Wittmann     if( bWithNum )
3276dec99bbdSOliver-Rainer Wittmann     {
3277dec99bbdSOliver-Rainer Wittmann         aDestIdx = nDestStt;
3278cdf0e10cSrcweir         rDestNd.InsertText( GetNumString(), aDestIdx );
3279dec99bbdSOliver-Rainer Wittmann     }
3280cdf0e10cSrcweir 
3281cdf0e10cSrcweir     if ( nHiddenChrs > 0 )
3282cdf0e10cSrcweir     {
3283cdf0e10cSrcweir         aDestIdx = 0;
3284cdf0e10cSrcweir         while ( aDestIdx < rDestNd.GetTxt().Len() )
3285cdf0e10cSrcweir         {
3286cdf0e10cSrcweir             if ( cChar == rDestNd.GetTxt().GetChar( aDestIdx.GetIndex() ) )
3287cdf0e10cSrcweir             {
3288cdf0e10cSrcweir                 xub_StrLen nIndex = aDestIdx.GetIndex();
3289cdf0e10cSrcweir                 while ( nIndex < rDestNd.GetTxt().Len() &&
3290cdf0e10cSrcweir                         cChar == rDestNd.GetTxt().GetChar( ++nIndex ) )
3291cdf0e10cSrcweir                     ;
3292cdf0e10cSrcweir                 rDestNd.EraseText( aDestIdx, nIndex - aDestIdx.GetIndex() );
3293cdf0e10cSrcweir             }
3294cdf0e10cSrcweir             else
3295cdf0e10cSrcweir                 ++aDestIdx;
3296cdf0e10cSrcweir         }
3297cdf0e10cSrcweir     }
3298cdf0e10cSrcweir 
3299cdf0e10cSrcweir 	return sal_True;
3300cdf0e10cSrcweir }
3301cdf0e10cSrcweir 
3302cdf0e10cSrcweir const ModelToViewHelper::ConversionMap*
BuildConversionMap(rtl::OUString & rRetText) const3303cdf0e10cSrcweir         SwTxtNode::BuildConversionMap( rtl::OUString& rRetText ) const
3304cdf0e10cSrcweir {
3305cdf0e10cSrcweir     const rtl::OUString& rNodeText = GetTxt();
3306cdf0e10cSrcweir     rRetText = rNodeText;
3307cdf0e10cSrcweir     ModelToViewHelper::ConversionMap* pConversionMap = 0;
3308cdf0e10cSrcweir 
3309cdf0e10cSrcweir     const SwpHints* pSwpHints2 = GetpSwpHints();
3310cdf0e10cSrcweir     xub_StrLen nPos = 0;
3311cdf0e10cSrcweir 
3312cdf0e10cSrcweir     for ( sal_uInt16 i = 0; pSwpHints2 && i < pSwpHints2->Count(); ++i )
3313cdf0e10cSrcweir     {
3314cdf0e10cSrcweir         const SwTxtAttr* pAttr = (*pSwpHints2)[i];
3315dec99bbdSOliver-Rainer Wittmann         if ( pAttr->Which() == RES_TXTATR_FIELD
3316dec99bbdSOliver-Rainer Wittmann              || pAttr->Which() == RES_TXTATR_ANNOTATION )
3317cdf0e10cSrcweir         {
3318cdf0e10cSrcweir             const XubString aExpand(
3319c0286415SOliver-Rainer Wittmann                 static_cast<SwTxtFld const*>(pAttr)->GetFmtFld().GetField()->ExpandField(true));
3320cdf0e10cSrcweir             if ( aExpand.Len() > 0 )
3321cdf0e10cSrcweir             {
3322cdf0e10cSrcweir                 const xub_StrLen nFieldPos = *pAttr->GetStart();
3323cdf0e10cSrcweir                 rRetText = rRetText.replaceAt( nPos + nFieldPos, 1, aExpand );
3324cdf0e10cSrcweir                 if ( !pConversionMap )
3325cdf0e10cSrcweir                     pConversionMap = new ModelToViewHelper::ConversionMap;
3326cdf0e10cSrcweir                 pConversionMap->push_back(
3327cdf0e10cSrcweir                         ModelToViewHelper::ConversionMapEntry(
3328cdf0e10cSrcweir                             nFieldPos, nPos + nFieldPos ) );
3329cdf0e10cSrcweir                 nPos += ( aExpand.Len() - 1 );
3330cdf0e10cSrcweir             }
3331cdf0e10cSrcweir         }
3332cdf0e10cSrcweir     }
3333cdf0e10cSrcweir 
3334cdf0e10cSrcweir     if ( pConversionMap && pConversionMap->size() )
3335cdf0e10cSrcweir         pConversionMap->push_back(
3336cdf0e10cSrcweir             ModelToViewHelper::ConversionMapEntry(
3337cdf0e10cSrcweir                 rNodeText.getLength()+1, rRetText.getLength()+1 ) );
3338cdf0e10cSrcweir 
3339cdf0e10cSrcweir     return pConversionMap;
3340cdf0e10cSrcweir }
3341cdf0e10cSrcweir 
GetRedlineTxt(xub_StrLen nIdx,xub_StrLen nLen,sal_Bool bExpandFlds,sal_Bool bWithNum) const3342cdf0e10cSrcweir XubString SwTxtNode::GetRedlineTxt( xub_StrLen nIdx, xub_StrLen nLen,
3343cdf0e10cSrcweir 								sal_Bool bExpandFlds, sal_Bool bWithNum ) const
3344cdf0e10cSrcweir {
3345cdf0e10cSrcweir 	SvUShorts aRedlArr;
3346cdf0e10cSrcweir 	const SwDoc* pDoc = GetDoc();
3347cdf0e10cSrcweir 	sal_uInt16 nRedlPos = pDoc->GetRedlinePos( *this, nsRedlineType_t::REDLINE_DELETE );
3348cdf0e10cSrcweir 	if( USHRT_MAX != nRedlPos )
3349cdf0e10cSrcweir 	{
3350cdf0e10cSrcweir 		// es existiert fuer den Node irgendein Redline-Delete-Object
3351cdf0e10cSrcweir 		const sal_uLong nNdIdx = GetIndex();
3352cdf0e10cSrcweir 		for( ; nRedlPos < pDoc->GetRedlineTbl().Count() ; ++nRedlPos )
3353cdf0e10cSrcweir 		{
3354cdf0e10cSrcweir 			const SwRedline* pTmp = pDoc->GetRedlineTbl()[ nRedlPos ];
3355cdf0e10cSrcweir 			if( nsRedlineType_t::REDLINE_DELETE == pTmp->GetType() )
3356cdf0e10cSrcweir 			{
3357cdf0e10cSrcweir 				const SwPosition *pRStt = pTmp->Start(), *pREnd = pTmp->End();
3358cdf0e10cSrcweir 				if( pRStt->nNode < nNdIdx )
3359cdf0e10cSrcweir 				{
3360cdf0e10cSrcweir 					if( pREnd->nNode > nNdIdx )
3361cdf0e10cSrcweir 						// Absatz ist komplett geloescht
3362cdf0e10cSrcweir 						return aEmptyStr;
3363cdf0e10cSrcweir 					else if( pREnd->nNode == nNdIdx )
3364cdf0e10cSrcweir 					{
3365cdf0e10cSrcweir 						// von 0 bis nContent ist alles geloescht
3366cdf0e10cSrcweir 						aRedlArr.Insert( xub_StrLen(0), aRedlArr.Count() );
3367cdf0e10cSrcweir 						aRedlArr.Insert( pREnd->nContent.GetIndex(), aRedlArr.Count() );
3368cdf0e10cSrcweir 					}
3369cdf0e10cSrcweir 				}
3370cdf0e10cSrcweir 				else if( pRStt->nNode == nNdIdx )
3371cdf0e10cSrcweir 				{
3372cdf0e10cSrcweir 					aRedlArr.Insert( pRStt->nContent.GetIndex(), aRedlArr.Count() );
3373cdf0e10cSrcweir 					if( pREnd->nNode == nNdIdx )
3374cdf0e10cSrcweir 						aRedlArr.Insert( pREnd->nContent.GetIndex(), aRedlArr.Count() );
3375cdf0e10cSrcweir 					else
3376cdf0e10cSrcweir 					{
3377cdf0e10cSrcweir 						aRedlArr.Insert( GetTxt().Len(), aRedlArr.Count() );
3378cdf0e10cSrcweir 						break; 		// mehr kann nicht kommen
3379cdf0e10cSrcweir 					}
3380cdf0e10cSrcweir 				}
3381cdf0e10cSrcweir 				else
3382cdf0e10cSrcweir 					break; 		// mehr kann nicht kommen
3383cdf0e10cSrcweir 			}
3384cdf0e10cSrcweir 		}
3385cdf0e10cSrcweir 	}
3386cdf0e10cSrcweir 
3387cdf0e10cSrcweir 	XubString aTxt( GetTxt().Copy( nIdx, nLen ) );
3388cdf0e10cSrcweir 
3389cdf0e10cSrcweir 	xub_StrLen nTxtStt = nIdx, nIdxEnd = nIdx + aTxt.Len();
3390cdf0e10cSrcweir 	for( sal_uInt16 n = 0; n < aRedlArr.Count(); n += 2 )
3391cdf0e10cSrcweir 	{
3392cdf0e10cSrcweir 		xub_StrLen nStt = aRedlArr[ n ], nEnd = aRedlArr[ n+1 ];
3393cdf0e10cSrcweir 		if( ( nIdx <= nStt && nStt <= nIdxEnd ) ||
3394cdf0e10cSrcweir 			( nIdx <= nEnd && nEnd <= nIdxEnd ))
3395cdf0e10cSrcweir 		{
3396cdf0e10cSrcweir 			if( nStt < nIdx ) nStt = nIdx;
3397cdf0e10cSrcweir 			if( nIdxEnd < nEnd ) nEnd = nIdxEnd;
3398cdf0e10cSrcweir 			xub_StrLen nDelCnt = nEnd - nStt;
3399cdf0e10cSrcweir 			aTxt.Erase( nStt - nTxtStt, nDelCnt );
3400cdf0e10cSrcweir 			Replace0xFF( aTxt, nTxtStt, nStt - nTxtStt, bExpandFlds );
3401cdf0e10cSrcweir 			nTxtStt = nTxtStt + nDelCnt;
3402cdf0e10cSrcweir 		}
3403cdf0e10cSrcweir 		else if( nStt >= nIdxEnd )
3404cdf0e10cSrcweir 			break;
3405cdf0e10cSrcweir 	}
3406cdf0e10cSrcweir 	Replace0xFF( aTxt, nTxtStt, aTxt.Len(), bExpandFlds );
3407cdf0e10cSrcweir 
3408cdf0e10cSrcweir 	if( bWithNum )
3409cdf0e10cSrcweir 		aTxt.Insert( GetNumString(), 0 );
3410cdf0e10cSrcweir 	return aTxt;
3411cdf0e10cSrcweir }
3412cdf0e10cSrcweir 
3413cdf0e10cSrcweir /*************************************************************************
3414cdf0e10cSrcweir  *                        SwTxtNode::ReplaceText
3415cdf0e10cSrcweir  *************************************************************************/
3416cdf0e10cSrcweir 
ReplaceText(const SwIndex & rStart,const xub_StrLen nDelLen,const XubString & rText)3417cdf0e10cSrcweir void SwTxtNode::ReplaceText( const SwIndex& rStart, const xub_StrLen nDelLen,
3418cdf0e10cSrcweir                              const XubString& rText )
3419cdf0e10cSrcweir {
3420cdf0e10cSrcweir     ASSERT( rStart.GetIndex() < m_Text.Len() &&
3421cdf0e10cSrcweir             rStart.GetIndex() + nDelLen <= m_Text.Len(),
3422cdf0e10cSrcweir             "SwTxtNode::ReplaceText: index out of bounds" );
3423cdf0e10cSrcweir     const xub_StrLen nStartPos = rStart.GetIndex();
3424cdf0e10cSrcweir     xub_StrLen nEndPos = nStartPos + nDelLen;
3425cdf0e10cSrcweir     xub_StrLen nLen = nDelLen;
3426cdf0e10cSrcweir     for ( xub_StrLen nPos = nStartPos; nPos < nEndPos; ++nPos )
3427cdf0e10cSrcweir     {
3428cdf0e10cSrcweir         if ( ( CH_TXTATR_BREAKWORD == m_Text.GetChar( nPos ) ) ||
3429cdf0e10cSrcweir              ( CH_TXTATR_INWORD    == m_Text.GetChar( nPos ) ) )
3430cdf0e10cSrcweir         {
3431cdf0e10cSrcweir             SwTxtAttr *const pHint = GetTxtAttrForCharAt( nPos );
3432cdf0e10cSrcweir             if (pHint)
3433cdf0e10cSrcweir             {
3434cdf0e10cSrcweir                 ASSERT (!( pHint->GetEnd() && pHint->HasDummyChar()
3435cdf0e10cSrcweir                             && (*pHint->GetStart() < nEndPos)
3436cdf0e10cSrcweir                             && (*pHint->GetEnd()   > nEndPos) ),
3437cdf0e10cSrcweir                     "ReplaceText: ERROR: "
3438cdf0e10cSrcweir                     "deleting left-overlapped attribute with CH_TXTATR");
3439cdf0e10cSrcweir                 DeleteAttribute( pHint );
3440cdf0e10cSrcweir                 --nEndPos;
3441cdf0e10cSrcweir                 --nLen;
3442cdf0e10cSrcweir             }
3443cdf0e10cSrcweir         }
3444cdf0e10cSrcweir     }
3445cdf0e10cSrcweir 
3446cdf0e10cSrcweir 	sal_Bool bOldExpFlg = IsIgnoreDontExpand();
3447cdf0e10cSrcweir 	SetIgnoreDontExpand( sal_True );
3448cdf0e10cSrcweir 
3449cdf0e10cSrcweir 	if( nLen && rText.Len() )
3450cdf0e10cSrcweir 	{
3451cdf0e10cSrcweir 		// dann das 1. Zeichen ersetzen den Rest loschen und einfuegen
3452cdf0e10cSrcweir 		// Dadurch wird die Attributierung des 1. Zeichen expandiert!
3453cdf0e10cSrcweir         m_Text.SetChar( nStartPos, rText.GetChar( 0 ) );
3454cdf0e10cSrcweir 
3455cdf0e10cSrcweir 		((SwIndex&)rStart)++;
3456cdf0e10cSrcweir         m_Text.Erase( rStart.GetIndex(), nLen - 1 );
3457cdf0e10cSrcweir         Update( rStart, nLen - 1, true );
3458cdf0e10cSrcweir 
3459cdf0e10cSrcweir 		XubString aTmpTxt( rText ); aTmpTxt.Erase( 0, 1 );
3460cdf0e10cSrcweir         m_Text.Insert( aTmpTxt, rStart.GetIndex() );
3461cdf0e10cSrcweir         Update( rStart, aTmpTxt.Len(), false );
3462cdf0e10cSrcweir     }
3463cdf0e10cSrcweir     else
3464cdf0e10cSrcweir     {
3465cdf0e10cSrcweir         m_Text.Erase( nStartPos, nLen );
3466cdf0e10cSrcweir         Update( rStart, nLen, true );
3467cdf0e10cSrcweir 
3468cdf0e10cSrcweir         m_Text.Insert( rText, nStartPos );
3469cdf0e10cSrcweir         Update( rStart, rText.Len(), false );
3470cdf0e10cSrcweir     }
3471cdf0e10cSrcweir 
3472cdf0e10cSrcweir 	SetIgnoreDontExpand( bOldExpFlg );
3473cdf0e10cSrcweir     SwDelTxt aDelHint( nStartPos, nDelLen );
3474cdf0e10cSrcweir 	NotifyClients( 0, &aDelHint );
3475cdf0e10cSrcweir 
3476cdf0e10cSrcweir     SwInsTxt aHint( nStartPos, rText.Len() );
3477cdf0e10cSrcweir 	NotifyClients( 0, &aHint );
3478cdf0e10cSrcweir }
3479cdf0e10cSrcweir 
3480cdf0e10cSrcweir // --> OD 2008-03-27 #refactorlists#
3481cdf0e10cSrcweir namespace {
3482cdf0e10cSrcweir     // Helper method for special handling of modified attributes at text node.
3483cdf0e10cSrcweir     // The following is handled:
3484cdf0e10cSrcweir     // (1) on changing the paragraph style - RES_FMT_CHG:
3485cdf0e10cSrcweir     // Check, if list style of the text node is changed. If yes, add respectively
3486cdf0e10cSrcweir     // remove the text node to the corresponding list.
3487cdf0e10cSrcweir     // (2) on changing the attributes - RES_ATTRSET_CHG:
3488cdf0e10cSrcweir     // Same as (1).
3489cdf0e10cSrcweir     // (3) on changing the list style - RES_PARATR_NUMRULE:
3490cdf0e10cSrcweir     // Same as (1).
HandleModifyAtTxtNode(SwTxtNode & rTxtNode,const SfxPoolItem * pOldValue,const SfxPoolItem * pNewValue)3491cdf0e10cSrcweir     void HandleModifyAtTxtNode( SwTxtNode& rTxtNode,
3492cdf0e10cSrcweir                                 const SfxPoolItem* pOldValue,
3493cdf0e10cSrcweir                                 const SfxPoolItem* pNewValue )
3494cdf0e10cSrcweir     {
3495cdf0e10cSrcweir         const sal_uInt16 nWhich = pOldValue ? pOldValue->Which() :
3496cdf0e10cSrcweir                               pNewValue ? pNewValue->Which() : 0 ;
3497cdf0e10cSrcweir         bool bNumRuleSet = false;
3498cdf0e10cSrcweir         bool bParagraphStyleChanged = false;
3499cdf0e10cSrcweir         String sNumRule;
3500cdf0e10cSrcweir         String sOldNumRule;
3501cdf0e10cSrcweir         switch ( nWhich )
3502cdf0e10cSrcweir         {
3503cdf0e10cSrcweir             case RES_FMT_CHG:
3504cdf0e10cSrcweir             {
3505cdf0e10cSrcweir                 bParagraphStyleChanged = true;
3506cdf0e10cSrcweir                 if( rTxtNode.GetNodes().IsDocNodes() )
3507cdf0e10cSrcweir                 {
3508cdf0e10cSrcweir                     const SwNumRule* pFormerNumRuleAtTxtNode =
3509cdf0e10cSrcweir                         rTxtNode.GetNum() ? rTxtNode.GetNum()->GetNumRule() : 0;
3510cdf0e10cSrcweir                     if ( pFormerNumRuleAtTxtNode )
3511cdf0e10cSrcweir                     {
3512cdf0e10cSrcweir                         sOldNumRule = pFormerNumRuleAtTxtNode->GetName();
3513cdf0e10cSrcweir                     }
3514cdf0e10cSrcweir                     if ( rTxtNode.IsEmptyListStyleDueToSetOutlineLevelAttr() )
3515cdf0e10cSrcweir                     {
3516cdf0e10cSrcweir                         const SwNumRuleItem& rNumRuleItem = rTxtNode.GetTxtColl()->GetNumRule();
3517cdf0e10cSrcweir                         if ( rNumRuleItem.GetValue().Len() > 0 )
3518cdf0e10cSrcweir                         {
3519cdf0e10cSrcweir                             rTxtNode.ResetEmptyListStyleDueToResetOutlineLevelAttr();
3520cdf0e10cSrcweir                         }
3521cdf0e10cSrcweir                     }
3522cdf0e10cSrcweir                     const SwNumRule* pNumRuleAtTxtNode = rTxtNode.GetNumRule();
3523cdf0e10cSrcweir                     if ( pNumRuleAtTxtNode )
3524cdf0e10cSrcweir                     {
3525cdf0e10cSrcweir                         bNumRuleSet = true;
3526cdf0e10cSrcweir                         sNumRule = pNumRuleAtTxtNode->GetName();
3527cdf0e10cSrcweir                     }
3528cdf0e10cSrcweir                 }
3529cdf0e10cSrcweir                 break;
3530cdf0e10cSrcweir             }
3531cdf0e10cSrcweir             case RES_ATTRSET_CHG:
3532cdf0e10cSrcweir             {
3533cdf0e10cSrcweir                 const SfxPoolItem* pItem = 0;
3534cdf0e10cSrcweir                 const SwNumRule* pFormerNumRuleAtTxtNode =
3535cdf0e10cSrcweir                     rTxtNode.GetNum() ? rTxtNode.GetNum()->GetNumRule() : 0;
3536cdf0e10cSrcweir                 if ( pFormerNumRuleAtTxtNode )
3537cdf0e10cSrcweir                 {
3538cdf0e10cSrcweir                     sOldNumRule = pFormerNumRuleAtTxtNode->GetName();
3539cdf0e10cSrcweir                 }
3540cdf0e10cSrcweir                 if ( dynamic_cast<const SwAttrSetChg*>(pNewValue)->GetChgSet()->GetItemState( RES_PARATR_NUMRULE, sal_False, &pItem ) ==
3541cdf0e10cSrcweir                         SFX_ITEM_SET )
3542cdf0e10cSrcweir                 {
3543cdf0e10cSrcweir                     rTxtNode.ResetEmptyListStyleDueToResetOutlineLevelAttr();
3544cdf0e10cSrcweir                     bNumRuleSet = true;
3545cdf0e10cSrcweir                 }
3546cdf0e10cSrcweir                 const SwNumRule* pNumRuleAtTxtNode = rTxtNode.GetNumRule();
3547cdf0e10cSrcweir                 if ( pNumRuleAtTxtNode )
3548cdf0e10cSrcweir                 {
3549cdf0e10cSrcweir                     sNumRule = pNumRuleAtTxtNode->GetName();
3550cdf0e10cSrcweir                 }
3551cdf0e10cSrcweir                 break;
3552cdf0e10cSrcweir             }
3553cdf0e10cSrcweir             case RES_PARATR_NUMRULE:
3554cdf0e10cSrcweir             {
3555cdf0e10cSrcweir                 if ( rTxtNode.GetNodes().IsDocNodes() )
3556cdf0e10cSrcweir                 {
3557cdf0e10cSrcweir                     const SwNumRule* pFormerNumRuleAtTxtNode =
3558cdf0e10cSrcweir                         rTxtNode.GetNum() ? rTxtNode.GetNum()->GetNumRule() : 0;
3559cdf0e10cSrcweir                     if ( pFormerNumRuleAtTxtNode )
3560cdf0e10cSrcweir                     {
3561cdf0e10cSrcweir                         sOldNumRule = pFormerNumRuleAtTxtNode->GetName();
3562cdf0e10cSrcweir                     }
3563cdf0e10cSrcweir                     if ( pNewValue )
3564cdf0e10cSrcweir                     {
3565cdf0e10cSrcweir                         rTxtNode.ResetEmptyListStyleDueToResetOutlineLevelAttr();
3566cdf0e10cSrcweir                         bNumRuleSet = true;
3567cdf0e10cSrcweir                     }
3568cdf0e10cSrcweir                     const SwNumRule* pNumRuleAtTxtNode = rTxtNode.GetNumRule();
3569cdf0e10cSrcweir                     if ( pNumRuleAtTxtNode )
3570cdf0e10cSrcweir                     {
3571cdf0e10cSrcweir                         sNumRule = pNumRuleAtTxtNode->GetName();
3572cdf0e10cSrcweir                     }
3573cdf0e10cSrcweir                 }
3574cdf0e10cSrcweir                 break;
3575cdf0e10cSrcweir             }
3576cdf0e10cSrcweir         }
3577cdf0e10cSrcweir         if ( sNumRule != sOldNumRule )
3578cdf0e10cSrcweir         {
3579cdf0e10cSrcweir             if ( bNumRuleSet )
3580cdf0e10cSrcweir             {
3581cdf0e10cSrcweir                 if ( sNumRule.Len() == 0 )
3582cdf0e10cSrcweir                 {
3583cdf0e10cSrcweir                     rTxtNode.RemoveFromList();
3584cdf0e10cSrcweir                     if ( bParagraphStyleChanged )
3585cdf0e10cSrcweir                     {
3586cdf0e10cSrcweir                         SvUShortsSort aResetAttrsArray;
3587cdf0e10cSrcweir                         aResetAttrsArray.Insert( RES_PARATR_LIST_ID );
3588cdf0e10cSrcweir                         aResetAttrsArray.Insert( RES_PARATR_LIST_LEVEL );
3589cdf0e10cSrcweir                         aResetAttrsArray.Insert( RES_PARATR_LIST_ISRESTART );
3590cdf0e10cSrcweir                         aResetAttrsArray.Insert( RES_PARATR_LIST_RESTARTVALUE );
3591cdf0e10cSrcweir                         aResetAttrsArray.Insert( RES_PARATR_LIST_ISCOUNTED );
3592cdf0e10cSrcweir                         SwPaM aPam( rTxtNode );
3593cdf0e10cSrcweir                         // suppress side effect "send data changed events"
3594cdf0e10cSrcweir                         rTxtNode.GetDoc()->ResetAttrs( aPam, sal_False,
3595cdf0e10cSrcweir                                                        &aResetAttrsArray,
3596cdf0e10cSrcweir                                                        false );
3597cdf0e10cSrcweir                     }
3598cdf0e10cSrcweir                 }
3599cdf0e10cSrcweir                 else
3600cdf0e10cSrcweir                 {
3601cdf0e10cSrcweir                     rTxtNode.RemoveFromList();
3602cdf0e10cSrcweir                     // If new list style is the outline style, apply outline
3603cdf0e10cSrcweir                     // level as the list level.
3604cdf0e10cSrcweir                     if ( sNumRule ==
3605cdf0e10cSrcweir                             String::CreateFromAscii( SwNumRule::GetOutlineRuleName() ) )
3606cdf0e10cSrcweir                     {
3607cdf0e10cSrcweir                         ASSERT( rTxtNode.GetTxtColl()->IsAssignedToListLevelOfOutlineStyle(),
3608cdf0e10cSrcweir                                 "<HandleModifyAtTxtNode()> - text node with outline style, but its paragraph style is not assigned to outline style." );
360969a74367SOliver-Rainer Wittmann                         const int nNewListLevel = rTxtNode.GetTxtColl()->GetAssignedOutlineStyleLevel();
3610cdf0e10cSrcweir                         if ( 0 <= nNewListLevel && nNewListLevel < MAXLEVEL )
3611cdf0e10cSrcweir                         {
3612cdf0e10cSrcweir                             rTxtNode.SetAttrListLevel( nNewListLevel );
3613cdf0e10cSrcweir                         }
3614cdf0e10cSrcweir                     }
3615cdf0e10cSrcweir                     rTxtNode.AddToList();
3616cdf0e10cSrcweir                 }
3617cdf0e10cSrcweir             }
3618cdf0e10cSrcweir             else // <sNumRule.Len() == 0 && sOldNumRule.Len() != 0>
3619cdf0e10cSrcweir             {
3620cdf0e10cSrcweir                 rTxtNode.RemoveFromList();
3621cdf0e10cSrcweir                 if ( bParagraphStyleChanged )
3622cdf0e10cSrcweir                 {
3623cdf0e10cSrcweir                     SvUShortsSort aResetAttrsArray;
3624cdf0e10cSrcweir                     aResetAttrsArray.Insert( RES_PARATR_LIST_ID );
3625cdf0e10cSrcweir                     aResetAttrsArray.Insert( RES_PARATR_LIST_LEVEL );
3626cdf0e10cSrcweir                     aResetAttrsArray.Insert( RES_PARATR_LIST_ISRESTART );
3627cdf0e10cSrcweir                     aResetAttrsArray.Insert( RES_PARATR_LIST_RESTARTVALUE );
3628cdf0e10cSrcweir                     aResetAttrsArray.Insert( RES_PARATR_LIST_ISCOUNTED );
3629cdf0e10cSrcweir                     SwPaM aPam( rTxtNode );
3630cdf0e10cSrcweir                     rTxtNode.GetDoc()->ResetAttrs( aPam, sal_False,
3631cdf0e10cSrcweir                                                    &aResetAttrsArray,
3632cdf0e10cSrcweir                                                    false );
3633cdf0e10cSrcweir                     if ( dynamic_cast<const SfxUInt16Item &>(rTxtNode.GetAttr( RES_PARATR_OUTLINELEVEL, sal_False )).GetValue() > 0 )
3634cdf0e10cSrcweir                     {
3635cdf0e10cSrcweir                         rTxtNode.SetEmptyListStyleDueToSetOutlineLevelAttr();
3636cdf0e10cSrcweir                     }
3637cdf0e10cSrcweir                 }
3638cdf0e10cSrcweir             }
3639cdf0e10cSrcweir         }
3640cdf0e10cSrcweir         else if ( sNumRule.Len() > 0 && !rTxtNode.IsInList() )
3641cdf0e10cSrcweir         {
3642cdf0e10cSrcweir             rTxtNode.AddToList();
3643cdf0e10cSrcweir         }
3644cdf0e10cSrcweir     }
3645cdf0e10cSrcweir     // End of method <HandleModifyAtTxtNode>
3646cdf0e10cSrcweir }
3647cdf0e10cSrcweir // <--
3648cdf0e10cSrcweir 
Modify(const SfxPoolItem * pOldValue,const SfxPoolItem * pNewValue)3649cdf0e10cSrcweir void SwTxtNode::Modify( const SfxPoolItem* pOldValue, const SfxPoolItem* pNewValue )
3650cdf0e10cSrcweir {
3651cdf0e10cSrcweir     bool bWasNotifiable = m_bNotifiable;
3652cdf0e10cSrcweir     m_bNotifiable = false;
3653cdf0e10cSrcweir 
3654cdf0e10cSrcweir 	// Bug 24616/24617:
3655cdf0e10cSrcweir 	// 		Modify ueberladen, damit beim Loeschen von Vorlagen diese
3656cdf0e10cSrcweir 	// 		wieder richtig verwaltet werden (Outline-Numerierung!!)
3657cdf0e10cSrcweir 	// 	Bug25481:
3658cdf0e10cSrcweir 	//		bei Nodes im Undo nie _ChgTxtCollUpdateNum rufen.
3659cdf0e10cSrcweir 	if( pOldValue && pNewValue && RES_FMT_CHG == pOldValue->Which() &&
3660cdf0e10cSrcweir 		GetRegisteredIn() == ((SwFmtChg*)pNewValue)->pChangedFmt &&
3661cdf0e10cSrcweir 		GetNodes().IsDocNodes() )
3662cdf0e10cSrcweir     {
3663cdf0e10cSrcweir 		_ChgTxtCollUpdateNum(
3664cdf0e10cSrcweir 						(SwTxtFmtColl*)((SwFmtChg*)pOldValue)->pChangedFmt,
3665cdf0e10cSrcweir 						(SwTxtFmtColl*)((SwFmtChg*)pNewValue)->pChangedFmt );
3666cdf0e10cSrcweir     }
3667cdf0e10cSrcweir 
3668cdf0e10cSrcweir     // --> OD 2008-03-27 #refactorlists#
3669cdf0e10cSrcweir     if ( !mbInSetOrResetAttr )
3670cdf0e10cSrcweir     {
3671cdf0e10cSrcweir         HandleModifyAtTxtNode( *this, pOldValue, pNewValue );
3672cdf0e10cSrcweir     }
3673cdf0e10cSrcweir     // <--
3674cdf0e10cSrcweir 
3675cdf0e10cSrcweir 	SwCntntNode::Modify( pOldValue, pNewValue );
3676cdf0e10cSrcweir 
3677cdf0e10cSrcweir     SwDoc * pDoc = GetDoc();
3678cdf0e10cSrcweir     // --> OD 2005-11-02 #125329# - assure that text node is in document nodes array
3679cdf0e10cSrcweir     if ( pDoc && !pDoc->IsInDtor() && &pDoc->GetNodes() == &GetNodes() )
3680cdf0e10cSrcweir     // <--
3681cdf0e10cSrcweir     {
3682cdf0e10cSrcweir         pDoc->GetNodes().UpdateOutlineNode(*this);
3683cdf0e10cSrcweir     }
3684cdf0e10cSrcweir 
3685cdf0e10cSrcweir     m_bNotifiable = bWasNotifiable;
3686cdf0e10cSrcweir 
3687cdf0e10cSrcweir     if (pOldValue && (RES_REMOVE_UNO_OBJECT == pOldValue->Which()))
3688cdf0e10cSrcweir     {   // invalidate cached uno object
3689cdf0e10cSrcweir         SetXParagraph(::com::sun::star::uno::Reference<
3690cdf0e10cSrcweir                 ::com::sun::star::text::XTextContent>(0));
3691cdf0e10cSrcweir     }
3692cdf0e10cSrcweir }
3693cdf0e10cSrcweir 
ChgFmtColl(SwFmtColl * pNewColl)3694cdf0e10cSrcweir SwFmtColl* SwTxtNode::ChgFmtColl( SwFmtColl *pNewColl )
3695cdf0e10cSrcweir {
3696cdf0e10cSrcweir     ASSERT( pNewColl,"ChgFmtColl: Collectionpointer ist 0." );
3697cdf0e10cSrcweir     ASSERT( HAS_BASE( SwTxtFmtColl, pNewColl ),
3698cdf0e10cSrcweir                 "ChgFmtColl: ist kein Text-Collectionpointer." );
3699cdf0e10cSrcweir 
3700cdf0e10cSrcweir     SwTxtFmtColl *pOldColl = GetTxtColl();
3701cdf0e10cSrcweir     if( pNewColl != pOldColl )
3702cdf0e10cSrcweir     {
3703cdf0e10cSrcweir         SetCalcHiddenCharFlags();
3704cdf0e10cSrcweir         SwCntntNode::ChgFmtColl( pNewColl );
3705cdf0e10cSrcweir         // --> OD 2008-03-27 #refactorlists#
3706cdf0e10cSrcweir //        NumRuleChgd();
3707cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
3708cdf0e10cSrcweir         ASSERT( !mbInSetOrResetAttr,
3709cdf0e10cSrcweir                 "DEBUG ASSERTION - <SwTxtNode::ChgFmtColl(..)> called during <Set/ResetAttr(..)>" )
3710cdf0e10cSrcweir #endif
3711cdf0e10cSrcweir         if ( !mbInSetOrResetAttr )
3712cdf0e10cSrcweir         {
3713cdf0e10cSrcweir             SwFmtChg aTmp1( pOldColl );
3714cdf0e10cSrcweir             SwFmtChg aTmp2( pNewColl );
3715cdf0e10cSrcweir             HandleModifyAtTxtNode( *this, &aTmp1, &aTmp2  );
3716cdf0e10cSrcweir         }
3717cdf0e10cSrcweir         // <--
3718cdf0e10cSrcweir     }
3719cdf0e10cSrcweir 
3720cdf0e10cSrcweir     // nur wenn im normalen Nodes-Array
3721cdf0e10cSrcweir     if( GetNodes().IsDocNodes() )
3722cdf0e10cSrcweir     {
3723cdf0e10cSrcweir         _ChgTxtCollUpdateNum( pOldColl, static_cast<SwTxtFmtColl *>(pNewColl) );
3724cdf0e10cSrcweir     }
3725cdf0e10cSrcweir 
3726cdf0e10cSrcweir     GetNodes().UpdateOutlineNode(*this);
3727cdf0e10cSrcweir 
3728cdf0e10cSrcweir     return pOldColl;
3729cdf0e10cSrcweir }
3730cdf0e10cSrcweir 
CreateNum() const3731cdf0e10cSrcweir SwNodeNum* SwTxtNode::CreateNum() const
3732cdf0e10cSrcweir {
3733cdf0e10cSrcweir     if ( !mpNodeNum )
3734cdf0e10cSrcweir     {
3735cdf0e10cSrcweir         // --> OD 2008-02-19 #refactorlists#
3736cdf0e10cSrcweir         mpNodeNum = new SwNodeNum( const_cast<SwTxtNode*>(this) );
3737cdf0e10cSrcweir         // <--
3738cdf0e10cSrcweir     }
3739cdf0e10cSrcweir     return mpNodeNum;
3740cdf0e10cSrcweir }
3741cdf0e10cSrcweir 
GetNumberVector() const3742cdf0e10cSrcweir SwNumberTree::tNumberVector SwTxtNode::GetNumberVector() const
3743cdf0e10cSrcweir {
3744cdf0e10cSrcweir     if ( GetNum() )
3745cdf0e10cSrcweir     {
3746cdf0e10cSrcweir         return GetNum()->GetNumberVector();
3747cdf0e10cSrcweir     }
3748cdf0e10cSrcweir     else
3749cdf0e10cSrcweir     {
3750cdf0e10cSrcweir         SwNumberTree::tNumberVector aResult;
3751cdf0e10cSrcweir         return aResult;
3752cdf0e10cSrcweir     }
3753cdf0e10cSrcweir }
3754cdf0e10cSrcweir 
IsOutline() const3755cdf0e10cSrcweir bool SwTxtNode::IsOutline() const
3756cdf0e10cSrcweir {
3757cdf0e10cSrcweir     bool bResult = false;
3758cdf0e10cSrcweir 
3759cdf0e10cSrcweir     //if ( GetOutlineLevel() != NO_NUMBERING )//#outline level,removed by zhaojianwei
3760cdf0e10cSrcweir     if ( GetAttrOutlineLevel() > 0 )            //<-end,zhaojianwei
3761cdf0e10cSrcweir     {
3762cdf0e10cSrcweir         bResult = !IsInRedlines();
3763cdf0e10cSrcweir     }
3764cdf0e10cSrcweir     else
3765cdf0e10cSrcweir     {
3766cdf0e10cSrcweir         const SwNumRule* pRule( GetNum() ? GetNum()->GetNumRule() : 0L );
3767cdf0e10cSrcweir         if ( pRule && pRule->IsOutlineRule() )
3768cdf0e10cSrcweir         {
3769cdf0e10cSrcweir             bResult = !IsInRedlines();
3770cdf0e10cSrcweir         }
3771cdf0e10cSrcweir     }
3772cdf0e10cSrcweir 
3773cdf0e10cSrcweir     return bResult;
3774cdf0e10cSrcweir }
3775cdf0e10cSrcweir 
IsOutlineStateChanged() const3776cdf0e10cSrcweir bool SwTxtNode::IsOutlineStateChanged() const
3777cdf0e10cSrcweir {
3778cdf0e10cSrcweir     return IsOutline() != m_bLastOutlineState;
3779cdf0e10cSrcweir }
3780cdf0e10cSrcweir 
UpdateOutlineState()3781cdf0e10cSrcweir void SwTxtNode::UpdateOutlineState()
3782cdf0e10cSrcweir {
3783cdf0e10cSrcweir     m_bLastOutlineState = IsOutline();
3784cdf0e10cSrcweir }
3785cdf0e10cSrcweir 
3786cdf0e10cSrcweir //#outline level, zhaojianwei
GetAttrOutlineLevel() const3787cdf0e10cSrcweir int SwTxtNode::GetAttrOutlineLevel() const
3788cdf0e10cSrcweir {
3789cdf0e10cSrcweir 	return ((const SfxUInt16Item &)GetAttr(RES_PARATR_OUTLINELEVEL)).GetValue();
3790cdf0e10cSrcweir }
SetAttrOutlineLevel(int nLevel)3791cdf0e10cSrcweir void SwTxtNode::SetAttrOutlineLevel(int nLevel)
3792cdf0e10cSrcweir {
3793cdf0e10cSrcweir     ASSERT( 0 <= nLevel && nLevel <= MAXLEVEL ,"SwTxtNode: Level Out Of Range" );//#outline level,zhaojianwei
3794cdf0e10cSrcweir     if ( 0 <= nLevel && nLevel <= MAXLEVEL )
3795cdf0e10cSrcweir     {
3796cdf0e10cSrcweir         SetAttr( SfxUInt16Item( RES_PARATR_OUTLINELEVEL,
3797cdf0e10cSrcweir                                 static_cast<sal_uInt16>(nLevel) ) );
3798cdf0e10cSrcweir     }
3799cdf0e10cSrcweir }
3800cdf0e10cSrcweir //<-end
3801cdf0e10cSrcweir 
3802cdf0e10cSrcweir // --> OD 2008-11-19 #i70748#
IsEmptyListStyleDueToSetOutlineLevelAttr()3803cdf0e10cSrcweir bool SwTxtNode::IsEmptyListStyleDueToSetOutlineLevelAttr()
3804cdf0e10cSrcweir {
3805cdf0e10cSrcweir     return mbEmptyListStyleSetDueToSetOutlineLevelAttr;
3806cdf0e10cSrcweir }
3807cdf0e10cSrcweir 
SetEmptyListStyleDueToSetOutlineLevelAttr()3808cdf0e10cSrcweir void SwTxtNode::SetEmptyListStyleDueToSetOutlineLevelAttr()
3809cdf0e10cSrcweir {
3810cdf0e10cSrcweir     if ( !mbEmptyListStyleSetDueToSetOutlineLevelAttr )
3811cdf0e10cSrcweir     {
3812cdf0e10cSrcweir         SetAttr( SwNumRuleItem() );
3813cdf0e10cSrcweir         mbEmptyListStyleSetDueToSetOutlineLevelAttr = true;
3814cdf0e10cSrcweir     }
3815cdf0e10cSrcweir }
3816cdf0e10cSrcweir 
ResetEmptyListStyleDueToResetOutlineLevelAttr()3817cdf0e10cSrcweir void SwTxtNode::ResetEmptyListStyleDueToResetOutlineLevelAttr()
3818cdf0e10cSrcweir {
3819cdf0e10cSrcweir     if ( mbEmptyListStyleSetDueToSetOutlineLevelAttr )
3820cdf0e10cSrcweir     {
3821cdf0e10cSrcweir         ResetAttr( RES_PARATR_NUMRULE );
3822cdf0e10cSrcweir         mbEmptyListStyleSetDueToSetOutlineLevelAttr = false;
3823cdf0e10cSrcweir     }
3824cdf0e10cSrcweir }
3825cdf0e10cSrcweir // <--
3826cdf0e10cSrcweir 
3827cdf0e10cSrcweir 
3828cdf0e10cSrcweir // --> OD 2008-02-27 #refactorlists#
SetAttrListLevel(int nLevel)3829cdf0e10cSrcweir void SwTxtNode::SetAttrListLevel( int nLevel )
3830cdf0e10cSrcweir {
3831cdf0e10cSrcweir     if ( nLevel < 0 || nLevel >= MAXLEVEL )
3832cdf0e10cSrcweir     {
3833cdf0e10cSrcweir         ASSERT( false,
3834cdf0e10cSrcweir                 "<SwTxtNode::SetAttrListLevel()> - value of parameter <nLevel> is out of valid range" );
3835cdf0e10cSrcweir         return;
3836cdf0e10cSrcweir     }
3837cdf0e10cSrcweir 
3838cdf0e10cSrcweir     SfxInt16Item aNewListLevelItem( RES_PARATR_LIST_LEVEL,
3839cdf0e10cSrcweir                                     static_cast<sal_Int16>(nLevel) );
3840cdf0e10cSrcweir     SetAttr( aNewListLevelItem );
3841cdf0e10cSrcweir }
3842cdf0e10cSrcweir // <--
3843cdf0e10cSrcweir // --> OD 2008-02-27 #refactorlists#
HasAttrListLevel() const3844cdf0e10cSrcweir bool SwTxtNode::HasAttrListLevel() const
3845cdf0e10cSrcweir {
3846cdf0e10cSrcweir     return GetpSwAttrSet() &&
3847cdf0e10cSrcweir            GetpSwAttrSet()->GetItemState( RES_PARATR_LIST_LEVEL, sal_False ) == SFX_ITEM_SET;
3848cdf0e10cSrcweir }
3849cdf0e10cSrcweir // <--
3850cdf0e10cSrcweir // --> OD 2008-02-27 #refactorlists#
GetAttrListLevel() const3851cdf0e10cSrcweir int SwTxtNode::GetAttrListLevel() const
3852cdf0e10cSrcweir {
3853cdf0e10cSrcweir     int nAttrListLevel = 0;
3854cdf0e10cSrcweir 
3855cdf0e10cSrcweir     const SfxInt16Item& aListLevelItem =
3856cdf0e10cSrcweir         dynamic_cast<const SfxInt16Item&>(GetAttr( RES_PARATR_LIST_LEVEL ));
3857cdf0e10cSrcweir     nAttrListLevel = static_cast<int>(aListLevelItem.GetValue());
3858cdf0e10cSrcweir 
3859cdf0e10cSrcweir     return nAttrListLevel;
3860cdf0e10cSrcweir }
3861cdf0e10cSrcweir // <--
3862cdf0e10cSrcweir 
GetActualListLevel() const3863cdf0e10cSrcweir int SwTxtNode::GetActualListLevel() const
3864cdf0e10cSrcweir {
3865cdf0e10cSrcweir     return GetNum() ? GetNum()->GetLevelInListTree() : -1;
3866cdf0e10cSrcweir }
3867cdf0e10cSrcweir 
3868cdf0e10cSrcweir // --> OD 2008-02-25 #refactorlists#
SetListRestart(bool bRestart)3869cdf0e10cSrcweir void SwTxtNode::SetListRestart( bool bRestart )
3870cdf0e10cSrcweir {
3871cdf0e10cSrcweir //    CreateNum()->SetRestart(bRestart);
3872cdf0e10cSrcweir     if ( !bRestart )
3873cdf0e10cSrcweir     {
3874cdf0e10cSrcweir         // attribute not contained in paragraph style's attribute set. Thus,
3875cdf0e10cSrcweir         // it can be reset to the attribute pool default by resetting the attribute.
3876cdf0e10cSrcweir         ResetAttr( RES_PARATR_LIST_ISRESTART );
3877cdf0e10cSrcweir     }
3878cdf0e10cSrcweir     else
3879cdf0e10cSrcweir     {
3880cdf0e10cSrcweir         SfxBoolItem aNewIsRestartItem( RES_PARATR_LIST_ISRESTART,
3881cdf0e10cSrcweir                                        sal_True );
3882cdf0e10cSrcweir         SetAttr( aNewIsRestartItem );
3883cdf0e10cSrcweir     }
3884cdf0e10cSrcweir }
3885cdf0e10cSrcweir 
3886cdf0e10cSrcweir // --> OD 2008-02-25 #refactorlists#
IsListRestart() const3887cdf0e10cSrcweir bool SwTxtNode::IsListRestart() const
3888cdf0e10cSrcweir {
3889cdf0e10cSrcweir //    return GetNum() ? GetNum()->IsRestart() : false;
3890cdf0e10cSrcweir     const SfxBoolItem& aIsRestartItem =
3891cdf0e10cSrcweir         dynamic_cast<const SfxBoolItem&>(GetAttr( RES_PARATR_LIST_ISRESTART ));
3892cdf0e10cSrcweir 
3893cdf0e10cSrcweir     return aIsRestartItem.GetValue() ? true : false;
3894cdf0e10cSrcweir }
3895cdf0e10cSrcweir // <--
3896cdf0e10cSrcweir 
3897cdf0e10cSrcweir /** Returns if the paragraph has a visible numbering or bullet.
3898cdf0e10cSrcweir     This includes all kinds of numbering/bullet/outlines.
3899cdf0e10cSrcweir     OD 2008-02-28 #newlistlevelattrs#
3900cdf0e10cSrcweir     The concrete list label string has to be checked, too.
3901cdf0e10cSrcweir  */
HasVisibleNumberingOrBullet() const3902cdf0e10cSrcweir bool SwTxtNode::HasVisibleNumberingOrBullet() const
3903cdf0e10cSrcweir {
3904cdf0e10cSrcweir     bool bRet = false;
3905cdf0e10cSrcweir 
3906cdf0e10cSrcweir     const SwNumRule* pRule = GetNum() ? GetNum()->GetNumRule() : 0L;
3907cdf0e10cSrcweir     if ( pRule && IsCountedInList())
3908cdf0e10cSrcweir     {
3909cdf0e10cSrcweir         // --> OD 2008-03-19 #i87154#
3910cdf0e10cSrcweir         // Correction of #newlistlevelattrs#:
3911cdf0e10cSrcweir         // The numbering type has to be checked for bullet lists.
3912cdf0e10cSrcweir         const SwNumFmt& rFmt = pRule->Get( static_cast<sal_uInt16>(GetActualListLevel() ));
3913cdf0e10cSrcweir         if ( SVX_NUM_NUMBER_NONE != rFmt.GetNumberingType() ||
3914cdf0e10cSrcweir              pRule->MakeNumString( *(GetNum()) ).Len() > 0 )
3915cdf0e10cSrcweir         {
3916cdf0e10cSrcweir             bRet = true;
3917cdf0e10cSrcweir         }
3918cdf0e10cSrcweir         // <--
3919cdf0e10cSrcweir     }
3920cdf0e10cSrcweir 
3921cdf0e10cSrcweir     return bRet;
3922cdf0e10cSrcweir }
3923cdf0e10cSrcweir 
3924cdf0e10cSrcweir // --> OD 2008-02-25 #refactorlists#
SetAttrListRestartValue(SwNumberTree::tSwNumTreeNumber nNumber)3925cdf0e10cSrcweir void SwTxtNode::SetAttrListRestartValue( SwNumberTree::tSwNumTreeNumber nNumber )
3926cdf0e10cSrcweir {
3927cdf0e10cSrcweir //    CreateNum()->SetStart(nNumber);
3928cdf0e10cSrcweir     const bool bChanged( HasAttrListRestartValue()
3929cdf0e10cSrcweir                          ? GetAttrListRestartValue() != nNumber
3930cdf0e10cSrcweir                          : nNumber != USHRT_MAX );
3931cdf0e10cSrcweir 
3932cdf0e10cSrcweir     if ( bChanged || !HasAttrListRestartValue() )
3933cdf0e10cSrcweir     {
3934cdf0e10cSrcweir         if ( nNumber == USHRT_MAX )
3935cdf0e10cSrcweir         {
3936cdf0e10cSrcweir             ResetAttr( RES_PARATR_LIST_RESTARTVALUE );
3937cdf0e10cSrcweir         }
3938cdf0e10cSrcweir         else
3939cdf0e10cSrcweir         {
3940cdf0e10cSrcweir             SfxInt16Item aNewListRestartValueItem( RES_PARATR_LIST_RESTARTVALUE,
3941cdf0e10cSrcweir                                                    static_cast<sal_Int16>(nNumber) );
3942cdf0e10cSrcweir             SetAttr( aNewListRestartValueItem );
3943cdf0e10cSrcweir         }
3944cdf0e10cSrcweir     }
3945cdf0e10cSrcweir }
3946cdf0e10cSrcweir // <--
3947cdf0e10cSrcweir 
3948cdf0e10cSrcweir // --> OD 2008-02-27 #refactorlists#
HasAttrListRestartValue() const3949cdf0e10cSrcweir bool SwTxtNode::HasAttrListRestartValue() const
3950cdf0e10cSrcweir {
3951cdf0e10cSrcweir     return GetpSwAttrSet() &&
3952cdf0e10cSrcweir            GetpSwAttrSet()->GetItemState( RES_PARATR_LIST_RESTARTVALUE, sal_False ) == SFX_ITEM_SET;
3953cdf0e10cSrcweir }
3954cdf0e10cSrcweir // <--
GetAttrListRestartValue() const3955cdf0e10cSrcweir SwNumberTree::tSwNumTreeNumber SwTxtNode::GetAttrListRestartValue() const
3956cdf0e10cSrcweir {
3957cdf0e10cSrcweir     ASSERT( HasAttrListRestartValue(),
3958cdf0e10cSrcweir             "<SwTxtNode::GetAttrListRestartValue()> - only ask for list restart value, if attribute is set at text node." );
3959cdf0e10cSrcweir 
3960cdf0e10cSrcweir     const SfxInt16Item& aListRestartValueItem =
3961cdf0e10cSrcweir         dynamic_cast<const SfxInt16Item&>(GetAttr( RES_PARATR_LIST_RESTARTVALUE ));
3962cdf0e10cSrcweir     return static_cast<SwNumberTree::tSwNumTreeNumber>(aListRestartValueItem.GetValue());
3963cdf0e10cSrcweir }
3964cdf0e10cSrcweir 
3965cdf0e10cSrcweir // --> OD 2008-02-25 #refactorlists#
GetActualListStartValue() const3966cdf0e10cSrcweir SwNumberTree::tSwNumTreeNumber SwTxtNode::GetActualListStartValue() const
3967cdf0e10cSrcweir {
3968cdf0e10cSrcweir //    return GetNum() ? GetNum()->GetStart() : 1;
3969cdf0e10cSrcweir     SwNumberTree::tSwNumTreeNumber nListRestartValue = 1;
3970cdf0e10cSrcweir 
3971cdf0e10cSrcweir     if ( IsListRestart() && HasAttrListRestartValue() )
3972cdf0e10cSrcweir     {
3973cdf0e10cSrcweir         nListRestartValue = GetAttrListRestartValue();
3974cdf0e10cSrcweir     }
3975cdf0e10cSrcweir     else
3976cdf0e10cSrcweir     {
3977cdf0e10cSrcweir         SwNumRule* pRule = GetNumRule();
3978cdf0e10cSrcweir         if ( pRule )
3979cdf0e10cSrcweir         {
3980cdf0e10cSrcweir             const SwNumFmt* pFmt =
3981cdf0e10cSrcweir                     pRule->GetNumFmt( static_cast<sal_uInt16>(GetAttrListLevel()) );
3982cdf0e10cSrcweir             if ( pFmt )
3983cdf0e10cSrcweir             {
3984cdf0e10cSrcweir                 nListRestartValue = pFmt->GetStart();
3985cdf0e10cSrcweir             }
3986cdf0e10cSrcweir         }
3987cdf0e10cSrcweir     }
3988cdf0e10cSrcweir 
3989cdf0e10cSrcweir     return nListRestartValue;
3990cdf0e10cSrcweir }
3991cdf0e10cSrcweir // <--
3992cdf0e10cSrcweir 
IsNotifiable() const3993cdf0e10cSrcweir bool SwTxtNode::IsNotifiable() const
3994cdf0e10cSrcweir {
3995cdf0e10cSrcweir     return m_bNotifiable && IsNotificationEnabled();
3996cdf0e10cSrcweir }
3997cdf0e10cSrcweir 
IsNotificationEnabled() const3998cdf0e10cSrcweir bool SwTxtNode::IsNotificationEnabled() const
3999cdf0e10cSrcweir {
4000cdf0e10cSrcweir     bool bResult = false;
4001cdf0e10cSrcweir     const SwDoc * pDoc = GetDoc();
4002cdf0e10cSrcweir     if( pDoc )
4003cdf0e10cSrcweir     {
4004cdf0e10cSrcweir         bResult = pDoc->IsInReading() || pDoc->IsInDtor() ? false : true;
4005cdf0e10cSrcweir     }
4006cdf0e10cSrcweir     return bResult;
4007cdf0e10cSrcweir }
4008cdf0e10cSrcweir 
4009cdf0e10cSrcweir // --> OD 2008-02-27 #refactorlists#
SetCountedInList(bool bCounted)4010cdf0e10cSrcweir void SwTxtNode::SetCountedInList( bool bCounted )
4011cdf0e10cSrcweir {
4012cdf0e10cSrcweir     if ( bCounted )
4013cdf0e10cSrcweir     {
4014cdf0e10cSrcweir         // attribute not contained in paragraph style's attribute set. Thus,
4015cdf0e10cSrcweir         // it can be reset to the attribute pool default by resetting the attribute.
4016cdf0e10cSrcweir         ResetAttr( RES_PARATR_LIST_ISCOUNTED );
4017cdf0e10cSrcweir     }
4018cdf0e10cSrcweir     else
4019cdf0e10cSrcweir     {
4020cdf0e10cSrcweir         SfxBoolItem aIsCountedInListItem( RES_PARATR_LIST_ISCOUNTED, sal_False );
4021cdf0e10cSrcweir         SetAttr( aIsCountedInListItem );
4022cdf0e10cSrcweir     }
4023cdf0e10cSrcweir }
4024cdf0e10cSrcweir // <--
4025cdf0e10cSrcweir 
IsCountedInList() const4026cdf0e10cSrcweir bool SwTxtNode::IsCountedInList() const
4027cdf0e10cSrcweir {
4028cdf0e10cSrcweir     const SfxBoolItem& aIsCountedInListItem =
4029cdf0e10cSrcweir         dynamic_cast<const SfxBoolItem&>(GetAttr( RES_PARATR_LIST_ISCOUNTED ));
4030cdf0e10cSrcweir 
4031cdf0e10cSrcweir     return aIsCountedInListItem.GetValue() ? true : false;
4032cdf0e10cSrcweir }
4033cdf0e10cSrcweir 
4034cdf0e10cSrcweir // --> OD 2008-03-13 #refactorlists#
AddToList()4035cdf0e10cSrcweir void SwTxtNode::AddToList()
4036cdf0e10cSrcweir {
4037cdf0e10cSrcweir     if ( IsInList() )
4038cdf0e10cSrcweir     {
4039cdf0e10cSrcweir         ASSERT( false,
4040cdf0e10cSrcweir                 "<SwTxtNode::AddToList()> - the text node is already added to a list. Serious defect -> please inform OD" );
4041cdf0e10cSrcweir         return;
4042cdf0e10cSrcweir     }
4043cdf0e10cSrcweir 
4044cdf0e10cSrcweir     const String sListId = GetListId();
4045cdf0e10cSrcweir     if ( sListId.Len() > 0 )
4046cdf0e10cSrcweir     {
4047cdf0e10cSrcweir         SwList* pList = GetDoc()->getListByName( sListId );
4048cdf0e10cSrcweir         if ( pList == 0 )
4049cdf0e10cSrcweir         {
4050cdf0e10cSrcweir             // Create corresponding list.
4051cdf0e10cSrcweir             SwNumRule* pNumRule = GetNumRule();
4052cdf0e10cSrcweir             if ( pNumRule )
4053cdf0e10cSrcweir             {
4054cdf0e10cSrcweir                 pList = GetDoc()->createList( sListId, GetNumRule()->GetName() );
4055cdf0e10cSrcweir             }
4056cdf0e10cSrcweir         }
4057cdf0e10cSrcweir         ASSERT( pList != 0,
4058cdf0e10cSrcweir                 "<SwTxtNode::AddToList()> - no list for given list id. Serious defect -> please inform OD" );
4059cdf0e10cSrcweir         if ( pList )
4060cdf0e10cSrcweir         {
4061cdf0e10cSrcweir             pList->InsertListItem( *CreateNum(), GetAttrListLevel() );
4062cdf0e10cSrcweir             mpList = pList;
4063cdf0e10cSrcweir         }
4064cdf0e10cSrcweir     }
4065cdf0e10cSrcweir }
4066cdf0e10cSrcweir 
RemoveFromList()4067cdf0e10cSrcweir void SwTxtNode::RemoveFromList()
4068cdf0e10cSrcweir {
4069cdf0e10cSrcweir     if ( IsInList() )
4070cdf0e10cSrcweir     {
4071cdf0e10cSrcweir         mpList->RemoveListItem( *mpNodeNum );
4072cdf0e10cSrcweir         mpList = 0;
4073cdf0e10cSrcweir         delete mpNodeNum;
4074cdf0e10cSrcweir         mpNodeNum = 0L;
4075cdf0e10cSrcweir     }
4076cdf0e10cSrcweir }
4077cdf0e10cSrcweir 
IsInList() const4078cdf0e10cSrcweir bool SwTxtNode::IsInList() const
4079cdf0e10cSrcweir {
4080cdf0e10cSrcweir     return GetNum() != 0 && GetNum()->GetParent() != 0;
4081cdf0e10cSrcweir }
4082cdf0e10cSrcweir // <--
4083cdf0e10cSrcweir 
IsFirstOfNumRule() const4084cdf0e10cSrcweir bool SwTxtNode::IsFirstOfNumRule() const
4085cdf0e10cSrcweir {
4086cdf0e10cSrcweir     bool bResult = false;
4087cdf0e10cSrcweir 
4088cdf0e10cSrcweir     if ( GetNum() && GetNum()->GetNumRule())
4089cdf0e10cSrcweir         bResult = GetNum()->IsFirst();
4090cdf0e10cSrcweir 
4091cdf0e10cSrcweir     return bResult;
4092cdf0e10cSrcweir }
4093cdf0e10cSrcweir 
4094cdf0e10cSrcweir // --> OD 2008-02-20 #refactorlists#
SetListId(const String sListId)4095cdf0e10cSrcweir void SwTxtNode::SetListId( const String sListId )
4096cdf0e10cSrcweir {
4097cdf0e10cSrcweir     const SfxStringItem& rListIdItem =
4098cdf0e10cSrcweir             dynamic_cast<const SfxStringItem&>(GetAttr( RES_PARATR_LIST_ID ));
4099cdf0e10cSrcweir     if ( rListIdItem.GetValue() != sListId )
4100cdf0e10cSrcweir     {
4101cdf0e10cSrcweir         if ( sListId.Len() == 0 )
4102cdf0e10cSrcweir         {
4103cdf0e10cSrcweir             ResetAttr( RES_PARATR_LIST_ID );
4104cdf0e10cSrcweir         }
4105cdf0e10cSrcweir         else
4106cdf0e10cSrcweir         {
4107cdf0e10cSrcweir             SfxStringItem aNewListIdItem( RES_PARATR_LIST_ID, sListId );
4108cdf0e10cSrcweir             SetAttr( aNewListIdItem );
4109cdf0e10cSrcweir         }
4110cdf0e10cSrcweir     }
4111cdf0e10cSrcweir }
4112cdf0e10cSrcweir 
GetListId() const4113cdf0e10cSrcweir String SwTxtNode::GetListId() const
4114cdf0e10cSrcweir {
4115cdf0e10cSrcweir     String sListId;
4116cdf0e10cSrcweir 
4117cdf0e10cSrcweir     const SfxStringItem& rListIdItem =
4118cdf0e10cSrcweir                 dynamic_cast<const SfxStringItem&>(GetAttr( RES_PARATR_LIST_ID ));
4119cdf0e10cSrcweir     sListId = rListIdItem.GetValue();
4120cdf0e10cSrcweir 
4121cdf0e10cSrcweir     // As long as no explicit list id attribute is set, use the list id of
4122cdf0e10cSrcweir     // the list, which has been created for the applied list style.
4123cdf0e10cSrcweir     if ( sListId.Len() == 0 )
4124cdf0e10cSrcweir     {
4125cdf0e10cSrcweir         SwNumRule* pRule = GetNumRule();
4126cdf0e10cSrcweir         if ( pRule )
4127cdf0e10cSrcweir         {
4128cdf0e10cSrcweir             sListId = pRule->GetDefaultListId();
4129cdf0e10cSrcweir //#if OSL_DEBUG_LEVEL > 1
4130cdf0e10cSrcweir //            ASSERT( false,
4131cdf0e10cSrcweir //                    "DEBUG ASSERTION: default list id of list style is applied." );
4132cdf0e10cSrcweir //#endif
4133cdf0e10cSrcweir //            // setting list id directly using <SwCntntNode::SetAttr(..)>,
4134cdf0e10cSrcweir //            // because no handling of this attribute set is needed and to avoid
4135cdf0e10cSrcweir //            // recursive calls of <SwTxtNode::SetAttr(..)>
4136cdf0e10cSrcweir //            SfxStringItem aNewListIdItem( RES_PARATR_LIST_ID, sListId );
4137cdf0e10cSrcweir //            const_cast<SwTxtNode*>(this)->SwCntntNode::SetAttr( aNewListIdItem );
4138cdf0e10cSrcweir         }
4139cdf0e10cSrcweir     }
4140cdf0e10cSrcweir 
4141cdf0e10cSrcweir     return sListId;
4142cdf0e10cSrcweir }
4143cdf0e10cSrcweir // <--
4144cdf0e10cSrcweir 
4145cdf0e10cSrcweir /** Determines, if the list level indent attributes can be applied to the
4146cdf0e10cSrcweir     paragraph.
4147cdf0e10cSrcweir 
4148cdf0e10cSrcweir     OD 2008-01-17 #newlistlevelattrs#
4149cdf0e10cSrcweir     The list level indents can be applied to the paragraph under the one
4150cdf0e10cSrcweir     of following conditions:
4151cdf0e10cSrcweir     - the list style is directly applied to the paragraph and the paragraph
4152cdf0e10cSrcweir       has no own indent attributes.
4153cdf0e10cSrcweir     - the list style is applied to the paragraph through one of its paragraph
4154cdf0e10cSrcweir       styles, the paragraph has no own indent attributes and on the paragraph
4155cdf0e10cSrcweir       style hierarchy from the paragraph to the paragraph style with the
4156cdf0e10cSrcweir       list style no indent attributes are found.
4157cdf0e10cSrcweir 
4158cdf0e10cSrcweir     @author OD
4159cdf0e10cSrcweir 
4160cdf0e10cSrcweir     @return boolean
4161cdf0e10cSrcweir */
AreListLevelIndentsApplicable() const4162cdf0e10cSrcweir bool SwTxtNode::AreListLevelIndentsApplicable() const
4163cdf0e10cSrcweir {
4164cdf0e10cSrcweir     bool bAreListLevelIndentsApplicable( true );
4165cdf0e10cSrcweir 
4166cdf0e10cSrcweir     if ( !GetNum() || !GetNum()->GetNumRule() )
4167cdf0e10cSrcweir     {
4168cdf0e10cSrcweir         // no list style applied to paragraph
4169cdf0e10cSrcweir         bAreListLevelIndentsApplicable = false;
4170cdf0e10cSrcweir     }
4171cdf0e10cSrcweir     else if ( HasSwAttrSet() &&
4172cdf0e10cSrcweir               GetpSwAttrSet()->GetItemState( RES_LR_SPACE, sal_False ) == SFX_ITEM_SET )
4173cdf0e10cSrcweir     {
4174cdf0e10cSrcweir         // paragraph has hard-set indent attributes
4175cdf0e10cSrcweir         bAreListLevelIndentsApplicable = false;
4176cdf0e10cSrcweir     }
4177cdf0e10cSrcweir     else if ( HasSwAttrSet() &&
4178cdf0e10cSrcweir               GetpSwAttrSet()->GetItemState( RES_PARATR_NUMRULE, sal_False ) == SFX_ITEM_SET )
4179cdf0e10cSrcweir     {
4180cdf0e10cSrcweir         // list style is directly applied to paragraph and paragraph has no
4181cdf0e10cSrcweir         // hard-set indent attributes
4182cdf0e10cSrcweir         bAreListLevelIndentsApplicable = true;
4183cdf0e10cSrcweir     }
4184cdf0e10cSrcweir     else
4185cdf0e10cSrcweir     {
4186cdf0e10cSrcweir         // list style is applied through one of the paragraph styles and
4187cdf0e10cSrcweir         // paragraph has no hard-set indent attributes
4188cdf0e10cSrcweir 
4189cdf0e10cSrcweir         // check, paragraph's
4190cdf0e10cSrcweir         const SwTxtFmtColl* pColl = GetTxtColl();
4191cdf0e10cSrcweir         while ( pColl )
4192cdf0e10cSrcweir         {
4193cdf0e10cSrcweir             if ( pColl->GetAttrSet().GetItemState( RES_LR_SPACE, sal_False ) == SFX_ITEM_SET )
4194cdf0e10cSrcweir             {
4195cdf0e10cSrcweir                 // indent attributes found in the paragraph style hierarchy.
4196cdf0e10cSrcweir                 bAreListLevelIndentsApplicable = false;
4197cdf0e10cSrcweir                 break;
4198cdf0e10cSrcweir             }
4199cdf0e10cSrcweir 
4200cdf0e10cSrcweir             if ( pColl->GetAttrSet().GetItemState( RES_PARATR_NUMRULE, sal_False ) == SFX_ITEM_SET )
4201cdf0e10cSrcweir             {
4202cdf0e10cSrcweir                 // paragraph style with the list style found and until now no
4203cdf0e10cSrcweir                 // indent attributes are found in the paragraph style hierarchy.
4204cdf0e10cSrcweir                 bAreListLevelIndentsApplicable = true;
4205cdf0e10cSrcweir                 break;
4206cdf0e10cSrcweir             }
4207cdf0e10cSrcweir 
4208cdf0e10cSrcweir             pColl = dynamic_cast<const SwTxtFmtColl*>(pColl->DerivedFrom());
4209cdf0e10cSrcweir             ASSERT( pColl,
4210cdf0e10cSrcweir                     "<SwTxtNode::AreListLevelIndentsApplicable()> - something wrong in paragraph's style hierarchy. The applied list style is not found." );
4211cdf0e10cSrcweir         }
4212cdf0e10cSrcweir     }
4213cdf0e10cSrcweir 
4214cdf0e10cSrcweir     return bAreListLevelIndentsApplicable;
4215cdf0e10cSrcweir }
4216cdf0e10cSrcweir 
4217cdf0e10cSrcweir /** Retrieves the list tab stop position, if the paragraph's list level defines
4218cdf0e10cSrcweir     one and this list tab stop has to merged into the tap stops of the paragraph
4219cdf0e10cSrcweir 
4220cdf0e10cSrcweir     OD 2008-01-17 #newlistlevelattrs#
4221cdf0e10cSrcweir 
4222cdf0e10cSrcweir     @author OD
4223cdf0e10cSrcweir 
4224cdf0e10cSrcweir     @param nListTabStopPosition
4225cdf0e10cSrcweir     output parameter - containing the list tab stop position
4226cdf0e10cSrcweir 
4227cdf0e10cSrcweir     @return boolean - indicating, if a list tab stop position is provided
4228cdf0e10cSrcweir */
GetListTabStopPosition(long & nListTabStopPosition) const4229cdf0e10cSrcweir bool SwTxtNode::GetListTabStopPosition( long& nListTabStopPosition ) const
4230cdf0e10cSrcweir {
4231cdf0e10cSrcweir     bool bListTanStopPositionProvided( false );
4232cdf0e10cSrcweir 
4233cdf0e10cSrcweir     const SwNumRule* pNumRule = GetNum() ? GetNum()->GetNumRule() : 0;
4234cdf0e10cSrcweir     if ( pNumRule && HasVisibleNumberingOrBullet() && GetActualListLevel() >= 0 )
4235cdf0e10cSrcweir     {
4236cdf0e10cSrcweir         const SwNumFmt& rFmt = pNumRule->Get( static_cast<sal_uInt16>(GetActualListLevel()) );
4237cdf0e10cSrcweir         if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT &&
4238cdf0e10cSrcweir              rFmt.GetLabelFollowedBy() == SvxNumberFormat::LISTTAB )
4239cdf0e10cSrcweir         {
4240cdf0e10cSrcweir             bListTanStopPositionProvided = true;
4241cdf0e10cSrcweir             nListTabStopPosition = rFmt.GetListtabPos();
4242cdf0e10cSrcweir 
4243cdf0e10cSrcweir             if ( getIDocumentSettingAccess()->get(IDocumentSettingAccess::TABS_RELATIVE_TO_INDENT) )
4244cdf0e10cSrcweir             {
4245cdf0e10cSrcweir                 // tab stop position are treated to be relative to the "before text"
4246cdf0e10cSrcweir                 // indent value of the paragraph. Thus, adjust <nListTabStopPos>.
4247cdf0e10cSrcweir                 if ( AreListLevelIndentsApplicable() )
4248cdf0e10cSrcweir                 {
4249cdf0e10cSrcweir                     nListTabStopPosition -= rFmt.GetIndentAt();
4250cdf0e10cSrcweir                 }
4251cdf0e10cSrcweir                 else if (!getIDocumentSettingAccess()->get(IDocumentSettingAccess::IGNORE_FIRST_LINE_INDENT_IN_NUMBERING))
4252cdf0e10cSrcweir                 {
4253cdf0e10cSrcweir                     SvxLRSpaceItem aItem = GetSwAttrSet().GetLRSpace();
4254cdf0e10cSrcweir                     nListTabStopPosition -= aItem.GetTxtLeft();
4255cdf0e10cSrcweir                 }
4256cdf0e10cSrcweir             }
4257cdf0e10cSrcweir         }
4258cdf0e10cSrcweir     }
4259cdf0e10cSrcweir 
4260cdf0e10cSrcweir     return bListTanStopPositionProvided;
4261cdf0e10cSrcweir }
4262cdf0e10cSrcweir 
4263cdf0e10cSrcweir /** Retrieves the character following the list label, if the paragraph's
4264cdf0e10cSrcweir     list level defines one.
4265cdf0e10cSrcweir 
4266cdf0e10cSrcweir     OD 2008-01-17 #newlistlevelattrs#
4267cdf0e10cSrcweir 
4268cdf0e10cSrcweir     @author OD
4269cdf0e10cSrcweir 
4270cdf0e10cSrcweir     @return XubString - the list tab stop position
4271cdf0e10cSrcweir */
GetLabelFollowedBy() const4272cdf0e10cSrcweir XubString SwTxtNode::GetLabelFollowedBy() const
4273cdf0e10cSrcweir {
4274cdf0e10cSrcweir     XubString aLabelFollowedBy;
4275cdf0e10cSrcweir 
4276cdf0e10cSrcweir     const SwNumRule* pNumRule = GetNum() ? GetNum()->GetNumRule() : 0;
4277cdf0e10cSrcweir     if ( pNumRule && HasVisibleNumberingOrBullet() && GetActualListLevel() >= 0 )
4278cdf0e10cSrcweir     {
4279cdf0e10cSrcweir         const SwNumFmt& rFmt = pNumRule->Get( static_cast<sal_uInt16>(GetActualListLevel()) );
4280cdf0e10cSrcweir         if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
4281cdf0e10cSrcweir         {
4282cdf0e10cSrcweir             switch ( rFmt.GetLabelFollowedBy() )
4283cdf0e10cSrcweir             {
4284cdf0e10cSrcweir                 case SvxNumberFormat::LISTTAB:
4285cdf0e10cSrcweir                 {
4286cdf0e10cSrcweir                     const sal_Unicode aTab = '\t';
4287cdf0e10cSrcweir                     aLabelFollowedBy.Insert( aTab, 0 );
4288cdf0e10cSrcweir                 }
4289cdf0e10cSrcweir                 break;
4290cdf0e10cSrcweir                 case SvxNumberFormat::SPACE:
4291cdf0e10cSrcweir                 {
4292cdf0e10cSrcweir                     const sal_Unicode aSpace = ' ';
4293cdf0e10cSrcweir                     aLabelFollowedBy.Insert( aSpace, 0 );
4294cdf0e10cSrcweir                 }
4295cdf0e10cSrcweir                 break;
4296cdf0e10cSrcweir                 case SvxNumberFormat::NOTHING:
4297cdf0e10cSrcweir                 {
4298cdf0e10cSrcweir                     // intentionally left blank.
4299cdf0e10cSrcweir                 }
4300cdf0e10cSrcweir                 break;
4301cdf0e10cSrcweir                 default:
4302cdf0e10cSrcweir                 {
4303cdf0e10cSrcweir                     ASSERT( false,
4304cdf0e10cSrcweir                             "<SwTxtNode::GetLabelFollowedBy()> - unknown SvxNumberFormat::GetLabelFollowedBy() return value" );
4305cdf0e10cSrcweir                 }
4306cdf0e10cSrcweir             }
4307cdf0e10cSrcweir         }
4308cdf0e10cSrcweir     }
4309cdf0e10cSrcweir 
4310cdf0e10cSrcweir     return aLabelFollowedBy;
4311cdf0e10cSrcweir }
4312cdf0e10cSrcweir 
CalcHiddenCharFlags() const4313cdf0e10cSrcweir void SwTxtNode::CalcHiddenCharFlags() const
4314cdf0e10cSrcweir {
4315cdf0e10cSrcweir     xub_StrLen nStartPos;
4316cdf0e10cSrcweir     xub_StrLen nEndPos;
4317cdf0e10cSrcweir     // Update of the flags is done inside GetBoundsOfHiddenRange()
4318cdf0e10cSrcweir     SwScriptInfo::GetBoundsOfHiddenRange( *this, 0, nStartPos, nEndPos );
4319cdf0e10cSrcweir }
4320cdf0e10cSrcweir 
4321cdf0e10cSrcweir // --> FME 2004-06-08 #i12836# enhanced pdf export
IsHidden() const4322cdf0e10cSrcweir bool SwTxtNode::IsHidden() const
4323cdf0e10cSrcweir {
4324cdf0e10cSrcweir     if ( HasHiddenParaField() || HasHiddenCharAttribute( true ) )
4325cdf0e10cSrcweir         return true;
4326cdf0e10cSrcweir 
4327cdf0e10cSrcweir     const SwSectionNode* pSectNd = FindSectionNode();
4328cdf0e10cSrcweir     if ( pSectNd && pSectNd->GetSection().IsHiddenFlag() )
4329cdf0e10cSrcweir         return true;
4330cdf0e10cSrcweir 
4331cdf0e10cSrcweir     return false;
4332cdf0e10cSrcweir }
4333cdf0e10cSrcweir // <--
4334cdf0e10cSrcweir 
4335cdf0e10cSrcweir // --> OD 2008-03-13 #refactorlists#
4336cdf0e10cSrcweir namespace {
4337cdf0e10cSrcweir     // Helper class for special handling of setting attributes at text node:
4338cdf0e10cSrcweir     // In constructor an instance of the helper class recognize whose attributes
4339cdf0e10cSrcweir     // are set and perform corresponding actions before the intrinsic set of
4340cdf0e10cSrcweir     // attributes has been taken place.
4341cdf0e10cSrcweir     // In the destructor - after the attributes have been set at the text
4342cdf0e10cSrcweir     // node - corresponding actions are performed.
4343cdf0e10cSrcweir     // The following is handled:
4344cdf0e10cSrcweir     // (1) When the list style attribute - RES_PARATR_NUMRULE - is set,
4345cdf0e10cSrcweir     //     (A) list style attribute is empty -> the text node is removed from
4346cdf0e10cSrcweir     //         its list.
4347cdf0e10cSrcweir     //     (B) list style attribute is not empty
4348cdf0e10cSrcweir     //         (a) text node has no list style -> add text node to its list after
4349cdf0e10cSrcweir     //             the attributes have been set.
4350cdf0e10cSrcweir     //         (b) text node has list style -> change of list style is notified
4351cdf0e10cSrcweir     //             after the attributes have been set.
4352cdf0e10cSrcweir     // (2) When the list id attribute - RES_PARATR_LIST_ID - is set and changed,
4353cdf0e10cSrcweir     //     the text node is removed from its current list before the attributes
4354cdf0e10cSrcweir     //     are set and added to its new list after the attributes have been set.
4355cdf0e10cSrcweir     // (3) Notify list tree, if list level - RES_PARATR_LIST_LEVEL - is set
4356cdf0e10cSrcweir     //     and changed after the attributes have been set
4357cdf0e10cSrcweir     // (4) Notify list tree, if list restart - RES_PARATR_LIST_ISRESTART - is set
4358cdf0e10cSrcweir     //     and changed after the attributes have been set
4359cdf0e10cSrcweir     // (5) Notify list tree, if list restart value - RES_PARATR_LIST_RESTARTVALUE -
4360cdf0e10cSrcweir     //     is set and changed after the attributes have been set
4361cdf0e10cSrcweir     // (6) Notify list tree, if count in list - RES_PARATR_LIST_ISCOUNTED - is set
4362cdf0e10cSrcweir     //     and changed after the attributes have been set
4363cdf0e10cSrcweir     // (7) Set or Reset emtpy list style due to changed outline level - RES_PARATR_OUTLINELEVEL.
4364cdf0e10cSrcweir     class HandleSetAttrAtTxtNode
4365cdf0e10cSrcweir     {
4366cdf0e10cSrcweir         public:
4367cdf0e10cSrcweir             HandleSetAttrAtTxtNode( SwTxtNode& rTxtNode,
4368cdf0e10cSrcweir                                     const SfxPoolItem& pItem );
4369cdf0e10cSrcweir             HandleSetAttrAtTxtNode( SwTxtNode& rTxtNode,
4370cdf0e10cSrcweir                                     const SfxItemSet& rItemSet );
4371cdf0e10cSrcweir             ~HandleSetAttrAtTxtNode();
4372cdf0e10cSrcweir 
4373cdf0e10cSrcweir         private:
4374cdf0e10cSrcweir             SwTxtNode& mrTxtNode;
4375cdf0e10cSrcweir             bool mbAddTxtNodeToList;
4376cdf0e10cSrcweir             bool mbUpdateListLevel;
4377cdf0e10cSrcweir             bool mbUpdateListRestart;
4378cdf0e10cSrcweir             bool mbUpdateListCount;
4379cdf0e10cSrcweir             // --> OD 2008-11-19 #i70748#
4380cdf0e10cSrcweir             bool mbOutlineLevelSet;
4381cdf0e10cSrcweir             // <--
4382cdf0e10cSrcweir     };
4383cdf0e10cSrcweir 
HandleSetAttrAtTxtNode(SwTxtNode & rTxtNode,const SfxPoolItem & pItem)4384cdf0e10cSrcweir     HandleSetAttrAtTxtNode::HandleSetAttrAtTxtNode( SwTxtNode& rTxtNode,
4385cdf0e10cSrcweir                                                     const SfxPoolItem& pItem )
4386cdf0e10cSrcweir         : mrTxtNode( rTxtNode ),
4387cdf0e10cSrcweir           mbAddTxtNodeToList( false ),
4388cdf0e10cSrcweir           mbUpdateListLevel( false ),
4389cdf0e10cSrcweir           mbUpdateListRestart( false ),
4390cdf0e10cSrcweir           mbUpdateListCount( false ),
4391cdf0e10cSrcweir           // --> OD 2008-11-19 #i70748#
4392cdf0e10cSrcweir           mbOutlineLevelSet( false )
4393cdf0e10cSrcweir           // <--
4394cdf0e10cSrcweir     {
4395cdf0e10cSrcweir         switch ( pItem.Which() )
4396cdf0e10cSrcweir         {
4397cdf0e10cSrcweir             // handle RES_PARATR_NUMRULE
4398cdf0e10cSrcweir             case RES_PARATR_NUMRULE:
4399cdf0e10cSrcweir             {
4400cdf0e10cSrcweir                 mrTxtNode.RemoveFromList();
4401cdf0e10cSrcweir 
4402cdf0e10cSrcweir                 const SwNumRuleItem& pNumRuleItem =
4403cdf0e10cSrcweir                                 dynamic_cast<const SwNumRuleItem&>(pItem);
4404cdf0e10cSrcweir                 if ( pNumRuleItem.GetValue().Len() > 0 )
4405cdf0e10cSrcweir                 {
4406cdf0e10cSrcweir                     mbAddTxtNodeToList = true;
4407cdf0e10cSrcweir                     // --> OD 2010-05-12 #i105562#
4408cdf0e10cSrcweir                     //
4409cdf0e10cSrcweir                     mrTxtNode.ResetEmptyListStyleDueToResetOutlineLevelAttr();
4410cdf0e10cSrcweir                     // <--
4411cdf0e10cSrcweir                 }
4412cdf0e10cSrcweir             }
4413cdf0e10cSrcweir             break;
4414cdf0e10cSrcweir 
4415cdf0e10cSrcweir             // handle RES_PARATR_LIST_ID
4416cdf0e10cSrcweir             case RES_PARATR_LIST_ID:
4417cdf0e10cSrcweir             {
4418cdf0e10cSrcweir                 const SfxStringItem& pListIdItem =
4419cdf0e10cSrcweir                                         dynamic_cast<const SfxStringItem&>(pItem);
4420cdf0e10cSrcweir                 ASSERT( pListIdItem.GetValue().Len() > 0,
4421cdf0e10cSrcweir                         "<HandleSetAttrAtTxtNode(..)> - empty list id attribute not excepted. Serious defect -> please inform OD." );
4422cdf0e10cSrcweir                 const String sListIdOfTxtNode = rTxtNode.GetListId();
4423cdf0e10cSrcweir                 if ( pListIdItem.GetValue() != sListIdOfTxtNode )
4424cdf0e10cSrcweir                 {
4425cdf0e10cSrcweir                     mbAddTxtNodeToList = true;
4426cdf0e10cSrcweir                     if ( mrTxtNode.IsInList() )
4427cdf0e10cSrcweir                     {
4428cdf0e10cSrcweir                         mrTxtNode.RemoveFromList();
4429cdf0e10cSrcweir                     }
4430cdf0e10cSrcweir                 }
4431cdf0e10cSrcweir             }
4432cdf0e10cSrcweir             break;
4433cdf0e10cSrcweir 
4434cdf0e10cSrcweir             // handle RES_PARATR_LIST_LEVEL
4435cdf0e10cSrcweir             case RES_PARATR_LIST_LEVEL:
4436cdf0e10cSrcweir             {
4437cdf0e10cSrcweir                 const SfxInt16Item& aListLevelItem =
4438cdf0e10cSrcweir                                     dynamic_cast<const SfxInt16Item&>(pItem);
4439cdf0e10cSrcweir                 if ( aListLevelItem.GetValue() != mrTxtNode.GetAttrListLevel() )
4440cdf0e10cSrcweir                 {
4441cdf0e10cSrcweir                     mbUpdateListLevel = true;
4442cdf0e10cSrcweir                 }
4443cdf0e10cSrcweir             }
4444cdf0e10cSrcweir             break;
4445cdf0e10cSrcweir 
4446cdf0e10cSrcweir             // handle RES_PARATR_LIST_ISRESTART
4447cdf0e10cSrcweir             case RES_PARATR_LIST_ISRESTART:
4448cdf0e10cSrcweir             {
4449cdf0e10cSrcweir                 const SfxBoolItem& aListIsRestartItem =
4450cdf0e10cSrcweir                                     dynamic_cast<const SfxBoolItem&>(pItem);
4451cdf0e10cSrcweir                 if ( aListIsRestartItem.GetValue() !=
4452cdf0e10cSrcweir                                     (mrTxtNode.IsListRestart() ? sal_True : sal_False) )
4453cdf0e10cSrcweir                 {
4454cdf0e10cSrcweir                     mbUpdateListRestart = true;
4455cdf0e10cSrcweir                 }
4456cdf0e10cSrcweir             }
4457cdf0e10cSrcweir             break;
4458cdf0e10cSrcweir 
4459cdf0e10cSrcweir             // handle RES_PARATR_LIST_RESTARTVALUE
4460cdf0e10cSrcweir             case RES_PARATR_LIST_RESTARTVALUE:
4461cdf0e10cSrcweir             {
4462cdf0e10cSrcweir                 const SfxInt16Item& aListRestartValueItem =
4463cdf0e10cSrcweir                                     dynamic_cast<const SfxInt16Item&>(pItem);
4464cdf0e10cSrcweir                 if ( !mrTxtNode.HasAttrListRestartValue() ||
4465cdf0e10cSrcweir                      aListRestartValueItem.GetValue() != mrTxtNode.GetAttrListRestartValue() )
4466cdf0e10cSrcweir                 {
4467cdf0e10cSrcweir                     mbUpdateListRestart = true;
4468cdf0e10cSrcweir                 }
4469cdf0e10cSrcweir             }
4470cdf0e10cSrcweir             break;
4471cdf0e10cSrcweir 
4472cdf0e10cSrcweir             // handle RES_PARATR_LIST_ISCOUNTED
4473cdf0e10cSrcweir             case RES_PARATR_LIST_ISCOUNTED:
4474cdf0e10cSrcweir             {
4475cdf0e10cSrcweir                 const SfxBoolItem& aIsCountedInListItem =
4476cdf0e10cSrcweir                                     dynamic_cast<const SfxBoolItem&>(pItem);
4477cdf0e10cSrcweir                 if ( aIsCountedInListItem.GetValue() !=
4478cdf0e10cSrcweir                                     (mrTxtNode.IsCountedInList() ? sal_True : sal_False) )
4479cdf0e10cSrcweir                 {
4480cdf0e10cSrcweir                     mbUpdateListCount = true;
4481cdf0e10cSrcweir                 }
4482cdf0e10cSrcweir             }
4483cdf0e10cSrcweir             break;
4484cdf0e10cSrcweir 
4485cdf0e10cSrcweir             // --> OD 2008-11-19 #i70748#
4486cdf0e10cSrcweir             // handle RES_PARATR_OUTLINELEVEL
4487cdf0e10cSrcweir             case RES_PARATR_OUTLINELEVEL:
4488cdf0e10cSrcweir             {
4489cdf0e10cSrcweir                 const SfxUInt16Item& aOutlineLevelItem =
4490cdf0e10cSrcweir                                     dynamic_cast<const SfxUInt16Item&>(pItem);
4491cdf0e10cSrcweir                 if ( aOutlineLevelItem.GetValue() != mrTxtNode.GetAttrOutlineLevel() )
4492cdf0e10cSrcweir                 {
4493cdf0e10cSrcweir                     mbOutlineLevelSet = true;
4494cdf0e10cSrcweir                 }
4495cdf0e10cSrcweir             }
4496cdf0e10cSrcweir             break;
4497cdf0e10cSrcweir             // <--
4498cdf0e10cSrcweir         }
4499cdf0e10cSrcweir 
4500cdf0e10cSrcweir     }
4501cdf0e10cSrcweir 
HandleSetAttrAtTxtNode(SwTxtNode & rTxtNode,const SfxItemSet & rItemSet)4502cdf0e10cSrcweir     HandleSetAttrAtTxtNode::HandleSetAttrAtTxtNode( SwTxtNode& rTxtNode,
4503cdf0e10cSrcweir                                                     const SfxItemSet& rItemSet )
4504cdf0e10cSrcweir         : mrTxtNode( rTxtNode ),
4505cdf0e10cSrcweir           mbAddTxtNodeToList( false ),
4506cdf0e10cSrcweir           mbUpdateListLevel( false ),
4507cdf0e10cSrcweir           mbUpdateListRestart( false ),
4508cdf0e10cSrcweir           mbUpdateListCount( false ),
4509cdf0e10cSrcweir           // --> OD 2008-11-19 #i70748#
4510cdf0e10cSrcweir           mbOutlineLevelSet( false )
4511cdf0e10cSrcweir           // <--
4512cdf0e10cSrcweir     {
4513cdf0e10cSrcweir         const SfxPoolItem* pItem = 0;
4514cdf0e10cSrcweir         // handle RES_PARATR_NUMRULE
4515cdf0e10cSrcweir         if ( rItemSet.GetItemState( RES_PARATR_NUMRULE, sal_False, &pItem ) == SFX_ITEM_SET )
4516cdf0e10cSrcweir         {
4517cdf0e10cSrcweir             mrTxtNode.RemoveFromList();
4518cdf0e10cSrcweir 
4519cdf0e10cSrcweir             const SwNumRuleItem* pNumRuleItem =
4520cdf0e10cSrcweir                             dynamic_cast<const SwNumRuleItem*>(pItem);
4521cdf0e10cSrcweir             if ( pNumRuleItem->GetValue().Len() > 0 )
4522cdf0e10cSrcweir             {
4523cdf0e10cSrcweir                 mbAddTxtNodeToList = true;
4524cdf0e10cSrcweir                 // --> OD 2008-11-19 #i70748#
4525cdf0e10cSrcweir                 mrTxtNode.ResetEmptyListStyleDueToResetOutlineLevelAttr();
4526cdf0e10cSrcweir                 // <--
4527cdf0e10cSrcweir             }
4528cdf0e10cSrcweir         }
4529cdf0e10cSrcweir 
4530cdf0e10cSrcweir         // handle RES_PARATR_LIST_ID
4531cdf0e10cSrcweir         if ( rItemSet.GetItemState( RES_PARATR_LIST_ID, sal_False, &pItem ) == SFX_ITEM_SET )
4532cdf0e10cSrcweir         {
4533cdf0e10cSrcweir             const SfxStringItem* pListIdItem =
4534cdf0e10cSrcweir                                     dynamic_cast<const SfxStringItem*>(pItem);
4535cdf0e10cSrcweir             const String sListIdOfTxtNode = mrTxtNode.GetListId();
4536cdf0e10cSrcweir             if ( pListIdItem &&
4537cdf0e10cSrcweir                  pListIdItem->GetValue() != sListIdOfTxtNode )
4538cdf0e10cSrcweir             {
4539cdf0e10cSrcweir                 mbAddTxtNodeToList = true;
4540cdf0e10cSrcweir                 if ( mrTxtNode.IsInList() )
4541cdf0e10cSrcweir                 {
4542cdf0e10cSrcweir                     mrTxtNode.RemoveFromList();
4543cdf0e10cSrcweir                 }
4544cdf0e10cSrcweir             }
4545cdf0e10cSrcweir         }
4546cdf0e10cSrcweir 
4547cdf0e10cSrcweir         // handle RES_PARATR_LIST_LEVEL
4548cdf0e10cSrcweir         if ( rItemSet.GetItemState( RES_PARATR_LIST_LEVEL, sal_False, &pItem ) == SFX_ITEM_SET )
4549cdf0e10cSrcweir         {
4550cdf0e10cSrcweir             const SfxInt16Item* pListLevelItem =
4551cdf0e10cSrcweir                                 dynamic_cast<const SfxInt16Item*>(pItem);
4552cdf0e10cSrcweir             if ( pListLevelItem->GetValue() != mrTxtNode.GetAttrListLevel() )
4553cdf0e10cSrcweir             {
4554cdf0e10cSrcweir                 mbUpdateListLevel = true;
4555cdf0e10cSrcweir             }
4556cdf0e10cSrcweir         }
4557cdf0e10cSrcweir 
4558cdf0e10cSrcweir         // handle RES_PARATR_LIST_ISRESTART
4559cdf0e10cSrcweir         if ( rItemSet.GetItemState( RES_PARATR_LIST_ISRESTART, sal_False, &pItem ) == SFX_ITEM_SET )
4560cdf0e10cSrcweir         {
4561cdf0e10cSrcweir             const SfxBoolItem* pListIsRestartItem =
4562cdf0e10cSrcweir                                 dynamic_cast<const SfxBoolItem*>(pItem);
4563cdf0e10cSrcweir             if ( pListIsRestartItem->GetValue() !=
4564cdf0e10cSrcweir                                     (mrTxtNode.IsListRestart() ? sal_True : sal_False) )
4565cdf0e10cSrcweir             {
4566cdf0e10cSrcweir                 mbUpdateListRestart = true;
4567cdf0e10cSrcweir             }
4568cdf0e10cSrcweir         }
4569cdf0e10cSrcweir 
4570cdf0e10cSrcweir         // handle RES_PARATR_LIST_RESTARTVALUE
4571cdf0e10cSrcweir         if ( rItemSet.GetItemState( RES_PARATR_LIST_RESTARTVALUE, sal_False, &pItem ) == SFX_ITEM_SET )
4572cdf0e10cSrcweir         {
4573cdf0e10cSrcweir             const SfxInt16Item* pListRestartValueItem =
4574cdf0e10cSrcweir                                 dynamic_cast<const SfxInt16Item*>(pItem);
4575cdf0e10cSrcweir             if ( !mrTxtNode.HasAttrListRestartValue() ||
4576cdf0e10cSrcweir                  pListRestartValueItem->GetValue() != mrTxtNode.GetAttrListRestartValue() )
4577cdf0e10cSrcweir             {
4578cdf0e10cSrcweir                 mbUpdateListRestart = true;
4579cdf0e10cSrcweir             }
4580cdf0e10cSrcweir         }
4581cdf0e10cSrcweir 
4582cdf0e10cSrcweir         // handle RES_PARATR_LIST_ISCOUNTED
4583cdf0e10cSrcweir         if ( rItemSet.GetItemState( RES_PARATR_LIST_ISCOUNTED, sal_False, &pItem ) == SFX_ITEM_SET )
4584cdf0e10cSrcweir         {
4585cdf0e10cSrcweir             const SfxBoolItem* pIsCountedInListItem =
4586cdf0e10cSrcweir                                 dynamic_cast<const SfxBoolItem*>(pItem);
4587cdf0e10cSrcweir             if ( pIsCountedInListItem->GetValue() !=
4588cdf0e10cSrcweir                                 (mrTxtNode.IsCountedInList() ? sal_True : sal_False) )
4589cdf0e10cSrcweir             {
4590cdf0e10cSrcweir                 mbUpdateListCount = true;
4591cdf0e10cSrcweir             }
4592cdf0e10cSrcweir         }
4593cdf0e10cSrcweir 
4594cdf0e10cSrcweir         // --> OD 2008-11-19 #i70748#
4595cdf0e10cSrcweir         // handle RES_PARATR_OUTLINELEVEL
4596cdf0e10cSrcweir         if ( rItemSet.GetItemState( RES_PARATR_OUTLINELEVEL, sal_False, &pItem ) == SFX_ITEM_SET )
4597cdf0e10cSrcweir         {
4598cdf0e10cSrcweir             const SfxUInt16Item* pOutlineLevelItem =
4599cdf0e10cSrcweir                                 dynamic_cast<const SfxUInt16Item*>(pItem);
4600cdf0e10cSrcweir             if ( pOutlineLevelItem->GetValue() != mrTxtNode.GetAttrOutlineLevel() )
4601cdf0e10cSrcweir             {
4602cdf0e10cSrcweir                 mbOutlineLevelSet = true;
4603cdf0e10cSrcweir             }
4604cdf0e10cSrcweir         }
4605cdf0e10cSrcweir         // <--
4606cdf0e10cSrcweir     }
4607cdf0e10cSrcweir 
~HandleSetAttrAtTxtNode()4608cdf0e10cSrcweir     HandleSetAttrAtTxtNode::~HandleSetAttrAtTxtNode()
4609cdf0e10cSrcweir     {
4610cdf0e10cSrcweir         if ( mbAddTxtNodeToList )
4611cdf0e10cSrcweir         {
4612cdf0e10cSrcweir             SwNumRule* pNumRuleAtTxtNode = mrTxtNode.GetNumRule();
4613cdf0e10cSrcweir             if ( pNumRuleAtTxtNode )
4614cdf0e10cSrcweir             {
4615cdf0e10cSrcweir                 mrTxtNode.AddToList();
4616cdf0e10cSrcweir             }
4617cdf0e10cSrcweir         }
4618cdf0e10cSrcweir         else
4619cdf0e10cSrcweir         {
4620cdf0e10cSrcweir             if ( mbUpdateListLevel && mrTxtNode.IsInList() )
4621cdf0e10cSrcweir             {
4622cdf0e10cSrcweir                 const_cast<SwNodeNum*>(mrTxtNode.GetNum())->SetLevelInListTree(
4623cdf0e10cSrcweir                                                     mrTxtNode.GetAttrListLevel() );
4624cdf0e10cSrcweir             }
4625cdf0e10cSrcweir 
4626cdf0e10cSrcweir             if ( mbUpdateListRestart && mrTxtNode.IsInList() )
4627cdf0e10cSrcweir             {
4628cdf0e10cSrcweir                 SwNodeNum* pNodeNum = const_cast<SwNodeNum*>(mrTxtNode.GetNum());
4629cdf0e10cSrcweir                 pNodeNum->InvalidateMe();
4630cdf0e10cSrcweir                 pNodeNum->NotifyInvalidSiblings();
4631cdf0e10cSrcweir             }
4632cdf0e10cSrcweir 
4633cdf0e10cSrcweir             if ( mbUpdateListCount && mrTxtNode.IsInList() )
4634cdf0e10cSrcweir             {
4635cdf0e10cSrcweir                 const_cast<SwNodeNum*>(mrTxtNode.GetNum())->InvalidateAndNotifyTree();
4636cdf0e10cSrcweir             }
4637cdf0e10cSrcweir         }
4638cdf0e10cSrcweir 
4639cdf0e10cSrcweir         // --> OD 2008-11-19 #i70748#
4640cdf0e10cSrcweir         if ( mbOutlineLevelSet )
4641cdf0e10cSrcweir         {
4642*808c4840SOliver-Rainer Wittmann             mrTxtNode.GetNodes().UpdateOutlineNode( mrTxtNode );
4643cdf0e10cSrcweir             if ( mrTxtNode.GetAttrOutlineLevel() == 0 )
4644cdf0e10cSrcweir             {
4645cdf0e10cSrcweir                 mrTxtNode.ResetEmptyListStyleDueToResetOutlineLevelAttr();
4646cdf0e10cSrcweir             }
4647cdf0e10cSrcweir             else
4648cdf0e10cSrcweir             {
4649cdf0e10cSrcweir                 const SfxPoolItem* pItem = 0;
4650cdf0e10cSrcweir                 if ( mrTxtNode.GetSwAttrSet().GetItemState( RES_PARATR_NUMRULE,
4651cdf0e10cSrcweir                                                             sal_True, &pItem )
4652cdf0e10cSrcweir                                                                 != SFX_ITEM_SET )
4653cdf0e10cSrcweir                 {
4654cdf0e10cSrcweir                     mrTxtNode.SetEmptyListStyleDueToSetOutlineLevelAttr();
4655cdf0e10cSrcweir                 }
4656cdf0e10cSrcweir             }
4657cdf0e10cSrcweir         }
4658cdf0e10cSrcweir         // <--
4659cdf0e10cSrcweir     }
4660cdf0e10cSrcweir     // End of class <HandleSetAttrAtTxtNode>
4661cdf0e10cSrcweir }
4662cdf0e10cSrcweir 
SetAttr(const SfxPoolItem & pItem)4663cdf0e10cSrcweir sal_Bool SwTxtNode::SetAttr( const SfxPoolItem& pItem )
4664cdf0e10cSrcweir {
4665cdf0e10cSrcweir     const bool bOldIsSetOrResetAttr( mbInSetOrResetAttr );
4666cdf0e10cSrcweir     mbInSetOrResetAttr = true;
4667cdf0e10cSrcweir 
4668cdf0e10cSrcweir     HandleSetAttrAtTxtNode aHandleSetAttr( *this, pItem );
4669cdf0e10cSrcweir 
4670cdf0e10cSrcweir     sal_Bool bRet = SwCntntNode::SetAttr( pItem );
4671cdf0e10cSrcweir 
4672cdf0e10cSrcweir     mbInSetOrResetAttr = bOldIsSetOrResetAttr;
4673cdf0e10cSrcweir 
4674cdf0e10cSrcweir     return bRet;
4675cdf0e10cSrcweir }
4676cdf0e10cSrcweir 
SetAttr(const SfxItemSet & rSet)4677cdf0e10cSrcweir sal_Bool SwTxtNode::SetAttr( const SfxItemSet& rSet )
4678cdf0e10cSrcweir {
4679cdf0e10cSrcweir     const bool bOldIsSetOrResetAttr( mbInSetOrResetAttr );
4680cdf0e10cSrcweir     mbInSetOrResetAttr = true;
4681cdf0e10cSrcweir 
4682cdf0e10cSrcweir     HandleSetAttrAtTxtNode aHandleSetAttr( *this, rSet );
4683cdf0e10cSrcweir 
4684cdf0e10cSrcweir     sal_Bool bRet = SwCntntNode::SetAttr( rSet );
4685cdf0e10cSrcweir 
4686cdf0e10cSrcweir     mbInSetOrResetAttr = bOldIsSetOrResetAttr;
4687cdf0e10cSrcweir 
4688cdf0e10cSrcweir     return bRet;
4689cdf0e10cSrcweir }
4690cdf0e10cSrcweir 
4691cdf0e10cSrcweir namespace {
4692cdf0e10cSrcweir     // Helper class for special handling of resetting attributes at text node:
4693cdf0e10cSrcweir     // In constructor an instance of the helper class recognize whose attributes
4694cdf0e10cSrcweir     // are reset and perform corresponding actions before the intrinsic reset of
4695cdf0e10cSrcweir     // attributes has been taken place.
4696cdf0e10cSrcweir     // In the destructor - after the attributes have been reset at the text
4697cdf0e10cSrcweir     // node - corresponding actions are performed.
4698cdf0e10cSrcweir     // The following is handled:
4699cdf0e10cSrcweir     // (1) When the list style attribute - RES_PARATR_NUMRULE - is reset,
4700cdf0e10cSrcweir     //     the text is removed from its list before the attributes have been reset.
4701cdf0e10cSrcweir     // (2) When the list id attribute - RES_PARATR_LIST_ID - is reset,
4702cdf0e10cSrcweir     //     the text is removed from its list before the attributes have been reset.
4703cdf0e10cSrcweir     // (3) Notify list tree, if list level - RES_PARATR_LIST_LEVEL - is reset.
4704cdf0e10cSrcweir     // (4) Notify list tree, if list restart - RES_PARATR_LIST_ISRESTART - is reset.
4705cdf0e10cSrcweir     // (5) Notify list tree, if list restart value - RES_PARATR_LIST_RESTARTVALUE - is reset.
4706cdf0e10cSrcweir     // (6) Notify list tree, if count in list - RES_PARATR_LIST_ISCOUNTED - is reset.
4707cdf0e10cSrcweir     // (7) Reset empty list style, if outline level attribute - RES_PARATR_OUTLINELEVEL - is reset.
4708cdf0e10cSrcweir     class HandleResetAttrAtTxtNode
4709cdf0e10cSrcweir     {
4710cdf0e10cSrcweir         public:
4711cdf0e10cSrcweir             HandleResetAttrAtTxtNode( SwTxtNode& rTxtNode,
4712cdf0e10cSrcweir                                       const sal_uInt16 nWhich1,
4713cdf0e10cSrcweir                                       const sal_uInt16 nWhich2 );
4714cdf0e10cSrcweir             HandleResetAttrAtTxtNode( SwTxtNode& rTxtNode,
4715cdf0e10cSrcweir                                       const SvUShorts& rWhichArr );
4716cdf0e10cSrcweir             HandleResetAttrAtTxtNode( SwTxtNode& rTxtNode );
4717cdf0e10cSrcweir 
4718cdf0e10cSrcweir             ~HandleResetAttrAtTxtNode();
4719cdf0e10cSrcweir 
4720cdf0e10cSrcweir         private:
4721cdf0e10cSrcweir             SwTxtNode& mrTxtNode;
4722cdf0e10cSrcweir             bool mbListStyleOrIdReset;
4723cdf0e10cSrcweir             bool mbUpdateListLevel;
4724cdf0e10cSrcweir             bool mbUpdateListRestart;
4725cdf0e10cSrcweir             bool mbUpdateListCount;
4726cdf0e10cSrcweir     };
4727cdf0e10cSrcweir 
HandleResetAttrAtTxtNode(SwTxtNode & rTxtNode,const sal_uInt16 nWhich1,const sal_uInt16 nWhich2)4728cdf0e10cSrcweir     HandleResetAttrAtTxtNode::HandleResetAttrAtTxtNode( SwTxtNode& rTxtNode,
4729cdf0e10cSrcweir                                                         const sal_uInt16 nWhich1,
4730cdf0e10cSrcweir                                                         const sal_uInt16 nWhich2 )
4731cdf0e10cSrcweir         : mrTxtNode( rTxtNode ),
4732cdf0e10cSrcweir           mbListStyleOrIdReset( false ),
4733cdf0e10cSrcweir           mbUpdateListLevel( false ),
4734cdf0e10cSrcweir           mbUpdateListRestart( false ),
4735cdf0e10cSrcweir           mbUpdateListCount( false )
4736cdf0e10cSrcweir     {
4737cdf0e10cSrcweir         bool bRemoveFromList( false );
4738cdf0e10cSrcweir         if ( nWhich2 != 0 && nWhich2 > nWhich1 )
4739cdf0e10cSrcweir         {
4740cdf0e10cSrcweir             // RES_PARATR_NUMRULE and RES_PARATR_LIST_ID
4741cdf0e10cSrcweir             if ( nWhich1 <= RES_PARATR_NUMRULE && RES_PARATR_NUMRULE <= nWhich2 )
4742cdf0e10cSrcweir             {
4743cdf0e10cSrcweir                 bRemoveFromList = mrTxtNode.GetNumRule() != 0;
4744cdf0e10cSrcweir                 mbListStyleOrIdReset = true;
4745cdf0e10cSrcweir             }
4746cdf0e10cSrcweir             else if ( nWhich1 <= RES_PARATR_LIST_ID && RES_PARATR_LIST_ID <= nWhich2 )
4747cdf0e10cSrcweir             {
4748cdf0e10cSrcweir                 bRemoveFromList = mrTxtNode.GetpSwAttrSet() &&
4749cdf0e10cSrcweir                     mrTxtNode.GetpSwAttrSet()->GetItemState( RES_PARATR_LIST_ID, sal_False ) == SFX_ITEM_SET;
4750cdf0e10cSrcweir                 // --> OD 2008-10-20 #i92898#
4751cdf0e10cSrcweir                 mbListStyleOrIdReset = true;
4752cdf0e10cSrcweir                 // <--
4753cdf0e10cSrcweir             }
4754cdf0e10cSrcweir 
4755cdf0e10cSrcweir             if ( !bRemoveFromList )
4756cdf0e10cSrcweir             {
4757cdf0e10cSrcweir                 // RES_PARATR_LIST_LEVEL
4758cdf0e10cSrcweir                 mbUpdateListLevel = ( nWhich1 <= RES_PARATR_LIST_LEVEL &&
4759cdf0e10cSrcweir                                       RES_PARATR_LIST_LEVEL <= nWhich2 &&
4760cdf0e10cSrcweir                                       mrTxtNode.HasAttrListLevel() );
4761cdf0e10cSrcweir 
4762cdf0e10cSrcweir                 // RES_PARATR_LIST_ISRESTART and RES_PARATR_LIST_RESTARTVALUE
4763cdf0e10cSrcweir                 mbUpdateListRestart =
4764cdf0e10cSrcweir                     ( nWhich1 <= RES_PARATR_LIST_ISRESTART && RES_PARATR_LIST_ISRESTART <= nWhich2 &&
4765cdf0e10cSrcweir                       mrTxtNode.IsListRestart() ) ||
4766cdf0e10cSrcweir                     ( nWhich1 <= RES_PARATR_LIST_RESTARTVALUE && RES_PARATR_LIST_RESTARTVALUE <= nWhich2 &&
4767cdf0e10cSrcweir                       mrTxtNode.HasAttrListRestartValue() );
4768cdf0e10cSrcweir 
4769cdf0e10cSrcweir                 // RES_PARATR_LIST_ISCOUNTED
4770cdf0e10cSrcweir                 mbUpdateListCount =
4771cdf0e10cSrcweir                     ( nWhich1 <= RES_PARATR_LIST_ISCOUNTED && RES_PARATR_LIST_ISCOUNTED <= nWhich2 &&
4772cdf0e10cSrcweir                       !mrTxtNode.IsCountedInList() );
4773cdf0e10cSrcweir             }
4774cdf0e10cSrcweir 
4775cdf0e10cSrcweir             // --> OD 2008-11-19 #i70748#
4776cdf0e10cSrcweir             // RES_PARATR_OUTLINELEVEL
4777cdf0e10cSrcweir             if ( nWhich1 <= RES_PARATR_OUTLINELEVEL && RES_PARATR_OUTLINELEVEL <= nWhich2 )
4778cdf0e10cSrcweir             {
4779cdf0e10cSrcweir                 mrTxtNode.ResetEmptyListStyleDueToResetOutlineLevelAttr();
4780cdf0e10cSrcweir             }
4781cdf0e10cSrcweir             // <--
4782cdf0e10cSrcweir         }
4783cdf0e10cSrcweir         else
4784cdf0e10cSrcweir         {
4785cdf0e10cSrcweir             // RES_PARATR_NUMRULE and RES_PARATR_LIST_ID
4786cdf0e10cSrcweir             if ( nWhich1 == RES_PARATR_NUMRULE )
4787cdf0e10cSrcweir             {
4788cdf0e10cSrcweir                 bRemoveFromList = mrTxtNode.GetNumRule() != 0;
4789cdf0e10cSrcweir                 mbListStyleOrIdReset = true;
4790cdf0e10cSrcweir             }
4791cdf0e10cSrcweir             else if ( nWhich1 == RES_PARATR_LIST_ID )
4792cdf0e10cSrcweir             {
4793cdf0e10cSrcweir                 bRemoveFromList = mrTxtNode.GetpSwAttrSet() &&
4794cdf0e10cSrcweir                     mrTxtNode.GetpSwAttrSet()->GetItemState( RES_PARATR_LIST_ID, sal_False ) == SFX_ITEM_SET;
4795cdf0e10cSrcweir                 // --> OD 2008-10-20 #i92898#
4796cdf0e10cSrcweir                 mbListStyleOrIdReset = true;
4797cdf0e10cSrcweir                 // <--
4798cdf0e10cSrcweir             }
4799cdf0e10cSrcweir             // --> OD 2008-11-19 #i70748#
4800cdf0e10cSrcweir             // RES_PARATR_OUTLINELEVEL
4801cdf0e10cSrcweir             else if ( nWhich1 == RES_PARATR_OUTLINELEVEL )
4802cdf0e10cSrcweir             {
4803cdf0e10cSrcweir                 mrTxtNode.ResetEmptyListStyleDueToResetOutlineLevelAttr();
4804cdf0e10cSrcweir             }
4805cdf0e10cSrcweir             // <--
4806cdf0e10cSrcweir 
4807cdf0e10cSrcweir             if ( !bRemoveFromList )
4808cdf0e10cSrcweir             {
4809cdf0e10cSrcweir                 // RES_PARATR_LIST_LEVEL
4810cdf0e10cSrcweir                 mbUpdateListLevel = nWhich1 == RES_PARATR_LIST_LEVEL &&
4811cdf0e10cSrcweir                                     mrTxtNode.HasAttrListLevel();
4812cdf0e10cSrcweir 
4813cdf0e10cSrcweir                 // RES_PARATR_LIST_ISRESTART and RES_PARATR_LIST_RESTARTVALUE
4814cdf0e10cSrcweir                 mbUpdateListRestart = ( nWhich1 == RES_PARATR_LIST_ISRESTART &&
4815cdf0e10cSrcweir                                         mrTxtNode.IsListRestart() ) ||
4816cdf0e10cSrcweir                                       ( nWhich1 == RES_PARATR_LIST_RESTARTVALUE &&
4817cdf0e10cSrcweir                                         mrTxtNode.HasAttrListRestartValue() );
4818cdf0e10cSrcweir 
4819cdf0e10cSrcweir                 // RES_PARATR_LIST_ISCOUNTED
4820cdf0e10cSrcweir                 mbUpdateListCount = nWhich1 == RES_PARATR_LIST_ISCOUNTED &&
4821cdf0e10cSrcweir                                     !mrTxtNode.IsCountedInList();
4822cdf0e10cSrcweir             }
4823cdf0e10cSrcweir         }
4824cdf0e10cSrcweir 
4825cdf0e10cSrcweir         if ( bRemoveFromList && mrTxtNode.IsInList() )
4826cdf0e10cSrcweir         {
4827cdf0e10cSrcweir             mrTxtNode.RemoveFromList();
4828cdf0e10cSrcweir         }
4829cdf0e10cSrcweir     }
4830cdf0e10cSrcweir 
HandleResetAttrAtTxtNode(SwTxtNode & rTxtNode,const SvUShorts & rWhichArr)4831cdf0e10cSrcweir     HandleResetAttrAtTxtNode::HandleResetAttrAtTxtNode( SwTxtNode& rTxtNode,
4832cdf0e10cSrcweir                                                         const SvUShorts& rWhichArr )
4833cdf0e10cSrcweir         : mrTxtNode( rTxtNode ),
4834cdf0e10cSrcweir           mbListStyleOrIdReset( false ),
4835cdf0e10cSrcweir           mbUpdateListLevel( false ),
4836cdf0e10cSrcweir           mbUpdateListRestart( false ),
4837cdf0e10cSrcweir           mbUpdateListCount( false )
4838cdf0e10cSrcweir     {
4839cdf0e10cSrcweir         bool bRemoveFromList( false );
4840cdf0e10cSrcweir         {
4841cdf0e10cSrcweir             const sal_uInt16 nEnd = rWhichArr.Count();
4842cdf0e10cSrcweir             for ( sal_uInt16 n = 0; n < nEnd; ++n )
4843cdf0e10cSrcweir             {
4844cdf0e10cSrcweir                 // RES_PARATR_NUMRULE and RES_PARATR_LIST_ID
4845cdf0e10cSrcweir                 if ( rWhichArr[ n ] == RES_PARATR_NUMRULE )
4846cdf0e10cSrcweir                 {
4847cdf0e10cSrcweir                     bRemoveFromList = bRemoveFromList ||
4848cdf0e10cSrcweir                                       mrTxtNode.GetNumRule() != 0;
4849cdf0e10cSrcweir                     mbListStyleOrIdReset = true;
4850cdf0e10cSrcweir                 }
4851cdf0e10cSrcweir                 else if ( rWhichArr[ n ] == RES_PARATR_LIST_ID )
4852cdf0e10cSrcweir                 {
4853cdf0e10cSrcweir                     bRemoveFromList = bRemoveFromList ||
4854cdf0e10cSrcweir                         ( mrTxtNode.GetpSwAttrSet() &&
4855cdf0e10cSrcweir                           mrTxtNode.GetpSwAttrSet()->GetItemState( RES_PARATR_LIST_ID, sal_False ) == SFX_ITEM_SET );
4856cdf0e10cSrcweir                     // --> OD 2008-10-20 #i92898#
4857cdf0e10cSrcweir                     mbListStyleOrIdReset = true;
4858cdf0e10cSrcweir                     // <--
4859cdf0e10cSrcweir                 }
4860cdf0e10cSrcweir                 // --> OD 2008-11-19 #i70748#
4861cdf0e10cSrcweir                 // RES_PARATR_OUTLINELEVEL
4862cdf0e10cSrcweir                 else if ( rWhichArr[ n ] == RES_PARATR_OUTLINELEVEL )
4863cdf0e10cSrcweir                 {
4864cdf0e10cSrcweir                     mrTxtNode.ResetEmptyListStyleDueToResetOutlineLevelAttr();
4865cdf0e10cSrcweir                 }
4866cdf0e10cSrcweir                 // <--
4867cdf0e10cSrcweir 
4868cdf0e10cSrcweir                 if ( !bRemoveFromList )
4869cdf0e10cSrcweir                 {
4870cdf0e10cSrcweir                     // RES_PARATR_LIST_LEVEL
4871cdf0e10cSrcweir                     mbUpdateListLevel = mbUpdateListLevel ||
4872cdf0e10cSrcweir                                         ( rWhichArr[ n ] == RES_PARATR_LIST_LEVEL &&
4873cdf0e10cSrcweir                                           mrTxtNode.HasAttrListLevel() );
4874cdf0e10cSrcweir 
4875cdf0e10cSrcweir                     // RES_PARATR_LIST_ISRESTART and RES_PARATR_LIST_RESTARTVALUE
4876cdf0e10cSrcweir                     mbUpdateListRestart = mbUpdateListRestart ||
4877cdf0e10cSrcweir                                           ( rWhichArr[ n ] == RES_PARATR_LIST_ISRESTART &&
4878cdf0e10cSrcweir                                             mrTxtNode.IsListRestart() ) ||
4879cdf0e10cSrcweir                                           ( rWhichArr[ n ] == RES_PARATR_LIST_RESTARTVALUE &&
4880cdf0e10cSrcweir                                             mrTxtNode.HasAttrListRestartValue() );
4881cdf0e10cSrcweir 
4882cdf0e10cSrcweir                     // RES_PARATR_LIST_ISCOUNTED
4883cdf0e10cSrcweir                     mbUpdateListCount = mbUpdateListCount ||
4884cdf0e10cSrcweir                                         ( rWhichArr[ n ] == RES_PARATR_LIST_ISCOUNTED &&
4885cdf0e10cSrcweir                                           !mrTxtNode.IsCountedInList() );
4886cdf0e10cSrcweir                 }
4887cdf0e10cSrcweir             }
4888cdf0e10cSrcweir         }
4889cdf0e10cSrcweir 
4890cdf0e10cSrcweir         if ( bRemoveFromList && mrTxtNode.IsInList() )
4891cdf0e10cSrcweir         {
4892cdf0e10cSrcweir             mrTxtNode.RemoveFromList();
4893cdf0e10cSrcweir         }
4894cdf0e10cSrcweir     }
4895cdf0e10cSrcweir 
HandleResetAttrAtTxtNode(SwTxtNode & rTxtNode)4896cdf0e10cSrcweir     HandleResetAttrAtTxtNode::HandleResetAttrAtTxtNode( SwTxtNode& rTxtNode )
4897cdf0e10cSrcweir         : mrTxtNode( rTxtNode ),
4898cdf0e10cSrcweir           mbListStyleOrIdReset( false ),
4899cdf0e10cSrcweir           mbUpdateListLevel( false ),
4900cdf0e10cSrcweir           mbUpdateListRestart( false ),
4901cdf0e10cSrcweir           mbUpdateListCount( false )
4902cdf0e10cSrcweir     {
4903cdf0e10cSrcweir         mbListStyleOrIdReset = true;
4904cdf0e10cSrcweir         if ( rTxtNode.IsInList() )
4905cdf0e10cSrcweir         {
4906cdf0e10cSrcweir             rTxtNode.RemoveFromList();
4907cdf0e10cSrcweir         }
4908cdf0e10cSrcweir         // --> OD 2008-11-19 #i70748#
4909cdf0e10cSrcweir         mrTxtNode.ResetEmptyListStyleDueToResetOutlineLevelAttr();
4910cdf0e10cSrcweir         // <--
4911cdf0e10cSrcweir     }
4912cdf0e10cSrcweir 
~HandleResetAttrAtTxtNode()4913cdf0e10cSrcweir     HandleResetAttrAtTxtNode::~HandleResetAttrAtTxtNode()
4914cdf0e10cSrcweir     {
4915cdf0e10cSrcweir         if ( mbListStyleOrIdReset && !mrTxtNode.IsInList() )
4916cdf0e10cSrcweir         {
4917cdf0e10cSrcweir             // check, if in spite of the reset of the list style or the list id
4918cdf0e10cSrcweir             // the paragraph still has to be added to a list.
4919cdf0e10cSrcweir             if ( mrTxtNode.GetNumRule() &&
4920cdf0e10cSrcweir                  mrTxtNode.GetListId().Len() > 0 )
4921cdf0e10cSrcweir             {
4922cdf0e10cSrcweir                 // --> OD 2009-01-14 #i96062#
4923cdf0e10cSrcweir                 // If paragraph has no list level attribute set and list style
4924cdf0e10cSrcweir                 // is the outline style, apply outline level as the list level.
4925cdf0e10cSrcweir                 if ( !mrTxtNode.HasAttrListLevel() &&
4926cdf0e10cSrcweir                      mrTxtNode.GetNumRule()->GetName() ==
4927cdf0e10cSrcweir                         String::CreateFromAscii( SwNumRule::GetOutlineRuleName() ) &&
4928cdf0e10cSrcweir                      mrTxtNode.GetTxtColl()->IsAssignedToListLevelOfOutlineStyle() )
4929cdf0e10cSrcweir                 {
4930cdf0e10cSrcweir                     int nNewListLevel = mrTxtNode.GetTxtColl()->GetAssignedOutlineStyleLevel();
4931cdf0e10cSrcweir                     if ( 0 <= nNewListLevel && nNewListLevel < MAXLEVEL )
4932cdf0e10cSrcweir                     {
4933cdf0e10cSrcweir                         mrTxtNode.SetAttrListLevel( nNewListLevel );
4934cdf0e10cSrcweir                     }
4935cdf0e10cSrcweir                 }
4936cdf0e10cSrcweir                 // <--
4937cdf0e10cSrcweir                 mrTxtNode.AddToList();
4938cdf0e10cSrcweir             }
4939cdf0e10cSrcweir             // --> OD 2008-11-19 #i70748#
4940cdf0e10cSrcweir             // --> OD 2010-05-12 #i105562#
4941cdf0e10cSrcweir             else if ( mrTxtNode.GetpSwAttrSet() &&
4942cdf0e10cSrcweir                       dynamic_cast<const SfxUInt16Item &>(mrTxtNode.GetAttr( RES_PARATR_OUTLINELEVEL, sal_False )).GetValue() > 0 )
4943cdf0e10cSrcweir             {
4944cdf0e10cSrcweir                 mrTxtNode.SetEmptyListStyleDueToSetOutlineLevelAttr();
4945cdf0e10cSrcweir             }
4946cdf0e10cSrcweir             // <--
4947cdf0e10cSrcweir         }
4948cdf0e10cSrcweir 
4949cdf0e10cSrcweir         if ( mrTxtNode.IsInList() )
4950cdf0e10cSrcweir         {
4951cdf0e10cSrcweir             if ( mbUpdateListLevel )
4952cdf0e10cSrcweir             {
4953cdf0e10cSrcweir                 SwNodeNum* pNodeNum = const_cast<SwNodeNum*>(mrTxtNode.GetNum());
4954cdf0e10cSrcweir                 pNodeNum->SetLevelInListTree( mrTxtNode.GetAttrListLevel() );
4955cdf0e10cSrcweir             }
4956cdf0e10cSrcweir 
4957cdf0e10cSrcweir             if ( mbUpdateListRestart )
4958cdf0e10cSrcweir             {
4959cdf0e10cSrcweir                 SwNodeNum* pNodeNum = const_cast<SwNodeNum*>(mrTxtNode.GetNum());
4960cdf0e10cSrcweir                 pNodeNum->InvalidateMe();
4961cdf0e10cSrcweir                 pNodeNum->NotifyInvalidSiblings();
4962cdf0e10cSrcweir             }
4963cdf0e10cSrcweir 
4964cdf0e10cSrcweir             if ( mbUpdateListCount )
4965cdf0e10cSrcweir             {
4966cdf0e10cSrcweir                 SwNodeNum* pNodeNum = const_cast<SwNodeNum*>(mrTxtNode.GetNum());
4967cdf0e10cSrcweir                 pNodeNum->InvalidateAndNotifyTree();
4968cdf0e10cSrcweir             }
4969cdf0e10cSrcweir         }
4970cdf0e10cSrcweir     }
4971cdf0e10cSrcweir     // End of class <HandleResetAttrAtTxtNode>
4972cdf0e10cSrcweir }
4973cdf0e10cSrcweir 
ResetAttr(sal_uInt16 nWhich1,sal_uInt16 nWhich2)4974cdf0e10cSrcweir sal_Bool SwTxtNode::ResetAttr( sal_uInt16 nWhich1, sal_uInt16 nWhich2 )
4975cdf0e10cSrcweir {
4976cdf0e10cSrcweir     const bool bOldIsSetOrResetAttr( mbInSetOrResetAttr );
4977cdf0e10cSrcweir     mbInSetOrResetAttr = true;
4978cdf0e10cSrcweir 
4979cdf0e10cSrcweir     HandleResetAttrAtTxtNode aHandleResetAttr( *this, nWhich1, nWhich2 );
4980cdf0e10cSrcweir 
4981cdf0e10cSrcweir     sal_Bool bRet = SwCntntNode::ResetAttr( nWhich1, nWhich2 );
4982cdf0e10cSrcweir 
4983cdf0e10cSrcweir     mbInSetOrResetAttr = bOldIsSetOrResetAttr;
4984cdf0e10cSrcweir 
4985cdf0e10cSrcweir     return bRet;
4986cdf0e10cSrcweir }
4987cdf0e10cSrcweir 
ResetAttr(const SvUShorts & rWhichArr)4988cdf0e10cSrcweir sal_Bool SwTxtNode::ResetAttr( const SvUShorts& rWhichArr )
4989cdf0e10cSrcweir {
4990cdf0e10cSrcweir     const bool bOldIsSetOrResetAttr( mbInSetOrResetAttr );
4991cdf0e10cSrcweir     mbInSetOrResetAttr = true;
4992cdf0e10cSrcweir 
4993cdf0e10cSrcweir     HandleResetAttrAtTxtNode aHandleResetAttr( *this, rWhichArr );
4994cdf0e10cSrcweir 
4995cdf0e10cSrcweir     sal_Bool bRet = SwCntntNode::ResetAttr( rWhichArr );
4996cdf0e10cSrcweir 
4997cdf0e10cSrcweir     mbInSetOrResetAttr = bOldIsSetOrResetAttr;
4998cdf0e10cSrcweir 
4999cdf0e10cSrcweir     return bRet;
5000cdf0e10cSrcweir }
5001cdf0e10cSrcweir 
ResetAllAttr()5002cdf0e10cSrcweir sal_uInt16 SwTxtNode::ResetAllAttr()
5003cdf0e10cSrcweir {
5004cdf0e10cSrcweir     const bool bOldIsSetOrResetAttr( mbInSetOrResetAttr );
5005cdf0e10cSrcweir     mbInSetOrResetAttr = true;
5006cdf0e10cSrcweir 
5007cdf0e10cSrcweir     HandleResetAttrAtTxtNode aHandleResetAttr( *this );
5008cdf0e10cSrcweir 
5009cdf0e10cSrcweir     sal_uInt16 nRet = SwCntntNode::ResetAllAttr();
5010cdf0e10cSrcweir 
5011cdf0e10cSrcweir     mbInSetOrResetAttr = bOldIsSetOrResetAttr;
5012cdf0e10cSrcweir 
5013cdf0e10cSrcweir     return nRet;
5014cdf0e10cSrcweir }
5015cdf0e10cSrcweir // <--
5016cdf0e10cSrcweir 
5017cdf0e10cSrcweir // sw::Metadatable
GetRegistry()5018cdf0e10cSrcweir ::sfx2::IXmlIdRegistry& SwTxtNode::GetRegistry()
5019cdf0e10cSrcweir {
5020cdf0e10cSrcweir     return GetDoc()->GetXmlIdRegistry();
5021cdf0e10cSrcweir }
5022cdf0e10cSrcweir 
IsInClipboard() const5023cdf0e10cSrcweir bool SwTxtNode::IsInClipboard() const
5024cdf0e10cSrcweir {
5025cdf0e10cSrcweir     return GetDoc()->IsClipBoard();
5026cdf0e10cSrcweir }
5027cdf0e10cSrcweir 
IsInUndo() const5028cdf0e10cSrcweir bool SwTxtNode::IsInUndo() const
5029cdf0e10cSrcweir {
5030cdf0e10cSrcweir     return GetDoc()->GetIDocumentUndoRedo().IsUndoNodes(GetNodes());
5031cdf0e10cSrcweir }
5032cdf0e10cSrcweir 
IsInContent() const5033cdf0e10cSrcweir bool SwTxtNode::IsInContent() const
5034cdf0e10cSrcweir {
5035cdf0e10cSrcweir     return !GetDoc()->IsInHeaderFooter( SwNodeIndex(*this) );
5036cdf0e10cSrcweir }
5037cdf0e10cSrcweir 
SwClientNotify(const SwModify & rModify,const SfxHint & rHint)5038cdf0e10cSrcweir void SwTxtNode::SwClientNotify( const SwModify& rModify, const SfxHint& rHint )
5039cdf0e10cSrcweir {
5040cdf0e10cSrcweir     const SwAttrHint* pHint = dynamic_cast<const SwAttrHint*>(&rHint);
5041cdf0e10cSrcweir     if ( pHint && pHint->GetId() == RES_CONDTXTFMTCOLL && &rModify == GetRegisteredIn() )
5042cdf0e10cSrcweir         ChkCondColl();
5043cdf0e10cSrcweir }
5044cdf0e10cSrcweir 
5045cdf0e10cSrcweir #include <unoparagraph.hxx>
5046cdf0e10cSrcweir 
5047cdf0e10cSrcweir uno::Reference< rdf::XMetadatable >
MakeUnoObject()5048cdf0e10cSrcweir SwTxtNode::MakeUnoObject()
5049cdf0e10cSrcweir {
5050cdf0e10cSrcweir     const uno::Reference<rdf::XMetadatable> xMeta(
5051cdf0e10cSrcweir             SwXParagraph::CreateXParagraph(*GetDoc(), *this), uno::UNO_QUERY);
5052cdf0e10cSrcweir     return xMeta;
5053cdf0e10cSrcweir }
505469a74367SOliver-Rainer Wittmann 
505591100364SJian Hong Cheng //Bug 120881:Modify here for Directly Page Numbering
HasPageNumberField()505691100364SJian Hong Cheng bool SwTxtNode::HasPageNumberField()
505791100364SJian Hong Cheng {
505869a74367SOliver-Rainer Wittmann     const xub_StrLen nEnd = Len();
505969a74367SOliver-Rainer Wittmann     for( xub_StrLen nStart = 0; nStart < nEnd; ++nStart )
506067da96a4SOliver-Rainer Wittmann     {
506169a74367SOliver-Rainer Wittmann         const SwTxtAttr* pTxtAttr = GetTxtAttrAt( nStart, RES_TXTATR_FIELD );
506269a74367SOliver-Rainer Wittmann         if ( pTxtAttr == NULL )
506369a74367SOliver-Rainer Wittmann         {
506469a74367SOliver-Rainer Wittmann             continue;
506569a74367SOliver-Rainer Wittmann         }
506669a74367SOliver-Rainer Wittmann         const SwField* pSwField = pTxtAttr->GetFmtFld().GetField();
506767da96a4SOliver-Rainer Wittmann         const SwFieldType* pType = pSwField
506867da96a4SOliver-Rainer Wittmann             ? pSwField->GetTyp()
506967da96a4SOliver-Rainer Wittmann             : NULL;
507067da96a4SOliver-Rainer Wittmann         if ( pType && pType->Which() == RES_PAGENUMBERFLD )
507167da96a4SOliver-Rainer Wittmann         {
507267da96a4SOliver-Rainer Wittmann             return true;
507367da96a4SOliver-Rainer Wittmann         }
507467da96a4SOliver-Rainer Wittmann     }
507567da96a4SOliver-Rainer Wittmann     return false;
507691100364SJian Hong Cheng 
507791100364SJian Hong Cheng }
507891100364SJian Hong Cheng //Bug 120881(End)
5079cdf0e10cSrcweir 
5080