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
00027 #ifndef WP6CONTENTLISTENER_H
00028 #define WP6CONTENTLISTENER_H
00029
00030 #include "WP6Listener.h"
00031 #include "WPXContentListener.h"
00032 #include "WP6FileStructure.h"
00033
00034 #include <stack>
00035 #include <map>
00036 #include <vector>
00037
00038 class WPXDocumentInterface;
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 enum WP6ListType { ORDERED, UNORDERED };
00049
00050 const int STATE_MEMORY = 3;
00051 class WP6StyleStateSequence
00052 {
00053 public:
00054 WP6StyleStateSequence() : m_stateSequence(), m_currentState(), m_previousState() { clear(); }
00055 void setCurrentState(WP6StyleState state) { for (int i=(STATE_MEMORY-1); i>0; i--) m_stateSequence[i] = m_stateSequence[i-1]; m_stateSequence[0]=state; }
00056 WP6StyleState getCurrentState() const { return m_stateSequence[0]; }
00057 WP6StyleState getPreviousState() const { return m_stateSequence[1]; }
00058 void clear() { m_stateSequence.clear(); for (int i=0; i<STATE_MEMORY; i++) m_stateSequence.push_back(NORMAL); }
00059
00060 private:
00061 std::vector<WP6StyleState> m_stateSequence;
00062 WP6StyleState m_currentState;
00063 WP6StyleState m_previousState;
00064 };
00065
00066 typedef struct _WP6ContentParsingState WP6ContentParsingState;
00067 struct _WP6ContentParsingState
00068 {
00069 _WP6ContentParsingState(WPXTableList tableList, int nextTableIndice = 0);
00070 ~_WP6ContentParsingState();
00071 WPXString m_bodyText;
00072 WPXString m_textBeforeNumber;
00073 WPXString m_textBeforeDisplayReference;
00074 WPXString m_numberText;
00075 WPXString m_textAfterDisplayReference;
00076 WPXString m_textAfterNumber;
00077
00078 double m_paragraphMarginBottomRelative;
00079 double m_paragraphMarginBottomAbsolute;
00080
00081 int m_numRemovedParagraphBreaks;
00082
00083 int m_numListExtraTabs;
00084 bool m_isListReference;
00085
00086 WPXTableList m_tableList;
00087 WPXTable *m_currentTable;
00088 int m_nextTableIndice;
00089
00090 std::stack<int> m_listLevelStack;
00091 std::stack<WP6ListType> m_listTypeStack;
00092 uint16_t m_currentOutlineHash;
00093 uint8_t m_oldListLevel;
00094 WP6StyleStateSequence m_styleStateSequence;
00095 bool m_putativeListElementHasParagraphNumber;
00096 bool m_putativeListElementHasDisplayReferenceNumber;
00097
00098 int m_noteTextPID;
00099 int m_numNestedNotes;
00100
00101 bool m_isFrameOpened;
00102
00103 uint16_t m_leaderCharacter;
00104 uint8_t m_leaderNumSpaces;
00105 std::vector<WPXTabStop> m_tempTabStops;
00106 std::vector<bool> m_tempUsePreWP9LeaderMethod;
00107
00108 WPXNumberingType m_currentPageNumberingType;
00109
00110 private:
00111 _WP6ContentParsingState(const _WP6ContentParsingState&);
00112 _WP6ContentParsingState& operator=(const _WP6ContentParsingState&);
00113 };
00114
00115 struct _WP6ListLevel
00116 {
00117 int m_level;
00118 bool m_isListElementOpenAtLevel;
00119 };
00120
00121 class WP6OutlineDefinition
00122 {
00123 public:
00124 WP6OutlineDefinition();
00125 WP6OutlineDefinition(const WP6OutlineLocation outlineLocation, const uint8_t *numberingMethods,
00126 const uint8_t tabBehaviourFlag);
00127 void update(const uint8_t *numberingMethods, const uint8_t tabBehaviourFlag);
00128
00129 WPXNumberingType getListType(int level) { return m_listTypes[level]; }
00130
00131 protected:
00132 void _updateNumberingMethods(const WP6OutlineLocation outlineLocation, const uint8_t *numberingMethods);
00133
00134 private:
00135 WPXNumberingType m_listTypes[WP6_NUM_LIST_LEVELS];
00136 };
00137
00138 class WP6ContentListener : public WP6Listener, protected WPXContentListener
00139 {
00140 public:
00141 WP6ContentListener(std::list<WPXPageSpan> &pageList, WPXTableList tableList, WPXDocumentInterface *documentInterface);
00142 ~WP6ContentListener();
00143
00144 void startDocument() { WPXContentListener::startDocument(); };
00145 void startSubDocument() { WPXContentListener::startSubDocument(); };
00146 void setDate(const uint16_t type, const uint16_t year,
00147 const uint8_t month, const uint8_t day,
00148 const uint8_t hour, const uint8_t minute,
00149 const uint8_t second, const uint8_t dayOfWeek,
00150 const uint8_t timeZone, const uint8_t unused);
00151 void setExtendedInformation(const uint16_t type, const WPXString &data);
00152 void setAlignmentCharacter(const uint16_t character);
00153 void setLeaderCharacter(const uint16_t character, const uint8_t numSpaces);
00154 void defineTabStops(const bool isRelative, const std::vector<WPXTabStop> &tabStops,
00155 const std::vector<bool> &usePreWP9LeaderMethods);
00156 void insertCharacter(const uint16_t character);
00157 void insertTab(const uint8_t tabType, double tabPosition);
00158 void handleLineBreak();
00159 void insertEOL();
00160 void insertBreak(const uint8_t breakType) { WPXContentListener::insertBreak(breakType); };
00161 void lineSpacingChange(const double lineSpacing) { WPXContentListener::lineSpacingChange(lineSpacing); };
00162 void justificationChange(const uint8_t justification) { WPXContentListener::justificationChange(justification); };
00163 void characterColorChange(const uint8_t red, const uint8_t green, const uint8_t blue);
00164 void characterShadingChange(const uint8_t shading);
00165 void highlightChange(const bool isOn, const RGBSColor color);
00166 void fontChange(const uint16_t matchedFontPointSize, const uint16_t fontPID, const WPXString &fontName);
00167 void attributeChange(const bool isOn, const uint8_t attribute);
00168 void spacingAfterParagraphChange(const double spacingRelative, const double spacingAbsolute);
00169 void pageNumberingChange(const WPXPageNumberPosition , const uint16_t , const uint16_t ) {}
00170 void pageMarginChange(const uint8_t , const uint16_t ) {}
00171 void pageFormChange(const uint16_t , const uint16_t , const WPXFormOrientation ) {}
00172 void marginChange(const uint8_t side, const uint16_t margin);
00173 void paragraphMarginChange(const uint8_t side, const int16_t margin);
00174 void indentFirstLineChange(const int16_t offset);
00175 void columnChange(const WPXTextColumnType columnType, const uint8_t numColumns, const std::vector<double> &columnWidth,
00176 const std::vector<bool> &isFixedWidth);
00177 void updateOutlineDefinition(const WP6OutlineLocation outlineLocation, const uint16_t outlineHash,
00178 const uint8_t *numberingMethods, const uint8_t tabBehaviourFlag);
00179
00180 void paragraphNumberOn(const uint16_t outlineHash, const uint8_t level, const uint8_t flag);
00181 void paragraphNumberOff();
00182 void displayNumberReferenceGroupOn(const uint8_t subGroup, const uint8_t level);
00183 void displayNumberReferenceGroupOff(const uint8_t subGroup);
00184 void styleGroupOn(const uint8_t subGroup);
00185 void styleGroupOff(const uint8_t subGroup);
00186 void globalOn(const uint8_t systemStyle);
00187 void globalOff();
00188 void noteOn(const uint16_t textPID);
00189 void noteOff(const WPXNoteType noteType);
00190 void headerFooterGroup(const uint8_t , const uint8_t , const uint16_t ) {}
00191 void suppressPageCharacteristics(const uint8_t ) {}
00192 void setPageNumber(const uint16_t ) {}
00193 void setPageNumberingType(const WPXNumberingType pageNumberingType);
00194 void endDocument() { WPXContentListener::endDocument(); };
00195 void endSubDocument() { WPXContentListener::endSubDocument(); };
00196
00197 void defineTable(const uint8_t position, const uint16_t leftOffset);
00198 void addTableColumnDefinition(const uint32_t width, const uint32_t leftGutter, const uint32_t rightGutter,
00199 const uint32_t attributes, const uint8_t alignment);
00200 void startTable();
00201 void insertRow(const uint16_t rowHeight, const bool isMinimumHeight, const bool isHeaderRow);
00202 void insertCell(const uint8_t colSpan, const uint8_t rowSpan, const uint8_t borderBits,
00203 const RGBSColor * cellFgColor, const RGBSColor * cellBgColor,
00204 const RGBSColor * cellBorderColor, const WPXVerticalAlignment cellVerticalAlignment,
00205 const bool useCellAttributes, const uint32_t cellAttributes);
00206 void endTable();
00207 void boxOn(const uint8_t anchoringType, const uint8_t generalPositioningFlags, const uint8_t horizontalPositioningFlags,
00208 const int16_t horizontalOffset, const uint8_t leftColumn, const uint8_t rightColumn,
00209 const uint8_t verticalPositioningFlags, const int16_t verticalOffset, const uint8_t widthFlags, const uint16_t width,
00210 const uint8_t heightFlags, const uint16_t height, const uint8_t boxContentType, const uint16_t nativeWidth,
00211 const uint16_t nativeHeight);
00212 void boxOff();
00213 void insertGraphicsData(const uint16_t packetId);
00214 void insertTextBox(const WP6SubDocument *subDocument);
00215 void commentAnnotation(const uint16_t textPID);
00216
00217 void undoChange(const uint8_t undoType, const uint16_t undoLevel);
00218
00219 protected:
00220 void _handleSubDocument(const WPXSubDocument *subDocument, WPXSubDocumentType subDocumentType, WPXTableList tableList, int nextTableIndice = 0);
00221
00222
00223 void _paragraphNumberOn(const uint16_t outlineHash, const uint8_t level);
00224 void _flushText();
00225 void _handleListChange(const uint16_t outlineHash);
00226
00227 void _changeList();
00228
00229 private:
00230 WP6ContentListener(const WP6ContentListener&);
00231 WP6ContentListener& operator=(const WP6ContentListener&);
00232 WP6ContentParsingState *m_parseState;
00233
00234 std::map<uint16_t,WP6OutlineDefinition *> m_outlineDefineHash;
00235 };
00236
00237 #endif