blob: 378fbd840a2514b7063f5c273e18d7d08af8171f [file] [log] [blame]
/* DocumentCollector: Collects sections and runs of text from a
* file (and styles to go along with them) and writes them
* to a target file
*
* Copyright (C) 2002-2004 William Lachance (william.lachance@sympatico.ca)
* Copyright (C) 2003-2004 Net Integration Technologies (http://www.net-itech.com)
* Copyright (C) 2004 Fridrich Strba (fridrich.strba@bluewin.ch)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* For further information visit http://libwpd.sourceforge.net
*
*/
/* "This product is not manufactured, approved, or supported by
* Corel Corporation or Corel Corporation Limited."
*/
#ifndef _DOCUMENTCOLLECTOR_HXX
#define _DOCUMENTCOLLECTOR_HXX
#include "SectionStyle.hxx"
#if defined _MSC_VER
#pragma warning( push, 1 )
#endif
#include <libwpd/libwpd.h>
#if defined _MSC_VER
#pragma warning( pop )
#endif
#include <vector>
#include <map>
#include <stack>
#include <string.h>
class DocumentElement;
class DocumentHandler;
class TagOpenElement;
class FontStyle;
class ListStyle;
class ParagraphStyle;
class SpanStyle;
class TableStyle;
class PageSpan;
// the state we use for writing the final document
typedef struct _WriterDocumentState WriterDocumentState;
struct _WriterDocumentState
{
_WriterDocumentState();
bool mbFirstElement;
bool mbInFakeSection;
bool mbListElementOpenedAtCurrentLevel;
bool mbTableCellOpened;
bool mbHeaderRow;
bool mbInNote;
};
enum WriterListType { unordered, ordered };
struct ltstr
{
bool operator()(const WPXString & s1, const WPXString & s2) const
{
return strcmp(s1.cstr(), s2.cstr()) < 0;
}
};
class DocumentCollector : public WPXHLListenerImpl
{
public:
DocumentCollector(WPXInputStream *pInput, DocumentHandler *pHandler);
virtual ~DocumentCollector();
bool filter();
virtual void setDocumentMetaData(const WPXPropertyList & /* propList */) {}
virtual void startDocument() {}
virtual void endDocument() {}
virtual void openPageSpan(const WPXPropertyList &propList);
virtual void closePageSpan() {}
virtual void openSection(const WPXPropertyList &propList, const WPXPropertyListVector &columns);
virtual void closeSection();
virtual void openHeader(const WPXPropertyList &propList);
virtual void closeHeader();
virtual void openFooter(const WPXPropertyList &propList);
virtual void closeFooter();
virtual void openParagraph(const WPXPropertyList &propList, const WPXPropertyListVector &tabStops);
virtual void closeParagraph();
virtual void openSpan(const WPXPropertyList &propList);
virtual void closeSpan();
virtual void insertTab();
virtual void insertText(const WPXString &text);
virtual void insertLineBreak();
virtual void defineOrderedListLevel(const WPXPropertyList &propList);
virtual void defineUnorderedListLevel(const WPXPropertyList &propList);
virtual void openOrderedListLevel(const WPXPropertyList &propList);
virtual void openUnorderedListLevel(const WPXPropertyList &propList);
virtual void closeOrderedListLevel();
virtual void closeUnorderedListLevel();
virtual void openListElement(const WPXPropertyList &propList, const WPXPropertyListVector &tabStops);
virtual void closeListElement();
virtual void openFootnote(const WPXPropertyList &propList);
virtual void closeFootnote();
virtual void openEndnote(const WPXPropertyList &propList);
virtual void closeEndnote();
virtual void openTable(const WPXPropertyList &propList, const WPXPropertyListVector &columns);
virtual void openTableRow(const WPXPropertyList &propList);
virtual void closeTableRow();
virtual void openTableCell(const WPXPropertyList &propList);
virtual void closeTableCell();
virtual void insertCoveredTableCell(const WPXPropertyList &propList);
virtual void closeTable();
virtual bool parseSourceDocument(WPXInputStream &input) = 0;
protected:
void _resetDocumentState();
bool _writeTargetDocument(DocumentHandler *pHandler);
void _writeDefaultStyles(DocumentHandler *pHandler);
void _writeMasterPages(DocumentHandler *pHandler);
void _writePageMasters(DocumentHandler *pHandler);
void _allocateFontName(const WPXString &);
private:
void _openListLevel(TagOpenElement *pListLevelOpenElement);
void _closeListLevel(const char *szListType);
WPXInputStream *mpInput;
DocumentHandler *mpHandler;
bool mbUsed; // whether or not it has been before (you can only use me once!)
WriterDocumentState mWriterDocumentState;
// paragraph styles
std::map<WPXString, ParagraphStyle *, ltstr> mTextStyleHash;
// span styles
std::map<WPXString, SpanStyle *, ltstr> mSpanStyleHash;
// font styles
std::map<WPXString, FontStyle *, ltstr> mFontHash;
// section styles
std::vector<SectionStyle *> mSectionStyles;
float mfSectionSpaceAfter;
// table styles
std::vector<TableStyle *> mTableStyles;
// list styles
unsigned int miNumListStyles;
// style elements
std::vector<DocumentElement *> mStylesElements;
// content elements
std::vector<DocumentElement *> mBodyElements;
// the current set of elements that we're writing to
std::vector<DocumentElement *> * mpCurrentContentElements;
// page state
std::vector<PageSpan *> mPageSpans;
PageSpan *mpCurrentPageSpan;
int miNumPageStyles;
// list styles / state
ListStyle *mpCurrentListStyle;
unsigned int miCurrentListLevel;
unsigned int miLastListLevel;
unsigned int miLastListNumber;
std::vector<ListStyle *> mListStyles;
bool mbListContinueNumbering;
bool mbListElementOpened;
bool mbListElementParagraphOpened;
// table state
TableStyle *mpCurrentTableStyle;
};
#endif