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 32 : TYPEINIT1(SwTextINetFormat,SwClient);
39 0 : TYPEINIT1(SwTextRuby,SwClient);
40 :
41 6318 : SwTextCharFormat::SwTextCharFormat( SwFormatCharFormat& rAttr,
42 : sal_Int32 nStt, sal_Int32 nEnde )
43 : : SwTextAttr( rAttr, nStt )
44 : , SwTextAttrEnd( rAttr, nStt, nEnde )
45 : , m_pTextNode( 0 )
46 6318 : , m_nSortNumber( 0 )
47 : {
48 6318 : rAttr.pTextAttr = this;
49 6318 : SetCharFormatAttr( true );
50 6318 : }
51 :
52 18954 : SwTextCharFormat::~SwTextCharFormat( )
53 : {
54 18954 : }
55 :
56 4596 : void SwTextCharFormat::ModifyNotification( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
57 : {
58 4596 : 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 : "SwTextCharFormat::Modify(): unknown Modify");
62 :
63 4596 : if ( m_pTextNode )
64 : {
65 : SwUpdateAttr aUpdateAttr(
66 4527 : GetStart(),
67 4527 : *GetEnd(),
68 13581 : nWhich);
69 :
70 4527 : m_pTextNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
71 : }
72 4596 : }
73 :
74 7 : bool SwTextCharFormat::GetInfo( SfxPoolItem& rInfo ) const
75 : {
76 14 : if ( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTextNode ||
77 7 : &m_pTextNode->GetNodes() != static_cast<SwAutoFormatGetDocNode&>(rInfo).pNodes )
78 : {
79 0 : return true;
80 : }
81 :
82 7 : static_cast<SwAutoFormatGetDocNode&>(rInfo).pContentNode = m_pTextNode;
83 7 : return false;
84 : }
85 :
86 2095 : SwTextAttrNesting::SwTextAttrNesting( SfxPoolItem & i_rAttr,
87 : const sal_Int32 i_nStart, const sal_Int32 i_nEnd )
88 : : SwTextAttr( i_rAttr, i_nStart )
89 2095 : , SwTextAttrEnd( i_rAttr, i_nStart, i_nEnd )
90 : {
91 2095 : SetDontExpand( true ); // never expand this attribute
92 : // lock the expand flag: simple guarantee that nesting will not be
93 : // invalidated by expand operations
94 2095 : SetLockExpandFlag( true );
95 2095 : SetDontExpandStartAttr( true );
96 2095 : SetNesting( true );
97 2095 : }
98 :
99 2095 : SwTextAttrNesting::~SwTextAttrNesting()
100 : {
101 2095 : }
102 :
103 1804 : SwTextINetFormat::SwTextINetFormat( SwFormatINetFormat& rAttr,
104 : sal_Int32 nStart, sal_Int32 nEnd )
105 : : SwTextAttr( rAttr, nStart )
106 : , SwTextAttrNesting( rAttr, nStart, nEnd )
107 : , SwClient( 0 )
108 : , m_pTextNode( 0 )
109 : , m_bVisited( false )
110 1804 : , m_bVisitedValid( false )
111 : {
112 1804 : rAttr.mpTextAttr = this;
113 1804 : SetCharFormatAttr( true );
114 1804 : }
115 :
116 5412 : SwTextINetFormat::~SwTextINetFormat( )
117 : {
118 5412 : }
119 :
120 16045 : SwCharFormat* SwTextINetFormat::GetCharFormat()
121 : {
122 16045 : const SwFormatINetFormat& rFormat = SwTextAttrEnd::GetINetFormat();
123 16045 : SwCharFormat* pRet = NULL;
124 :
125 16045 : if (!rFormat.GetValue().isEmpty())
126 : {
127 16038 : SwDoc* pDoc = GetTextNode().GetDoc();
128 16038 : if( !IsVisitedValid() )
129 : {
130 1786 : SetVisited( pDoc->IsVisitedURL( rFormat.GetValue() ) );
131 1786 : SetVisitedValid( true );
132 : }
133 :
134 16038 : const sal_uInt16 nId = IsVisited() ? rFormat.GetVisitedFormatId() : rFormat.GetINetFormatId();
135 16038 : const OUString& rStr = IsVisited() ? rFormat.GetVisitedFormat() : rFormat.GetINetFormat();
136 16038 : if (rStr.isEmpty())
137 : {
138 : OSL_ENSURE( false, "<SwTextINetFormat::GetCharFormat()> - 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 16038 : bool bResetMod = !pDoc->getIDocumentState().IsModified();
144 16038 : Link<> aOle2Lnk;
145 16038 : if ( bResetMod )
146 : {
147 9729 : aOle2Lnk = pDoc->GetOle2Link();
148 9729 : pDoc->SetOle2Link( Link<>() );
149 : }
150 :
151 16038 : pRet = IsPoolUserFormat( nId )
152 : ? pDoc->FindCharFormatByName( rStr )
153 16038 : : pDoc->getIDocumentStylePoolAccess().GetCharFormatFromPool( nId );
154 :
155 16038 : if ( bResetMod )
156 : {
157 9729 : pDoc->getIDocumentState().ResetModified();
158 9729 : pDoc->SetOle2Link( aOle2Lnk );
159 : }
160 : }
161 :
162 16045 : if ( pRet )
163 15685 : pRet->Add( this );
164 360 : else if ( GetRegisteredIn() )
165 2 : GetRegisteredInNonConst()->Remove( this );
166 :
167 16045 : return pRet;
168 : }
169 :
170 878 : void SwTextINetFormat::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
171 : {
172 878 : 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 : "SwTextINetFormat::Modify(): unknown Modify");
176 :
177 878 : if ( m_pTextNode )
178 : {
179 : SwUpdateAttr aUpdateAttr(
180 878 : GetStart(),
181 878 : *GetEnd(),
182 2634 : nWhich);
183 :
184 878 : m_pTextNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
185 : }
186 878 : }
187 :
188 : // erfrage vom Modify Informationen
189 1 : bool SwTextINetFormat::GetInfo( SfxPoolItem& rInfo ) const
190 : {
191 2 : if ( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTextNode ||
192 1 : &m_pTextNode->GetNodes() != static_cast<SwAutoFormatGetDocNode&>(rInfo).pNodes )
193 : {
194 0 : return true;
195 : }
196 :
197 1 : static_cast<SwAutoFormatGetDocNode&>(rInfo).pContentNode = m_pTextNode;
198 1 : return false;
199 : }
200 :
201 0 : bool SwTextINetFormat::IsProtect( ) const
202 : {
203 0 : return m_pTextNode && m_pTextNode->IsProtect();
204 : }
205 :
206 176 : SwTextRuby::SwTextRuby( SwFormatRuby& rAttr,
207 : sal_Int32 nStart, sal_Int32 nEnd )
208 : : SwTextAttr( rAttr, nStart )
209 : , SwTextAttrNesting( rAttr, nStart, nEnd )
210 : , SwClient( 0 )
211 176 : , m_pTextNode( 0 )
212 : {
213 176 : rAttr.pTextAttr = this;
214 176 : }
215 :
216 528 : SwTextRuby::~SwTextRuby()
217 : {
218 528 : }
219 :
220 71 : void SwTextRuby::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew )
221 : {
222 71 : 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 : "SwTextRuby::Modify(): unknown Modify");
226 :
227 71 : if ( m_pTextNode )
228 : {
229 : SwUpdateAttr aUpdateAttr(
230 71 : GetStart(),
231 71 : *GetEnd(),
232 213 : nWhich);
233 :
234 71 : m_pTextNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
235 : }
236 71 : }
237 :
238 1 : bool SwTextRuby::GetInfo( SfxPoolItem& rInfo ) const
239 : {
240 2 : if( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTextNode ||
241 1 : &m_pTextNode->GetNodes() != static_cast<SwAutoFormatGetDocNode&>(rInfo).pNodes )
242 : {
243 0 : return true;
244 : }
245 :
246 1 : static_cast<SwAutoFormatGetDocNode&>(rInfo).pContentNode = m_pTextNode;
247 1 : return false;
248 : }
249 :
250 157 : SwCharFormat* SwTextRuby::GetCharFormat()
251 : {
252 157 : const SwFormatRuby& rFormat = SwTextAttrEnd::GetRuby();
253 157 : SwCharFormat* pRet = 0;
254 :
255 157 : if( !rFormat.GetText().isEmpty() )
256 : {
257 157 : const SwDoc* pDoc = GetTextNode().GetDoc();
258 157 : const OUString rStr = rFormat.GetCharFormatName();
259 157 : const sal_uInt16 nId = rStr.isEmpty()
260 : ? static_cast<sal_uInt16>(RES_POOLCHR_RUBYTEXT)
261 157 : : rFormat.GetCharFormatId();
262 :
263 : // JP 10.02.2000, Bug 72806: dont modify the doc for getting the
264 : // correct charstyle.
265 157 : const bool bResetMod = !pDoc->getIDocumentState().IsModified();
266 157 : Link<> aOle2Lnk;
267 157 : if( bResetMod )
268 : {
269 12 : aOle2Lnk = pDoc->GetOle2Link();
270 12 : const_cast<SwDoc*>(pDoc)->SetOle2Link( Link<>() );
271 : }
272 :
273 157 : pRet = IsPoolUserFormat( nId )
274 : ? pDoc->FindCharFormatByName( rStr )
275 157 : : const_cast<SwDoc*>(pDoc)->getIDocumentStylePoolAccess().GetCharFormatFromPool( nId );
276 :
277 157 : if( bResetMod )
278 : {
279 12 : const_cast<SwDoc*>(pDoc)->getIDocumentState().ResetModified();
280 12 : const_cast<SwDoc*>(pDoc)->SetOle2Link( aOle2Lnk );
281 157 : }
282 : }
283 :
284 157 : if( pRet )
285 157 : pRet->Add( this );
286 0 : else if( GetRegisteredIn() )
287 0 : GetRegisteredInNonConst()->Remove( this );
288 :
289 157 : return pRet;
290 : }
291 :
292 : SwTextMeta *
293 97 : SwTextMeta::CreateTextMeta(
294 : ::sw::MetaFieldManager & i_rTargetDocManager,
295 : SwTextNode *const i_pTargetTextNode,
296 : SwFormatMeta & i_rAttr,
297 : sal_Int32 const i_nStart,
298 : sal_Int32 const i_nEnd,
299 : bool const i_bIsCopy)
300 : {
301 97 : if (i_bIsCopy)
302 : { // i_rAttr is already cloned, now call DoCopy to copy the sw::Meta
303 : OSL_ENSURE(i_pTargetTextNode, "cannot copy Meta without target node");
304 0 : i_rAttr.DoCopy(i_rTargetDocManager, *i_pTargetTextNode);
305 : }
306 97 : SwTextMeta *const pTextMeta(new SwTextMeta(i_rAttr, i_nStart, i_nEnd));
307 97 : return pTextMeta;
308 : }
309 :
310 97 : SwTextMeta::SwTextMeta( SwFormatMeta & i_rAttr,
311 : const sal_Int32 i_nStart, const sal_Int32 i_nEnd )
312 : : SwTextAttr( i_rAttr, i_nStart )
313 97 : , SwTextAttrNesting( i_rAttr, i_nStart, i_nEnd )
314 : {
315 97 : i_rAttr.SetTextAttr( this );
316 97 : SetHasDummyChar(true);
317 97 : }
318 :
319 388 : SwTextMeta::~SwTextMeta()
320 : {
321 97 : SwFormatMeta & rFormatMeta( static_cast<SwFormatMeta &>(GetAttr()) );
322 97 : if (rFormatMeta.GetTextAttr() == this)
323 : {
324 97 : rFormatMeta.SetTextAttr(0);
325 : }
326 291 : }
327 :
328 194 : void SwTextMeta::ChgTextNode(SwTextNode * const pNode)
329 : {
330 194 : SwFormatMeta & rFormatMeta( static_cast<SwFormatMeta &>(GetAttr()) );
331 194 : if (rFormatMeta.GetTextAttr() == this)
332 : {
333 194 : rFormatMeta.NotifyChangeTextNode(pNode);
334 : }
335 371 : }
336 :
337 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|