merge the formfield patch from ooo-build
[ooovba.git] / svx / inc / svxrtf.hxx
blob3f0435b309290511ce997cc1db764564d749c8b1
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: svxrtf.hxx,v $
10 * $Revision: 1.24.208.1 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 #ifndef _SVXRTF_HXX
32 #define _SVXRTF_HXX
34 #ifndef _TABLE_HXX //autogen
35 #include <tools/table.hxx>
36 #endif
37 #include <tools/string.hxx>
38 #include <svtools/itemset.hxx>
39 #include <svtools/parrtf.hxx>
41 #define _SVSTDARR_USHORTS
42 #include <svtools/svstdarr.hxx>
43 #include "svx/svxdllapi.h"
46 class Font;
47 class Color;
48 class Graphic;
49 class DateTime;
50 struct SvxRTFStyleType;
51 class SvxRTFItemStackType;
52 class SvxRTFItemStackList;
54 namespace com { namespace sun { namespace star {
55 namespace document {
56 class XDocumentProperties;
58 namespace util {
59 struct DateTime;
61 } } }
64 // Mapper-Klassen fuer die verschiedenen Anforderungen an Doc-Positionen
65 // Swg - NodePosition ist ein SwIndex, der intern veraendert wird
66 // EditEngine - ULONG auf Liste von Absaetzen
67 // .....
69 class SvxNodeIdx
71 public:
72 virtual ~SvxNodeIdx() {}
73 virtual ULONG GetIdx() const = 0;
74 virtual SvxNodeIdx* Clone() const = 0; // erzeuge von sich eine Kopie
77 class SvxPosition
79 public:
80 virtual ~SvxPosition() {}
82 virtual ULONG GetNodeIdx() const = 0;
83 virtual xub_StrLen GetCntIdx() const = 0;
85 virtual SvxPosition* Clone() const = 0; // erzeuge von sich eine Kopie
86 virtual SvxNodeIdx* MakeNodeIdx() const = 0; // erzeuge vom NodeIndex eine Kopie
90 typedef Color* ColorPtr;
91 SV_DECL_PTRARR( SvxRTFColorTbl, ColorPtr, 16, 4 )
92 DECLARE_TABLE( SvxRTFFontTbl, Font* )
93 DECLARE_TABLE( SvxRTFStyleTbl, SvxRTFStyleType* )
94 typedef SvxRTFItemStackType* SvxRTFItemStackTypePtr;
95 SV_DECL_PTRARR_DEL( SvxRTFItemStackList, SvxRTFItemStackTypePtr, 1, 1 )
96 SV_DECL_PTRARR_STACK( SvxRTFItemStack, SvxRTFItemStackTypePtr, 0, 1 )
98 // einige Hilfsklassen fuer den RTF-Parser
99 struct SvxRTFStyleType
101 SfxItemSet aAttrSet; // die Attribute vom Style (+Ableitung!)
102 String sName;
103 USHORT nBasedOn, nNext;
104 BOOL bBasedOnIsSet; //$flr #117411#
105 BYTE nOutlineNo;
106 BOOL bIsCharFmt;
108 SvxRTFStyleType( SfxItemPool& rPool, const USHORT* pWhichRange );
112 // Bitmap - Mode
114 struct SVX_DLLPUBLIC SvxRTFPictureType
116 // Format der Bitmap
117 enum RTF_BMPSTYLE
119 RTF_BITMAP, // Bitmap, die Planes sind in den Pict.Daten
120 WIN_METAFILE, // in den Pict.Daten steht ein Window-Metafile
121 MAC_QUICKDRAW, // in den Pict.Daten steht ein Mac-QuickDraw
122 OS2_METAFILE, // in den Pict.Daten steht ein OS2-Metafile
123 RTF_DI_BMP, // Device Independent Bitmap
124 ENHANCED_MF, // in den Pict.Daten steht ein Enhanced-Metafile
125 RTF_PNG, // in den Pict.Daten steht ein PNG file
126 RTF_JPG // in den Pict.Daten steht ein JPG file
127 } eStyle;
129 enum RTF_BMPMODE
131 BINARY_MODE,
132 HEX_MODE
133 } nMode;
135 USHORT nType;
136 sal_uInt32 uPicLen;
137 USHORT nWidth, nHeight;
138 USHORT nGoalWidth, nGoalHeight;
139 USHORT nBitsPerPixel;
140 USHORT nPlanes;
141 USHORT nWidthBytes;
142 USHORT nScalX, nScalY;
143 short nCropT, nCropB, nCropL, nCropR;
145 SvxRTFPictureType() { ResetValues(); }
146 // alle Werte auf default; wird nach einlesen der Bitmap aufgerufen !
147 void ResetValues();
150 // Hier sind die Ids fuer alle Charakter-Attribute, die vom SvxParser
151 // erkannt und in einem SfxItemSet gesetzt werden koennen.
152 // Die Ids werden ueber die SlotIds vom POOL richtig gesetzt.
153 struct RTFPlainAttrMapIds
155 USHORT nCaseMap,
156 nBgColor,
157 nColor,
158 nContour,
159 nCrossedOut,
160 nEscapement,
161 nFont,
162 nFontHeight,
163 nKering,
164 nLanguage,
165 nPosture,
166 nShadowed,
167 nUnderline,
168 nOverline,
169 nWeight,
170 nWordlineMode,
171 nAutoKerning,
172 nCJKFont,
173 nCJKFontHeight,
174 nCJKLanguage,
175 nCJKPosture,
176 nCJKWeight,
177 nCTLFont,
178 nCTLFontHeight,
179 nCTLLanguage,
180 nCTLPosture,
181 nCTLWeight,
182 nEmphasis,
183 nTwoLines,
184 nCharScaleX,
185 nHorzVert,
186 nRuby,
187 nRelief,
188 nHidden
190 RTFPlainAttrMapIds( const SfxItemPool& rPool );
193 // Hier sind die Ids fuer alle Paragraph-Attribute, die vom SvxParser
194 // erkannt und in einem SfxItemSet gesetzt werden koennen.
195 // Die Ids werden ueber die SlotIds vom POOL richtig gesetzt.
196 struct RTFPardAttrMapIds
198 USHORT nLinespacing,
199 nAdjust,
200 nTabStop,
201 nHyphenzone,
202 nLRSpace,
203 nULSpace,
204 nBrush,
205 nBox,
206 nShadow,
207 nOutlineLvl,
208 nSplit,
209 nKeep,
210 nFontAlign,
211 nScriptSpace,
212 nHangPunct,
213 nForbRule,
214 nDirection
216 RTFPardAttrMapIds( const SfxItemPool& rPool );
221 // -----------------------------------------------------------------------
224 class SVX_DLLPUBLIC SvxRTFParser : public SvRTFParser
226 SvStream &rStrm;
227 SvxRTFColorTbl aColorTbl;
228 SvxRTFFontTbl aFontTbl;
229 SvxRTFStyleTbl aStyleTbl;
230 SvxRTFItemStack aAttrStack;
231 SvxRTFItemStackList aAttrSetList;
233 SvUShorts aPlainMap;
234 SvUShorts aPardMap;
235 SvUShorts aWhichMap;
236 String sBaseURL;
238 SvxPosition* pInsPos;
239 SfxItemPool* pAttrPool;
240 Color* pDfltColor;
241 Font* pDfltFont;
242 ::com::sun::star::uno::Reference<
243 ::com::sun::star::document::XDocumentProperties> m_xDocProps;
244 SfxItemSet *pRTFDefaults;
246 long nVersionNo;
247 int nDfltFont;
249 BOOL bNewDoc : 1; // FALSE - in ein bestehendes lesen
250 BOOL bNewGroup : 1; // TRUE - es gab eine oeffnende Klammer
251 BOOL bIsSetDfltTab : 1; // TRUE - DefTab wurde eingelesen
252 BOOL bChkStyleAttr : 1; // TRUE - StyleSheets werden ausgewertet
253 BOOL bCalcValue : 1; // TRUE - Twipwerte an APP anpassen
254 BOOL bPardTokenRead : 1; // TRUE - Token \pard wurde erkannt
255 BOOL bReadDocInfo : 1; // TRUE - DocInfo mit einlesen
256 BOOL bIsLeftToRightDef : 1; // TRUE - in LeftToRight char run def.
257 // FALSE - in RightToLeft char run def.
258 BOOL bIsInReadStyleTab : 1; // TRUE - in ReadStyleTable
260 void ClearColorTbl();
261 void ClearFontTbl();
262 void ClearStyleTbl();
263 void ClearAttrStack();
265 SvxRTFItemStackTypePtr _GetAttrSet( int bCopyAttr=FALSE ); // neue ItemStackType anlegen
266 void _ClearStyleAttr( SvxRTFItemStackType& rStkType );
268 // setzt alle Attribute, die unterschiedlich zum aktuellen sind
269 void SetAttrSet( SfxItemSet& rAttrSet, SvxPosition& rSttPos );
270 void SetAttrSet( SvxRTFItemStackType &rSet );
271 void SetDefault( int nToken, int nValue );
273 // pard / plain abarbeiten
274 void RTFPardPlain( int bPard, SfxItemSet** ppSet );
276 void BuildWhichTbl();
278 enum RTF_CharTypeDef
280 NOTDEF_CHARTYPE,
281 LOW_CHARTYPE,
282 HIGH_CHARTYPE,
283 DOUBLEBYTE_CHARTYPE
286 // set latin/asian/complex character attributes
287 void SetScriptAttr(
288 RTF_CharTypeDef eType, SfxItemSet& rSet, SfxPoolItem& rItem );
290 protected:
291 virtual void EnterEnvironment();
292 virtual void LeaveEnvironment();
293 virtual void ResetPard();
294 virtual void InsertPara() = 0;
297 String& DelCharAtEnd( String& rStr, const sal_Unicode cDel );
299 // wird fuer jedes Token gerufen, das in CallParser erkannt wird
300 virtual void NextToken( int nToken );
302 virtual void ReadBitmapData();
303 virtual void ReadOLEData();
305 void ReadStyleTable();
306 void ReadColorTable();
307 void ReadFontTable();
308 void ReadAttr( int nToken, SfxItemSet* pSet );
309 void ReadTabAttr( int nToken, SfxItemSet& rSet );
311 // Dokument-Info lesen
312 ::com::sun::star::util::DateTime GetDateTimeStamp( );
313 String& GetTextToEndGroup( String& rStr );
314 virtual void ReadInfo( const sal_Char* pChkForVerNo = 0 );
316 inline SfxItemSet& GetAttrSet();
317 // wurde noch kein Text eingefuegt ? (SttPos vom obersten StackEintrag!)
318 int IsAttrSttPos();
319 void AttrGroupEnd(); // den akt. Bearbeiten, vom Stack loeschen
320 void SetAllAttrOfStk(); // end all Attr. and set it into doc
323 virtual void InsertText() = 0;
324 virtual void MovePos( int bForward = TRUE ) = 0;
325 virtual void SetEndPrevPara( SvxNodeIdx*& rpNodePos,
326 xub_StrLen& rCntPos )=0;
327 virtual void SetAttrInDoc( SvxRTFItemStackType &rSet );
328 // fuer Tokens, die im ReadAttr nicht ausgewertet werden
329 virtual void UnknownAttrToken( int nToken, SfxItemSet* pSet );
331 // falls jemand keine Twips haben moechte
332 virtual void CalcValue();
334 SvxRTFParser( SfxItemPool& rAttrPool,
335 SvStream& rIn,
336 ::com::sun::star::uno::Reference<
337 ::com::sun::star::document::XDocumentProperties> i_xDocProps,
338 int bReadNewDoc = TRUE );
339 virtual ~SvxRTFParser();
341 int IsNewDoc() const { return bNewDoc; }
342 void SetNewDoc( int bFlag ) { bNewDoc = bFlag; }
343 int IsNewGroup() const { return bNewGroup; }
344 void SetNewGroup( int bFlag ) { bNewGroup = bFlag; }
345 int IsChkStyleAttr() const { return bChkStyleAttr; }
346 void SetChkStyleAttr( int bFlag ) { bChkStyleAttr = bFlag; }
347 int IsCalcValue() const { return bCalcValue; }
348 void SetCalcValue( int bFlag ) { bCalcValue = bFlag; }
349 int IsPardTokenRead() const { return bPardTokenRead; }
350 void SetPardTokenRead( int bFlag ) { bPardTokenRead = bFlag; }
351 int IsReadDocInfo() const { return bReadDocInfo; }
352 void SetReadDocInfo( int bFlag ) { bReadDocInfo = bFlag; }
354 // erfrage/setze die aktuelle Einfuegeposition
355 SvxPosition& GetInsPos() const { return *pInsPos; }
356 void SetInsPos( const SvxPosition& rNew );
358 long GetVersionNo() const { return nVersionNo; }
360 // erfrage/setze die Mapping-Ids fuer die Pard/Plain Attribute
361 // (Set: es werden sich die Pointer gemerkt, also keine Kopie erzeugt!!! )
362 void AddPardAttr( USHORT nWhich ) { aPardMap.Insert( nWhich, aPardMap.Count() ); }
363 void AddPlainAttr( USHORT nWhich ) { aPlainMap.Insert( nWhich, aPlainMap.Count() ); }
365 SvxRTFStyleTbl& GetStyleTbl() { return aStyleTbl; }
366 SvxRTFItemStack& GetAttrStack() { return aAttrStack; }
367 SvxRTFColorTbl& GetColorTbl() { return aColorTbl; }
368 SvxRTFFontTbl& GetFontTbl() { return aFontTbl; }
370 const String& GetBaseURL() const { return sBaseURL; }
372 // lesen die GrafikDaten und fuelle damit die Grafik und die
373 // die PicDaten.
374 // Return - TRUE: die Grafik ist gueltig
375 BOOL ReadBmpData( Graphic& rGrf, SvxRTFPictureType& rPicType );
376 // wandel die ASCII-HexCodes in binaere Zeichen um. Werden
377 // ungueltige Daten gefunden (Zeichen ausser 0-9|a-f|A-F, so
378 // wird USHRT_MAX returnt, ansonsten die Anzahl der umgewandelten Ze.
379 xub_StrLen HexToBin( String& rToken );
381 public:
383 virtual SvParserState CallParser(); // Aufruf des Parsers
385 inline const Color& GetColor( USHORT nId ) const;
386 const Font& GetFont( USHORT nId ); // aendert den dflt Font
388 virtual int IsEndPara( SvxNodeIdx* pNd, xub_StrLen nCnt ) const = 0;
390 // um einen anderen Attribut-Pool setzen zukoennen. Darf nur vorm
391 // CallParser erfolgen!! Die Maps werden nicht neu erzeugt!
392 void SetAttrPool( SfxItemPool* pNewPool ) { pAttrPool = pNewPool; }
393 // um andere WhichIds fuer einen anderen Pool zusetzen.
394 RTFPardAttrMapIds& GetPardMap()
395 { return (RTFPardAttrMapIds&)*aPardMap.GetData(); }
396 RTFPlainAttrMapIds& GetPlainMap()
397 { return (RTFPlainAttrMapIds&)*aPlainMap.GetData(); }
398 // um diese von aussen z.B. Tabellenzellen zuordnen zu koennen
399 void ReadBorderAttr( int nToken, SfxItemSet& rSet, int bTableDef=FALSE );
400 void ReadBackgroundAttr( int nToken, SfxItemSet& rSet, int bTableDef=FALSE );
402 // fuers asynchrone lesen aus dem SvStream
403 virtual void Continue( int nToken );
405 // get RTF default ItemSets. Must be used by pard/plain tokens or in
406 // reset of Style-Items
407 const SfxItemSet& GetRTFDefaults();
408 virtual bool UncompressableStackEntry(const SvxRTFItemStackType &rSet) const;
411 // der Stack fuer die Attribute:
412 // diese Klasse darf nur vom SvxRTFParser benutzt werden!
413 class SVX_DLLPUBLIC SvxRTFItemStackType
415 friend class SvxRTFParser;
416 friend class SvxRTFItemStackList;
418 SfxItemSet aAttrSet;
419 SvxNodeIdx *pSttNd, *pEndNd;
420 xub_StrLen nSttCnt, nEndCnt;
421 SvxRTFItemStackList* pChildList;
422 USHORT nStyleNo;
424 SvxRTFItemStackType( SfxItemPool&, const USHORT* pWhichRange,
425 const SvxPosition& );
426 ~SvxRTFItemStackType();
428 void Add( SvxRTFItemStackTypePtr );
429 void Compress( const SvxRTFParser& );
431 public:
432 SvxRTFItemStackType( const SvxRTFItemStackType&, const SvxPosition&,
433 int bCopyAttr = FALSE );
434 //cmc, I'm very suspicios about SetStartPos, it doesn't change
435 //its children's starting position, and the implementation looks
436 //bad, consider this deprecated.
437 void SetStartPos( const SvxPosition& rPos );
439 void MoveFullNode(const SvxNodeIdx &rOldNode,
440 const SvxNodeIdx &rNewNode);
442 ULONG GetSttNodeIdx() const { return pSttNd->GetIdx(); }
443 ULONG GetEndNodeIdx() const { return pEndNd->GetIdx(); }
445 const SvxNodeIdx& GetSttNode() const { return *pSttNd; }
446 const SvxNodeIdx& GetEndNode() const { return *pEndNd; }
448 xub_StrLen GetSttCnt() const { return nSttCnt; }
449 xub_StrLen GetEndCnt() const { return nEndCnt; }
451 SfxItemSet& GetAttrSet() { return aAttrSet; }
452 const SfxItemSet& GetAttrSet() const { return aAttrSet; }
454 USHORT StyleNo() const { return nStyleNo; }
456 void SetRTFDefaults( const SfxItemSet& rDefaults );
460 // ----------- Inline Implementierungen --------------
462 inline const Color& SvxRTFParser::GetColor( USHORT nId ) const
464 ColorPtr pColor = (ColorPtr)pDfltColor;
465 if( nId < aColorTbl.Count() )
466 pColor = aColorTbl[ nId ];
467 return *pColor;
470 inline SfxItemSet& SvxRTFParser::GetAttrSet()
472 SvxRTFItemStackTypePtr pTmp;
473 if( bNewGroup || 0 == ( pTmp = aAttrStack.Top()) )
474 pTmp = _GetAttrSet();
475 return pTmp->aAttrSet;
479 #endif
480 //_SVXRTF_HXX