xref: /aoo42x/main/sw/source/core/txtnode/txtatr2.cxx (revision 56b35d86)
1efeef26fSAndrew Rist /**************************************************************
2efeef26fSAndrew Rist  *
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
12cdf0e10cSrcweir  *
13efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17efeef26fSAndrew Rist  * specific language governing permissions and limitations
18efeef26fSAndrew Rist  * under the License.
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 
27cdf0e10cSrcweir #include <hintids.hxx>
28cdf0e10cSrcweir #include <hints.hxx>
29cdf0e10cSrcweir #include <sfx2/objsh.hxx>
30cdf0e10cSrcweir #include <editeng/xmlcnitm.hxx>
31cdf0e10cSrcweir #include <editeng/twolinesitem.hxx>
32cdf0e10cSrcweir #include <txtinet.hxx>
33cdf0e10cSrcweir #include <txtatr.hxx>
34cdf0e10cSrcweir #include <fchrfmt.hxx>
35cdf0e10cSrcweir #include <fmtinfmt.hxx>
36cdf0e10cSrcweir #include <charfmt.hxx>
37cdf0e10cSrcweir #include <ndtxt.hxx>        // SwCharFmt, SwTxtNode
38cdf0e10cSrcweir #include <poolfmt.hxx>		// RES_POOLCHR_INET_...
39cdf0e10cSrcweir #include <doc.hxx>			// SwDoc
40cdf0e10cSrcweir #include <fmtruby.hxx>
41cdf0e10cSrcweir #include <fmtmeta.hxx>
42cdf0e10cSrcweir 
43cdf0e10cSrcweir 
44cdf0e10cSrcweir TYPEINIT1(SwTxtINetFmt,SwClient);
45cdf0e10cSrcweir TYPEINIT1(SwTxtRuby,SwClient);
46cdf0e10cSrcweir 
47cdf0e10cSrcweir 
48cdf0e10cSrcweir /*************************************************************************
49cdf0e10cSrcweir  *						class SwTxtCharFmt
50cdf0e10cSrcweir  *************************************************************************/
51cdf0e10cSrcweir 
SwTxtCharFmt(SwFmtCharFmt & rAttr,xub_StrLen nStt,xub_StrLen nEnde)52cdf0e10cSrcweir SwTxtCharFmt::SwTxtCharFmt( SwFmtCharFmt& rAttr,
53cdf0e10cSrcweir                     xub_StrLen nStt, xub_StrLen nEnde )
54cdf0e10cSrcweir     : SwTxtAttrEnd( rAttr, nStt, nEnde )
55cdf0e10cSrcweir     , m_pTxtNode( 0 )
56cdf0e10cSrcweir     , m_nSortNumber( 0 )
57cdf0e10cSrcweir {
58cdf0e10cSrcweir 	rAttr.pTxtAttr = this;
59cdf0e10cSrcweir 	SetCharFmtAttr( sal_True );
60cdf0e10cSrcweir }
61cdf0e10cSrcweir 
~SwTxtCharFmt()62cdf0e10cSrcweir SwTxtCharFmt::~SwTxtCharFmt( )
63cdf0e10cSrcweir {
64cdf0e10cSrcweir }
65cdf0e10cSrcweir 
ModifyNotification(const SfxPoolItem * pOld,const SfxPoolItem * pNew)66cdf0e10cSrcweir void SwTxtCharFmt::ModifyNotification( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
67cdf0e10cSrcweir {
68cdf0e10cSrcweir 	sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
69cdf0e10cSrcweir     ASSERT(  isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich)
70cdf0e10cSrcweir              || (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich),
71cdf0e10cSrcweir         "SwTxtCharFmt::Modify(): unknown Modify");
72cdf0e10cSrcweir 
73cdf0e10cSrcweir     if ( m_pTxtNode )
74cdf0e10cSrcweir     {
75*56b35d86SArmin Le Grand         SwUpdateAttr aUpdateAttr(
76*56b35d86SArmin Le Grand             *GetStart(),
77*56b35d86SArmin Le Grand             *GetEnd(),
78*56b35d86SArmin Le Grand             nWhich);
79*56b35d86SArmin Le Grand 
80cdf0e10cSrcweir         m_pTxtNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
81cdf0e10cSrcweir     }
82cdf0e10cSrcweir }
83cdf0e10cSrcweir 
GetInfo(SfxPoolItem & rInfo) const84cdf0e10cSrcweir bool SwTxtCharFmt::GetInfo( SfxPoolItem& rInfo ) const
85cdf0e10cSrcweir {
86cdf0e10cSrcweir     if ( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTxtNode ||
87cdf0e10cSrcweir         &m_pTxtNode->GetNodes() != static_cast<SwAutoFmtGetDocNode&>(rInfo).pNodes )
88cdf0e10cSrcweir     {
89cdf0e10cSrcweir 		return true;
90cdf0e10cSrcweir     }
91cdf0e10cSrcweir 
92cdf0e10cSrcweir     static_cast<SwAutoFmtGetDocNode&>(rInfo).pCntntNode = m_pTxtNode;
93cdf0e10cSrcweir 	return false;
94cdf0e10cSrcweir }
95cdf0e10cSrcweir 
96cdf0e10cSrcweir 
97cdf0e10cSrcweir /*************************************************************************
98cdf0e10cSrcweir  *                        class SwTxtAttrNesting
99cdf0e10cSrcweir  *************************************************************************/
100cdf0e10cSrcweir 
SwTxtAttrNesting(SfxPoolItem & i_rAttr,const xub_StrLen i_nStart,const xub_StrLen i_nEnd)101cdf0e10cSrcweir SwTxtAttrNesting::SwTxtAttrNesting( SfxPoolItem & i_rAttr,
102cdf0e10cSrcweir             const xub_StrLen i_nStart, const xub_StrLen i_nEnd )
103cdf0e10cSrcweir     : SwTxtAttrEnd( i_rAttr, i_nStart, i_nEnd )
104cdf0e10cSrcweir {
105cdf0e10cSrcweir     SetDontExpand( true );  // never expand this attribute
106cdf0e10cSrcweir     // lock the expand flag: simple guarantee that nesting will not be
107cdf0e10cSrcweir     // invalidated by expand operations
108cdf0e10cSrcweir     SetLockExpandFlag( true );
109cdf0e10cSrcweir     SetDontExpandStartAttr( true );
110cdf0e10cSrcweir     SetNesting( true );
111cdf0e10cSrcweir }
112cdf0e10cSrcweir 
~SwTxtAttrNesting()113cdf0e10cSrcweir SwTxtAttrNesting::~SwTxtAttrNesting()
114cdf0e10cSrcweir {
115cdf0e10cSrcweir }
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 
118cdf0e10cSrcweir /*************************************************************************
119cdf0e10cSrcweir  *						class SwTxtINetFmt
120cdf0e10cSrcweir  *************************************************************************/
121cdf0e10cSrcweir 
SwTxtINetFmt(SwFmtINetFmt & rAttr,xub_StrLen nStart,xub_StrLen nEnd)122cdf0e10cSrcweir SwTxtINetFmt::SwTxtINetFmt( SwFmtINetFmt& rAttr,
123cdf0e10cSrcweir                             xub_StrLen nStart, xub_StrLen nEnd )
124cdf0e10cSrcweir     : SwTxtAttrNesting( rAttr, nStart, nEnd )
125cdf0e10cSrcweir     , SwClient( 0 )
126cdf0e10cSrcweir     , m_pTxtNode( 0 )
127cdf0e10cSrcweir     , m_bVisited( false )
128cdf0e10cSrcweir     , m_bVisitedValid( false )
129cdf0e10cSrcweir {
130782a276cSOliver-Rainer Wittmann     rAttr.mpTxtAttr  = this;
131cdf0e10cSrcweir     SetCharFmtAttr( true );
132cdf0e10cSrcweir }
133cdf0e10cSrcweir 
~SwTxtINetFmt()134cdf0e10cSrcweir SwTxtINetFmt::~SwTxtINetFmt( )
135cdf0e10cSrcweir {
136cdf0e10cSrcweir }
137cdf0e10cSrcweir 
GetCharFmt()138cdf0e10cSrcweir SwCharFmt* SwTxtINetFmt::GetCharFmt()
139cdf0e10cSrcweir {
140782a276cSOliver-Rainer Wittmann     const SwFmtINetFmt& rFmt = SwTxtAttrEnd::GetINetFmt();
141782a276cSOliver-Rainer Wittmann     SwCharFmt* pRet = NULL;
142cdf0e10cSrcweir 
143782a276cSOliver-Rainer Wittmann     if ( rFmt.GetValue().Len() )
144782a276cSOliver-Rainer Wittmann     {
145782a276cSOliver-Rainer Wittmann         const SwDoc* pDoc = GetTxtNode().GetDoc();
146cdf0e10cSrcweir         if( !IsVisitedValid() )
147cdf0e10cSrcweir         {
148782a276cSOliver-Rainer Wittmann             SetVisited( pDoc->IsVisitedURL( rFmt.GetValue() ) );
149cdf0e10cSrcweir             SetVisitedValid( true );
150cdf0e10cSrcweir         }
151782a276cSOliver-Rainer Wittmann 
152782a276cSOliver-Rainer Wittmann         const sal_uInt16 nId = IsVisited() ? rFmt.GetVisitedFmtId() : rFmt.GetINetFmtId();
153782a276cSOliver-Rainer Wittmann         const String& rStr = IsVisited() ? rFmt.GetVisitedFmt() : rFmt.GetINetFmt();
154782a276cSOliver-Rainer Wittmann         if ( rStr.Len() == 0 )
155782a276cSOliver-Rainer Wittmann         {
156782a276cSOliver-Rainer Wittmann             ASSERT( false, "<SwTxtINetFmt::GetCharFmt()> - missing character format at hyperlink attribute");
157782a276cSOliver-Rainer Wittmann         }
158782a276cSOliver-Rainer Wittmann 
159782a276cSOliver-Rainer Wittmann         // JP 10.02.2000, Bug 72806: dont modify the doc for getting the
160782a276cSOliver-Rainer Wittmann         //		correct charstyle.
161782a276cSOliver-Rainer Wittmann         sal_Bool bResetMod = !pDoc->IsModified();
162782a276cSOliver-Rainer Wittmann         Link aOle2Lnk;
163782a276cSOliver-Rainer Wittmann         if ( bResetMod )
164782a276cSOliver-Rainer Wittmann         {
165782a276cSOliver-Rainer Wittmann             aOle2Lnk = pDoc->GetOle2Link();
166782a276cSOliver-Rainer Wittmann             ( (SwDoc*) pDoc )->SetOle2Link( Link() );
167782a276cSOliver-Rainer Wittmann         }
168782a276cSOliver-Rainer Wittmann 
169782a276cSOliver-Rainer Wittmann         pRet = IsPoolUserFmt( nId )
170782a276cSOliver-Rainer Wittmann                ? ( (SwDoc*) pDoc )->FindCharFmtByName( rStr )
171782a276cSOliver-Rainer Wittmann                : ( (SwDoc*) pDoc )->GetCharFmtFromPool( nId );
172782a276cSOliver-Rainer Wittmann 
173782a276cSOliver-Rainer Wittmann         if ( bResetMod )
174782a276cSOliver-Rainer Wittmann         {
175782a276cSOliver-Rainer Wittmann             ( (SwDoc*) pDoc )->ResetModified();
176782a276cSOliver-Rainer Wittmann             ( (SwDoc*) pDoc )->SetOle2Link( aOle2Lnk );
177782a276cSOliver-Rainer Wittmann         }
178782a276cSOliver-Rainer Wittmann     }
179782a276cSOliver-Rainer Wittmann 
180782a276cSOliver-Rainer Wittmann     if ( pRet )
181782a276cSOliver-Rainer Wittmann         pRet->Add( this );
182782a276cSOliver-Rainer Wittmann     else if ( GetRegisteredIn() )
183782a276cSOliver-Rainer Wittmann         GetRegisteredInNonConst()->Remove( this );
184782a276cSOliver-Rainer Wittmann 
185782a276cSOliver-Rainer Wittmann     return pRet;
186cdf0e10cSrcweir }
187cdf0e10cSrcweir 
Modify(const SfxPoolItem * pOld,const SfxPoolItem * pNew)188cdf0e10cSrcweir void SwTxtINetFmt::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
189cdf0e10cSrcweir {
190cdf0e10cSrcweir 	sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
191cdf0e10cSrcweir     ASSERT(  isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich)
192cdf0e10cSrcweir              || (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich),
193cdf0e10cSrcweir         "SwTxtINetFmt::Modify(): unknown Modify");
194cdf0e10cSrcweir 
195cdf0e10cSrcweir     if ( m_pTxtNode )
196cdf0e10cSrcweir     {
197*56b35d86SArmin Le Grand         SwUpdateAttr aUpdateAttr(
198*56b35d86SArmin Le Grand             *GetStart(),
199*56b35d86SArmin Le Grand             *GetEnd(),
200*56b35d86SArmin Le Grand             nWhich);
201*56b35d86SArmin Le Grand 
202cdf0e10cSrcweir         m_pTxtNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
203cdf0e10cSrcweir     }
204cdf0e10cSrcweir }
205cdf0e10cSrcweir 
206cdf0e10cSrcweir 	// erfrage vom Modify Informationen
GetInfo(SfxPoolItem & rInfo) const207cdf0e10cSrcweir sal_Bool SwTxtINetFmt::GetInfo( SfxPoolItem& rInfo ) const
208cdf0e10cSrcweir {
209cdf0e10cSrcweir     if ( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTxtNode ||
210cdf0e10cSrcweir         &m_pTxtNode->GetNodes() != static_cast<SwAutoFmtGetDocNode&>(rInfo).pNodes )
211cdf0e10cSrcweir     {
212cdf0e10cSrcweir 		return sal_True;
213cdf0e10cSrcweir     }
214cdf0e10cSrcweir 
215cdf0e10cSrcweir     static_cast<SwAutoFmtGetDocNode&>(rInfo).pCntntNode = m_pTxtNode;
216cdf0e10cSrcweir 	return sal_False;
217cdf0e10cSrcweir }
218cdf0e10cSrcweir 
IsProtect() const219cdf0e10cSrcweir sal_Bool SwTxtINetFmt::IsProtect( ) const
220cdf0e10cSrcweir {
221cdf0e10cSrcweir     return m_pTxtNode && m_pTxtNode->IsProtect();
222cdf0e10cSrcweir }
223cdf0e10cSrcweir 
224cdf0e10cSrcweir /*************************************************************************
225cdf0e10cSrcweir  *						class SwTxtRuby
226cdf0e10cSrcweir  *************************************************************************/
227cdf0e10cSrcweir 
SwTxtRuby(SwFmtRuby & rAttr,xub_StrLen nStart,xub_StrLen nEnd)228cdf0e10cSrcweir SwTxtRuby::SwTxtRuby( SwFmtRuby& rAttr,
229cdf0e10cSrcweir                       xub_StrLen nStart, xub_StrLen nEnd )
230cdf0e10cSrcweir     : SwTxtAttrNesting( rAttr, nStart, nEnd )
231cdf0e10cSrcweir     , SwClient( 0 )
232cdf0e10cSrcweir     , m_pTxtNode( 0 )
233cdf0e10cSrcweir {
234cdf0e10cSrcweir     rAttr.pTxtAttr  = this;
235cdf0e10cSrcweir }
236cdf0e10cSrcweir 
~SwTxtRuby()237cdf0e10cSrcweir SwTxtRuby::~SwTxtRuby()
238cdf0e10cSrcweir {
239cdf0e10cSrcweir }
240cdf0e10cSrcweir 
Modify(const SfxPoolItem * pOld,const SfxPoolItem * pNew)241cdf0e10cSrcweir void SwTxtRuby::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew )
242cdf0e10cSrcweir {
243cdf0e10cSrcweir 	sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
244cdf0e10cSrcweir     ASSERT(  isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich)
245cdf0e10cSrcweir              || (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich),
246cdf0e10cSrcweir         "SwTxtRuby::Modify(): unknown Modify");
247cdf0e10cSrcweir 
248cdf0e10cSrcweir     if ( m_pTxtNode )
249cdf0e10cSrcweir     {
250*56b35d86SArmin Le Grand         SwUpdateAttr aUpdateAttr(
251*56b35d86SArmin Le Grand             *GetStart(),
252*56b35d86SArmin Le Grand             *GetEnd(),
253*56b35d86SArmin Le Grand             nWhich);
254*56b35d86SArmin Le Grand 
255cdf0e10cSrcweir         m_pTxtNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
256cdf0e10cSrcweir     }
257cdf0e10cSrcweir }
258cdf0e10cSrcweir 
GetInfo(SfxPoolItem & rInfo) const259cdf0e10cSrcweir sal_Bool SwTxtRuby::GetInfo( SfxPoolItem& rInfo ) const
260cdf0e10cSrcweir {
261cdf0e10cSrcweir     if( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTxtNode ||
262cdf0e10cSrcweir         &m_pTxtNode->GetNodes() != static_cast<SwAutoFmtGetDocNode&>(rInfo).pNodes )
263cdf0e10cSrcweir     {
264cdf0e10cSrcweir         return sal_True;
265cdf0e10cSrcweir     }
266cdf0e10cSrcweir 
267cdf0e10cSrcweir     static_cast<SwAutoFmtGetDocNode&>(rInfo).pCntntNode = m_pTxtNode;
268cdf0e10cSrcweir     return sal_False;
269cdf0e10cSrcweir }
270cdf0e10cSrcweir 
GetCharFmt()271cdf0e10cSrcweir SwCharFmt* SwTxtRuby::GetCharFmt()
272cdf0e10cSrcweir {
273cdf0e10cSrcweir 	const SwFmtRuby& rFmt = SwTxtAttrEnd::GetRuby();
274cdf0e10cSrcweir 	SwCharFmt* pRet = 0;
275cdf0e10cSrcweir 
276cdf0e10cSrcweir 	if( rFmt.GetText().Len() )
277cdf0e10cSrcweir 	{
278cdf0e10cSrcweir 		const SwDoc* pDoc = GetTxtNode().GetDoc();
279cdf0e10cSrcweir 		const String& rStr = rFmt.GetCharFmtName();
280cdf0e10cSrcweir         sal_uInt16 nId = RES_POOLCHR_RUBYTEXT;
281cdf0e10cSrcweir         if ( rStr.Len() )
282cdf0e10cSrcweir             nId = rFmt.GetCharFmtId();
283cdf0e10cSrcweir 
284cdf0e10cSrcweir 		// JP 10.02.2000, Bug 72806: dont modify the doc for getting the
285cdf0e10cSrcweir 		//				correct charstyle.
286cdf0e10cSrcweir 		sal_Bool bResetMod = !pDoc->IsModified();
287cdf0e10cSrcweir 		Link aOle2Lnk;
288cdf0e10cSrcweir 		if( bResetMod )
289cdf0e10cSrcweir 		{
290cdf0e10cSrcweir 			aOle2Lnk = pDoc->GetOle2Link();
291cdf0e10cSrcweir 			((SwDoc*)pDoc)->SetOle2Link( Link() );
292cdf0e10cSrcweir 		}
293cdf0e10cSrcweir 
294cdf0e10cSrcweir 		pRet = IsPoolUserFmt( nId )
295cdf0e10cSrcweir 				? ((SwDoc*)pDoc)->FindCharFmtByName( rStr )
296cdf0e10cSrcweir 				: ((SwDoc*)pDoc)->GetCharFmtFromPool( nId );
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 		if( bResetMod )
299cdf0e10cSrcweir 		{
300cdf0e10cSrcweir 			((SwDoc*)pDoc)->ResetModified();
301cdf0e10cSrcweir 			((SwDoc*)pDoc)->SetOle2Link( aOle2Lnk );
302cdf0e10cSrcweir 		}
303cdf0e10cSrcweir 	}
304cdf0e10cSrcweir 
305cdf0e10cSrcweir 	if( pRet )
306cdf0e10cSrcweir 		pRet->Add( this );
307cdf0e10cSrcweir 	else if( GetRegisteredIn() )
308cdf0e10cSrcweir 		GetRegisteredInNonConst()->Remove( this );
309cdf0e10cSrcweir 
310cdf0e10cSrcweir 	return pRet;
311cdf0e10cSrcweir }
312cdf0e10cSrcweir 
313cdf0e10cSrcweir 
314cdf0e10cSrcweir /*************************************************************************
315cdf0e10cSrcweir  *                        class SwTxtMeta
316cdf0e10cSrcweir  *************************************************************************/
317cdf0e10cSrcweir 
318cdf0e10cSrcweir SwTxtMeta *
CreateTxtMeta(::sw::MetaFieldManager & i_rTargetDocManager,SwTxtNode * const i_pTargetTxtNode,SwFmtMeta & i_rAttr,xub_StrLen const i_nStart,xub_StrLen const i_nEnd,bool const i_bIsCopy)319cdf0e10cSrcweir SwTxtMeta::CreateTxtMeta(
320cdf0e10cSrcweir     ::sw::MetaFieldManager & i_rTargetDocManager,
321cdf0e10cSrcweir     SwTxtNode *const i_pTargetTxtNode,
322cdf0e10cSrcweir     SwFmtMeta & i_rAttr,
323dec99bbdSOliver-Rainer Wittmann     xub_StrLen const i_nStart,
324dec99bbdSOliver-Rainer Wittmann     xub_StrLen const i_nEnd,
325dec99bbdSOliver-Rainer Wittmann     bool const i_bIsCopy)
326cdf0e10cSrcweir {
327cdf0e10cSrcweir     if (COPY == i_bIsCopy)
328cdf0e10cSrcweir     {   // i_rAttr is already cloned, now call DoCopy to copy the sw::Meta
329cdf0e10cSrcweir         OSL_ENSURE(i_pTargetTxtNode, "cannot copy Meta without target node");
330cdf0e10cSrcweir         i_rAttr.DoCopy(i_rTargetDocManager, *i_pTargetTxtNode);
331cdf0e10cSrcweir     }
332cdf0e10cSrcweir     SwTxtMeta *const pTxtMeta(new SwTxtMeta(i_rAttr, i_nStart, i_nEnd));
333cdf0e10cSrcweir     return pTxtMeta;
334cdf0e10cSrcweir }
335cdf0e10cSrcweir 
SwTxtMeta(SwFmtMeta & i_rAttr,const xub_StrLen i_nStart,const xub_StrLen i_nEnd)336cdf0e10cSrcweir SwTxtMeta::SwTxtMeta( SwFmtMeta & i_rAttr,
337cdf0e10cSrcweir         const xub_StrLen i_nStart, const xub_StrLen i_nEnd )
338cdf0e10cSrcweir     : SwTxtAttrNesting( i_rAttr, i_nStart, i_nEnd )
339cdf0e10cSrcweir {
340cdf0e10cSrcweir     i_rAttr.SetTxtAttr( this );
341cdf0e10cSrcweir     SetHasDummyChar(true);
342cdf0e10cSrcweir }
343cdf0e10cSrcweir 
~SwTxtMeta()344cdf0e10cSrcweir SwTxtMeta::~SwTxtMeta()
345cdf0e10cSrcweir {
346cdf0e10cSrcweir     SwFmtMeta & rFmtMeta( static_cast<SwFmtMeta &>(GetAttr()) );
347cdf0e10cSrcweir     if (rFmtMeta.GetTxtAttr() == this)
348cdf0e10cSrcweir     {
349cdf0e10cSrcweir         rFmtMeta.SetTxtAttr(0);
350cdf0e10cSrcweir     }
351cdf0e10cSrcweir }
352cdf0e10cSrcweir 
ChgTxtNode(SwTxtNode * const pNode)353cdf0e10cSrcweir void SwTxtMeta::ChgTxtNode(SwTxtNode * const pNode)
354cdf0e10cSrcweir {
355cdf0e10cSrcweir     SwFmtMeta & rFmtMeta( static_cast<SwFmtMeta &>(GetAttr()) );
356cdf0e10cSrcweir     if (rFmtMeta.GetTxtAttr() == this)
357cdf0e10cSrcweir     {
358cdf0e10cSrcweir         rFmtMeta.NotifyChangeTxtNode(pNode);
359cdf0e10cSrcweir     }
360cdf0e10cSrcweir }
361cdf0e10cSrcweir 
362