00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef WPXCONTENTLISTENER_H
00026 #define WPXCONTENTLISTENER_H
00027
00028 #include "WPXTable.h"
00029 #include "WPXPropertyListVector.h"
00030 #include "WPXPropertyList.h"
00031 #include "libwpd_internal.h"
00032 #include "WPXSubDocument.h"
00033 #include "WPXPageSpan.h"
00034 #include "WPXHLListenerImpl.h"
00035 #include "WPXListener.h"
00036 #include <vector>
00037 #include <list>
00038 #include <set>
00039
00040 typedef struct _WPXTableDefinition WPXTableDefinition;
00041 struct _WPXTableDefinition
00042 {
00043 _WPXTableDefinition() : m_positionBits(0), m_leftOffset(0.0f), m_columns(), m_columnsProperties() {};
00044 uint8_t m_positionBits;
00045 float m_leftOffset;
00046 std::vector < WPXColumnDefinition > m_columns;
00047 std::vector < WPXColumnProperties > m_columnsProperties;
00048 };
00049
00050 typedef struct _WPXContentParsingState WPXContentParsingState;
00051 struct _WPXContentParsingState
00052 {
00053 _WPXContentParsingState();
00054 ~_WPXContentParsingState();
00055
00056 uint32_t m_textAttributeBits;
00057 float m_fontSize;
00058 WPXString *m_fontName;
00059 RGBSColor *m_fontColor;
00060 RGBSColor *m_highlightColor;
00061
00062 bool m_isParagraphColumnBreak;
00063 bool m_isParagraphPageBreak;
00064 uint8_t m_paragraphJustification;
00065 uint8_t m_tempParagraphJustification;
00066 float m_paragraphLineSpacing;
00067
00068 bool m_isDocumentStarted;
00069 bool m_isPageSpanOpened;
00070 bool m_isSectionOpened;
00071 bool m_isPageSpanBreakDeferred;
00072 bool m_isHeaderFooterWithoutParagraph;
00073
00074 bool m_isSpanOpened;
00075 bool m_isParagraphOpened;
00076 bool m_isListElementOpened;
00077
00078 std::vector<unsigned int> m_numRowsToSkip;
00079 WPXTableDefinition m_tableDefinition;
00080 int m_currentTableCol;
00081 int m_currentTableRow;
00082 int m_currentTableCellNumberInRow;
00083 bool m_isTableOpened;
00084 bool m_isTableRowOpened;
00085 bool m_isTableColumnOpened;
00086 bool m_isTableCellOpened;
00087 bool m_wasHeaderRow;
00088 bool m_isCellWithoutParagraph;
00089 uint32_t m_cellAttributeBits;
00090 uint8_t m_paragraphJustificationBeforeTable;
00091
00092 unsigned m_currentPage;
00093 int m_numPagesRemainingInSpan;
00094
00095 bool m_sectionAttributesChanged;
00096 int m_numColumns;
00097 std::vector < WPXColumnDefinition > m_textColumns;
00098 bool m_isTextColumnWithoutParagraph;
00099
00100 float m_pageFormLength;
00101 float m_pageFormWidth;
00102 WPXFormOrientation m_pageFormOrientation;
00103
00104 float m_pageMarginLeft;
00105 float m_pageMarginRight;
00106 float m_paragraphMarginLeft;
00107 float m_paragraphMarginRight;
00108 float m_paragraphMarginTop;
00109 float m_paragraphMarginBottom;
00110 float m_leftMarginByPageMarginChange;
00111 float m_rightMarginByPageMarginChange;
00112 float m_sectionMarginLeft;
00113 float m_sectionMarginRight;
00114 float m_leftMarginByParagraphMarginChange;
00115 float m_rightMarginByParagraphMarginChange;
00116 float m_leftMarginByTabs;
00117 float m_rightMarginByTabs;
00118
00119 float m_listReferencePosition;
00120 float m_listBeginPosition;
00121
00122 float m_paragraphTextIndent;
00123 float m_textIndentByParagraphIndentChange;
00124 float m_textIndentByTabs;
00125
00126 uint8_t m_currentListLevel;
00127
00128 uint16_t m_alignmentCharacter;
00129 std::vector<WPXTabStop> m_tabStops;
00130 bool m_isTabPositionRelative;
00131
00132 std::set <const WPXSubDocument *> m_subDocuments;
00133
00134 bool m_inSubDocument;
00135 bool m_isNote;
00136
00137 private:
00138 _WPXContentParsingState(const _WPXContentParsingState&);
00139 _WPXContentParsingState& operator=(const _WPXContentParsingState&);
00140 };
00141
00142 class WPXContentListener : public WPXListener
00143 {
00144 protected:
00145 WPXContentListener(std::list<WPXPageSpan> &pageList, WPXHLListenerImpl *listenerImpl);
00146 virtual ~WPXContentListener();
00147
00148 void startDocument();
00149 void endDocument();
00150 void handleSubDocument(const WPXSubDocument *subDocument, const bool isHeaderFooter, WPXTableList tableList, int nextTableIndice);
00151 void insertBreak(const uint8_t breakType);
00152 void lineSpacingChange(const float lineSpacing);
00153 void justificationChange(const uint8_t justification);
00154
00155 WPXContentParsingState *m_ps;
00156 WPXHLListenerImpl * m_listenerImpl;
00157 WPXPropertyList m_metaData;
00158
00159 virtual void _handleSubDocument(const WPXSubDocument *subDocument, const bool isHeaderFooter, WPXTableList tableList, int nextTableIndice) = 0;
00160 virtual void _flushText() = 0;
00161 virtual void _changeList() = 0;
00162
00163 void _openSection();
00164 void _closeSection();
00165
00166 void _openPageSpan();
00167 void _closePageSpan();
00168
00169 void _appendParagraphProperties(WPXPropertyList &propList, const bool isListElement=false);
00170 void _getTabStops(WPXPropertyListVector &tabStops);
00171 void _appendJustification(WPXPropertyList &propList, int justification);
00172 void _resetParagraphState(const bool isListElement=false);
00173 virtual void _openParagraph();
00174 void _closeParagraph();
00175
00176 void _openListElement();
00177 void _closeListElement();
00178
00179 void _openSpan();
00180 void _closeSpan();
00181
00182 void _openTable();
00183 void _closeTable();
00184 void _openTableRow(const float height, const bool isMinimumHeight, const bool isHeaderRow);
00185 void _closeTableRow();
00186 void _openTableCell(const uint8_t colSpan, const uint8_t rowSpan, const uint8_t borderBits,
00187 const RGBSColor * cellFgColor, const RGBSColor * cellBgColor,
00188 const RGBSColor * cellBorderColor,
00189 const WPXVerticalAlignment cellVerticalAlignment);
00190 void _closeTableCell();
00191
00192 float _movePositionToFirstColumn(float position);
00193
00194 const float _getNextTabStop() const;
00195 const float _getPreviousTabStop() const;
00196
00197 void _insertBreakIfNecessary(WPXPropertyList &propList);
00198
00199 private:
00200 WPXContentListener(const WPXContentListener&);
00201 WPXContentListener& operator=(const WPXContentListener&);
00202 WPXString _colorToString(const RGBSColor * color);
00203 WPXString _mergeColorsToString(const RGBSColor *fgColor, const RGBSColor *bgColor);
00204 };
00205
00206 #endif