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
00026 #ifndef WP6HLCONTENTLISTENER_H
00027 #define WP6HLCONTENTLISTENER_H
00028
00029 #include "WP6HLListener.h"
00030 #include "WPXHLListener.h"
00031 #include "WP6FileStructure.h"
00032
00033 #include <stack>
00034 #include <map>
00035 #include <vector>
00036
00037 class WPXHLListenerImpl;
00038 class WP6LLParser;
00039 class WPXTable;
00040
00041 enum WP6StyleState { NORMAL, DOCUMENT_NOTE, DOCUMENT_NOTE_GLOBAL,
00042 BEGIN_BEFORE_NUMBERING,
00043 BEGIN_NUMBERING_BEFORE_DISPLAY_REFERENCING,
00044 DISPLAY_REFERENCING,
00045 BEGIN_NUMBERING_AFTER_DISPLAY_REFERENCING,
00046 BEGIN_AFTER_NUMBERING, STYLE_BODY, STYLE_END };
00047
00048 const int STATE_MEMORY = 3;
00049 class WP6StyleStateSequence
00050 {
00051 public:
00052 WP6StyleStateSequence() { clear(); }
00053 void setCurrentState(WP6StyleState state) { for (int i=(STATE_MEMORY-1); i>0; i--) m_stateSequence[i] = m_stateSequence[i-1]; m_stateSequence[0]=state; }
00054 const WP6StyleState getCurrentState() const { return m_stateSequence[0]; }
00055 const WP6StyleState getPreviousState() const { return m_stateSequence[1]; }
00056 void clear() { m_stateSequence.clear(); for (int i=0; i<STATE_MEMORY; i++) m_stateSequence.push_back(NORMAL); }
00057
00058 private:
00059 std::vector<WP6StyleState> m_stateSequence;
00060 WP6StyleState m_currentState;
00061 WP6StyleState m_previousState;
00062 };
00063
00064 typedef struct _WP6ParsingState WP6ParsingState;
00065 struct _WP6ParsingState
00066 {
00067 _WP6ParsingState(WPXTableList tableList, int nextTableIndice = 0);
00068 ~_WP6ParsingState();
00069 WPXString m_bodyText;
00070 WPXString m_textBeforeNumber;
00071 WPXString m_textBeforeDisplayReference;
00072 WPXString m_numberText;
00073 WPXString m_textAfterDisplayReference;
00074 WPXString m_textAfterNumber;
00075
00076 float m_paragraphMarginBottomRelative;
00077 float m_paragraphMarginBottomAbsolute;
00078
00079 int m_numRemovedParagraphBreaks;
00080
00081 WPXTableList m_tableList;
00082 WPXTable *m_currentTable;
00083 int m_nextTableIndice;
00084
00085 std::stack<int> m_listLevelStack;
00086 uint16_t m_currentOutlineHash;
00087 uint8_t m_oldListLevel;
00088 uint8_t m_currentListLevel;
00089 WP6StyleStateSequence m_styleStateSequence;
00090 bool m_putativeListElementHasParagraphNumber;
00091 bool m_putativeListElementHasDisplayReferenceNumber;
00092
00093 int m_noteTextPID;
00094
00095 uint16_t m_leaderCharacter;
00096 uint8_t m_leaderNumSpaces;
00097 std::vector<WPXTabStop> m_tempTabStops;
00098 std::vector<bool> m_tempUsePreWP9LeaderMethod;
00099 };
00100
00101 struct _WP6ListLevel
00102 {
00103 int m_level;
00104 bool m_isListElementOpenAtLevel;
00105 };
00106
00107 class WP6OutlineDefinition
00108 {
00109 public:
00110 WP6OutlineDefinition();
00111 WP6OutlineDefinition(const WP6OutlineLocation outlineLocation, const uint8_t *numberingMethods,
00112 const uint8_t tabBehaviourFlag);
00113 void update(const uint8_t *numberingMethods, const uint8_t tabBehaviourFlag);
00114
00115 WPXNumberingType getListType(int level) { return m_listTypes[level]; }
00116
00117 protected:
00118 void _updateNumberingMethods(const WP6OutlineLocation outlineLocation, const uint8_t *numberingMethods);
00119
00120 private:
00121 WPXNumberingType m_listTypes[WP6_NUM_LIST_LEVELS];
00122 };
00123
00124 class WP6HLContentListener : public WP6HLListener
00125 {
00126 public:
00127 WP6HLContentListener(std::vector<WPXPageSpan *> *pageList, WPXTableList tableList, WPXHLListenerImpl *listenerImpl);
00128 virtual ~WP6HLContentListener();
00129
00130
00131 virtual void setDate(const uint16_t year, const uint8_t month, const uint8_t day,
00132 const uint8_t hour, const uint8_t minute, const uint8_t second,
00133 const uint8_t dayOfWeek, const uint8_t timeZone, const uint8_t unused) {}
00134 virtual void setExtendedInformation(const uint16_t type, const WPXString &data);
00135 virtual void setAlignmentCharacter(const uint16_t character);
00136 virtual void setLeaderCharacter(const uint16_t character, const uint8_t numSpaces);
00137 virtual void defineTabStops(const bool isRelative, const std::vector<WPXTabStop> &tabStops,
00138 const std::vector<bool> &usePreWP9LeaderMethods);
00139 virtual void insertCharacter(const uint16_t character);
00140 virtual void insertTab(const uint8_t tabType, const float tabPosition);
00141 virtual void handleLineBreak();
00142 virtual void insertEOL();
00143 virtual void characterColorChange(const uint8_t red, const uint8_t green, const uint8_t blue);
00144 virtual void characterShadingChange(const uint8_t shading);
00145 virtual void highlightChange(const bool isOn, const RGBSColor color);
00146 virtual void fontChange(const uint16_t matchedFontPointSize, const uint16_t fontPID);
00147 virtual void attributeChange(const bool isOn, const uint8_t attribute);
00148 virtual void spacingAfterParagraphChange(const float spacingRelative, const float spacingAbsolute);
00149 virtual void pageMarginChange(const uint8_t side, const uint16_t margin) {}
00150 virtual void pageFormChange(const uint16_t length, const uint16_t width, const WPXFormOrientation orientation, const bool isPersistent) {}
00151 virtual void marginChange(const uint8_t side, const uint16_t margin);
00152 virtual void paragraphMarginChange(const uint8_t side, const int16_t margin);
00153 virtual void indentFirstLineChange(const int16_t offset);
00154 virtual void columnChange(const WPXTextColumnType columnType, const uint8_t numColumns, const std::vector<float> &columnWidth,
00155 const std::vector<bool> &isFixedWidth);
00156 virtual void updateOutlineDefinition(const WP6OutlineLocation outlineLocation, const uint16_t outlineHash,
00157 const uint8_t *numberingMethods, const uint8_t tabBehaviourFlag);
00158
00159 virtual void paragraphNumberOn(const uint16_t outlineHash, const uint8_t level, const uint8_t flag);
00160 virtual void paragraphNumberOff();
00161 virtual void displayNumberReferenceGroupOn(const uint8_t subGroup, const uint8_t level);
00162 virtual void displayNumberReferenceGroupOff(const uint8_t subGroup);
00163 virtual void styleGroupOn(const uint8_t subGroup);
00164 virtual void styleGroupOff(const uint8_t subGroup);
00165 virtual void globalOn(const uint8_t systemStyle);
00166 virtual void globalOff();
00167 virtual void noteOn(const uint16_t textPID);
00168 virtual void noteOff(const WPXNoteType noteType);
00169 virtual void headerFooterGroup(const uint8_t headerFooterType, const uint8_t occurenceBits, const uint16_t textPID) {}
00170 virtual void suppressPageCharacteristics(const uint8_t suppressCode) {}
00171 virtual void endDocument();
00172
00173 virtual void defineTable(uint8_t position, uint16_t leftOffset);
00174 virtual void addTableColumnDefinition(uint32_t width, uint32_t leftGutter, uint32_t rightGutter);
00175 virtual void startTable();
00176 virtual void insertRow(const uint16_t rowHeight, const bool isMinimumHeight, const bool isHeaderRow);
00177 virtual void insertCell(const uint8_t colSpan, const uint8_t rowSpan, const bool boundFromLeft, const bool boundFromAbove,
00178 const uint8_t borderBits, const RGBSColor * cellFgColor, const RGBSColor * cellBgColor,
00179 const RGBSColor * cellBorderColor,
00180 const WPXVerticalAlignment cellVerticalAlignment, const uint32_t cellAttributes);
00181 virtual void endTable();
00182
00183
00184 protected:
00185 virtual void _handleSubDocument(uint16_t textPID, const bool isHeaderFooter, WPXTableList tableList, int nextTableIndice = 0);
00186
00187
00188 void _paragraphNumberOn(const uint16_t outlineHash, const uint8_t level);
00189 void _flushText(const bool fakeText=false);
00190 void _handleListChange(const uint16_t outlineHash);
00191
00192 void _flushList();
00193
00194 private:
00195 WP6ParsingState *m_parseState;
00196
00197 std::map<int,WP6OutlineDefinition *> m_outlineDefineHash;
00198 };
00199
00200 #endif