Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <hintids.hxx>
21 : #include <hints.hxx>
22 : #include <sfx2/objsh.hxx>
23 : #include <editeng/xmlcnitm.hxx>
24 : #include <editeng/twolinesitem.hxx>
25 : #include <txtinet.hxx>
26 : #include <txtatr.hxx>
27 : #include <fchrfmt.hxx>
28 : #include <fmtinfmt.hxx>
29 : #include <charfmt.hxx>
30 : #include <ndtxt.hxx>
31 : #include <poolfmt.hxx>
32 : #include <doc.hxx>
33 : #include <fmtruby.hxx>
34 : #include <fmtmeta.hxx>
35 : #include <IDocumentState.hxx>
36 : #include <IDocumentStylePoolAccess.hxx>
37 :
38 4584 : TYPEINIT1(SwTxtINetFmt,SwClient);
39 432 : TYPEINIT1(SwTxtRuby,SwClient);
40 :
41 12362 : SwTxtCharFmt::SwTxtCharFmt( SwFmtCharFmt& rAttr,
42 : sal_Int32 nStt, sal_Int32 nEnde )
43 : : SwTxtAttr( rAttr, nStt )
44 : , SwTxtAttrEnd( rAttr, nStt, nEnde )
45 : , m_pTxtNode( 0 )
46 12362 : , m_nSortNumber( 0 )
47 : {
48 12362 : rAttr.pTxtAttr = this;
49 12362 : SetCharFmtAttr( true );
50 12362 : }
51 :
52 24724 : SwTxtCharFmt::~SwTxtCharFmt( )
53 : {
54 24724 : }
55 :
56 8944 : void SwTxtCharFmt::ModifyNotification( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
57 : {
58 8944 : const sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
59 : OSL_ENSURE( isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich)
60 : || (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich),
61 : "SwTxtCharFmt::Modify(): unknown Modify");
62 :
63 8944 : if ( m_pTxtNode )
64 : {
65 : SwUpdateAttr aUpdateAttr(
66 8806 : GetStart(),
67 8806 : *GetEnd(),
68 26418 : nWhich);
69 :
70 8806 : m_pTxtNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
71 : }
72 8944 : }
73 :
74 12 : bool SwTxtCharFmt::GetInfo( SfxPoolItem& rInfo ) const
75 : {
76 24 : if ( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTxtNode ||
77 12 : &m_pTxtNode->GetNodes() != static_cast<SwAutoFmtGetDocNode&>(rInfo).pNodes )
78 : {
79 0 : return true;
80 : }
81 :
82 12 : static_cast<SwAutoFmtGetDocNode&>(rInfo).pCntntNode = m_pTxtNode;
83 12 : return false;
84 : }
85 :
86 3446 : SwTxtAttrNesting::SwTxtAttrNesting( SfxPoolItem & i_rAttr,
87 : const sal_Int32 i_nStart, const sal_Int32 i_nEnd )
88 : : SwTxtAttr( i_rAttr, i_nStart )
89 3446 : , SwTxtAttrEnd( i_rAttr, i_nStart, i_nEnd )
90 : {
91 3446 : SetDontExpand( true ); // never expand this attribute
92 : // lock the expand flag: simple guarantee that nesting will not be
93 : // invalidated by expand operations
94 3446 : SetLockExpandFlag( true );
95 3446 : SetDontExpandStartAttr( true );
96 3446 : SetNesting( true );
97 3446 : }
98 :
99 3446 : SwTxtAttrNesting::~SwTxtAttrNesting()
100 : {
101 3446 : }
102 :
103 2864 : SwTxtINetFmt::SwTxtINetFmt( SwFmtINetFmt& rAttr,
104 : sal_Int32 nStart, sal_Int32 nEnd )
105 : : SwTxtAttr( rAttr, nStart )
106 : , SwTxtAttrNesting( rAttr, nStart, nEnd )
107 : , SwClient( 0 )
108 : , m_pTxtNode( 0 )
109 : , m_bVisited( false )
110 2864 : , m_bVisitedValid( false )
111 : {
112 2864 : rAttr.mpTxtAttr = this;
113 2864 : SetCharFmtAttr( true );
114 2864 : }
115 :
116 5728 : SwTxtINetFmt::~SwTxtINetFmt( )
117 : {
118 5728 : }
119 :
120 27431 : SwCharFmt* SwTxtINetFmt::GetCharFmt()
121 : {
122 27431 : const SwFmtINetFmt& rFmt = SwTxtAttrEnd::GetINetFmt();
123 27431 : SwCharFmt* pRet = NULL;
124 :
125 27431 : if (!rFmt.GetValue().isEmpty())
126 : {
127 27431 : SwDoc* pDoc = GetTxtNode().GetDoc();
128 27431 : if( !IsVisitedValid() )
129 : {
130 2832 : SetVisited( pDoc->IsVisitedURL( rFmt.GetValue() ) );
131 2832 : SetVisitedValid( true );
132 : }
133 :
134 27431 : const sal_uInt16 nId = IsVisited() ? rFmt.GetVisitedFmtId() : rFmt.GetINetFmtId();
135 27431 : const OUString& rStr = IsVisited() ? rFmt.GetVisitedFmt() : rFmt.GetINetFmt();
136 27431 : if (rStr.isEmpty())
137 : {
138 : OSL_ENSURE( false, "<SwTxtINetFmt::GetCharFmt()> - missing character format at hyperlink attribute");
139 : }
140 :
141 : // JP 10.02.2000, Bug 72806: dont modify the doc for getting the
142 : // correct charstyle.
143 27431 : bool bResetMod = !pDoc->getIDocumentState().IsModified();
144 27431 : Link aOle2Lnk;
145 27431 : if ( bResetMod )
146 : {
147 17248 : aOle2Lnk = pDoc->GetOle2Link();
148 17248 : ( (SwDoc*) pDoc )->SetOle2Link( Link() );
149 : }
150 :
151 27431 : pRet = IsPoolUserFmt( nId )
152 : ? ( (SwDoc*) pDoc )->FindCharFmtByName( rStr )
153 27431 : : ( (SwDoc*) pDoc )->getIDocumentStylePoolAccess().GetCharFmtFromPool( nId );
154 :
155 27431 : if ( bResetMod )
156 : {
157 17248 : ( (SwDoc*) pDoc )->getIDocumentState().ResetModified();
158 17248 : ( (SwDoc*) pDoc )->SetOle2Link( aOle2Lnk );
159 : }
160 : }
161 :
162 27431 : if ( pRet )
163 26969 : pRet->Add( this );
164 462 : else if ( GetRegisteredIn() )
165 4 : GetRegisteredInNonConst()->Remove( this );
166 :
167 27431 : return pRet;
168 : }
169 :
170 1512 : void SwTxtINetFmt::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
171 : {
172 1512 : const sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
173 : OSL_ENSURE( isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich)
174 : || (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich),
175 : "SwTxtINetFmt::Modify(): unknown Modify");
176 :
177 1512 : if ( m_pTxtNode )
178 : {
179 : SwUpdateAttr aUpdateAttr(
180 1512 : GetStart(),
181 1512 : *GetEnd(),
182 4536 : nWhich);
183 :
184 1512 : m_pTxtNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
185 : }
186 1512 : }
187 :
188 : // erfrage vom Modify Informationen
189 0 : bool SwTxtINetFmt::GetInfo( SfxPoolItem& rInfo ) const
190 : {
191 0 : if ( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTxtNode ||
192 0 : &m_pTxtNode->GetNodes() != static_cast<SwAutoFmtGetDocNode&>(rInfo).pNodes )
193 : {
194 0 : return true;
195 : }
196 :
197 0 : static_cast<SwAutoFmtGetDocNode&>(rInfo).pCntntNode = m_pTxtNode;
198 0 : return false;
199 : }
200 :
201 0 : bool SwTxtINetFmt::IsProtect( ) const
202 : {
203 0 : return m_pTxtNode && m_pTxtNode->IsProtect();
204 : }
205 :
206 360 : SwTxtRuby::SwTxtRuby( SwFmtRuby& rAttr,
207 : sal_Int32 nStart, sal_Int32 nEnd )
208 : : SwTxtAttr( rAttr, nStart )
209 : , SwTxtAttrNesting( rAttr, nStart, nEnd )
210 : , SwClient( 0 )
211 360 : , m_pTxtNode( 0 )
212 : {
213 360 : rAttr.pTxtAttr = this;
214 360 : }
215 :
216 720 : SwTxtRuby::~SwTxtRuby()
217 : {
218 720 : }
219 :
220 144 : void SwTxtRuby::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew )
221 : {
222 144 : const sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
223 : OSL_ENSURE( isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich)
224 : || (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich),
225 : "SwTxtRuby::Modify(): unknown Modify");
226 :
227 144 : if ( m_pTxtNode )
228 : {
229 : SwUpdateAttr aUpdateAttr(
230 144 : GetStart(),
231 144 : *GetEnd(),
232 432 : nWhich);
233 :
234 144 : m_pTxtNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
235 : }
236 144 : }
237 :
238 2 : bool SwTxtRuby::GetInfo( SfxPoolItem& rInfo ) const
239 : {
240 4 : if( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTxtNode ||
241 2 : &m_pTxtNode->GetNodes() != static_cast<SwAutoFmtGetDocNode&>(rInfo).pNodes )
242 : {
243 0 : return true;
244 : }
245 :
246 2 : static_cast<SwAutoFmtGetDocNode&>(rInfo).pCntntNode = m_pTxtNode;
247 2 : return false;
248 : }
249 :
250 336 : SwCharFmt* SwTxtRuby::GetCharFmt()
251 : {
252 336 : const SwFmtRuby& rFmt = SwTxtAttrEnd::GetRuby();
253 336 : SwCharFmt* pRet = 0;
254 :
255 336 : if( !rFmt.GetText().isEmpty() )
256 : {
257 336 : const SwDoc* pDoc = GetTxtNode().GetDoc();
258 336 : const OUString rStr = rFmt.GetCharFmtName();
259 336 : const sal_uInt16 nId = rStr.isEmpty()
260 : ? static_cast<sal_uInt16>(RES_POOLCHR_RUBYTEXT)
261 336 : : rFmt.GetCharFmtId();
262 :
263 : // JP 10.02.2000, Bug 72806: dont modify the doc for getting the
264 : // correct charstyle.
265 336 : const bool bResetMod = !pDoc->getIDocumentState().IsModified();
266 336 : Link aOle2Lnk;
267 336 : if( bResetMod )
268 : {
269 12 : aOle2Lnk = pDoc->GetOle2Link();
270 12 : ((SwDoc*)pDoc)->SetOle2Link( Link() );
271 : }
272 :
273 336 : pRet = IsPoolUserFmt( nId )
274 : ? ((SwDoc*)pDoc)->FindCharFmtByName( rStr )
275 336 : : ((SwDoc*)pDoc)->getIDocumentStylePoolAccess().GetCharFmtFromPool( nId );
276 :
277 336 : if( bResetMod )
278 : {
279 12 : ((SwDoc*)pDoc)->getIDocumentState().ResetModified();
280 12 : ((SwDoc*)pDoc)->SetOle2Link( aOle2Lnk );
281 336 : }
282 : }
283 :
284 336 : if( pRet )
285 336 : pRet->Add( this );
286 0 : else if( GetRegisteredIn() )
287 0 : GetRegisteredInNonConst()->Remove( this );
288 :
289 336 : return pRet;
290 : }
291 :
292 : SwTxtMeta *
293 194 : SwTxtMeta::CreateTxtMeta(
294 : ::sw::MetaFieldManager & i_rTargetDocManager,
295 : SwTxtNode *const i_pTargetTxtNode,
296 : SwFmtMeta & i_rAttr,
297 : sal_Int32 const i_nStart,
298 : sal_Int32 const i_nEnd,
299 : bool const i_bIsCopy)
300 : {
301 194 : if (i_bIsCopy)
302 : { // i_rAttr is already cloned, now call DoCopy to copy the sw::Meta
303 : OSL_ENSURE(i_pTargetTxtNode, "cannot copy Meta without target node");
304 0 : i_rAttr.DoCopy(i_rTargetDocManager, *i_pTargetTxtNode);
305 : }
306 194 : SwTxtMeta *const pTxtMeta(new SwTxtMeta(i_rAttr, i_nStart, i_nEnd));
307 194 : return pTxtMeta;
308 : }
309 :
310 194 : SwTxtMeta::SwTxtMeta( SwFmtMeta & i_rAttr,
311 : const sal_Int32 i_nStart, const sal_Int32 i_nEnd )
312 : : SwTxtAttr( i_rAttr, i_nStart )
313 194 : , SwTxtAttrNesting( i_rAttr, i_nStart, i_nEnd )
314 : {
315 194 : i_rAttr.SetTxtAttr( this );
316 194 : SetHasDummyChar(true);
317 194 : }
318 :
319 582 : SwTxtMeta::~SwTxtMeta()
320 : {
321 194 : SwFmtMeta & rFmtMeta( static_cast<SwFmtMeta &>(GetAttr()) );
322 194 : if (rFmtMeta.GetTxtAttr() == this)
323 : {
324 194 : rFmtMeta.SetTxtAttr(0);
325 : }
326 388 : }
327 :
328 388 : void SwTxtMeta::ChgTxtNode(SwTxtNode * const pNode)
329 : {
330 388 : SwFmtMeta & rFmtMeta( static_cast<SwFmtMeta &>(GetAttr()) );
331 388 : if (rFmtMeta.GetTxtAttr() == this)
332 : {
333 388 : rFmtMeta.NotifyChangeTxtNode(pNode);
334 : }
335 658 : }
336 :
337 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|