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