xref: /AOO41X/main/writerperfect/source/filter/DocumentCollector.hxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /* DocumentCollector: Collects sections and runs of text from a
2  * file (and styles to go along with them) and writes them
3  * to a target file
4  *
5  * Copyright (C) 2002-2004 William Lachance (william.lachance@sympatico.ca)
6  * Copyright (C) 2003-2004 Net Integration Technologies (http://www.net-itech.com)
7  * Copyright (C) 2004 Fridrich Strba (fridrich.strba@bluewin.ch)
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2 of the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Library General Public License for more details.
18  *
19  * You should have received a copy of the GNU Library General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
22  *
23  * For further information visit http://libwpd.sourceforge.net
24  *
25  */
26 
27 /* "This product is not manufactured, approved, or supported by
28  * Corel Corporation or Corel Corporation Limited."
29  */
30 
31 #ifndef _DOCUMENTCOLLECTOR_HXX
32 #define _DOCUMENTCOLLECTOR_HXX
33 #include "SectionStyle.hxx"
34 
35 #if defined _MSC_VER
36 #pragma warning( push, 1 )
37 #endif
38 #include <libwpd/libwpd.h>
39 #if defined _MSC_VER
40 #pragma warning( pop )
41 #endif
42 #include <vector>
43 #include <map>
44 #include <stack>
45 #include <string.h>
46 
47 class DocumentElement;
48 class DocumentHandler;
49 class TagOpenElement;
50 class FontStyle;
51 class ListStyle;
52 
53 class ParagraphStyle;
54 class SpanStyle;
55 class TableStyle;
56 class PageSpan;
57 
58 // the state we use for writing the final document
59 typedef struct _WriterDocumentState WriterDocumentState;
60 struct _WriterDocumentState
61 {
62     _WriterDocumentState();
63 
64     bool mbFirstElement;
65     bool mbInFakeSection;
66     bool mbListElementOpenedAtCurrentLevel;
67     bool mbTableCellOpened;
68     bool mbHeaderRow;
69     bool mbInNote;
70 };
71 
72 enum WriterListType { unordered, ordered };
73 
74 struct ltstr
75 {
operator ()ltstr76   bool operator()(const WPXString & s1, const WPXString & s2) const
77   {
78     return strcmp(s1.cstr(), s2.cstr()) < 0;
79   }
80 };
81 
82 class DocumentCollector : public WPXHLListenerImpl
83 {
84 public:
85     DocumentCollector(WPXInputStream *pInput, DocumentHandler *pHandler);
86     virtual ~DocumentCollector();
87     bool filter();
88 
setDocumentMetaData(const WPXPropertyList &)89     virtual void setDocumentMetaData(const WPXPropertyList & /* propList */) {}
startDocument()90     virtual void startDocument() {}
endDocument()91     virtual void endDocument() {}
92 
93     virtual void openPageSpan(const WPXPropertyList &propList);
closePageSpan()94     virtual void closePageSpan() {}
95 
96     virtual void openSection(const WPXPropertyList &propList, const WPXPropertyListVector &columns);
97     virtual void closeSection();
98 
99     virtual void openHeader(const WPXPropertyList &propList);
100     virtual void closeHeader();
101     virtual void openFooter(const WPXPropertyList &propList);
102     virtual void closeFooter();
103 
104     virtual void openParagraph(const WPXPropertyList &propList, const WPXPropertyListVector &tabStops);
105     virtual void closeParagraph();
106 
107     virtual void openSpan(const WPXPropertyList &propList);
108     virtual void closeSpan();
109 
110 
111     virtual void insertTab();
112     virtual void insertText(const WPXString &text);
113     virtual void insertLineBreak();
114 
115     virtual void defineOrderedListLevel(const WPXPropertyList &propList);
116     virtual void defineUnorderedListLevel(const WPXPropertyList &propList);
117     virtual void openOrderedListLevel(const WPXPropertyList &propList);
118     virtual void openUnorderedListLevel(const WPXPropertyList &propList);
119     virtual void closeOrderedListLevel();
120     virtual void closeUnorderedListLevel();
121     virtual void openListElement(const WPXPropertyList &propList, const WPXPropertyListVector &tabStops);
122     virtual void closeListElement();
123 
124     virtual void openFootnote(const WPXPropertyList &propList);
125     virtual void closeFootnote();
126     virtual void openEndnote(const WPXPropertyList &propList);
127     virtual void closeEndnote();
128 
129     virtual void openTable(const WPXPropertyList &propList, const WPXPropertyListVector &columns);
130     virtual void openTableRow(const WPXPropertyList &propList);
131     virtual void closeTableRow();
132     virtual void openTableCell(const WPXPropertyList &propList);
133     virtual void closeTableCell();
134     virtual void insertCoveredTableCell(const WPXPropertyList &propList);
135     virtual void closeTable();
136     virtual bool parseSourceDocument(WPXInputStream &input) = 0;
137 
138 protected:
139     void _resetDocumentState();
140     bool _writeTargetDocument(DocumentHandler *pHandler);
141     void _writeDefaultStyles(DocumentHandler *pHandler);
142     void _writeMasterPages(DocumentHandler *pHandler);
143     void _writePageMasters(DocumentHandler *pHandler);
144     void _allocateFontName(const WPXString &);
145 
146 private:
147     void _openListLevel(TagOpenElement *pListLevelOpenElement);
148     void _closeListLevel(const char *szListType);
149 
150         WPXInputStream *mpInput;
151         DocumentHandler *mpHandler;
152     bool mbUsed; // whether or not it has been before (you can only use me once!)
153 
154     WriterDocumentState mWriterDocumentState;
155 
156     // paragraph styles
157     std::map<WPXString, ParagraphStyle *, ltstr> mTextStyleHash;
158 
159         // span styles
160         std::map<WPXString, SpanStyle *, ltstr> mSpanStyleHash;
161 
162     // font styles
163     std::map<WPXString, FontStyle *, ltstr> mFontHash;
164 
165     // section styles
166     std::vector<SectionStyle *> mSectionStyles;
167     float mfSectionSpaceAfter;
168 
169     // table styles
170     std::vector<TableStyle *> mTableStyles;
171 
172     // list styles
173     unsigned int miNumListStyles;
174 
175     // style elements
176     std::vector<DocumentElement *> mStylesElements;
177     // content elements
178     std::vector<DocumentElement *> mBodyElements;
179     // the current set of elements that we're writing to
180     std::vector<DocumentElement *> * mpCurrentContentElements;
181 
182     // page state
183     std::vector<PageSpan *> mPageSpans;
184     PageSpan *mpCurrentPageSpan;
185     int miNumPageStyles;
186 
187     // list styles / state
188     ListStyle *mpCurrentListStyle;
189     unsigned int miCurrentListLevel;
190     unsigned int miLastListLevel;
191     unsigned int miLastListNumber;
192     std::vector<ListStyle *> mListStyles;
193     bool mbListContinueNumbering;
194     bool mbListElementOpened;
195     bool mbListElementParagraphOpened;
196 
197     // table state
198     TableStyle *mpCurrentTableStyle;
199 };
200 
201 #endif
202