1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
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 ************************************************************************/
34 #ifndef _TABLE_HXX //autogen
35 #include <tools/table.hxx>
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"
50 struct SvxRTFStyleType
;
51 class SvxRTFItemStackType
;
52 class SvxRTFItemStackList
;
54 namespace com
{ namespace sun
{ namespace star
{
56 class XDocumentProperties
;
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
72 virtual ~SvxNodeIdx() {}
73 virtual ULONG
GetIdx() const = 0;
74 virtual SvxNodeIdx
* Clone() const = 0; // erzeuge von sich eine Kopie
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!)
103 USHORT nBasedOn
, nNext
;
104 BOOL bBasedOnIsSet
; //$flr #117411#
108 SvxRTFStyleType( SfxItemPool
& rPool
, const USHORT
* pWhichRange
);
114 struct SVX_DLLPUBLIC SvxRTFPictureType
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
137 USHORT nWidth
, nHeight
;
138 USHORT nGoalWidth
, nGoalHeight
;
139 USHORT nBitsPerPixel
;
142 USHORT nScalX
, nScalY
;
143 short nCropT
, nCropB
, nCropL
, nCropR
;
145 SvxRTFPictureType() { ResetValues(); }
146 // alle Werte auf default; wird nach einlesen der Bitmap aufgerufen !
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
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
216 RTFPardAttrMapIds( const SfxItemPool
& rPool
);
221 // -----------------------------------------------------------------------
224 class SVX_DLLPUBLIC SvxRTFParser
: public SvRTFParser
227 SvxRTFColorTbl aColorTbl
;
228 SvxRTFFontTbl aFontTbl
;
229 SvxRTFStyleTbl aStyleTbl
;
230 SvxRTFItemStack aAttrStack
;
231 SvxRTFItemStackList aAttrSetList
;
238 SvxPosition
* pInsPos
;
239 SfxItemPool
* pAttrPool
;
242 ::com::sun::star::uno::Reference
<
243 ::com::sun::star::document::XDocumentProperties
> m_xDocProps
;
244 SfxItemSet
*pRTFDefaults
;
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();
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();
286 // set latin/asian/complex character attributes
288 RTF_CharTypeDef eType
, SfxItemSet
& rSet
, SfxPoolItem
& rItem
);
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!)
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
,
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
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
);
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
;
419 SvxNodeIdx
*pSttNd
, *pEndNd
;
420 xub_StrLen nSttCnt
, nEndCnt
;
421 SvxRTFItemStackList
* pChildList
;
424 SvxRTFItemStackType( SfxItemPool
&, const USHORT
* pWhichRange
,
425 const SvxPosition
& );
426 ~SvxRTFItemStackType();
428 void Add( SvxRTFItemStackTypePtr
);
429 void Compress( const SvxRTFParser
& );
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
];
470 inline SfxItemSet
& SvxRTFParser::GetAttrSet()
472 SvxRTFItemStackTypePtr pTmp
;
473 if( bNewGroup
|| 0 == ( pTmp
= aAttrStack
.Top()) )
474 pTmp
= _GetAttrSet();
475 return pTmp
->aAttrSet
;