xref: /aoo41x/main/sw/source/core/txtnode/txtatr2.cxx (revision dec99bbd)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 #include <hintids.hxx>
28 #include <hints.hxx>
29 #include <sfx2/objsh.hxx>
30 #include <editeng/xmlcnitm.hxx>
31 #include <editeng/twolinesitem.hxx>
32 #include <txtinet.hxx>
33 #include <txtatr.hxx>
34 #include <fchrfmt.hxx>
35 #include <fmtinfmt.hxx>
36 #include <charfmt.hxx>
37 #include <ndtxt.hxx>        // SwCharFmt, SwTxtNode
38 #include <poolfmt.hxx>		// RES_POOLCHR_INET_...
39 #include <doc.hxx>			// SwDoc
40 #include <fmtruby.hxx>
41 #include <fmtmeta.hxx>
42 
43 
44 TYPEINIT1(SwTxtINetFmt,SwClient);
45 TYPEINIT1(SwTxtRuby,SwClient);
46 
47 
48 /*************************************************************************
49  *						class SwTxtCharFmt
50  *************************************************************************/
51 
52 SwTxtCharFmt::SwTxtCharFmt( SwFmtCharFmt& rAttr,
53                     xub_StrLen nStt, xub_StrLen nEnde )
54     : SwTxtAttrEnd( rAttr, nStt, nEnde )
55     , m_pTxtNode( 0 )
56     , m_nSortNumber( 0 )
57 {
58 	rAttr.pTxtAttr = this;
59 	SetCharFmtAttr( sal_True );
60 }
61 
62 SwTxtCharFmt::~SwTxtCharFmt( )
63 {
64 }
65 
66 void SwTxtCharFmt::ModifyNotification( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
67 {
68 	sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
69     ASSERT(  isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich)
70              || (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich),
71         "SwTxtCharFmt::Modify(): unknown Modify");
72 
73     if ( m_pTxtNode )
74     {
75 		SwUpdateAttr aUpdateAttr( *GetStart(), *GetEnd(), nWhich );
76         m_pTxtNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
77     }
78 }
79 
80 bool SwTxtCharFmt::GetInfo( SfxPoolItem& rInfo ) const
81 {
82     if ( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTxtNode ||
83         &m_pTxtNode->GetNodes() != static_cast<SwAutoFmtGetDocNode&>(rInfo).pNodes )
84     {
85 		return true;
86     }
87 
88     static_cast<SwAutoFmtGetDocNode&>(rInfo).pCntntNode = m_pTxtNode;
89 	return false;
90 }
91 
92 
93 /*************************************************************************
94  *                        class SwTxtAttrNesting
95  *************************************************************************/
96 
97 SwTxtAttrNesting::SwTxtAttrNesting( SfxPoolItem & i_rAttr,
98             const xub_StrLen i_nStart, const xub_StrLen i_nEnd )
99     : SwTxtAttrEnd( i_rAttr, i_nStart, i_nEnd )
100 {
101     SetDontExpand( true );  // never expand this attribute
102     // lock the expand flag: simple guarantee that nesting will not be
103     // invalidated by expand operations
104     SetLockExpandFlag( true );
105     SetDontExpandStartAttr( true );
106     SetNesting( true );
107 }
108 
109 SwTxtAttrNesting::~SwTxtAttrNesting()
110 {
111 }
112 
113 
114 /*************************************************************************
115  *						class SwTxtINetFmt
116  *************************************************************************/
117 
118 SwTxtINetFmt::SwTxtINetFmt( SwFmtINetFmt& rAttr,
119                             xub_StrLen nStart, xub_StrLen nEnd )
120     : SwTxtAttrNesting( rAttr, nStart, nEnd )
121     , SwClient( 0 )
122     , m_pTxtNode( 0 )
123     , m_bVisited( false )
124     , m_bVisitedValid( false )
125 {
126     rAttr.pTxtAttr  = this;
127     SetCharFmtAttr( true );
128 }
129 
130 SwTxtINetFmt::~SwTxtINetFmt( )
131 {
132 }
133 
134 SwCharFmt* SwTxtINetFmt::GetCharFmt()
135 {
136 	const SwFmtINetFmt& rFmt = SwTxtAttrEnd::GetINetFmt();
137 	SwCharFmt* pRet = NULL;
138 
139 	if( rFmt.GetValue().Len() )
140 	{
141 		const SwDoc* pDoc = GetTxtNode().GetDoc();
142         if( !IsVisitedValid() )
143         {
144 			SetVisited( pDoc->IsVisitedURL( rFmt.GetValue() ) );
145             SetVisitedValid( true );
146         }
147 		sal_uInt16 nId;
148 		const String& rStr = IsVisited() ? rFmt.GetVisitedFmt()
149 										   : rFmt.GetINetFmt();
150 		if( rStr.Len() )
151 			nId = IsVisited() ? rFmt.GetVisitedFmtId() : rFmt.GetINetFmtId();
152 		else
153 			nId = static_cast<sal_uInt16>(IsVisited() ? RES_POOLCHR_INET_VISIT : RES_POOLCHR_INET_NORMAL);
154 
155 		// JP 10.02.2000, Bug 72806: dont modify the doc for getting the
156 		//		correct charstyle.
157 		sal_Bool bResetMod = !pDoc->IsModified();
158 		Link aOle2Lnk;
159 		if( bResetMod )
160 		{
161 			aOle2Lnk = pDoc->GetOle2Link();
162 			((SwDoc*)pDoc)->SetOle2Link( Link() );
163 		}
164 
165 		pRet = IsPoolUserFmt( nId )
166 				? ((SwDoc*)pDoc)->FindCharFmtByName( rStr )
167 				: ((SwDoc*)pDoc)->GetCharFmtFromPool( nId );
168 
169 		if( bResetMod )
170 		{
171 			((SwDoc*)pDoc)->ResetModified();
172 			((SwDoc*)pDoc)->SetOle2Link( aOle2Lnk );
173 		}
174 	}
175 
176 	if( pRet )
177 		pRet->Add( this );
178 	else if( GetRegisteredIn() )
179 		GetRegisteredInNonConst()->Remove( this );
180 
181 	return pRet;
182 }
183 
184 void SwTxtINetFmt::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
185 {
186 	sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
187     ASSERT(  isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich)
188              || (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich),
189         "SwTxtINetFmt::Modify(): unknown Modify");
190 
191     if ( m_pTxtNode )
192     {
193 		SwUpdateAttr aUpdateAttr( *GetStart(), *GetEnd(), nWhich );
194         m_pTxtNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
195     }
196 }
197 
198 	// erfrage vom Modify Informationen
199 sal_Bool SwTxtINetFmt::GetInfo( SfxPoolItem& rInfo ) const
200 {
201     if ( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTxtNode ||
202         &m_pTxtNode->GetNodes() != static_cast<SwAutoFmtGetDocNode&>(rInfo).pNodes )
203     {
204 		return sal_True;
205     }
206 
207     static_cast<SwAutoFmtGetDocNode&>(rInfo).pCntntNode = m_pTxtNode;
208 	return sal_False;
209 }
210 
211 sal_Bool SwTxtINetFmt::IsProtect( ) const
212 {
213     return m_pTxtNode && m_pTxtNode->IsProtect();
214 }
215 
216 /*************************************************************************
217  *						class SwTxtRuby
218  *************************************************************************/
219 
220 SwTxtRuby::SwTxtRuby( SwFmtRuby& rAttr,
221                       xub_StrLen nStart, xub_StrLen nEnd )
222     : SwTxtAttrNesting( rAttr, nStart, nEnd )
223     , SwClient( 0 )
224     , m_pTxtNode( 0 )
225 {
226     rAttr.pTxtAttr  = this;
227 }
228 
229 SwTxtRuby::~SwTxtRuby()
230 {
231 }
232 
233 void SwTxtRuby::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew )
234 {
235 	sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
236     ASSERT(  isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich)
237              || (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich),
238         "SwTxtRuby::Modify(): unknown Modify");
239 
240     if ( m_pTxtNode )
241     {
242 		SwUpdateAttr aUpdateAttr( *GetStart(), *GetEnd(), nWhich );
243         m_pTxtNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
244     }
245 }
246 
247 sal_Bool SwTxtRuby::GetInfo( SfxPoolItem& rInfo ) const
248 {
249     if( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTxtNode ||
250         &m_pTxtNode->GetNodes() != static_cast<SwAutoFmtGetDocNode&>(rInfo).pNodes )
251     {
252         return sal_True;
253     }
254 
255     static_cast<SwAutoFmtGetDocNode&>(rInfo).pCntntNode = m_pTxtNode;
256     return sal_False;
257 }
258 
259 SwCharFmt* SwTxtRuby::GetCharFmt()
260 {
261 	const SwFmtRuby& rFmt = SwTxtAttrEnd::GetRuby();
262 	SwCharFmt* pRet = 0;
263 
264 	if( rFmt.GetText().Len() )
265 	{
266 		const SwDoc* pDoc = GetTxtNode().GetDoc();
267 		const String& rStr = rFmt.GetCharFmtName();
268         sal_uInt16 nId = RES_POOLCHR_RUBYTEXT;
269         if ( rStr.Len() )
270             nId = rFmt.GetCharFmtId();
271 
272 		// JP 10.02.2000, Bug 72806: dont modify the doc for getting the
273 		//				correct charstyle.
274 		sal_Bool bResetMod = !pDoc->IsModified();
275 		Link aOle2Lnk;
276 		if( bResetMod )
277 		{
278 			aOle2Lnk = pDoc->GetOle2Link();
279 			((SwDoc*)pDoc)->SetOle2Link( Link() );
280 		}
281 
282 		pRet = IsPoolUserFmt( nId )
283 				? ((SwDoc*)pDoc)->FindCharFmtByName( rStr )
284 				: ((SwDoc*)pDoc)->GetCharFmtFromPool( nId );
285 
286 		if( bResetMod )
287 		{
288 			((SwDoc*)pDoc)->ResetModified();
289 			((SwDoc*)pDoc)->SetOle2Link( aOle2Lnk );
290 		}
291 	}
292 
293 	if( pRet )
294 		pRet->Add( this );
295 	else if( GetRegisteredIn() )
296 		GetRegisteredInNonConst()->Remove( this );
297 
298 	return pRet;
299 }
300 
301 
302 /*************************************************************************
303  *                        class SwTxtMeta
304  *************************************************************************/
305 
306 SwTxtMeta *
307 SwTxtMeta::CreateTxtMeta(
308     ::sw::MetaFieldManager & i_rTargetDocManager,
309     SwTxtNode *const i_pTargetTxtNode,
310     SwFmtMeta & i_rAttr,
311     xub_StrLen const i_nStart,
312     xub_StrLen const i_nEnd,
313     bool const i_bIsCopy)
314 {
315     if (COPY == i_bIsCopy)
316     {   // i_rAttr is already cloned, now call DoCopy to copy the sw::Meta
317         OSL_ENSURE(i_pTargetTxtNode, "cannot copy Meta without target node");
318         i_rAttr.DoCopy(i_rTargetDocManager, *i_pTargetTxtNode);
319     }
320     SwTxtMeta *const pTxtMeta(new SwTxtMeta(i_rAttr, i_nStart, i_nEnd));
321     return pTxtMeta;
322 }
323 
324 SwTxtMeta::SwTxtMeta( SwFmtMeta & i_rAttr,
325         const xub_StrLen i_nStart, const xub_StrLen i_nEnd )
326     : SwTxtAttrNesting( i_rAttr, i_nStart, i_nEnd )
327 {
328     i_rAttr.SetTxtAttr( this );
329     SetHasDummyChar(true);
330 }
331 
332 SwTxtMeta::~SwTxtMeta()
333 {
334     SwFmtMeta & rFmtMeta( static_cast<SwFmtMeta &>(GetAttr()) );
335     if (rFmtMeta.GetTxtAttr() == this)
336     {
337         rFmtMeta.SetTxtAttr(0);
338     }
339 }
340 
341 void SwTxtMeta::ChgTxtNode(SwTxtNode * const pNode)
342 {
343     SwFmtMeta & rFmtMeta( static_cast<SwFmtMeta &>(GetAttr()) );
344     if (rFmtMeta.GetTxtAttr() == this)
345     {
346         rFmtMeta.NotifyChangeTxtNode(pNode);
347     }
348 }
349 
350