WP6ContentListener.h
Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
00002 /* libwpd
00003  * Version: MPL 2.0 / LGPLv2.1+
00004  *
00005  * This Source Code Form is subject to the terms of the Mozilla Public
00006  * License, v. 2.0. If a copy of the MPL was not distributed with this
00007  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
00008  *
00009  * Major Contributor(s):
00010  * Copyright (C) 2002 William Lachance (wrlach@gmail.com)
00011  * Copyright (C) 2002 Marc Maurer (uwog@uwog.net)
00012  * Copyright (C) 2005-2006 Fridrich Strba (fridrich.strba@bluewin.ch)
00013  *
00014  * For minor contributions see the git repository.
00015  *
00016  * Alternatively, the contents of this file may be used under the terms
00017  * of the GNU Lesser General Public License Version 2.1 or later
00018  * (LGPLv2.1+), in which case the provisions of the LGPLv2.1+ are
00019  * applicable instead of those above.
00020  *
00021  * For further information visit http://libwpd.sourceforge.net
00022  */
00023 
00024 /* "This product is not manufactured, approved, or supported by
00025  * Corel Corporation or Corel Corporation Limited."
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; // probably should replace Hash with Key in these sorts of cases
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 /* page numbering position */, const uint16_t /* matchedFontPointSize */, const uint16_t /* fontPID */) {}
00205         void pageMarginChange(const uint8_t /* side */, const uint16_t /* margin */) {}
00206         void pageFormChange(const uint16_t /* length */, const uint16_t /* width */, const WPXFormOrientation /* orientation */) {}
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 /* headerFooterType */, const uint8_t /* occurenceBits */, const uint16_t /* textPID */) {}
00226         void suppressPageCharacteristics(const uint8_t /* suppressCode */) {}
00227         void setPageNumber(const uint16_t /* pageNumber */) {}
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         //void _handleLineBreakElementBegin();
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 /* WP6CONTENTLISTENER_H */
00279 /* vim:set shiftwidth=4 softtabstop=4 noexpandtab: */