diff options
Diffstat (limited to 'include/editeng/svxrtf.hxx')
-rw-r--r-- | include/editeng/svxrtf.hxx | 424 |
1 files changed, 424 insertions, 0 deletions
diff --git a/include/editeng/svxrtf.hxx b/include/editeng/svxrtf.hxx new file mode 100644 index 000000000000..84c00a28634b --- /dev/null +++ b/include/editeng/svxrtf.hxx @@ -0,0 +1,424 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef _SVXRTF_HXX +#define _SVXRTF_HXX + +#include <tools/string.hxx> +#include <svl/itemset.hxx> +#include <svtools/parrtf.hxx> + +#include <editeng/editengdllapi.h> + +#include <deque> +#include <utility> +#include <vector> +#include "boost/ptr_container/ptr_map.hpp" +#include "boost/ptr_container/ptr_vector.hpp" + +class Font; +class Color; +class Graphic; +class DateTime; +struct SvxRTFStyleType; +class SvxRTFItemStackType; +class SvxRTFItemStackList : public boost::ptr_vector<SvxRTFItemStackType> {}; + +namespace com { namespace sun { namespace star { + namespace document { + class XDocumentProperties; + } + namespace util { + struct DateTime; + } +} } } + + +// Mapper-Classes for the various requirements on Document positions +// Swg - NodePosition is a SwIndex, which is used internally +// EditEngine - ULONG to list of paragraphs +// ..... + +class SvxNodeIdx +{ +public: + virtual ~SvxNodeIdx() {} + virtual sal_uLong GetIdx() const = 0; + virtual SvxNodeIdx* Clone() const = 0; // Cloning itself +}; + +class SvxPosition +{ +public: + virtual ~SvxPosition() {} + + virtual sal_uLong GetNodeIdx() const = 0; + virtual xub_StrLen GetCntIdx() const = 0; + + virtual SvxPosition* Clone() const = 0; // Cloning itself + virtual SvxNodeIdx* MakeNodeIdx() const = 0; // Cloning NodeIndex +}; + + +typedef Color* ColorPtr; +typedef std::deque< ColorPtr > SvxRTFColorTbl; +typedef boost::ptr_map<short, Font> SvxRTFFontTbl; +typedef boost::ptr_map<sal_uInt16, SvxRTFStyleType> SvxRTFStyleTbl; + +// SvxRTFItemStack can't be "std::stack< SvxRTFItemStackType* >" type, because +// the methods are using operator[] in sw/source/filter/rtf/rtftbl.cxx file +typedef std::deque< SvxRTFItemStackType* > SvxRTFItemStack; + +// own helper classes for the RTF Parser +struct SvxRTFStyleType +{ + SfxItemSet aAttrSet; // the attributes of Style (+ derivate!) + String sName; + sal_uInt16 nBasedOn, nNext; + sal_Bool bBasedOnIsSet; + sal_uInt8 nOutlineNo; + sal_Bool bIsCharFmt; + + SvxRTFStyleType( SfxItemPool& rPool, const sal_uInt16* pWhichRange ); +}; + + +// Here are the IDs for all character attributes, which can be detected by +// SvxParser and can be set in a SfxItemSet. The IDs are set correctly throught +// the SlotIds from POOL. +struct RTFPlainAttrMapIds +{ + sal_uInt16 nCaseMap, + nBgColor, + nColor, + nContour, + nCrossedOut, + nEscapement, + nFont, + nFontHeight, + nKering, + nLanguage, + nPosture, + nShadowed, + nUnderline, + nOverline, + nWeight, + nWordlineMode, + nAutoKerning, + nCJKFont, + nCJKFontHeight, + nCJKLanguage, + nCJKPosture, + nCJKWeight, + nCTLFont, + nCTLFontHeight, + nCTLLanguage, + nCTLPosture, + nCTLWeight, + nEmphasis, + nTwoLines, + nCharScaleX, + nHorzVert, + nRuby, + nRelief, + nHidden + ; + RTFPlainAttrMapIds( const SfxItemPool& rPool ); +}; + +// Here are the IDs for all paragraph attributes, which can be detected by +// SvxParser and can be set in a SfxItemSet. The IDs are set correctly throught +// the SlotIds from POOL. +struct RTFPardAttrMapIds +{ + sal_uInt16 nLinespacing, + nAdjust, + nTabStop, + nHyphenzone, + nLRSpace, + nULSpace, + nBrush, + nBox, + nShadow, + nOutlineLvl, + nSplit, + nKeep, + nFontAlign, + nScriptSpace, + nHangPunct, + nForbRule, + nDirection + ; + RTFPardAttrMapIds( const SfxItemPool& rPool ); +}; + + + +// ----------------------------------------------------------------------- + + +class EDITENG_DLLPUBLIC SvxRTFParser : public SvRTFParser +{ + SvStream &rStrm; + SvxRTFColorTbl aColorTbl; + SvxRTFFontTbl aFontTbl; + SvxRTFStyleTbl aStyleTbl; + SvxRTFItemStack aAttrStack; + SvxRTFItemStackList aAttrSetList; + + std::vector<sal_uInt16> aPlainMap; + std::vector<sal_uInt16> aPardMap; + std::vector<sal_uInt16> aWhichMap; + String sBaseURL; + + SvxPosition* pInsPos; + SfxItemPool* pAttrPool; + Color* pDfltColor; + Font* pDfltFont; + ::com::sun::star::uno::Reference< + ::com::sun::star::document::XDocumentProperties> m_xDocProps; + SfxItemSet *pRTFDefaults; + + long nVersionNo; + int nDfltFont; + + sal_Bool bNewDoc : 1; // sal_False - Reading in an existing + sal_Bool bNewGroup : 1; // sal_True - there was an opening parenthesis + sal_Bool bIsSetDfltTab : 1; // sal_True - DefTab was loaded + sal_Bool bChkStyleAttr : 1; // sal_True - StyleSheets are evaluated + sal_Bool bCalcValue : 1; // sal_True - Twip values adapt to App + sal_Bool bPardTokenRead : 1; // sal_True - Token \pard was detected + sal_Bool bReadDocInfo : 1; // sal_True - DocInfo to read + sal_Bool bIsLeftToRightDef : 1; // sal_True - in LeftToRight char run def. + // sal_False - in RightToLeft char run def. + sal_Bool bIsInReadStyleTab : 1; // sal_True - in ReadStyleTable + + void ClearColorTbl(); + void ClearFontTbl(); + void ClearStyleTbl(); + void ClearAttrStack(); + + SvxRTFItemStackType* _GetAttrSet( int bCopyAttr=sal_False ); // Create new ItemStackType:s + void _ClearStyleAttr( SvxRTFItemStackType& rStkType ); + + // Sets all the attributes that are different from the current + void SetAttrSet( SfxItemSet& rAttrSet, SvxPosition& rSttPos ); + void SetAttrSet( SvxRTFItemStackType &rSet ); + void SetDefault( int nToken, int nValue ); + + // Excecute pard / plain + void RTFPardPlain( int bPard, SfxItemSet** ppSet ); + + void BuildWhichTbl(); + + enum RTF_CharTypeDef + { + NOTDEF_CHARTYPE, + LOW_CHARTYPE, + HIGH_CHARTYPE, + DOUBLEBYTE_CHARTYPE + }; + + // set latin/asian/complex character attributes + void SetScriptAttr( + RTF_CharTypeDef eType, SfxItemSet& rSet, SfxPoolItem& rItem ); + +protected: + virtual void EnterEnvironment(); + virtual void LeaveEnvironment(); + virtual void ResetPard(); + virtual void InsertPara() = 0; + + + String& DelCharAtEnd( String& rStr, const sal_Unicode cDel ); + + // is called for each token that is recognized in CallParser + virtual void NextToken( int nToken ); + + virtual void ReadBitmapData(); + virtual void ReadOLEData(); + + void ReadStyleTable(); + void ReadColorTable(); + void ReadFontTable(); + void ReadAttr( int nToken, SfxItemSet* pSet ); + void ReadTabAttr( int nToken, SfxItemSet& rSet ); + + // Read Document-Info + ::com::sun::star::util::DateTime GetDateTimeStamp( ); + String& GetTextToEndGroup( String& rStr ); + virtual void ReadInfo( const sal_Char* pChkForVerNo = 0 ); + + inline SfxItemSet& GetAttrSet(); + // no text yet inserted? (SttPos from the top stack entry!) + int IsAttrSttPos(); + void AttrGroupEnd(); // edit the current, delete from stack + void SetAllAttrOfStk(); // end all Attr. and set it into doc + + + virtual void InsertText() = 0; + virtual void MovePos( int bForward = sal_True ) = 0; + virtual void SetEndPrevPara( SvxNodeIdx*& rpNodePos, + xub_StrLen& rCntPos )=0; + virtual void SetAttrInDoc( SvxRTFItemStackType &rSet ); + // for Tokens, which are not evaluated in ReadAttr + virtual void UnknownAttrToken( int nToken, SfxItemSet* pSet ); + + // if no-one would like to have any twips + virtual void CalcValue(); + + SvxRTFParser( SfxItemPool& rAttrPool, + SvStream& rIn, + ::com::sun::star::uno::Reference< + ::com::sun::star::document::XDocumentProperties> i_xDocProps, + int bReadNewDoc = sal_True ); + virtual ~SvxRTFParser(); + + int IsNewDoc() const { return bNewDoc; } + void SetNewDoc( int bFlag ) { bNewDoc = bFlag; } + int IsNewGroup() const { return bNewGroup; } + void SetNewGroup( int bFlag ) { bNewGroup = bFlag; } + int IsChkStyleAttr() const { return bChkStyleAttr; } + void SetChkStyleAttr( int bFlag ) { bChkStyleAttr = bFlag; } + int IsCalcValue() const { return bCalcValue; } + void SetCalcValue( int bFlag ) { bCalcValue = bFlag; } + int IsPardTokenRead() const { return bPardTokenRead; } + void SetPardTokenRead( int bFlag ) { bPardTokenRead = bFlag; } + int IsReadDocInfo() const { return bReadDocInfo; } + void SetReadDocInfo( int bFlag ) { bReadDocInfo = bFlag; } + + // Query/Set the current insert position + SvxPosition& GetInsPos() const { return *pInsPos; } + void SetInsPos( const SvxPosition& rNew ); + + long GetVersionNo() const { return nVersionNo; } + + // Query/Set the mapping IDs for the Pard/Plain attributes + //(Set: It is noted in the pointers, which thus does not create a copy) + void AddPardAttr( sal_uInt16 nWhich ) { aPardMap.push_back( nWhich ); } + void AddPlainAttr( sal_uInt16 nWhich ) { aPlainMap.push_back( nWhich ); } + + SvxRTFStyleTbl& GetStyleTbl() { return aStyleTbl; } + SvxRTFItemStack& GetAttrStack() { return aAttrStack; } + SvxRTFColorTbl& GetColorTbl() { return aColorTbl; } + SvxRTFFontTbl& GetFontTbl() { return aFontTbl; } + + const String& GetBaseURL() const { return sBaseURL; } + +public: + + virtual SvParserState CallParser(); + + inline const Color& GetColor( size_t nId ) const; + const Font& GetFont( sal_uInt16 nId ); // Changes the dflt Font + + virtual int IsEndPara( SvxNodeIdx* pNd, xub_StrLen nCnt ) const = 0; + + // to det a different attribute pool. May only be done prior to CallParser! + // The maps are not generated anew! + void SetAttrPool( SfxItemPool* pNewPool ) { pAttrPool = pNewPool; } + // to set different WhichIds for a different pool. + RTFPardAttrMapIds& GetPardMap() + { return (RTFPardAttrMapIds&)*aPardMap.begin(); } + RTFPlainAttrMapIds& GetPlainMap() + { return (RTFPlainAttrMapIds&)*aPlainMap.begin(); } + // to be able to assign them from the outside as for example table cells + void ReadBorderAttr( int nToken, SfxItemSet& rSet, int bTableDef=sal_False ); + void ReadBackgroundAttr( int nToken, SfxItemSet& rSet, int bTableDef=sal_False ); + + // for asynchronous read from the SvStream + virtual void Continue( int nToken ); + + // get RTF default ItemSets. Must be used by pard/plain tokens or in + // reset of Style-Items + const SfxItemSet& GetRTFDefaults(); + virtual bool UncompressableStackEntry(const SvxRTFItemStackType &rSet) const; +}; + +// The stack for the attributes: +// this class may only be used by SvxRTFParser! +class EDITENG_DLLPUBLIC SvxRTFItemStackType +{ + friend class SvxRTFParser; + + SfxItemSet aAttrSet; + SvxNodeIdx *pSttNd, *pEndNd; + xub_StrLen nSttCnt, nEndCnt; + SvxRTFItemStackList* pChildList; + sal_uInt16 nStyleNo; + + SvxRTFItemStackType( SfxItemPool&, const sal_uInt16* pWhichRange, + const SvxPosition& ); + + void Add( SvxRTFItemStackType* ); + void Compress( const SvxRTFParser& ); + +public: + SvxRTFItemStackType( const SvxRTFItemStackType&, const SvxPosition&, + int bCopyAttr = sal_False ); + ~SvxRTFItemStackType(); + //cmc, I'm very suspicios about SetStartPos, it doesn't change + //its children's starting position, and the implementation looks + //bad, consider this deprecated. + void SetStartPos( const SvxPosition& rPos ); + + void MoveFullNode(const SvxNodeIdx &rOldNode, + const SvxNodeIdx &rNewNode); + + sal_uLong GetSttNodeIdx() const { return pSttNd->GetIdx(); } + sal_uLong GetEndNodeIdx() const { return pEndNd->GetIdx(); } + + const SvxNodeIdx& GetSttNode() const { return *pSttNd; } + const SvxNodeIdx& GetEndNode() const { return *pEndNd; } + + xub_StrLen GetSttCnt() const { return nSttCnt; } + xub_StrLen GetEndCnt() const { return nEndCnt; } + + SfxItemSet& GetAttrSet() { return aAttrSet; } + const SfxItemSet& GetAttrSet() const { return aAttrSet; } + + sal_uInt16 StyleNo() const { return nStyleNo; } + + void SetRTFDefaults( const SfxItemSet& rDefaults ); +}; + + +// ----------- Inline Implementations -------------- + +inline const Color& SvxRTFParser::GetColor( size_t nId ) const +{ + ColorPtr pColor = (ColorPtr)pDfltColor; + if( nId < aColorTbl.size() ) + pColor = aColorTbl[ nId ]; + return *pColor; +} + +inline SfxItemSet& SvxRTFParser::GetAttrSet() +{ + SvxRTFItemStackType* pTmp; + if( bNewGroup || 0 == ( pTmp = aAttrStack.empty() ? 0 : aAttrStack.back()) ) + pTmp = _GetAttrSet(); + return pTmp->aAttrSet; +} + + +#endif + //_SVXRTF_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |