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