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