Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : :
30 : : #include <ctype.h>
31 : : #include <tools/diagnose_ex.h>
32 : : #include <rtl/tencinfo.h>
33 : : #include <svl/itemiter.hxx>
34 : : #include <svl/whiter.hxx>
35 : : #include <svtools/rtftoken.h>
36 : : #include <svl/itempool.hxx>
37 : :
38 : : #include <comphelper/string.hxx>
39 : :
40 : : #include <com/sun/star/lang/Locale.hpp>
41 : : #include <editeng/scriptspaceitem.hxx>
42 : : #include <editeng/fontitem.hxx>
43 : : #include <editeng/colritem.hxx>
44 : : #include <editeng/svxrtf.hxx>
45 : : #include <editeng/editids.hrc>
46 : : #include <vcl/svapp.hxx>
47 : :
48 : : #include <com/sun/star/document/XDocumentProperties.hpp>
49 : :
50 : :
51 : : using namespace ::com::sun::star;
52 : :
53 : :
54 : 0 : CharSet lcl_GetDefaultTextEncodingForRTF()
55 : : {
56 : :
57 : 0 : ::com::sun::star::lang::Locale aLocale;
58 : 0 : ::rtl::OUString aLangString;
59 : :
60 [ # # ][ # # ]: 0 : aLocale = Application::GetSettings().GetLocale();
61 : 0 : aLangString = aLocale.Language;
62 : :
63 [ # # ][ # # ]: 0 : if ( aLangString == "ru" || aLangString == "uk" )
[ # # ]
64 : 0 : return RTL_TEXTENCODING_MS_1251;
65 [ # # ]: 0 : if ( aLangString == "tr" )
66 : 0 : return RTL_TEXTENCODING_MS_1254;
67 : : else
68 : 0 : return RTL_TEXTENCODING_MS_1252;
69 : : }
70 : :
71 : : // -------------- Methods --------------------
72 : :
73 : 0 : SvxRTFParser::SvxRTFParser( SfxItemPool& rPool, SvStream& rIn,
74 : : uno::Reference<document::XDocumentProperties> i_xDocProps,
75 : : int bReadNewDoc )
76 : : : SvRTFParser( rIn, 5 ),
77 : : rStrm(rIn),
78 : : pInsPos( 0 ),
79 : : pAttrPool( &rPool ),
80 : : m_xDocProps( i_xDocProps ),
81 : : pRTFDefaults( 0 ),
82 [ # # ][ # # ]: 0 : nVersionNo( 0 )
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
83 : : {
84 : 0 : bNewDoc = bReadNewDoc;
85 : :
86 : 0 : bChkStyleAttr = bCalcValue = bReadDocInfo = bIsInReadStyleTab = sal_False;
87 : 0 : bIsLeftToRightDef = sal_True;
88 : :
89 : : {
90 [ # # ]: 0 : RTFPlainAttrMapIds aTmp( rPool );
91 : : aPlainMap.insert( aPlainMap.begin(), (sal_uInt16*)&aTmp,
92 [ # # ]: 0 : (sal_uInt16*)&aTmp + (sizeof( RTFPlainAttrMapIds ) / sizeof(sal_uInt16)) );
93 : : }
94 : : {
95 [ # # ]: 0 : RTFPardAttrMapIds aTmp( rPool );
96 : : aPardMap.insert( aPardMap.begin(), (sal_uInt16*)&aTmp,
97 [ # # ]: 0 : (sal_uInt16*)&aTmp + (sizeof( RTFPardAttrMapIds ) / sizeof(sal_uInt16)) );
98 : : }
99 [ # # ][ # # ]: 0 : pDfltFont = new Font;
100 [ # # ]: 0 : pDfltColor = new Color;
101 : 0 : }
102 : :
103 : 0 : void SvxRTFParser::EnterEnvironment()
104 : : {
105 : 0 : }
106 : :
107 : 0 : void SvxRTFParser::LeaveEnvironment()
108 : : {
109 : 0 : }
110 : :
111 : 0 : void SvxRTFParser::ResetPard()
112 : : {
113 : 0 : }
114 : :
115 [ # # ][ # # ]: 0 : SvxRTFParser::~SvxRTFParser()
[ # # ][ # # ]
116 : : {
117 [ # # ]: 0 : if( !aColorTbl.empty() )
118 [ # # ]: 0 : ClearColorTbl();
119 [ # # ]: 0 : if( !aAttrStack.empty() )
120 [ # # ]: 0 : ClearAttrStack();
121 : :
122 [ # # ][ # # ]: 0 : delete pRTFDefaults;
123 : :
124 [ # # ][ # # ]: 0 : delete pInsPos;
125 [ # # ][ # # ]: 0 : delete pDfltFont;
126 : 0 : delete pDfltColor;
127 [ # # ]: 0 : }
128 : :
129 : 0 : void SvxRTFParser::SetInsPos( const SvxPosition& rNew )
130 : : {
131 [ # # ]: 0 : if( pInsPos )
132 [ # # ]: 0 : delete pInsPos;
133 : 0 : pInsPos = rNew.Clone();
134 : 0 : }
135 : :
136 : 0 : SvParserState SvxRTFParser::CallParser()
137 : : {
138 : : DBG_ASSERT( pInsPos, "no insertion position");
139 : :
140 [ # # ]: 0 : if( !pInsPos )
141 : 0 : return SVPAR_ERROR;
142 : :
143 [ # # ]: 0 : if( !aColorTbl.empty() )
144 : 0 : ClearColorTbl();
145 [ # # ]: 0 : if( !aFontTbl.empty() )
146 : 0 : ClearFontTbl();
147 [ # # ]: 0 : if( !aStyleTbl.empty() )
148 : 0 : ClearStyleTbl();
149 [ # # ]: 0 : if( !aAttrStack.empty() )
150 : 0 : ClearAttrStack();
151 : :
152 : 0 : bIsSetDfltTab = sal_False;
153 : 0 : bNewGroup = sal_False;
154 : 0 : nDfltFont = 0;
155 : :
156 : 0 : sBaseURL.Erase();
157 : :
158 : : // generate the correct WhichId table from the set WhichIds.
159 : 0 : BuildWhichTbl();
160 : :
161 : 0 : return SvRTFParser::CallParser();
162 : : }
163 : :
164 : 0 : void SvxRTFParser::Continue( int nToken )
165 : : {
166 : 0 : SvRTFParser::Continue( nToken );
167 : :
168 [ # # ]: 0 : if( SVPAR_PENDING != GetStatus() )
169 : : {
170 : 0 : SetAllAttrOfStk();
171 : : //Regardless of what "color 0" is, word defaults to auto as the default colour.
172 : : //e.g. see #i7713#
173 : : }
174 : 0 : }
175 : :
176 : :
177 : : // is called for each token that is recognized in CallParser
178 : 0 : void SvxRTFParser::NextToken( int nToken )
179 : : {
180 : : sal_Unicode cCh;
181 [ # # # # : 0 : switch( nToken )
# # # # #
# # # # #
# # # # #
# # # #
# ]
182 : : {
183 : 0 : case RTF_COLORTBL: ReadColorTable(); break;
184 : 0 : case RTF_FONTTBL: ReadFontTable(); break;
185 : 0 : case RTF_STYLESHEET: ReadStyleTable(); break;
186 : :
187 : : case RTF_DEFF:
188 [ # # ]: 0 : if( bNewDoc )
189 : : {
190 [ # # ]: 0 : if( !aFontTbl.empty() )
191 : : // Can immediately be set
192 : 0 : SetDefault( nToken, nTokenValue );
193 : : else
194 : : // is set after reading the font table
195 : 0 : nDfltFont = int(nTokenValue);
196 : : }
197 : 0 : break;
198 : :
199 : : case RTF_DEFTAB:
200 : : case RTF_DEFLANG:
201 [ # # ]: 0 : if( bNewDoc )
202 : 0 : SetDefault( nToken, nTokenValue );
203 : 0 : break;
204 : :
205 : :
206 : 0 : case RTF_PICT: ReadBitmapData(); break;
207 : :
208 : 0 : case RTF_LINE: cCh = '\n'; goto INSINGLECHAR;
209 : 0 : case RTF_TAB: cCh = '\t'; goto INSINGLECHAR;
210 : 0 : case RTF_SUBENTRYINDEX: cCh = ':'; goto INSINGLECHAR;
211 : :
212 : 0 : case RTF_EMDASH: cCh = 0x2014; goto INSINGLECHAR;
213 : 0 : case RTF_ENDASH: cCh = 0x2013; goto INSINGLECHAR;
214 : 0 : case RTF_BULLET: cCh = 0x2022; goto INSINGLECHAR;
215 : 0 : case RTF_LQUOTE: cCh = 0x2018; goto INSINGLECHAR;
216 : 0 : case RTF_RQUOTE: cCh = 0x2019; goto INSINGLECHAR;
217 : 0 : case RTF_LDBLQUOTE: cCh = 0x201C; goto INSINGLECHAR;
218 : 0 : case RTF_RDBLQUOTE: cCh = 0x201D; goto INSINGLECHAR;
219 : : INSINGLECHAR:
220 [ # # ]: 0 : aToken = rtl::OUString(cCh);
221 : : // no Break, aToken is set as Text
222 : : case RTF_TEXTTOKEN:
223 : : {
224 : 0 : InsertText();
225 : : // all collected Attributes are set
226 [ # # ]: 0 : for( sal_uInt16 n = aAttrSetList.size(); n; )
227 : : {
228 : 0 : SvxRTFItemStackType* pStkSet = &aAttrSetList[--n];
229 : 0 : SetAttrSet( *pStkSet );
230 : 0 : aAttrSetList.pop_back();
231 : : }
232 : : }
233 : 0 : break;
234 : :
235 : :
236 : : case RTF_PAR:
237 : 0 : InsertPara();
238 : 0 : break;
239 : : case '{':
240 [ # # ]: 0 : if (bNewGroup) // Nesting!
241 : 0 : _GetAttrSet();
242 : 0 : EnterEnvironment();
243 : 0 : bNewGroup = true;
244 : 0 : break;
245 : : case '}':
246 [ # # ]: 0 : if( !bNewGroup ) // Empty Group ??
247 : 0 : AttrGroupEnd();
248 : 0 : LeaveEnvironment();
249 : 0 : bNewGroup = false;
250 : 0 : break;
251 : : case RTF_INFO:
252 [ # # ][ # # ]: 0 : if (bReadDocInfo && bNewDoc && m_xDocProps.is())
[ # # ][ # # ]
253 : 0 : ReadInfo();
254 : : else
255 : 0 : SkipGroup();
256 : 0 : break;
257 : :
258 : : // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
259 : : // First overwrite all (all have to be in one group!!)
260 : : // Could also appear in the RTF-filewithout the IGNORE-Flag; all Groups
261 : : // with the IGNORE-Flag are overwritten in the default branch.
262 : :
263 : : case RTF_SWG_PRTDATA:
264 : : case RTF_FIELD:
265 : : case RTF_ATNID:
266 : : case RTF_ANNOTATION:
267 : :
268 : : case RTF_BKMKSTART:
269 : : case RTF_BKMKEND:
270 : : case RTF_BKMK_KEY:
271 : : case RTF_XE:
272 : : case RTF_TC:
273 : : case RTF_NEXTFILE:
274 : : case RTF_TEMPLATE:
275 : : // RTF_SHPRSLT disabled for #i19718#
276 : 0 : SkipGroup();
277 : 0 : break;
278 : : // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
279 : :
280 : : case RTF_PGDSCNO:
281 : : case RTF_PGBRK:
282 : : case RTF_SHADOW:
283 [ # # ]: 0 : if( RTF_IGNOREFLAG != GetStackPtr( -1 )->nTokenId )
284 : 0 : break;
285 : 0 : nToken = SkipToken( -1 );
286 [ # # ]: 0 : if( '{' == GetStackPtr( -1 )->nTokenId )
287 : 0 : nToken = SkipToken( -1 );
288 : :
289 : 0 : ReadAttr( nToken, &GetAttrSet() );
290 : 0 : break;
291 : :
292 : : default:
293 [ # # # ]: 0 : switch( nToken & ~(0xff | RTF_SWGDEFS) )
294 : : {
295 : : case RTF_PARFMT: // hier gibts keine Swg-Defines
296 : 0 : ReadAttr( nToken, &GetAttrSet() );
297 : 0 : break;
298 : :
299 : : case RTF_CHRFMT:
300 : : case RTF_BRDRDEF:
301 : : case RTF_TABSTOPDEF:
302 : :
303 [ # # ]: 0 : if( RTF_SWGDEFS & nToken)
304 : : {
305 [ # # ]: 0 : if( RTF_IGNOREFLAG != GetStackPtr( -1 )->nTokenId )
306 : 0 : break;
307 : 0 : nToken = SkipToken( -1 );
308 [ # # ]: 0 : if( '{' == GetStackPtr( -1 )->nTokenId )
309 : : {
310 : 0 : nToken = SkipToken( -1 );
311 : : }
312 : : }
313 : 0 : ReadAttr( nToken, &GetAttrSet() );
314 : 0 : break;
315 : : default:
316 : : {
317 [ # # ]: 0 : if( /*( '{' == GetStackPtr( -1 )->nTokenId ) ||*/
[ # # # # ]
318 : 0 : ( RTF_IGNOREFLAG == GetStackPtr( -1 )->nTokenId &&
319 : 0 : '{' == GetStackPtr( -2 )->nTokenId ) )
320 : 0 : SkipGroup();
321 : : }
322 : 0 : break;
323 : : }
324 : 0 : break;
325 : : }
326 : 0 : }
327 : :
328 : 0 : void SvxRTFParser::ReadStyleTable()
329 : : {
330 : 0 : int nToken, bSaveChkStyleAttr = bChkStyleAttr;
331 : 0 : sal_uInt16 nStyleNo = 0;
332 : 0 : int _nOpenBrakets = 1; // the first was already detected earlier!!
333 [ # # ][ # # ]: 0 : SvxRTFStyleType* pStyle = new SvxRTFStyleType( *pAttrPool, &aWhichMap[0] );
[ # # ]
334 [ # # ][ # # ]: 0 : pStyle->aAttrSet.Put( GetRTFDefaults() );
335 : :
336 : 0 : bIsInReadStyleTab = sal_True;
337 : 0 : bChkStyleAttr = sal_False; // Do not check Attribute against the Styles
338 : :
339 [ # # ][ # # ]: 0 : while( _nOpenBrakets && IsParserWorking() )
[ # # ]
340 : : {
341 [ # # ][ # # : 0 : switch( nToken = GetNextToken() )
# # # # #
# # ]
342 : : {
343 [ # # ][ # # ]: 0 : case '}': if( --_nOpenBrakets && IsParserWorking() )
[ # # ]
344 : : // Style has been completely read,
345 : : // so this is still a stable status
346 [ # # ]: 0 : SaveState( RTF_STYLESHEET );
347 : 0 : break;
348 : : case '{':
349 : : {
350 [ # # ][ # # ]: 0 : if( RTF_IGNOREFLAG != GetNextToken() )
351 [ # # ]: 0 : nToken = SkipToken( -1 );
352 [ # # ][ # # ]: 0 : else if( RTF_UNKNOWNCONTROL != ( nToken = GetNextToken() ) &&
[ # # ][ # # ]
353 : : RTF_PN != nToken )
354 [ # # ]: 0 : nToken = SkipToken( -2 );
355 : : else
356 : : {
357 : : // filter out at once
358 [ # # ]: 0 : ReadUnknownData();
359 [ # # ]: 0 : nToken = GetNextToken();
360 [ # # ]: 0 : if( '}' != nToken )
361 : 0 : eState = SVPAR_ERROR;
362 : 0 : break;
363 : : }
364 : 0 : ++_nOpenBrakets;
365 : : }
366 : 0 : break;
367 : :
368 : 0 : case RTF_SBASEDON: pStyle->nBasedOn = sal_uInt16(nTokenValue); pStyle->bBasedOnIsSet=sal_True; break;
369 : 0 : case RTF_SNEXT: pStyle->nNext = sal_uInt16(nTokenValue); break;
370 : : case RTF_OUTLINELEVEL:
371 : 0 : case RTF_SOUTLVL: pStyle->nOutlineNo = sal_uInt8(nTokenValue); break;
372 : 0 : case RTF_S: nStyleNo = (short)nTokenValue; break;
373 : 0 : case RTF_CS: nStyleNo = (short)nTokenValue;
374 : 0 : pStyle->bIsCharFmt = sal_True;
375 : 0 : break;
376 : :
377 : : case RTF_TEXTTOKEN:
378 : : {
379 [ # # ][ # # ]: 0 : pStyle->sName = DelCharAtEnd( aToken, ';' );
380 : :
381 [ # # ]: 0 : if( !aStyleTbl.empty() )
382 : : {
383 [ # # ]: 0 : aStyleTbl.erase(nStyleNo);
384 : : }
385 : : // All data from the font is available, so off to the table
386 [ # # ]: 0 : aStyleTbl.insert( nStyleNo , pStyle);
387 [ # # ][ # # ]: 0 : pStyle = new SvxRTFStyleType( *pAttrPool, &aWhichMap[0] );
[ # # ]
388 [ # # ][ # # ]: 0 : pStyle->aAttrSet.Put( GetRTFDefaults() );
389 : 0 : nStyleNo = 0;
390 : : }
391 : 0 : break;
392 : : default:
393 [ # # # ]: 0 : switch( nToken & ~(0xff | RTF_SWGDEFS) )
394 : : {
395 : : case RTF_PARFMT: // hier gibts keine Swg-Defines
396 [ # # ]: 0 : ReadAttr( nToken, &pStyle->aAttrSet );
397 : 0 : break;
398 : :
399 : : case RTF_CHRFMT:
400 : : case RTF_BRDRDEF:
401 : : case RTF_TABSTOPDEF:
402 : :
403 [ # # ]: 0 : if( RTF_SWGDEFS & nToken)
404 : : {
405 [ # # ][ # # ]: 0 : if( RTF_IGNOREFLAG != GetStackPtr( -1 )->nTokenId )
406 : 0 : break;
407 [ # # ]: 0 : nToken = SkipToken( -1 );
408 [ # # ][ # # ]: 0 : if( '{' == GetStackPtr( -1 )->nTokenId )
409 : : {
410 [ # # ]: 0 : nToken = SkipToken( -1 );
411 : : }
412 : : }
413 [ # # ]: 0 : ReadAttr( nToken, &pStyle->aAttrSet );
414 : 0 : break;
415 : : }
416 : 0 : break;
417 : : }
418 : : }
419 [ # # ][ # # ]: 0 : delete pStyle; // Delete the Last Style
420 [ # # ]: 0 : SkipToken( -1 ); // the closing brace is evaluated "above"
421 : :
422 : : // Flag back to old state
423 : 0 : bChkStyleAttr = bSaveChkStyleAttr;
424 : 0 : bIsInReadStyleTab = sal_False;
425 : 0 : }
426 : :
427 : 0 : void SvxRTFParser::ReadColorTable()
428 : : {
429 : : int nToken;
430 : 0 : sal_uInt8 nRed = 0xff, nGreen = 0xff, nBlue = 0xff;
431 : :
432 [ # # ][ # # ]: 0 : while( '}' != ( nToken = GetNextToken() ) && IsParserWorking() )
[ # # ]
433 : : {
434 [ # # # # : 0 : switch( nToken )
# # ]
435 : : {
436 : 0 : case RTF_RED: nRed = sal_uInt8(nTokenValue); break;
437 : 0 : case RTF_GREEN: nGreen = sal_uInt8(nTokenValue); break;
438 : 0 : case RTF_BLUE: nBlue = sal_uInt8(nTokenValue); break;
439 : :
440 : : case RTF_TEXTTOKEN:
441 [ # # ][ # # ]: 0 : if( 1 == aToken.Len()
442 : 0 : ? aToken.GetChar( 0 ) != ';'
443 : 0 : : STRING_NOTFOUND == aToken.Search( ';' ) )
444 : 0 : break; // At least the ';' must be found
445 : :
446 : : // else no break !!
447 : :
448 : : case ';':
449 [ # # ]: 0 : if( IsParserWorking() )
450 : : {
451 : : // one color is finished, fill in the table
452 : : // try to map the values to SV internal names
453 [ # # ]: 0 : ColorPtr pColor = new Color( nRed, nGreen, nBlue );
454 [ # # ][ # # ]: 0 : if( aColorTbl.empty() &&
[ # # ][ # # ]
[ # # ]
455 : : sal_uInt8(-1) == nRed && sal_uInt8(-1) == nGreen && sal_uInt8(-1) == nBlue )
456 : 0 : pColor->SetColor( COL_AUTO );
457 [ # # ]: 0 : aColorTbl.push_back( pColor );
458 : 0 : nRed = 0, nGreen = 0, nBlue = 0;
459 : :
460 : : // Color has been completely read,
461 : : // so this is still a stable status
462 [ # # ]: 0 : SaveState( RTF_COLORTBL );
463 : : }
464 : 0 : break;
465 : : }
466 : : }
467 : 0 : SkipToken( -1 ); // the closing brace is evaluated "above"
468 : 0 : }
469 : :
470 : 0 : void SvxRTFParser::ReadFontTable()
471 : : {
472 : : int nToken;
473 : 0 : int _nOpenBrakets = 1; // the first was already detected earlier!!
474 [ # # ][ # # ]: 0 : Font* pFont = new Font();
475 : 0 : short nFontNo(0), nInsFontNo (0);
476 [ # # ][ # # ]: 0 : String sAltNm, sFntNm;
477 : 0 : sal_Bool bIsAltFntNm = sal_False, bCheckNewFont;
478 : :
479 [ # # ]: 0 : CharSet nSystemChar = lcl_GetDefaultTextEncodingForRTF();
480 [ # # ]: 0 : pFont->SetCharSet( nSystemChar );
481 [ # # ]: 0 : SetEncoding( nSystemChar );
482 : :
483 [ # # ][ # # ]: 0 : while( _nOpenBrakets && IsParserWorking() )
[ # # ]
484 : : {
485 : 0 : bCheckNewFont = sal_False;
486 [ # # ][ # # : 0 : switch( ( nToken = GetNextToken() ))
# # # # #
# # # # #
# # # ]
487 : : {
488 : : case '}':
489 : 0 : bIsAltFntNm = sal_False;
490 : : // Style has been completely read,
491 : : // so this is still a stable status
492 [ # # ][ # # ]: 0 : if( --_nOpenBrakets <= 1 && IsParserWorking() )
[ # # ]
493 [ # # ]: 0 : SaveState( RTF_FONTTBL );
494 : 0 : bCheckNewFont = sal_True;
495 : 0 : nInsFontNo = nFontNo;
496 : 0 : break;
497 : : case '{':
498 [ # # ][ # # ]: 0 : if( RTF_IGNOREFLAG != GetNextToken() )
499 [ # # ]: 0 : nToken = SkipToken( -1 );
500 : : // immediately skip unknown and all known but non-evaluated
501 : : // groups
502 [ # # ][ # # ]: 0 : else if( RTF_UNKNOWNCONTROL != ( nToken = GetNextToken() ) &&
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
503 : : RTF_PANOSE != nToken && RTF_FNAME != nToken &&
504 : : RTF_FONTEMB != nToken && RTF_FONTFILE != nToken )
505 [ # # ]: 0 : nToken = SkipToken( -2 );
506 : : else
507 : : {
508 : : // filter out at once
509 [ # # ]: 0 : ReadUnknownData();
510 [ # # ]: 0 : nToken = GetNextToken();
511 [ # # ]: 0 : if( '}' != nToken )
512 : 0 : eState = SVPAR_ERROR;
513 : 0 : break;
514 : : }
515 : 0 : ++_nOpenBrakets;
516 : 0 : break;
517 : : case RTF_FROMAN:
518 [ # # ]: 0 : pFont->SetFamily( FAMILY_ROMAN );
519 : 0 : break;
520 : : case RTF_FSWISS:
521 [ # # ]: 0 : pFont->SetFamily( FAMILY_SWISS );
522 : 0 : break;
523 : : case RTF_FMODERN:
524 [ # # ]: 0 : pFont->SetFamily( FAMILY_MODERN );
525 : 0 : break;
526 : : case RTF_FSCRIPT:
527 [ # # ]: 0 : pFont->SetFamily( FAMILY_SCRIPT );
528 : 0 : break;
529 : : case RTF_FDECOR:
530 [ # # ]: 0 : pFont->SetFamily( FAMILY_DECORATIVE );
531 : 0 : break;
532 : : // for technical/symbolic font of the CharSet is changed!
533 : : case RTF_FTECH:
534 [ # # ]: 0 : pFont->SetCharSet( RTL_TEXTENCODING_SYMBOL );
535 : : // deliberate fall through
536 : : case RTF_FNIL:
537 [ # # ]: 0 : pFont->SetFamily( FAMILY_DONTKNOW );
538 : 0 : break;
539 : : case RTF_FCHARSET:
540 [ # # ]: 0 : if (-1 != nTokenValue)
541 : : {
542 : : CharSet nCharSet = rtl_getTextEncodingFromWindowsCharset(
543 [ # # ]: 0 : (sal_uInt8)nTokenValue);
544 [ # # ]: 0 : pFont->SetCharSet(nCharSet);
545 : : //When we're in a font, the fontname is in the font
546 : : //charset, except for symbol fonts I believe
547 [ # # ]: 0 : if (nCharSet == RTL_TEXTENCODING_SYMBOL)
548 : 0 : nCharSet = RTL_TEXTENCODING_DONTKNOW;
549 [ # # ]: 0 : SetEncoding(nCharSet);
550 : : }
551 : 0 : break;
552 : : case RTF_FPRQ:
553 [ # # # ]: 0 : switch( nTokenValue )
554 : : {
555 : : case 1:
556 [ # # ]: 0 : pFont->SetPitch( PITCH_FIXED );
557 : 0 : break;
558 : : case 2:
559 [ # # ]: 0 : pFont->SetPitch( PITCH_VARIABLE );
560 : 0 : break;
561 : : }
562 : 0 : break;
563 : : case RTF_F:
564 : 0 : bCheckNewFont = sal_True;
565 : 0 : nInsFontNo = nFontNo;
566 : 0 : nFontNo = (short)nTokenValue;
567 : 0 : break;
568 : : case RTF_FALT:
569 : 0 : bIsAltFntNm = sal_True;
570 : 0 : break;
571 : : case RTF_TEXTTOKEN:
572 [ # # ]: 0 : DelCharAtEnd( aToken, ';' );
573 [ # # ]: 0 : if ( aToken.Len() )
574 : : {
575 [ # # ]: 0 : if( bIsAltFntNm )
576 [ # # ]: 0 : sAltNm = aToken;
577 : : else
578 [ # # ]: 0 : sFntNm = aToken;
579 : : }
580 : 0 : break;
581 : : }
582 : :
583 [ # # ][ # # ]: 0 : if( bCheckNewFont && 1 >= _nOpenBrakets && sFntNm.Len() ) // one font is ready
[ # # ][ # # ]
584 : : {
585 : : // All data from the font is available, so off to the table
586 [ # # ]: 0 : if (sAltNm.Len())
587 [ # # ][ # # ]: 0 : (sFntNm += ';' ) += sAltNm;
588 : :
589 [ # # ][ # # ]: 0 : pFont->SetName( sFntNm );
590 [ # # ]: 0 : aFontTbl.insert( nInsFontNo, pFont );
591 [ # # ][ # # ]: 0 : pFont = new Font();
592 [ # # ]: 0 : pFont->SetCharSet( nSystemChar );
593 [ # # ]: 0 : sAltNm.Erase();
594 [ # # ]: 0 : sFntNm.Erase();
595 : : }
596 : : }
597 : : // the last one we have to delete manually
598 [ # # ][ # # ]: 0 : delete pFont;
599 [ # # ]: 0 : SkipToken( -1 ); // the closing brace is evaluated "above"
600 : :
601 : : // set the default font in the Document
602 [ # # ][ # # ]: 0 : if( bNewDoc && IsParserWorking() )
[ # # ]
603 [ # # ][ # # ]: 0 : SetDefault( RTF_DEFF, nDfltFont );
[ # # ]
604 : 0 : }
605 : :
606 : 0 : void SvxRTFParser::ReadBitmapData()
607 : : {
608 : 0 : SvRTFParser::ReadBitmapData();
609 : 0 : }
610 : :
611 : 0 : void SvxRTFParser::ReadOLEData()
612 : : {
613 : 0 : SvRTFParser::ReadOLEData();
614 : 0 : }
615 : :
616 : 0 : String& SvxRTFParser::GetTextToEndGroup( String& rStr )
617 : : {
618 : 0 : rStr.Erase( 0 );
619 : 0 : int _nOpenBrakets = 1, nToken; // the first was already detected earlier!!
620 : :
621 [ # # ][ # # ]: 0 : while( _nOpenBrakets && IsParserWorking() )
[ # # ]
622 : : {
623 [ # # # # ]: 0 : switch( nToken = GetNextToken() )
624 : : {
625 : 0 : case '}': --_nOpenBrakets; break;
626 : : case '{':
627 : : {
628 [ # # ]: 0 : if( RTF_IGNOREFLAG != GetNextToken() )
629 : 0 : nToken = SkipToken( -1 );
630 [ # # ]: 0 : else if( RTF_UNKNOWNCONTROL != GetNextToken() )
631 : 0 : nToken = SkipToken( -2 );
632 : : else
633 : : {
634 : : // filter out at once
635 : 0 : ReadUnknownData();
636 : 0 : nToken = GetNextToken();
637 [ # # ]: 0 : if( '}' != nToken )
638 : 0 : eState = SVPAR_ERROR;
639 : 0 : break;
640 : : }
641 : 0 : ++_nOpenBrakets;
642 : : }
643 : 0 : break;
644 : :
645 : : case RTF_TEXTTOKEN:
646 : 0 : rStr += aToken;
647 : 0 : break;
648 : : }
649 : : }
650 : 0 : SkipToken( -1 ); // the closing brace is evaluated "above"
651 : 0 : return rStr;
652 : : }
653 : :
654 : 0 : util::DateTime SvxRTFParser::GetDateTimeStamp( )
655 : : {
656 : 0 : util::DateTime aDT;
657 : 0 : sal_Bool bWeiter = sal_True;
658 : :
659 [ # # ][ # # ]: 0 : while( bWeiter && IsParserWorking() )
[ # # ]
660 : : {
661 : 0 : int nToken = GetNextToken();
662 [ # # # # : 0 : switch( nToken )
# # ]
663 : : {
664 : 0 : case RTF_YR: aDT.Year = (sal_uInt16)nTokenValue; break;
665 : 0 : case RTF_MO: aDT.Month = (sal_uInt16)nTokenValue; break;
666 : 0 : case RTF_DY: aDT.Day = (sal_uInt16)nTokenValue; break;
667 : 0 : case RTF_HR: aDT.Hours = (sal_uInt16)nTokenValue; break;
668 : 0 : case RTF_MIN: aDT.Minutes = (sal_uInt16)nTokenValue; break;
669 : : default:
670 : 0 : bWeiter = sal_False;
671 : : }
672 : : }
673 : 0 : SkipToken( -1 ); // the closing brace is evaluated "above"
674 : 0 : return aDT;
675 : : }
676 : :
677 : 0 : void SvxRTFParser::ReadInfo( const sal_Char* pChkForVerNo )
678 : : {
679 : 0 : int _nOpenBrakets = 1, nToken; // the first was already detected earlier!!
680 : : DBG_ASSERT(m_xDocProps.is(),
681 : : "SvxRTFParser::ReadInfo: no DocumentProperties");
682 [ # # ][ # # ]: 0 : String sStr, sComment;
683 : 0 : long nVersNo = 0;
684 : :
685 [ # # ][ # # ]: 0 : while( _nOpenBrakets && IsParserWorking() )
[ # # ]
686 : : {
687 [ # # ][ # # : 0 : switch( nToken = GetNextToken() )
# # # # #
# # # # #
# # # #
# ]
688 : : {
689 : 0 : case '}': --_nOpenBrakets; break;
690 : : case '{':
691 : : {
692 [ # # ][ # # ]: 0 : if( RTF_IGNOREFLAG != GetNextToken() )
693 [ # # ]: 0 : nToken = SkipToken( -1 );
694 [ # # ][ # # ]: 0 : else if( RTF_UNKNOWNCONTROL != GetNextToken() )
695 [ # # ]: 0 : nToken = SkipToken( -2 );
696 : : else
697 : : {
698 : : // filter out at once
699 [ # # ]: 0 : ReadUnknownData();
700 [ # # ]: 0 : nToken = GetNextToken();
701 [ # # ]: 0 : if( '}' != nToken )
702 : 0 : eState = SVPAR_ERROR;
703 : 0 : break;
704 : : }
705 : 0 : ++_nOpenBrakets;
706 : : }
707 : 0 : break;
708 : :
709 : : case RTF_TITLE:
710 [ # # ][ # # ]: 0 : m_xDocProps->setTitle( GetTextToEndGroup( sStr ) );
[ # # ][ # # ]
711 : 0 : break;
712 : : case RTF_SUBJECT:
713 [ # # ][ # # ]: 0 : m_xDocProps->setSubject( GetTextToEndGroup( sStr ) );
[ # # ][ # # ]
714 : 0 : break;
715 : : case RTF_AUTHOR:
716 [ # # ][ # # ]: 0 : m_xDocProps->setAuthor( GetTextToEndGroup( sStr ) );
[ # # ][ # # ]
717 : 0 : break;
718 : : case RTF_OPERATOR:
719 [ # # ][ # # ]: 0 : m_xDocProps->setModifiedBy( GetTextToEndGroup( sStr ) );
[ # # ][ # # ]
720 : 0 : break;
721 : : case RTF_KEYWORDS:
722 : : {
723 [ # # ][ # # ]: 0 : ::rtl::OUString sTemp = GetTextToEndGroup( sStr );
724 [ # # ]: 0 : m_xDocProps->setKeywords(
725 [ # # ][ # # ]: 0 : ::comphelper::string::convertCommaSeparated(sTemp) );
[ # # ]
726 : 0 : break;
727 : : }
728 : : case RTF_DOCCOMM:
729 [ # # ][ # # ]: 0 : m_xDocProps->setDescription( GetTextToEndGroup( sStr ) );
[ # # ][ # # ]
730 : 0 : break;
731 : :
732 : : case RTF_HLINKBASE:
733 [ # # ][ # # ]: 0 : sBaseURL = GetTextToEndGroup( sStr ) ;
734 : 0 : break;
735 : :
736 : : case RTF_CREATIM:
737 [ # # ][ # # ]: 0 : m_xDocProps->setCreationDate( GetDateTimeStamp() );
[ # # ]
738 : 0 : break;
739 : :
740 : : case RTF_REVTIM:
741 [ # # ][ # # ]: 0 : m_xDocProps->setModificationDate( GetDateTimeStamp() );
[ # # ]
742 : 0 : break;
743 : :
744 : : case RTF_PRINTIM:
745 [ # # ][ # # ]: 0 : m_xDocProps->setPrintDate( GetDateTimeStamp() );
[ # # ]
746 : 0 : break;
747 : :
748 : : case RTF_COMMENT:
749 [ # # ]: 0 : GetTextToEndGroup( sComment );
750 : 0 : break;
751 : :
752 : : case RTF_BUPTIM:
753 [ # # ]: 0 : SkipGroup();
754 : 0 : break;
755 : :
756 : : case RTF_VERN:
757 : 0 : nVersNo = nTokenValue;
758 : 0 : break;
759 : :
760 : : case RTF_EDMINS:
761 : : case RTF_ID:
762 : : case RTF_VERSION:
763 : : case RTF_NOFPAGES:
764 : : case RTF_NOFWORDS:
765 : : case RTF_NOFCHARS:
766 [ # # ]: 0 : NextToken( nToken );
767 : 0 : break;
768 : :
769 : : // default:
770 : : }
771 : : }
772 : :
773 [ # # ][ # # ]: 0 : if( pChkForVerNo &&
[ # # ]
774 [ # # ]: 0 : COMPARE_EQUAL == sComment.CompareToAscii( pChkForVerNo ))
775 : 0 : nVersionNo = nVersNo;
776 : :
777 [ # # ][ # # ]: 0 : SkipToken( -1 ); // the closing brace is evaluated "above"
[ # # ]
778 : 0 : }
779 : :
780 : :
781 : 0 : void SvxRTFParser::ClearColorTbl()
782 : : {
783 [ # # ]: 0 : while ( !aColorTbl.empty() )
784 : : {
785 : 0 : delete aColorTbl.back();
786 : 0 : aColorTbl.pop_back();
787 : : }
788 : 0 : }
789 : :
790 : 0 : void SvxRTFParser::ClearFontTbl()
791 : : {
792 : 0 : aFontTbl.clear();
793 : 0 : }
794 : :
795 : 0 : void SvxRTFParser::ClearStyleTbl()
796 : : {
797 : 0 : aStyleTbl.clear();
798 : 0 : }
799 : :
800 : 0 : void SvxRTFParser::ClearAttrStack()
801 : : {
802 : : SvxRTFItemStackType* pTmp;
803 [ # # ]: 0 : for( size_t nCnt = aAttrStack.size(); nCnt; --nCnt )
804 : : {
805 : 0 : pTmp = aAttrStack.back();
806 : 0 : aAttrStack.pop_back();
807 [ # # ]: 0 : delete pTmp;
808 : : }
809 : 0 : }
810 : :
811 : 0 : String& SvxRTFParser::DelCharAtEnd( String& rStr, const sal_Unicode cDel )
812 : : {
813 [ # # ][ # # ]: 0 : if( rStr.Len() && ' ' == rStr.GetChar( 0 ))
[ # # ]
814 [ # # ][ # # ]: 0 : rStr = comphelper::string::stripStart(rStr, ' ');
815 [ # # ][ # # ]: 0 : if( rStr.Len() && ' ' == rStr.GetChar( rStr.Len()-1 ))
[ # # ]
816 [ # # ][ # # ]: 0 : rStr = comphelper::string::stripEnd(rStr, ' ');
817 [ # # ][ # # ]: 0 : if( rStr.Len() && cDel == rStr.GetChar( rStr.Len()-1 ))
[ # # ]
818 : 0 : rStr.Erase( rStr.Len()-1 );
819 : 0 : return rStr;
820 : : }
821 : :
822 : :
823 : 0 : const Font& SvxRTFParser::GetFont( sal_uInt16 nId )
824 : : {
825 [ # # ][ # # ]: 0 : SvxRTFFontTbl::const_iterator it = aFontTbl.find( nId );
826 : : const Font* pFont;
827 [ # # ][ # # ]: 0 : if( it == aFontTbl.end() )
[ # # ]
828 : : {
829 : : const SvxFontItem& rDfltFont = (const SvxFontItem&)
830 : : pAttrPool->GetDefaultItem(
831 [ # # ][ # # ]: 0 : ((RTFPlainAttrMapIds*)&aPlainMap[0])->nFont );
832 [ # # ][ # # ]: 0 : pDfltFont->SetName( rDfltFont.GetStyleName() );
833 [ # # ]: 0 : pDfltFont->SetFamily( rDfltFont.GetFamily() );
834 : 0 : pFont = pDfltFont;
835 : : }
836 : : else
837 [ # # ]: 0 : pFont = it->second;
838 : 0 : return *pFont;
839 : : }
840 : :
841 : 0 : SvxRTFItemStackType* SvxRTFParser::_GetAttrSet( int bCopyAttr )
842 : : {
843 [ # # ][ # # ]: 0 : SvxRTFItemStackType* pAkt = aAttrStack.empty() ? 0 : aAttrStack.back();
844 : : SvxRTFItemStackType* pNew;
845 [ # # ]: 0 : if( pAkt )
846 [ # # ][ # # ]: 0 : pNew = new SvxRTFItemStackType( *pAkt, *pInsPos, bCopyAttr );
847 : : else
848 : 0 : pNew = new SvxRTFItemStackType( *pAttrPool, &aWhichMap[0],
849 [ # # ][ # # ]: 0 : *pInsPos );
[ # # ]
850 [ # # ][ # # ]: 0 : pNew->SetRTFDefaults( GetRTFDefaults() );
851 : :
852 [ # # ]: 0 : aAttrStack.push_back( pNew );
853 : 0 : bNewGroup = sal_False;
854 : 0 : return pNew;
855 : : }
856 : :
857 : :
858 : 0 : void SvxRTFParser::_ClearStyleAttr( SvxRTFItemStackType& rStkType )
859 : : {
860 : : // check attributes to the attributes of the stylesheet or to
861 : : // the default attrs of the document
862 : 0 : SfxItemSet &rSet = rStkType.GetAttrSet();
863 : 0 : const SfxItemPool& rPool = *rSet.GetPool();
864 : : const SfxPoolItem* pItem;
865 [ # # ]: 0 : SfxWhichIter aIter( rSet );
866 : :
867 [ # # # # ]: 0 : if( !IsChkStyleAttr() ||
[ # # ][ # # ]
868 : 0 : !rStkType.GetAttrSet().Count() ||
869 [ # # ]: 0 : aStyleTbl.count( rStkType.nStyleNo ) == 0 )
870 : : {
871 [ # # ][ # # ]: 0 : for( sal_uInt16 nWhich = aIter.GetCurWhich(); nWhich; nWhich = aIter.NextWhich() )
872 : : {
873 [ # # ][ # # ]: 0 : if( SFX_WHICH_MAX > nWhich &&
[ # # ][ # # ]
874 [ # # ]: 0 : SFX_ITEM_SET == rSet.GetItemState( nWhich, sal_False, &pItem ) &&
875 [ # # ][ # # ]: 0 : rPool.GetDefaultItem( nWhich ) == *pItem )
876 [ # # ]: 0 : rSet.ClearItem( nWhich ); // delete
877 : : }
878 : : }
879 : : else
880 : : {
881 : : // Delete all Attributes, which are already defined in the Style,
882 : : // from the current AttrSet.
883 [ # # ][ # # ]: 0 : SvxRTFStyleType* pStyle = aStyleTbl.find( rStkType.nStyleNo )->second;
884 : 0 : SfxItemSet &rStyleSet = pStyle->aAttrSet;
885 : : const SfxPoolItem* pSItem;
886 [ # # ][ # # ]: 0 : for( sal_uInt16 nWhich = aIter.GetCurWhich(); nWhich; nWhich = aIter.NextWhich() )
887 : : {
888 [ # # ][ # # ]: 0 : if( SFX_ITEM_SET == rStyleSet.GetItemState( nWhich, sal_True, &pSItem ))
889 : : {
890 [ # # ][ # # ]: 0 : if( SFX_ITEM_SET == rSet.GetItemState( nWhich, sal_False, &pItem )
[ # # ][ # # ]
891 [ # # ]: 0 : && *pItem == *pSItem )
892 [ # # ]: 0 : rSet.ClearItem( nWhich ); // delete
893 : : }
894 [ # # ][ # # ]: 0 : else if( SFX_WHICH_MAX > nWhich &&
[ # # ][ # # ]
895 [ # # ]: 0 : SFX_ITEM_SET == rSet.GetItemState( nWhich, sal_False, &pItem ) &&
896 [ # # ][ # # ]: 0 : rPool.GetDefaultItem( nWhich ) == *pItem )
897 [ # # ]: 0 : rSet.ClearItem( nWhich ); // delete
898 : : }
899 [ # # ]: 0 : }
900 : 0 : }
901 : :
902 : 0 : void SvxRTFParser::AttrGroupEnd() // process the current, delete from Stack
903 : : {
904 [ # # ]: 0 : if( !aAttrStack.empty() )
905 : : {
906 [ # # ]: 0 : SvxRTFItemStackType *pOld = aAttrStack.empty() ? 0 : aAttrStack.back();
907 : 0 : aAttrStack.pop_back();
908 [ # # ]: 0 : SvxRTFItemStackType *pAkt = aAttrStack.empty() ? 0 : aAttrStack.back();
909 : :
910 : : do { // middle check loop
911 : 0 : sal_uLong nOldSttNdIdx = pOld->pSttNd->GetIdx();
912 [ # # # # : 0 : if( !pOld->pChildList &&
# # ][ # # ]
[ # # # # ]
913 : 0 : ((!pOld->aAttrSet.Count() && !pOld->nStyleNo ) ||
914 : 0 : (nOldSttNdIdx == pInsPos->GetNodeIdx() &&
915 : 0 : pOld->nSttCnt == pInsPos->GetCntIdx() )))
916 : 0 : break; // no attributes or Area
917 : :
918 : : // set only the attributes that are different from the parent
919 [ # # ][ # # ]: 0 : if( pAkt && pOld->aAttrSet.Count() )
[ # # ]
920 : : {
921 [ # # ]: 0 : SfxItemIter aIter( pOld->aAttrSet );
922 : 0 : const SfxPoolItem* pItem = aIter.GetCurItem(), *pGet;
923 : 0 : while( sal_True )
924 : : {
925 [ # # ][ # # ]: 0 : if( SFX_ITEM_SET == pAkt->aAttrSet.GetItemState(
[ # # ]
926 [ # # ]: 0 : pItem->Which(), sal_False, &pGet ) &&
927 [ # # ]: 0 : *pItem == *pGet )
928 [ # # ]: 0 : pOld->aAttrSet.ClearItem( pItem->Which() );
929 : :
930 [ # # ]: 0 : if( aIter.IsAtEnd() )
931 : 0 : break;
932 [ # # ]: 0 : pItem = aIter.NextItem();
933 : : }
934 : :
935 [ # # ][ # # ]: 0 : if( !pOld->aAttrSet.Count() && !pOld->pChildList &&
[ # # ][ # # ]
936 : 0 : !pOld->nStyleNo )
937 [ # # ][ # # ]: 0 : break;
938 : : }
939 : :
940 : : // Set all attributes which have been defined from start until here
941 : 0 : int bCrsrBack = !pInsPos->GetCntIdx();
942 [ # # ]: 0 : if( bCrsrBack )
943 : : {
944 : : // at the beginning of a paragraph? Move back one position
945 : 0 : sal_uLong nNd = pInsPos->GetNodeIdx();
946 : 0 : MovePos( sal_False );
947 : : // if can not move backward then later dont move forward !
948 : 0 : bCrsrBack = nNd != pInsPos->GetNodeIdx();
949 : : }
950 : :
951 [ # # # # : 0 : if( ( pOld->pSttNd->GetIdx() < pInsPos->GetNodeIdx() ||
# # ][ # # ]
952 : 0 : ( pOld->pSttNd->GetIdx() == pInsPos->GetNodeIdx() &&
953 : 0 : pOld->nSttCnt <= pInsPos->GetCntIdx() ))
954 : : )
955 : : {
956 [ # # ]: 0 : if( !bCrsrBack )
957 : : {
958 : : // all pard attributes are only valid until the previous
959 : : // paragraph !!
960 [ # # ]: 0 : if( nOldSttNdIdx == pInsPos->GetNodeIdx() )
961 : : {
962 : : }
963 : : else
964 : : {
965 : : // Now it gets complicated:
966 : : // - all character attributes sre keep the area
967 : : // - all paragraph attributes to get the area
968 : : // up to the previous paragraph
969 : : SvxRTFItemStackType* pNew = new SvxRTFItemStackType(
970 [ # # ]: 0 : *pOld, *pInsPos, sal_True );
971 : 0 : pNew->aAttrSet.SetParent( pOld->aAttrSet.GetParent() );
972 : :
973 : : // Delete all paragraph attributes from pNew
974 [ # # # # ]: 0 : for( sal_uInt16 n = 0; n < aPardMap.size() &&
[ # # ]
975 : 0 : pNew->aAttrSet.Count(); ++n )
976 [ # # ]: 0 : if( aPardMap[n] )
977 : 0 : pNew->aAttrSet.ClearItem( aPardMap[n] );
978 : 0 : pNew->SetRTFDefaults( GetRTFDefaults() );
979 : :
980 : : // Were there any?
981 [ # # ]: 0 : if( pNew->aAttrSet.Count() == pOld->aAttrSet.Count() )
982 [ # # ]: 0 : delete pNew;
983 : : else
984 : : {
985 : 0 : pNew->nStyleNo = 0;
986 : :
987 : : // Now span the real area of pNew from old
988 : 0 : SetEndPrevPara( pOld->pEndNd, pOld->nEndCnt );
989 : 0 : pNew->nSttCnt = 0;
990 : :
991 [ # # ]: 0 : if( IsChkStyleAttr() )
992 : : {
993 : 0 : _ClearStyleAttr( *pOld );
994 : 0 : _ClearStyleAttr( *pNew ); //#i10381#, methinks.
995 : : }
996 : :
997 [ # # ]: 0 : if( pAkt )
998 : : {
999 : 0 : pAkt->Add( pOld );
1000 : 0 : pAkt->Add( pNew );
1001 : : }
1002 : : else
1003 : : {
1004 : : // Last off the stack, thus cache it until the next text was
1005 : : // read. (Span no attributes!)
1006 : :
1007 : 0 : aAttrSetList.push_back( pOld );
1008 : 0 : aAttrSetList.push_back( pNew );
1009 : : }
1010 : 0 : pOld = 0; // Do not delete pOld
1011 : 0 : break;
1012 : : }
1013 : : }
1014 : : }
1015 : :
1016 : 0 : pOld->pEndNd = pInsPos->MakeNodeIdx();
1017 : 0 : pOld->nEndCnt = pInsPos->GetCntIdx();
1018 : :
1019 : : /*
1020 : : #i21422#
1021 : : If the parent (pAkt) sets something e.g. , and the child (pOld)
1022 : : unsets it and the style both are based on has it unset then
1023 : : clearing the pOld by looking at the style is clearly a disaster
1024 : : as the text ends up with pAkts bold and not pOlds no bold, this
1025 : : should be rethought out. For the moment its safest to just do
1026 : : the clean if we have no parent, all we suffer is too many
1027 : : redundant properties.
1028 : : */
1029 [ # # ][ # # ]: 0 : if (IsChkStyleAttr() && !pAkt)
[ # # ]
1030 : 0 : _ClearStyleAttr( *pOld );
1031 : :
1032 [ # # ]: 0 : if( pAkt )
1033 : : {
1034 : 0 : pAkt->Add( pOld );
1035 : : // split up and create new entry, because it make no sense
1036 : : // to create a "so long" depend list. Bug 95010
1037 [ # # ][ # # ]: 0 : if( bCrsrBack && 50 < pAkt->pChildList->size() )
[ # # ]
1038 : : {
1039 : : // at the beginning of a paragraph? Move back one position
1040 [ # # ]: 0 : MovePos( sal_True );
1041 : 0 : bCrsrBack = sal_False;
1042 : :
1043 : : // Open a new Group.
1044 : : SvxRTFItemStackType* pNew = new SvxRTFItemStackType(
1045 [ # # ][ # # ]: 0 : *pAkt, *pInsPos, sal_True );
1046 [ # # ][ # # ]: 0 : pNew->SetRTFDefaults( GetRTFDefaults() );
1047 : :
1048 : : // Set all until here valid Attributes
1049 [ # # ]: 0 : AttrGroupEnd();
1050 [ # # ][ # # ]: 0 : pAkt = aAttrStack.empty() ? 0 : aAttrStack.back(); // can be changed after AttrGroupEnd!
1051 [ # # ]: 0 : pNew->aAttrSet.SetParent( pAkt ? &pAkt->aAttrSet : 0 );
1052 [ # # ]: 0 : aAttrStack.push_back( pNew );
1053 : 0 : pAkt = pNew;
1054 : : }
1055 : : }
1056 : : else
1057 : : // Last off the stack, thus cache it until the next text was
1058 : : // read. (Span no attributes!)
1059 : 0 : aAttrSetList.push_back( pOld );
1060 : :
1061 : 0 : pOld = 0;
1062 : : }
1063 : :
1064 [ # # ]: 0 : if( bCrsrBack )
1065 : : // at the beginning of a paragraph? Move back one position
1066 : 0 : MovePos( sal_True );
1067 : :
1068 : : } while( sal_False );
1069 : :
1070 [ # # ]: 0 : if( pOld )
1071 [ # # ]: 0 : delete pOld;
1072 : :
1073 : 0 : bNewGroup = sal_False;
1074 : : }
1075 : 0 : }
1076 : :
1077 : 0 : void SvxRTFParser::SetAllAttrOfStk() // end all Attr. and set it into doc
1078 : : {
1079 : : // repeat until all attributes will be taken from stack
1080 [ # # ]: 0 : while( !aAttrStack.empty() )
1081 : 0 : AttrGroupEnd();
1082 : :
1083 [ # # ]: 0 : for( sal_uInt16 n = aAttrSetList.size(); n; )
1084 : : {
1085 : 0 : SvxRTFItemStackType* pStkSet = &aAttrSetList[--n];
1086 : 0 : SetAttrSet( *pStkSet );
1087 : 0 : aAttrSetList.pop_back();
1088 : : }
1089 : 0 : }
1090 : :
1091 : : // sets all the attributes that are different from the current
1092 : 0 : void SvxRTFParser::SetAttrSet( SvxRTFItemStackType &rSet )
1093 : : {
1094 : : // Was DefTab never read? then set to default
1095 [ # # ]: 0 : if( !bIsSetDfltTab )
1096 : 0 : SetDefault( RTF_DEFTAB, 720 );
1097 : :
1098 [ # # ]: 0 : if( rSet.pChildList )
1099 : 0 : rSet.Compress( *this );
1100 [ # # ][ # # ]: 0 : if( rSet.aAttrSet.Count() || rSet.nStyleNo )
[ # # ]
1101 : 0 : SetAttrInDoc( rSet );
1102 : :
1103 : : // then process all the children
1104 [ # # ]: 0 : if( rSet.pChildList )
1105 [ # # ]: 0 : for( sal_uInt16 n = 0; n < rSet.pChildList->size(); ++n )
1106 : 0 : SetAttrSet( (*rSet.pChildList)[ n ] );
1107 : 0 : }
1108 : :
1109 : : // Has no Text been inserted yet? (SttPos from the top Stack entry!)
1110 : 0 : int SvxRTFParser::IsAttrSttPos()
1111 : : {
1112 [ # # ]: 0 : SvxRTFItemStackType* pAkt = aAttrStack.empty() ? 0 : aAttrStack.back();
1113 : 0 : return !pAkt || (pAkt->pSttNd->GetIdx() == pInsPos->GetNodeIdx() &&
1114 [ # # # # ]: 0 : pAkt->nSttCnt == pInsPos->GetCntIdx());
[ # # ]
1115 : : }
1116 : :
1117 : :
1118 : 0 : void SvxRTFParser::SetAttrInDoc( SvxRTFItemStackType & )
1119 : : {
1120 : 0 : }
1121 : :
1122 : 0 : void SvxRTFParser::BuildWhichTbl()
1123 : : {
1124 : 0 : aWhichMap.clear();
1125 [ # # ]: 0 : aWhichMap.push_back( 0 );
1126 : :
1127 : : // Building a Which-Map 'rWhichMap' from an Array of
1128 : : // 'pWhichIds' frm Which-Ids. It has the long 'nWhichIds'.
1129 : : // The Which-Map is not going to be deleted.
1130 : 0 : SvParser::BuildWhichTbl( aWhichMap, (sal_uInt16*)&aPardMap[0], aPardMap.size() );
1131 : 0 : SvParser::BuildWhichTbl( aWhichMap, (sal_uInt16*)&aPlainMap[0], aPlainMap.size() );
1132 : 0 : }
1133 : :
1134 : 0 : const SfxItemSet& SvxRTFParser::GetRTFDefaults()
1135 : : {
1136 [ # # ]: 0 : if( !pRTFDefaults )
1137 : : {
1138 [ # # ]: 0 : pRTFDefaults = new SfxItemSet( *pAttrPool, &aWhichMap[0] );
1139 : : sal_uInt16 nId;
1140 [ # # ]: 0 : if( 0 != ( nId = ((RTFPardAttrMapIds*)&aPardMap[0])->nScriptSpace ))
1141 : : {
1142 [ # # ]: 0 : SvxScriptSpaceItem aItem( sal_False, nId );
1143 [ # # ]: 0 : if( bNewDoc )
1144 [ # # ]: 0 : pAttrPool->SetPoolDefaultItem( aItem );
1145 : : else
1146 [ # # ][ # # ]: 0 : pRTFDefaults->Put( aItem );
1147 : : }
1148 : : }
1149 : 0 : return *pRTFDefaults;
1150 : : }
1151 : :
1152 : :
1153 : 0 : SvxRTFStyleType::SvxRTFStyleType( SfxItemPool& rPool, const sal_uInt16* pWhichRange )
1154 [ # # ]: 0 : : aAttrSet( rPool, pWhichRange )
1155 : : {
1156 : 0 : nOutlineNo = sal_uInt8(-1); // not set
1157 : 0 : nBasedOn = 0;
1158 : 0 : bBasedOnIsSet = sal_False; //$flr #117411#
1159 : 0 : nNext = 0;
1160 : 0 : bIsCharFmt = sal_False;
1161 : 0 : }
1162 : :
1163 : :
1164 : 0 : SvxRTFItemStackType::SvxRTFItemStackType(
1165 : : SfxItemPool& rPool, const sal_uInt16* pWhichRange,
1166 : : const SvxPosition& rPos )
1167 : : : aAttrSet( rPool, pWhichRange ),
1168 : : pChildList( 0 ),
1169 : 0 : nStyleNo( 0 )
1170 : : {
1171 [ # # ]: 0 : pSttNd = rPos.MakeNodeIdx();
1172 [ # # ]: 0 : nSttCnt = rPos.GetCntIdx();
1173 : 0 : pEndNd = pSttNd;
1174 : 0 : nEndCnt = nSttCnt;
1175 : 0 : }
1176 : :
1177 : 0 : SvxRTFItemStackType::SvxRTFItemStackType(
1178 : : const SvxRTFItemStackType& rCpy,
1179 : : const SvxPosition& rPos,
1180 : : int bCopyAttr )
1181 : 0 : : aAttrSet( *rCpy.aAttrSet.GetPool(), rCpy.aAttrSet.GetRanges() ),
1182 : : pChildList( 0 ),
1183 : 0 : nStyleNo( rCpy.nStyleNo )
1184 : : {
1185 [ # # ]: 0 : pSttNd = rPos.MakeNodeIdx();
1186 [ # # ]: 0 : nSttCnt = rPos.GetCntIdx();
1187 : 0 : pEndNd = pSttNd;
1188 : 0 : nEndCnt = nSttCnt;
1189 : :
1190 : 0 : aAttrSet.SetParent( &rCpy.aAttrSet );
1191 [ # # ]: 0 : if( bCopyAttr )
1192 [ # # ]: 0 : aAttrSet.Put( rCpy.aAttrSet );
1193 : 0 : }
1194 : :
1195 : 0 : SvxRTFItemStackType::~SvxRTFItemStackType()
1196 : : {
1197 [ # # ]: 0 : if( pChildList )
1198 [ # # ][ # # ]: 0 : delete pChildList;
1199 [ # # ]: 0 : if( pSttNd != pEndNd )
1200 [ # # ][ # # ]: 0 : delete pEndNd;
1201 [ # # ][ # # ]: 0 : delete pSttNd;
1202 : 0 : }
1203 : :
1204 : 0 : void SvxRTFItemStackType::Add( SvxRTFItemStackType* pIns )
1205 : : {
1206 [ # # ]: 0 : if( !pChildList )
1207 [ # # ]: 0 : pChildList = new SvxRTFItemStackList();
1208 : 0 : pChildList->push_back( pIns );
1209 : 0 : }
1210 : :
1211 : 0 : void SvxRTFItemStackType::SetStartPos( const SvxPosition& rPos )
1212 : : {
1213 [ # # ]: 0 : if (pSttNd != pEndNd)
1214 [ # # ]: 0 : delete pEndNd;
1215 [ # # ]: 0 : delete pSttNd;
1216 : 0 : pSttNd = rPos.MakeNodeIdx();
1217 : 0 : pEndNd = pSttNd;
1218 : 0 : nSttCnt = rPos.GetCntIdx();
1219 : 0 : }
1220 : :
1221 : 0 : void SvxRTFItemStackType::MoveFullNode(const SvxNodeIdx &rOldNode,
1222 : : const SvxNodeIdx &rNewNode)
1223 : : {
1224 : 0 : bool bSameEndAsStart = (pSttNd == pEndNd) ? true : false;
1225 : :
1226 [ # # ]: 0 : if (GetSttNodeIdx() == rOldNode.GetIdx())
1227 : : {
1228 [ # # ]: 0 : delete pSttNd;
1229 : 0 : pSttNd = rNewNode.Clone();
1230 [ # # ]: 0 : if (bSameEndAsStart)
1231 : 0 : pEndNd = pSttNd;
1232 : : }
1233 : :
1234 [ # # ][ # # ]: 0 : if (!bSameEndAsStart && GetEndNodeIdx() == rOldNode.GetIdx())
[ # # ]
1235 : : {
1236 [ # # ]: 0 : delete pEndNd;
1237 : 0 : pEndNd = rNewNode.Clone();
1238 : : }
1239 : :
1240 : : //And the same for all the children
1241 [ # # ]: 0 : sal_uInt16 nCount = pChildList ? pChildList->size() : 0;
1242 [ # # ]: 0 : for (sal_uInt16 i = 0; i < nCount; ++i)
1243 : : {
1244 : 0 : SvxRTFItemStackType* pStk = &(*pChildList)[i];
1245 : 0 : pStk->MoveFullNode(rOldNode, rNewNode);
1246 : : }
1247 : 0 : }
1248 : :
1249 : 0 : bool SvxRTFParser::UncompressableStackEntry(const SvxRTFItemStackType &) const
1250 : : {
1251 : 0 : return false;
1252 : : }
1253 : :
1254 : 0 : void SvxRTFItemStackType::Compress( const SvxRTFParser& rParser )
1255 : : {
1256 [ # # ]: 0 : ENSURE_OR_RETURN_VOID(pChildList, "Compress: no ChildList" );
1257 [ # # ]: 0 : ENSURE_OR_RETURN_VOID(!pChildList->empty(), "Compress: ChildList empty");
1258 : :
1259 : : sal_uInt16 n;
1260 [ # # ]: 0 : SvxRTFItemStackType* pTmp = &(*pChildList)[0];
1261 : :
1262 [ # # ][ # # ]: 0 : if( !pTmp->aAttrSet.Count() ||
[ # # ][ # # ]
1263 [ # # ][ # # ]: 0 : pSttNd->GetIdx() != pTmp->pSttNd->GetIdx() ||
1264 : : nSttCnt != pTmp->nSttCnt )
1265 : : return;
1266 : :
1267 : 0 : SvxNodeIdx* pLastNd = pTmp->pEndNd;
1268 : 0 : xub_StrLen nLastCnt = pTmp->nEndCnt;
1269 : :
1270 [ # # ]: 0 : SfxItemSet aMrgSet( pTmp->aAttrSet );
1271 [ # # ]: 0 : for( n = 1; n < pChildList->size(); ++n )
1272 : : {
1273 [ # # ]: 0 : pTmp = &(*pChildList)[n];
1274 [ # # ]: 0 : if( pTmp->pChildList )
1275 [ # # ]: 0 : pTmp->Compress( rParser );
1276 : :
1277 [ # # ][ # # ]: 0 : if( !pTmp->nSttCnt
[ # # ][ # # ]
[ # # ][ # # ]
1278 [ # # ][ # # ]: 0 : ? (pLastNd->GetIdx()+1 != pTmp->pSttNd->GetIdx() ||
1279 [ # # ]: 0 : !rParser.IsEndPara( pLastNd, nLastCnt ) )
1280 : : : ( pTmp->nSttCnt != nLastCnt ||
1281 [ # # ][ # # ]: 0 : pLastNd->GetIdx() != pTmp->pSttNd->GetIdx() ))
1282 : : {
1283 [ # # ]: 0 : while( ++n < pChildList->size() )
1284 [ # # ][ # # ]: 0 : if( (pTmp = &(*pChildList)[n])->pChildList )
1285 [ # # ]: 0 : pTmp->Compress( rParser );
1286 : : return;
1287 : : }
1288 : :
1289 [ # # ][ # # ]: 0 : if (rParser.UncompressableStackEntry(*pTmp))
1290 : : return;
1291 : :
1292 [ # # ]: 0 : if( n )
1293 : : {
1294 : : // Search for all which are set over the whole area
1295 [ # # ]: 0 : SfxItemIter aIter( aMrgSet );
1296 : : const SfxPoolItem* pItem;
1297 : 0 : do {
1298 : 0 : sal_uInt16 nWhich = aIter.GetCurItem()->Which();
1299 [ # # ][ # # ]: 0 : if( SFX_ITEM_SET != pTmp->aAttrSet.GetItemState( nWhich,
[ # # ]
1300 [ # # ][ # # ]: 0 : sal_False, &pItem ) || *pItem != *aIter.GetCurItem() )
1301 [ # # ]: 0 : aMrgSet.ClearItem( nWhich );
1302 : :
1303 [ # # ]: 0 : if( aIter.IsAtEnd() )
1304 : 0 : break;
1305 [ # # ]: 0 : aIter.NextItem();
1306 : : } while( sal_True );
1307 : :
1308 [ # # ]: 0 : if( !aMrgSet.Count() )
1309 [ # # ][ # # ]: 0 : return;
1310 : : }
1311 : :
1312 : 0 : pLastNd = pTmp->pEndNd;
1313 : 0 : nLastCnt = pTmp->nEndCnt;
1314 : : }
1315 : :
1316 [ # # ][ # # ]: 0 : if( pEndNd->GetIdx() != pLastNd->GetIdx() || nEndCnt != nLastCnt )
[ # # ][ # # ]
[ # # ]
1317 : : return;
1318 : :
1319 : : // It can be merged
1320 [ # # ]: 0 : aAttrSet.Put( aMrgSet );
1321 : :
1322 [ # # ]: 0 : for( n = 0; n < pChildList->size(); ++n )
1323 : : {
1324 [ # # ]: 0 : pTmp = &(*pChildList)[n];
1325 [ # # ]: 0 : pTmp->aAttrSet.Differentiate( aMrgSet );
1326 : :
1327 [ # # ][ # # ]: 0 : if( !pTmp->pChildList && !pTmp->aAttrSet.Count() && !pTmp->nStyleNo )
[ # # ][ # # ]
1328 : : {
1329 [ # # ][ # # ]: 0 : pChildList->erase( pChildList->begin() + n );
[ # # ]
1330 : 0 : --n;
1331 : 0 : continue;
1332 : : }
1333 : : }
1334 [ # # ]: 0 : if( pChildList->empty() )
1335 : : {
1336 [ # # ][ # # ]: 0 : delete pChildList;
1337 : 0 : pChildList = 0;
1338 [ # # ][ # # ]: 0 : }
1339 : : }
1340 : 0 : void SvxRTFItemStackType::SetRTFDefaults( const SfxItemSet& rDefaults )
1341 : : {
1342 [ # # ]: 0 : if( rDefaults.Count() )
1343 : : {
1344 [ # # ]: 0 : SfxItemIter aIter( rDefaults );
1345 : 0 : do {
1346 : 0 : sal_uInt16 nWhich = aIter.GetCurItem()->Which();
1347 [ # # ][ # # ]: 0 : if( SFX_ITEM_SET != aAttrSet.GetItemState( nWhich, sal_False ))
1348 [ # # ]: 0 : aAttrSet.Put( *aIter.GetCurItem() );
1349 : :
1350 [ # # ]: 0 : if( aIter.IsAtEnd() )
1351 : 0 : break;
1352 [ # # ]: 0 : aIter.NextItem();
1353 [ # # ]: 0 : } while( sal_True );
1354 : : }
1355 : 0 : }
1356 : :
1357 : :
1358 : 0 : RTFPlainAttrMapIds::RTFPlainAttrMapIds( const SfxItemPool& rPool )
1359 : : {
1360 : 0 : nCaseMap = rPool.GetTrueWhich( SID_ATTR_CHAR_CASEMAP, sal_False );
1361 : 0 : nBgColor = rPool.GetTrueWhich( SID_ATTR_BRUSH_CHAR, sal_False );
1362 : 0 : nColor = rPool.GetTrueWhich( SID_ATTR_CHAR_COLOR, sal_False );
1363 : 0 : nContour = rPool.GetTrueWhich( SID_ATTR_CHAR_CONTOUR, sal_False );
1364 : 0 : nCrossedOut = rPool.GetTrueWhich( SID_ATTR_CHAR_STRIKEOUT, sal_False );
1365 : 0 : nEscapement = rPool.GetTrueWhich( SID_ATTR_CHAR_ESCAPEMENT, sal_False );
1366 : 0 : nFont = rPool.GetTrueWhich( SID_ATTR_CHAR_FONT, sal_False );
1367 : 0 : nFontHeight = rPool.GetTrueWhich( SID_ATTR_CHAR_FONTHEIGHT, sal_False );
1368 : 0 : nKering = rPool.GetTrueWhich( SID_ATTR_CHAR_KERNING, sal_False );
1369 : 0 : nLanguage = rPool.GetTrueWhich( SID_ATTR_CHAR_LANGUAGE, sal_False );
1370 : 0 : nPosture = rPool.GetTrueWhich( SID_ATTR_CHAR_POSTURE, sal_False );
1371 : 0 : nShadowed = rPool.GetTrueWhich( SID_ATTR_CHAR_SHADOWED, sal_False );
1372 : 0 : nUnderline = rPool.GetTrueWhich( SID_ATTR_CHAR_UNDERLINE, sal_False );
1373 : 0 : nOverline = rPool.GetTrueWhich( SID_ATTR_CHAR_OVERLINE, sal_False );
1374 : 0 : nWeight = rPool.GetTrueWhich( SID_ATTR_CHAR_WEIGHT, sal_False );
1375 : 0 : nWordlineMode = rPool.GetTrueWhich( SID_ATTR_CHAR_WORDLINEMODE, sal_False );
1376 : 0 : nAutoKerning = rPool.GetTrueWhich( SID_ATTR_CHAR_AUTOKERN, sal_False );
1377 : :
1378 : 0 : nCJKFont = rPool.GetTrueWhich( SID_ATTR_CHAR_CJK_FONT, sal_False );
1379 : 0 : nCJKFontHeight = rPool.GetTrueWhich( SID_ATTR_CHAR_CJK_FONTHEIGHT, sal_False );
1380 : 0 : nCJKLanguage = rPool.GetTrueWhich( SID_ATTR_CHAR_CJK_LANGUAGE, sal_False );
1381 : 0 : nCJKPosture = rPool.GetTrueWhich( SID_ATTR_CHAR_CJK_POSTURE, sal_False );
1382 : 0 : nCJKWeight = rPool.GetTrueWhich( SID_ATTR_CHAR_CJK_WEIGHT, sal_False );
1383 : 0 : nCTLFont = rPool.GetTrueWhich( SID_ATTR_CHAR_CTL_FONT, sal_False );
1384 : 0 : nCTLFontHeight = rPool.GetTrueWhich( SID_ATTR_CHAR_CTL_FONTHEIGHT, sal_False );
1385 : 0 : nCTLLanguage = rPool.GetTrueWhich( SID_ATTR_CHAR_CTL_LANGUAGE, sal_False );
1386 : 0 : nCTLPosture = rPool.GetTrueWhich( SID_ATTR_CHAR_CTL_POSTURE, sal_False );
1387 : 0 : nCTLWeight = rPool.GetTrueWhich( SID_ATTR_CHAR_CTL_WEIGHT, sal_False );
1388 : 0 : nEmphasis = rPool.GetTrueWhich( SID_ATTR_CHAR_EMPHASISMARK, sal_False );
1389 : 0 : nTwoLines = rPool.GetTrueWhich( SID_ATTR_CHAR_TWO_LINES, sal_False );
1390 : 0 : nRuby = 0; //rPool.GetTrueWhich( SID_ATTR_CHAR_CJK_RUBY, sal_False );
1391 : 0 : nCharScaleX = rPool.GetTrueWhich( SID_ATTR_CHAR_SCALEWIDTH, sal_False );
1392 : 0 : nHorzVert = rPool.GetTrueWhich( SID_ATTR_CHAR_ROTATED, sal_False );
1393 : 0 : nRelief = rPool.GetTrueWhich( SID_ATTR_CHAR_RELIEF, sal_False );
1394 : 0 : nHidden = rPool.GetTrueWhich( SID_ATTR_CHAR_HIDDEN, sal_False );
1395 : 0 : }
1396 : :
1397 : 0 : RTFPardAttrMapIds ::RTFPardAttrMapIds ( const SfxItemPool& rPool )
1398 : : {
1399 : 0 : nLinespacing = rPool.GetTrueWhich( SID_ATTR_PARA_LINESPACE, sal_False );
1400 : 0 : nAdjust = rPool.GetTrueWhich( SID_ATTR_PARA_ADJUST, sal_False );
1401 : 0 : nTabStop = rPool.GetTrueWhich( SID_ATTR_TABSTOP, sal_False );
1402 : 0 : nHyphenzone = rPool.GetTrueWhich( SID_ATTR_PARA_HYPHENZONE, sal_False );
1403 : 0 : nLRSpace = rPool.GetTrueWhich( SID_ATTR_LRSPACE, sal_False );
1404 : 0 : nULSpace = rPool.GetTrueWhich( SID_ATTR_ULSPACE, sal_False );
1405 : 0 : nBrush = rPool.GetTrueWhich( SID_ATTR_BRUSH, sal_False );
1406 : 0 : nBox = rPool.GetTrueWhich( SID_ATTR_BORDER_OUTER, sal_False );
1407 : 0 : nShadow = rPool.GetTrueWhich( SID_ATTR_BORDER_SHADOW, sal_False );
1408 : 0 : nOutlineLvl = rPool.GetTrueWhich( SID_ATTR_PARA_OUTLLEVEL, sal_False );
1409 : 0 : nSplit = rPool.GetTrueWhich( SID_ATTR_PARA_SPLIT, sal_False );
1410 : 0 : nKeep = rPool.GetTrueWhich( SID_ATTR_PARA_KEEP, sal_False );
1411 : 0 : nFontAlign = rPool.GetTrueWhich( SID_PARA_VERTALIGN, sal_False );
1412 : 0 : nScriptSpace = rPool.GetTrueWhich( SID_ATTR_PARA_SCRIPTSPACE, sal_False );
1413 : 0 : nHangPunct = rPool.GetTrueWhich( SID_ATTR_PARA_HANGPUNCTUATION, sal_False );
1414 : 0 : nForbRule = rPool.GetTrueWhich( SID_ATTR_PARA_FORBIDDEN_RULES, sal_False );
1415 : 0 : nDirection = rPool.GetTrueWhich( SID_ATTR_FRAMEDIRECTION, sal_False );
1416 : 0 : }
1417 : :
1418 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|