blob: 6b946b6119432cef9542f73740cf4f70ab89ad3c [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */
#ifndef _SWPARRTF_HXX
#define _SWPARRTF_HXX
#ifndef __SGI_STL_DEQUE
#include <deque>
#endif
#ifndef __SGI_STL_VECTOR
#include <vector>
#endif
#ifndef _SVSTDARR_HXX
#define _SVSTDARR_BOOLS
#include <svl/svstdarr.hxx>
#endif
#include <editeng/svxrtf.hxx>
#include <editeng/numitem.hxx>
#include <editeng/boxitem.hxx>
#include <redline.hxx>
#include <fltshell.hxx> // fuer den Attribut Stack
#include <ndindex.hxx>
#include "../inc/msfilter.hxx"
#include <svx/svdobj.hxx>
extern void GetLineIndex(SvxBoxItem &rBox, short nLineThickness, short nSpace, sal_uInt8 nCol, short nIdx,
sal_uInt16 nOOIndex, sal_uInt16 nWWIndex, short *pSize);
class Font;
class Graphic;
class SwNoTxtNode;
class Size;
class SwPaM;
class SwDoc;
class SwPageDesc;
class SwTxtFmtColl;
class SwTableNode;
class SwCharFmt;
class SwNumRule;
class SwRTFParser;
class SvxFontItem;
class SwRelNumRuleSpaces;
class SwNodeNum;
class SwTxtNode;
struct SvxRTFPictureType;
class RtfReader: public Reader
{
virtual sal_uLong Read( SwDoc &, const String& rBaseURL, SwPaM &,const String &);
public:
virtual sal_uLong Read( SvStream* pStrm, SwDoc &, const String& rBaseURL, SwPaM &);
};
class SwNodeIdx : public SvxNodeIdx
{
SwNodeIndex aIdx;
public:
SwNodeIdx( const SwNodeIndex& rIdx ) : aIdx( rIdx ) {}
virtual sal_uLong GetIdx() const;
virtual SvxNodeIdx* Clone() const;
};
class BookmarkPosition
{
public:
SwNodeIndex maMkNode;
xub_StrLen mnMkCntnt;
BookmarkPosition(const SwPaM &rPaM);
BookmarkPosition(const BookmarkPosition &rEntry);
bool operator==(const BookmarkPosition);
private:
//No assignment
BookmarkPosition& operator=(const BookmarkPosition&);
};
class SwxPosition : public SvxPosition
{
SwPaM* pPam;
public:
SwxPosition( SwPaM* pCrsr ) : pPam( pCrsr ) {}
virtual sal_uLong GetNodeIdx() const;
virtual xub_StrLen GetCntIdx() const;
// erzeuge von sich selbst eine Kopie
virtual SvxPosition* Clone() const;
// erzeuge vom NodeIndex eine Kopie
virtual SvxNodeIdx* MakeNodeIdx() const;
};
// zum zwischenspeichern der Flys:
struct SwFlySave
{
SfxItemSet aFlySet;
SwNodeIndex nSttNd, nEndNd;
xub_StrLen nEndCnt;
SwTwips nPageWidth;
sal_uInt16 nDropLines, nDropAnchor;
SwFlySave( const SwPaM& rPam, SfxItemSet& rSet );
int IsEqualFly( const SwPaM& rPos, SfxItemSet& rSet );
void SetFlySize( const SwTableNode& rTblNd );
};
struct SwListEntry
{
long nListId, nListTemplateId, nListNo;
sal_uInt16 nListDocPos;
sal_Bool bRuleUsed;
SwListEntry()
: nListId( 0 ), nListTemplateId( 0 ), nListNo( 0 ), nListDocPos( 0 ),
bRuleUsed( sal_False )
{}
SwListEntry( long nLstId, long nLstTmplId, sal_uInt16 nLstDocPos )
: nListId( nLstId ), nListTemplateId( nLstTmplId ), nListNo( 0 ),
nListDocPos( nLstDocPos ), bRuleUsed( sal_False )
{}
void Clear() { nListId = nListTemplateId = nListNo = 0, nListDocPos = 0;
bRuleUsed = sal_False; }
};
DECLARE_TABLE( SwRTFStyleTbl, SwTxtFmtColl* )
DECLARE_TABLE( SwRTFCharStyleTbl, SwCharFmt* )
typedef SwFlySave* SwFlySavePtr;
SV_DECL_PTRARR_DEL( SwFlySaveArr, SwFlySavePtr, 0, 20 )
typedef std::deque< SwListEntry > SwListArr;
struct DocPageInformation
{
SvxBoxItem maBox;
long mnPaperw;
long mnPaperh;
long mnMargl;
long mnMargr;
long mnMargt;
long mnMargb;
long mnGutter;
long mnPgnStart;
bool mbFacingp;
bool mbLandscape;
bool mbRTLdoc;
DocPageInformation();
};
struct SectPageInformation
{
std::vector<long> maColumns;
SvxBoxItem maBox;
SvxNumberType maNumType;
SwPageDesc *mpTitlePageHdFt;
SwPageDesc *mpPageHdFt;
long mnPgwsxn;
long mnPghsxn;
long mnMarglsxn;
long mnMargrsxn;
long mnMargtsxn;
long mnMargbsxn;
long mnGutterxsn;
long mnHeadery;
long mnFootery;
long mnPgnStarts;
long mnCols;
long mnColsx;
long mnStextflow;
int mnBkc;
bool mbLndscpsxn;
bool mbTitlepg;
bool mbFacpgsxn;
bool mbRTLsection;
bool mbPgnrestart;
bool mbTitlePageHdFtUsed;
bool mbPageHdFtUsed;
SectPageInformation(const DocPageInformation &rDoc);
SectPageInformation(const SectPageInformation &rSect);
};
class rtfSection
{
public:
rtfSection(const SwPosition &rPos,
const SectPageInformation &rPageInfo);
SwNodeIndex maStart;
SectPageInformation maPageInfo;
SwSection *mpSection;
SwPageDesc *mpTitlePage;
SwPageDesc *mpPage;
bool IsContinous() const { return maPageInfo.mnBkc == 0; }
long NoCols() const { return maPageInfo.mnCols; }
long StandardColSeperation() const { return maPageInfo.mnColsx; }
bool HasTitlePage() const { return maPageInfo.mbTitlepg; }
long PageStartAt() const { return maPageInfo.mnPgnStarts; }
bool PageRestartNo() const { return maPageInfo.mbPgnrestart; }
bool IsBiDi() const { return maPageInfo.mbRTLsection; }
long GetPageWidth() const { return maPageInfo.mnPgwsxn; }
long GetPageHeight() const { return maPageInfo.mnPghsxn; }
long GetPageLeft() const { return maPageInfo.mnMarglsxn; }
long GetPageRight() const { return maPageInfo.mnMargrsxn; }
bool IsLandScape() const { return maPageInfo.mbLndscpsxn; }
};
class rtfSections
{
private:
SwRTFParser &mrReader;
std::deque<rtfSection> maSegments;
typedef std::deque<rtfSection>::iterator mySegIter;
typedef std::deque<rtfSection>::reverse_iterator mySegrIter;
struct wwULSpaceData
{
bool bHasHeader, bHasFooter;
short nSwHLo, nHdUL, nSwFUp, nFtUL, nSwUp, nSwLo;
wwULSpaceData() : bHasHeader(false), bHasFooter(false) {}
};
void SetSegmentToPageDesc(const rtfSection &rSection, bool bTitlePage,
bool bIgnoreCols);
SwSectionFmt *InsertSection(SwPaM& rMyPaM, rtfSection &rSection);
void SetPage(SwPageDesc &rInPageDesc, SwFrmFmt &rFmt,
const rtfSection &rSection, bool bIgnoreCols);
void GetPageULData(const rtfSection &rSection, bool bFirst,
wwULSpaceData& rData);
void SetPageULSpaceItems(SwFrmFmt &rFmt, wwULSpaceData& rData);
bool SetCols(SwFrmFmt &rFmt, const rtfSection &rSection,
sal_uInt16 nNettoWidth);
void SetHdFt(rtfSection &rSection);
void CopyFrom(const SwPageDesc &rFrom, SwPageDesc &rDest);
void MoveFrom(SwPageDesc &rFrom, SwPageDesc &rDest);
public:
bool empty() const { return maSegments.empty(); }
int size() const { return maSegments.size(); }
void push_back(const rtfSection &rSect);
void pop_back() { maSegments.pop_back(); }
rtfSection& back() { return maSegments.back(); }
const rtfSection& back() const { return maSegments.back(); }
void InsertSegments(bool bIsNewDoc);
rtfSections(SwRTFParser &rReader) : mrReader(rReader) {}
std::vector<sal_uInt16> maDummyPageNos;
typedef std::vector<sal_uInt16>::reverse_iterator myrDummyIter;
void PrependedInlineNode(const SwPosition &rPos,
const SwNode &rNode);
};
class SwRTFParser : public SvxRTFParser
{
/*
Knows which writer style a given word style should be imported as.
*/
sw::util::ParaStyleMapper maParaStyleMapper;
sw::util::CharStyleMapper maCharStyleMapper;
std::vector<String> aRevTbl;
friend class rtfSections;
DocPageInformation maPageDefaults;
rtfSections maSegments;
sw::util::InsertedTablesManager maInsertedTables;
SwRTFStyleTbl aTxtCollTbl;
SwRTFCharStyleTbl aCharFmtTbl;
SwFlySaveArr aFlyArr; // Flys als Letzes im Doc setzen
SvBools aMergeBoxes; // Flags fuer gemergte Zellen
SwListArr aListArr;
SvPtrarr aRubyCharFmts;
BookmarkPosition* mpBookmarkStart;
sw::util::RedlineStack *mpRedlineStack;
sw::util::AuthorInfos* pAuthorInfos;
SfxItemSet* pGrfAttrSet;
SwTableNode* pTableNode, *pOldTblNd; // fuers Lesen von Tabellen: akt. Tab
SwNodeIndex* pSttNdIdx;
SwNodeIndex* pRegionEndIdx;
SwDoc* pDoc;
SwPaM* pPam; // SwPosition duerfte doch reichen, oder ??
SwRelNumRuleSpaces* pRelNumRule; // Liste aller benannten NumRules
String sNestedFieldStr;
SwFltRedline *pRedlineInsert;
SwFltRedline *pRedlineDelete;
String sBaseURL;
sal_uInt16 nAktPageDesc, nAktFirstPageDesc;
sal_uInt16 m_nCurrentBox;
sal_uInt16 nInsTblRow; // beim nach \row kein \pard -> neue Line anlegen
sal_uInt16 nNewNumSectDef; // jeder SectionWechsel kann neue Rules definieren
sal_uInt16 nRowsToRepeat;
bool bSwPageDesc;
bool bReadSwFly; // lese Swg-Fly (wichtig fuer Bitmaps!)
// --> OD 2008-12-22 #i83368#
bool mbReadCellWhileReadSwFly;
// <--
bool mbReadNoTbl; // verhinder Tabelle in Tabelle/FootNote
bool mbIsFootnote;
bool bFootnoteAutoNum; // automatische Numerierung ?
bool bStyleTabValid; // Styles schon erzeugt ?
bool bInPgDscTbl; // beim PageDescTbl lesen
bool bNewNumList; // Word 7.0 NumList gelesen, 6.0 ueberspringen
bool bFirstContinue; // 1.Call ins Continue
bool bContainsPara; // If there is no paragraph in the section
bool bContainsTablePara; // If there is an table in this section
bool bForceNewTable; // Forces a beginning of a new table
bool bNestedField;
bool bTrowdRead; // True, iff an \trowd definition was read after the last \row
int nReadFlyDepth;
int nZOrder;
/*
#i9243#
In a footnote tables are not possible (for some obscure reason!)
*/
bool CantUseTables() const { return mbReadNoTbl || mbIsFootnote; }
virtual void InsertPara();
virtual void InsertText();
virtual void MovePos( int bForward = sal_True );
virtual void SetEndPrevPara( SvxNodeIdx*& rpNodePos, xub_StrLen& rCntPos );
void EnterEnvironment();
void LeaveEnvironment();
SwFmtPageDesc* GetCurrentPageDesc(SwPaM *pPam);
void CheckInsNewTblLine();
// setze RTF-Werte auf Swg-Werte
void SetSwgValues( SfxItemSet& rSet );
virtual void ReadInfo( const sal_Char* pChkForVerNo = 0 );
void ReadUserProperties();
void ReadListLevel( SwNumRule& rRule, sal_uInt8 nLvl );
void SetBorderLine(SvxBoxItem& rBox, sal_uInt16 nLine);
void ReadListTable();
sal_uInt16 ReadRevTbl();
void ReadShpRslt();
void ReadShpTxt(String &shpTxt);
void ReadDrawingObject();
void InsertShpObject(SdrObject* pStroke, int nZOrder);
void ReadShapeObject();
void ReadListOverrideTable();
SwNumRule *ReadNumSecLevel( int nToken );
SwNumRule* GetNumRuleOfListNo( long nListNo,
sal_Bool bRemoveFromList = sal_False );
void RemoveUnusedNumRule( SwNumRule* );
void RemoveUnusedNumRules();
const Font* FindFontOfItem( const SvxFontItem& rItem ) const;
// 3 Methoden zum Aufbauen der Styles
SwTxtFmtColl* MakeColl( const String&, sal_uInt16 nPos, sal_uInt8 nOutlineLevel,
bool& rbCollExist );
SwCharFmt* MakeCharFmt( const String& rName, sal_uInt16 nPos,
int& rbCollExist );
void SetStyleAttr( SfxItemSet& rCollSet,
const SfxItemSet& rStyleSet,
const SfxItemSet& rDerivedSet );
SwTxtFmtColl* MakeStyle( sal_uInt16 nNo, const SvxRTFStyleType& rStyle );
SwCharFmt* MakeCharStyle( sal_uInt16 nNo, const SvxRTFStyleType& rStyle );
void MakeStyleTab();
int MakeFieldInst( String& rFieldStr );
// einlesen/einfuegen von Bitmaps
void InsPicture( const String& rNm,
const Graphic* = 0, const SvxRTFPictureType* = 0 );
void _SetPictureSize( const SwNoTxtNode& rNd, const SwNodeIndex& rAnchor,
SfxItemSet& rSet, const SvxRTFPictureType* = 0 );
void SetFlysInDoc();
void GetPageSize( Size& rSize ); // Groesse der PagePrintArea
// fuers Einlesen von Tabellen
void GotoNextBox();
void NewTblLine();
void DelLastNode(); // loesche den letzten Node (Tabelle/Fly/Ftn/..)
void AddNumRule( SwNumRule* pRule );
void SetNumRelSpaces();
void SetOultineRelSpaces( const SwNodeIndex& rStt,
const SwNodeIndex& rEnd );
void SetNumLSpace( SwTxtNode& rNd, const SwNodeNum& rNum,
const SwNumRule& rRule );
long GetSafePos(long nPos);
protected:
// wird fuer jedes Token gerufen, das in CallParser erkannt wird
virtual void NextToken( int nToken );
// virtual void ReadUnknownData();
virtual void ReadBitmapData();
#ifdef READ_OLE_OBJECT
virtual void ReadOLEData();
#endif
virtual void SetAttrInDoc( SvxRTFItemStackType &rSet );
virtual bool UncompressableStackEntry(const SvxRTFItemStackType &rSet) const;
// fuer Tokens, die im ReadAttr nicht ausgewertet werden
virtual void UnknownAttrToken( int nToken, SfxItemSet* pSet );
void ReadPrtData();
void ReadField();
void ReadXEField();
void ReadHeaderFooter( int nToken, SwPageDesc* pPageDesc = 0 );
void ReadDocControls( int nToken );
void SetPageInformationAsDefault(const DocPageInformation &rInfo);
void ReadSectControls( int nToken );
void DoHairyWriterPageDesc(int nToken);
void ReadFly( int nToken, SfxItemSet* pFillSet = 0 );
void ReadTable( int nToken );
void ReadPageDescTbl();
void SkipPageDescTbl();
bool IsBorderToken(int nToken);
const String& GetBaseURL() const { return sBaseURL;}
virtual ~SwRTFParser();
public:
SwRTFParser( SwDoc* pD,
::com::sun::star::uno::Reference<
::com::sun::star::document::XDocumentProperties> i_xDocProps,
const SwPaM& rCrsr, SvStream& rIn,
const String& rBaseURL,
int bReadNewDoc = sal_True );
virtual SvParserState CallParser(); // Aufruf des Parsers
virtual int IsEndPara( SvxNodeIdx* pNd, xub_StrLen nCnt ) const;
// fuers asynchrone lesen aus dem SvStream
// virtual void SaveState( int nToken );
// virtual void RestoreState();
virtual void Continue( int nToken );
};
#endif
/* vi:set tabstop=4 shiftwidth=4 expandtab: */