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  * Copyright (C) 2002 William Lachance (wrlach@gmail.com)
00004  * Copyright (C) 2002 Marc Maurer (uwog@uwog.net)
00005  * Copyright (C) 2005-2006 Fridrich Strba (fridrich.strba@bluewin.ch)
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Library General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2 of the License, or (at your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Library General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Library General Public
00018  * License along with this library; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
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(), 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]; /*currentState;*/
00068         }
00069         WP6StyleState getPreviousState() const
00070         {
00071                 return m_stateSequence[1]; /*m_previousState;*/
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; // probably should replace Hash with Key in these sorts of cases
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 /* page numbering position */, const uint16_t /* matchedFontPointSize */, const uint16_t /* fontPID */) {}
00207         void pageMarginChange(const uint8_t /* side */, const uint16_t /* margin */) {}
00208         void pageFormChange(const uint16_t /* length */, const uint16_t /* width */, const WPXFormOrientation /* orientation */) {}
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 /* headerFooterType */, const uint8_t /* occurenceBits */, const uint16_t /* textPID */) {}
00228         void suppressPageCharacteristics(const uint8_t /* suppressCode */) {}
00229         void setPageNumber(const uint16_t /* pageNumber */) {}
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         //void _handleLineBreakElementBegin();
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 /* WP6CONTENTLISTENER_H */
00281 /* vim:set shiftwidth=4 softtabstop=4 noexpandtab: */