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