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 <librevenge/librevenge.h>
00032 #include "WP6Listener.h"
00033 #include "WPXContentListener.h"
00034 #include "WP6FileStructure.h"
00035
00036 #include <stack>
00037 #include <map>
00038 #include <vector>
00039
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 librevenge::RVNGString m_bodyText;
00089 librevenge::RVNGString m_textBeforeNumber;
00090 librevenge::RVNGString m_textBeforeDisplayReference;
00091 librevenge::RVNGString m_numberText;
00092 librevenge::RVNGString m_textAfterDisplayReference;
00093 librevenge::RVNGString 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 unsigned short m_currentOutlineHash;
00110 unsigned char 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 unsigned m_leaderCharacter;
00121 unsigned char 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 unsigned char *numberingMethods, const unsigned char tabBehaviourFlag);
00143 void update(const unsigned char *numberingMethods, const unsigned char tabBehaviourFlag);
00144
00145 WPXNumberingType getListType(int level)
00146 {
00147 return m_listTypes[level];
00148 }
00149
00150 protected:
00151 void _updateNumberingMethods(const unsigned char *numberingMethods);
00152
00153 private:
00154 WPXNumberingType m_listTypes[WP6_NUM_LIST_LEVELS];
00155 };
00156
00157 class WP6ContentListener : public WP6Listener, protected WPXContentListener
00158 {
00159 public:
00160 WP6ContentListener(std::list<WPXPageSpan> &pageList, WPXTableList tableList, librevenge::RVNGTextInterface *documentInterface);
00161 ~WP6ContentListener();
00162
00163 void startDocument()
00164 {
00165 WPXContentListener::startDocument();
00166 }
00167 void startSubDocument()
00168 {
00169 WPXContentListener::startSubDocument();
00170 }
00171 void setDate(const unsigned short type, const unsigned short year,
00172 const unsigned char month, const unsigned char day,
00173 const unsigned char hour, const unsigned char minute,
00174 const unsigned char second, const unsigned char dayOfWeek,
00175 const unsigned char timeZone, const unsigned char unused);
00176 void setExtendedInformation(const unsigned short type, const librevenge::RVNGString &data);
00177 void setAlignmentCharacter(const unsigned character);
00178 void setLeaderCharacter(const unsigned character, const unsigned char numSpaces);
00179 void defineTabStops(const bool isRelative, const std::vector<WPXTabStop> &tabStops,
00180 const std::vector<bool> &usePreWP9LeaderMethods);
00181 void insertCharacter(unsigned character);
00182 void insertTab(const unsigned char tabType, double tabPosition);
00183 void handleLineBreak();
00184 void insertEOL();
00185 void insertBreak(const unsigned char breakType)
00186 {
00187 WPXContentListener::insertBreak(breakType);
00188 }
00189 void lineSpacingChange(const double lineSpacing)
00190 {
00191 WPXContentListener::lineSpacingChange(lineSpacing);
00192 }
00193 void justificationChange(const unsigned char justification)
00194 {
00195 WPXContentListener::justificationChange(justification);
00196 }
00197 void characterColorChange(const unsigned char red, const unsigned char green, const unsigned char blue);
00198 void characterShadingChange(const unsigned char shading);
00199 void highlightChange(const bool isOn, const RGBSColor &color);
00200 void fontChange(const unsigned short matchedFontPointSize, const unsigned short fontPID, const librevenge::RVNGString &fontName);
00201 void attributeChange(const bool isOn, const unsigned char attribute);
00202 void spacingAfterParagraphChange(const double spacingRelative, const double spacingAbsolute);
00203 void pageNumberingChange(const WPXPageNumberPosition , const unsigned short , const unsigned short ) {}
00204 void pageMarginChange(const unsigned char , const unsigned short ) {}
00205 void pageFormChange(const unsigned short , const unsigned short , const WPXFormOrientation ) {}
00206 void marginChange(const unsigned char side, const unsigned short margin);
00207 void paragraphMarginChange(const unsigned char side, const signed short margin);
00208 void indentFirstLineChange(const signed short offset);
00209 void columnChange(const WPXTextColumnType columnType, const unsigned char numColumns, const std::vector<double> &columnWidth,
00210 const std::vector<bool> &isFixedWidth);
00211 void updateOutlineDefinition(const unsigned short outlineHash, const unsigned char *numberingMethods, const unsigned char tabBehaviourFlag);
00212
00213 void paragraphNumberOn(const unsigned short outlineHash, const unsigned char level, const unsigned char flag);
00214 void paragraphNumberOff();
00215 void displayNumberReferenceGroupOn(const unsigned char subGroup, const unsigned char level);
00216 void displayNumberReferenceGroupOff(const unsigned char subGroup);
00217 void styleGroupOn(const unsigned char subGroup);
00218 void styleGroupOff(const unsigned char subGroup);
00219 void globalOn(const unsigned char systemStyle);
00220 void globalOff();
00221 void noteOn(const unsigned short textPID);
00222 void noteOff(const WPXNoteType noteType);
00223 void headerFooterGroup(const unsigned char , const unsigned char , const unsigned short ) {}
00224 void suppressPageCharacteristics(const unsigned char ) {}
00225 void setPageNumber(const unsigned short ) {}
00226 void setPageNumberingType(const WPXNumberingType pageNumberingType);
00227 void endDocument()
00228 {
00229 WPXContentListener::endDocument();
00230 }
00231 void endSubDocument()
00232 {
00233 WPXContentListener::endSubDocument();
00234 }
00235
00236 void defineTable(const unsigned char position, const unsigned short leftOffset);
00237 void addTableColumnDefinition(const unsigned width, const unsigned leftGutter, const unsigned rightGutter,
00238 const unsigned attributes, const unsigned char alignment);
00239 void startTable();
00240 void insertRow(const unsigned short rowHeight, const bool isMinimumHeight, const bool isHeaderRow);
00241 void insertCell(const unsigned char colSpan, const unsigned char rowSpan, const unsigned char borderBits,
00242 const RGBSColor *cellFgColor, const RGBSColor *cellBgColor,
00243 const RGBSColor *cellBorderColor, const WPXVerticalAlignment cellVerticalAlignment,
00244 const bool useCellAttributes, const unsigned cellAttributes);
00245 void endTable();
00246 void boxOn(const unsigned char anchoringType, const unsigned char generalPositioningFlags, const unsigned char horizontalPositioningFlags,
00247 const signed short horizontalOffset, const unsigned char leftColumn, const unsigned char rightColumn,
00248 const unsigned char verticalPositioningFlags, const signed short verticalOffset, const unsigned char widthFlags, const unsigned short width,
00249 const unsigned char heightFlags, const unsigned short height, const unsigned char boxContentType, const unsigned short nativeWidth,
00250 const unsigned short nativeHeight);
00251 void boxOff();
00252 void insertGraphicsData(const unsigned short packetId);
00253 void insertTextBox(const WP6SubDocument *subDocument);
00254 void commentAnnotation(const unsigned short textPID);
00255
00256 void undoChange(const unsigned char undoType, const unsigned short undoLevel);
00257
00258 protected:
00259 void _handleSubDocument(const WPXSubDocument *subDocument, WPXSubDocumentType subDocumentType, WPXTableList tableList, unsigned nextTableIndice = 0);
00260
00261
00262 void _paragraphNumberOn(const unsigned short outlineHash, const unsigned char level);
00263 void _flushText();
00264 void _handleListChange(const unsigned short outlineHash);
00265
00266 void _changeList();
00267
00268 private:
00269 WP6ContentListener(const WP6ContentListener &);
00270 WP6ContentListener &operator=(const WP6ContentListener &);
00271 WP6ContentParsingState *m_parseState;
00272
00273 std::map<unsigned short,WP6OutlineDefinition> m_outlineDefineHash;
00274 std::map<unsigned, librevenge::RVNGPropertyList> m_listDefinitions;
00275 };
00276
00277 #endif
00278