xref: /AOO41X/main/sw/source/filter/rtf/swparrtf.hxx (revision b264d727df3f2f855962c46c6c4fbcd5e27e6a7e)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */
24 
25 #ifndef _SWPARRTF_HXX
26 #define _SWPARRTF_HXX
27 
28 #ifndef __SGI_STL_DEQUE
29 #include <deque>
30 #endif
31 #ifndef __SGI_STL_VECTOR
32 #include <vector>
33 #endif
34 
35 #ifndef _SVSTDARR_HXX
36 #define _SVSTDARR_BOOLS
37 #include <svl/svstdarr.hxx>
38 #endif
39 #include <editeng/svxrtf.hxx>
40 #include <editeng/numitem.hxx>
41 #include <editeng/boxitem.hxx>
42 #include <redline.hxx>
43 
44 #include <fltshell.hxx>         // fuer den Attribut Stack
45 #include <ndindex.hxx>
46 #include "../inc/msfilter.hxx"
47 #include <svx/svdobj.hxx>
48 
49 
50 extern void GetLineIndex(SvxBoxItem &rBox, short nLineThickness, short nSpace, sal_uInt8 nCol, short nIdx,
51     sal_uInt16 nOOIndex, sal_uInt16 nWWIndex, short *pSize);
52 
53 class Font;
54 class Graphic;
55 
56 class SwNoTxtNode;
57 class Size;
58 class SwPaM;
59 class SwDoc;
60 class SwPageDesc;
61 class SwTxtFmtColl;
62 class SwTableNode;
63 class SwCharFmt;
64 class SwNumRule;
65 class SwRTFParser;
66 class SvxFontItem;
67 class SwRelNumRuleSpaces;
68 class SwNodeNum;
69 class SwTxtNode;
70 struct SvxRTFPictureType;
71 
72 class RtfReader: public Reader
73 {
74     virtual sal_uLong Read( SwDoc &, const String& rBaseURL, SwPaM &,const String &);
75 public:
76     virtual sal_uLong Read( SvStream* pStrm, SwDoc &, const String& rBaseURL, SwPaM &);
77 };
78 
79 class SwNodeIdx : public SvxNodeIdx
80 {
81     SwNodeIndex aIdx;
82 public:
SwNodeIdx(const SwNodeIndex & rIdx)83     SwNodeIdx( const SwNodeIndex& rIdx ) : aIdx( rIdx ) {}
84     virtual sal_uLong   GetIdx() const;
85     virtual SvxNodeIdx* Clone() const;
86 };
87 
88 class BookmarkPosition
89 {
90 public:
91     SwNodeIndex maMkNode;
92     xub_StrLen mnMkCntnt;
93     BookmarkPosition(const SwPaM &rPaM);
94     BookmarkPosition(const BookmarkPosition &rEntry);
95 
96     bool operator==(const BookmarkPosition);
97 private:
98     //No assignment
99     BookmarkPosition& operator=(const BookmarkPosition&);
100 
101 };
102 
103 class SwxPosition : public SvxPosition
104 {
105     SwPaM* pPam;
106 public:
SwxPosition(SwPaM * pCrsr)107     SwxPosition( SwPaM* pCrsr ) : pPam( pCrsr ) {}
108 
109     virtual sal_uLong   GetNodeIdx() const;
110     virtual xub_StrLen GetCntIdx() const;
111 
112     // erzeuge von sich selbst eine Kopie
113     virtual SvxPosition* Clone() const;
114     // erzeuge vom NodeIndex eine Kopie
115     virtual SvxNodeIdx* MakeNodeIdx() const;
116 };
117 
118 
119 // zum zwischenspeichern der Flys:
120 struct SwFlySave
121 {
122     SfxItemSet  aFlySet;
123     SwNodeIndex nSttNd, nEndNd;
124     xub_StrLen  nEndCnt;
125     SwTwips     nPageWidth;
126     sal_uInt16      nDropLines, nDropAnchor;
127 
128     SwFlySave( const SwPaM& rPam, SfxItemSet& rSet );
129     int IsEqualFly( const SwPaM& rPos, SfxItemSet& rSet );
130     void SetFlySize( const SwTableNode& rTblNd );
131 };
132 
133 struct SwListEntry
134 {
135     long nListId, nListTemplateId, nListNo;
136     sal_uInt16 nListDocPos;
137     sal_Bool bRuleUsed;
138 
SwListEntrySwListEntry139     SwListEntry()
140         : nListId( 0 ), nListTemplateId( 0 ), nListNo( 0 ), nListDocPos( 0 ),
141         bRuleUsed( sal_False )
142     {}
SwListEntrySwListEntry143     SwListEntry( long nLstId, long nLstTmplId, sal_uInt16 nLstDocPos )
144         : nListId( nLstId ), nListTemplateId( nLstTmplId ), nListNo( 0 ),
145         nListDocPos( nLstDocPos ), bRuleUsed( sal_False )
146     {}
147 
ClearSwListEntry148     void Clear() { nListId = nListTemplateId = nListNo = 0, nListDocPos = 0;
149                     bRuleUsed = sal_False; }
150 };
151 
152 DECLARE_TABLE( SwRTFStyleTbl, SwTxtFmtColl* )
153 DECLARE_TABLE( SwRTFCharStyleTbl, SwCharFmt* )
154 typedef SwFlySave* SwFlySavePtr;
155 SV_DECL_PTRARR_DEL( SwFlySaveArr, SwFlySavePtr, 0, 20 )
156 typedef std::deque< SwListEntry > SwListArr;
157 
158 struct DocPageInformation
159 {
160     SvxBoxItem maBox;
161     long mnPaperw;
162     long mnPaperh;
163     long mnMargl;
164     long mnMargr;
165     long mnMargt;
166     long mnMargb;
167     long mnGutter;
168     long mnPgnStart;
169     bool mbFacingp;
170     bool mbLandscape;
171     bool mbRTLdoc;
172     DocPageInformation();
173 };
174 
175 struct SectPageInformation
176 {
177     std::vector<long> maColumns;
178     SvxBoxItem maBox;
179     SvxNumberType maNumType;
180     SwPageDesc *mpTitlePageHdFt;
181     SwPageDesc *mpPageHdFt;
182     long mnPgwsxn;
183     long mnPghsxn;
184     long mnMarglsxn;
185     long mnMargrsxn;
186     long mnMargtsxn;
187     long mnMargbsxn;
188     long mnGutterxsn;
189     long mnHeadery;
190     long mnFootery;
191     long mnPgnStarts;
192     long mnCols;
193     long mnColsx;
194     long mnStextflow;
195     int mnBkc;
196     bool mbLndscpsxn;
197     bool mbTitlepg;
198     bool mbFacpgsxn;
199     bool mbRTLsection;
200     bool mbPgnrestart;
201     bool mbTitlePageHdFtUsed;
202     bool mbPageHdFtUsed;
203     SectPageInformation(const DocPageInformation &rDoc);
204     SectPageInformation(const SectPageInformation &rSect);
205 };
206 
207 class rtfSection
208 {
209 public:
210     rtfSection(const SwPosition &rPos,
211         const SectPageInformation &rPageInfo);
212     SwNodeIndex maStart;
213     SectPageInformation maPageInfo;
214     SwSection *mpSection;
215     SwPageDesc *mpTitlePage;
216     SwPageDesc *mpPage;
217 
IsContinous() const218     bool IsContinous() const { return maPageInfo.mnBkc == 0; }
NoCols() const219     long NoCols() const { return maPageInfo.mnCols; }
StandardColSeperation() const220     long StandardColSeperation() const { return maPageInfo.mnColsx; }
HasTitlePage() const221     bool HasTitlePage() const { return maPageInfo.mbTitlepg; }
PageStartAt() const222     long PageStartAt() const { return maPageInfo.mnPgnStarts; }
PageRestartNo() const223     bool PageRestartNo() const { return maPageInfo.mbPgnrestart; }
IsBiDi() const224     bool IsBiDi() const { return maPageInfo.mbRTLsection; }
GetPageWidth() const225     long GetPageWidth() const { return maPageInfo.mnPgwsxn; }
GetPageHeight() const226     long GetPageHeight() const { return maPageInfo.mnPghsxn; }
GetPageLeft() const227     long GetPageLeft() const { return maPageInfo.mnMarglsxn; }
GetPageRight() const228     long GetPageRight() const { return maPageInfo.mnMargrsxn; }
IsLandScape() const229     bool IsLandScape() const { return maPageInfo.mbLndscpsxn; }
230 };
231 
232 class rtfSections
233 {
234 private:
235     SwRTFParser &mrReader;
236     std::deque<rtfSection> maSegments;
237     typedef std::deque<rtfSection>::iterator mySegIter;
238     typedef std::deque<rtfSection>::reverse_iterator mySegrIter;
239 
240     struct wwULSpaceData
241     {
242         bool bHasHeader, bHasFooter;
243         short nSwHLo, nHdUL, nSwFUp, nFtUL, nSwUp,  nSwLo;
wwULSpaceDatartfSections::wwULSpaceData244         wwULSpaceData() : bHasHeader(false), bHasFooter(false) {}
245     };
246 
247     void SetSegmentToPageDesc(const rtfSection &rSection, bool bTitlePage,
248         bool bIgnoreCols);
249     SwSectionFmt *InsertSection(SwPaM& rMyPaM, rtfSection &rSection);
250     void SetPage(SwPageDesc &rInPageDesc, SwFrmFmt &rFmt,
251         const rtfSection &rSection, bool bIgnoreCols);
252     void GetPageULData(const rtfSection &rSection, bool bFirst,
253         wwULSpaceData& rData);
254     void SetPageULSpaceItems(SwFrmFmt &rFmt, wwULSpaceData& rData);
255     bool SetCols(SwFrmFmt &rFmt, const rtfSection &rSection,
256         sal_uInt16 nNettoWidth);
257     void SetHdFt(rtfSection &rSection);
258     void CopyFrom(const SwPageDesc &rFrom, SwPageDesc &rDest);
259     void MoveFrom(SwPageDesc &rFrom, SwPageDesc &rDest);
260 public:
empty() const261     bool empty() const { return maSegments.empty(); }
size() const262     int size() const { return maSegments.size(); }
263     void push_back(const rtfSection &rSect);
pop_back()264     void pop_back() { maSegments.pop_back(); }
back()265     rtfSection& back() { return maSegments.back(); }
back() const266     const rtfSection& back() const { return maSegments.back(); }
267     void InsertSegments(bool bIsNewDoc);
rtfSections(SwRTFParser & rReader)268     rtfSections(SwRTFParser &rReader) : mrReader(rReader) {}
269     std::vector<sal_uInt16> maDummyPageNos;
270     typedef std::vector<sal_uInt16>::reverse_iterator myrDummyIter;
271     void PrependedInlineNode(const SwPosition &rPos,
272         const SwNode &rNode);
273 };
274 
275 
276 
277 
278 class SwRTFParser : public SvxRTFParser
279 {
280     /*
281      Knows which writer style a given word style should be imported as.
282     */
283     sw::util::ParaStyleMapper maParaStyleMapper;
284     sw::util::CharStyleMapper maCharStyleMapper;
285 
286     std::vector<String> aRevTbl;
287 
288     friend class rtfSections;
289     DocPageInformation maPageDefaults;
290     rtfSections maSegments;
291 
292     sw::util::InsertedTablesManager maInsertedTables;
293     SwRTFStyleTbl aTxtCollTbl;
294     SwRTFCharStyleTbl aCharFmtTbl;
295     SwFlySaveArr aFlyArr;               // Flys als Letzes im Doc setzen
296     SvBools aMergeBoxes;                // Flags fuer gemergte Zellen
297     SwListArr aListArr;
298     SvPtrarr aRubyCharFmts;
299     BookmarkPosition* mpBookmarkStart;
300     sw::util::RedlineStack *mpRedlineStack;
301     sw::util::AuthorInfos* pAuthorInfos;
302 
303     SfxItemSet* pGrfAttrSet;
304     SwTableNode* pTableNode, *pOldTblNd; // fuers Lesen von Tabellen: akt. Tab
305     SwNodeIndex* pSttNdIdx;
306     SwNodeIndex* pRegionEndIdx;
307     SwDoc*  pDoc;
308     SwPaM*  pPam;               // SwPosition duerfte doch reichen, oder ??
309     SwRelNumRuleSpaces* pRelNumRule;    // Liste aller benannten NumRules
310 
311     String sNestedFieldStr;
312     SwFltRedline *pRedlineInsert;
313     SwFltRedline *pRedlineDelete;
314 
315     String sBaseURL;
316 
317     sal_uInt16 nAktPageDesc, nAktFirstPageDesc;
318     sal_uInt16 m_nCurrentBox;
319     sal_uInt16 nInsTblRow;      // beim nach \row kein \pard -> neue Line anlegen
320     sal_uInt16 nNewNumSectDef;  // jeder SectionWechsel kann neue Rules definieren
321     sal_uInt16 nRowsToRepeat;
322 
323     bool bSwPageDesc;
324     bool bReadSwFly;        // lese Swg-Fly (wichtig fuer Bitmaps!)
325     // --> OD 2008-12-22 #i83368#
326     bool mbReadCellWhileReadSwFly;
327     // <--
328     bool mbReadNoTbl;       // verhinder Tabelle in Tabelle/FootNote
329     bool mbIsFootnote;
330     bool bFootnoteAutoNum;  // automatische Numerierung ?
331     bool bStyleTabValid;    // Styles schon erzeugt ?
332     bool bInPgDscTbl;       // beim PageDescTbl lesen
333     bool bNewNumList;       // Word 7.0 NumList gelesen, 6.0 ueberspringen
334     bool bFirstContinue;    // 1.Call ins Continue
335     bool bContainsPara;     // If there is no paragraph in the section
336     bool bContainsTablePara;     // If there is an table in this section
337     bool bForceNewTable;     // Forces a beginning of a new table
338     bool bNestedField;
339     bool bTrowdRead;         // True, iff an \trowd definition was read after the last \row
340 
341     int nReadFlyDepth;
342 
343     int nZOrder;
344     /*
345      #i9243#
346      In a footnote tables are not possible (for some obscure reason!)
347     */
CantUseTables() const348     bool CantUseTables() const { return mbReadNoTbl || mbIsFootnote; }
349 
350     virtual void InsertPara();
351     virtual void InsertText();
352     virtual void MovePos( int bForward = sal_True );
353     virtual void SetEndPrevPara( SvxNodeIdx*& rpNodePos, xub_StrLen& rCntPos );
354     void EnterEnvironment();
355     void LeaveEnvironment();
356 
357     SwFmtPageDesc* GetCurrentPageDesc(SwPaM *pPam);
358     void CheckInsNewTblLine();
359 
360     // setze RTF-Werte auf Swg-Werte
361     void SetSwgValues( SfxItemSet& rSet );
362 
363     virtual void ReadInfo( const sal_Char* pChkForVerNo = 0 );
364 
365     void ReadUserProperties();
366 
367     void ReadListLevel( SwNumRule& rRule, sal_uInt8 nLvl );
368     void SetBorderLine(SvxBoxItem& rBox, sal_uInt16 nLine);
369     void ReadListTable();
370     sal_uInt16 ReadRevTbl();
371     void ReadShpRslt();
372     void ReadShpTxt(String &shpTxt);
373     void ReadDrawingObject();
374     void InsertShpObject(SdrObject* pStroke, int nZOrder);
375     void ReadShapeObject();
376     void ReadListOverrideTable();
377     SwNumRule *ReadNumSecLevel( int nToken );
378     SwNumRule* GetNumRuleOfListNo( long nListNo,
379                                     sal_Bool bRemoveFromList = sal_False );
380     void RemoveUnusedNumRule( SwNumRule* );
381     void RemoveUnusedNumRules();
382     const Font* FindFontOfItem( const SvxFontItem& rItem ) const;
383 
384     // 3 Methoden zum Aufbauen der Styles
385     SwTxtFmtColl* MakeColl( const String&, sal_uInt16 nPos, sal_uInt8 nOutlineLevel,
386                             bool& rbCollExist );
387     SwCharFmt* MakeCharFmt( const String& rName, sal_uInt16 nPos,
388                             int& rbCollExist );
389     void SetStyleAttr( SfxItemSet& rCollSet,
390                         const SfxItemSet& rStyleSet,
391                         const SfxItemSet& rDerivedSet );
392     SwTxtFmtColl* MakeStyle( sal_uInt16 nNo, const SvxRTFStyleType& rStyle );
393     SwCharFmt* MakeCharStyle( sal_uInt16 nNo, const SvxRTFStyleType& rStyle );
394     void MakeStyleTab();
395 
396     int MakeFieldInst( String& rFieldStr );
397 
398     // einlesen/einfuegen von Bitmaps
399     void InsPicture( const String& rNm,
400                     const Graphic* = 0, const SvxRTFPictureType* = 0 );
401     void _SetPictureSize( const SwNoTxtNode& rNd, const SwNodeIndex& rAnchor,
402                             SfxItemSet& rSet, const SvxRTFPictureType* = 0  );
403 
404     void SetFlysInDoc();
405     void GetPageSize( Size& rSize );        // Groesse der PagePrintArea
406 
407     // fuers Einlesen von Tabellen
408     void GotoNextBox();
409     void NewTblLine();
410 
411     void DelLastNode();         // loesche den letzten Node (Tabelle/Fly/Ftn/..)
412 
413     void AddNumRule( SwNumRule* pRule );
414     void SetNumRelSpaces();
415     void SetOultineRelSpaces( const SwNodeIndex& rStt,
416                                 const SwNodeIndex& rEnd );
417     void SetNumLSpace( SwTxtNode& rNd, const SwNodeNum& rNum,
418                                 const SwNumRule& rRule );
419     long GetSafePos(long nPos);
420 
421 protected:
422     // wird fuer jedes Token gerufen, das in CallParser erkannt wird
423     virtual void NextToken( int nToken );
424 
425 //  virtual void ReadUnknownData();
426     virtual void ReadBitmapData();
427 #ifdef READ_OLE_OBJECT
428     virtual void ReadOLEData();
429 #endif
430     virtual void SetAttrInDoc( SvxRTFItemStackType &rSet );
431     virtual bool UncompressableStackEntry(const SvxRTFItemStackType &rSet) const;
432     // fuer Tokens, die im ReadAttr nicht ausgewertet werden
433     virtual void UnknownAttrToken( int nToken, SfxItemSet* pSet );
434 
435     void ReadPrtData();
436     void ReadField();
437     void ReadXEField();
438     void ReadHeaderFooter( int nToken, SwPageDesc* pPageDesc = 0 );
439     void ReadDocControls( int nToken );
440     void SetPageInformationAsDefault(const DocPageInformation &rInfo);
441     void ReadSectControls( int nToken );
442     void DoHairyWriterPageDesc(int nToken);
443     void ReadFly( int nToken, SfxItemSet* pFillSet = 0 );
444     void ReadTable( int nToken );
445     void ReadPageDescTbl();
446     void SkipPageDescTbl();
447     bool IsBorderToken(int nToken);
448 
GetBaseURL() const449     const String& GetBaseURL() const { return sBaseURL;}
450 
451     virtual ~SwRTFParser();
452 
453 public:
454     SwRTFParser( SwDoc* pD,
455         ::com::sun::star::uno::Reference<
456             ::com::sun::star::document::XDocumentProperties> i_xDocProps,
457         const SwPaM& rCrsr, SvStream& rIn,
458         const String& rBaseURL,
459         int bReadNewDoc = sal_True );
460 
461     virtual SvParserState CallParser(); // Aufruf des Parsers
462     virtual int IsEndPara( SvxNodeIdx* pNd, xub_StrLen nCnt ) const;
463 
464     // fuers asynchrone lesen aus dem SvStream
465 //  virtual void SaveState( int nToken );
466 //  virtual void RestoreState();
467     virtual void Continue( int nToken );
468 };
469 
470 
471 #endif
472 
473 /* vi:set tabstop=4 shiftwidth=4 expandtab: */
474