WP6ContentListener.h
Go to the documentation of this file.
00001 /* libwpd
00002  * Copyright (C) 2002 William Lachance (wrlach@gmail.com)
00003  * Copyright (C) 2002 Marc Maurer (uwog@uwog.net)
00004  * Copyright (C) 2005-2006 Fridrich Strba (fridrich.strba@bluewin.ch)
00005  *
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU Library General Public
00008  * License as published by the Free Software Foundation; either
00009  * version 2 of the License, or (at your option) any later version.
00010  *
00011  * This library is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014  * Library General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU Library General Public
00017  * License along with this library; if not, write to the Free Software
00018  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
00019  *
00020  * For further information visit http://libwpd.sourceforge.net
00021  */
00022 
00023 /* "This product is not manufactured, approved, or supported by
00024  * Corel Corporation or Corel Corporation Limited."
00025  */
00026 
00027 #ifndef WP6CONTENTLISTENER_H
00028 #define WP6CONTENTLISTENER_H
00029 
00030 #include "WP6Listener.h"
00031 #include "WPXContentListener.h"
00032 #include "WP6FileStructure.h"
00033 
00034 #include <stack>
00035 #include <map>
00036 #include <vector>
00037 
00038 class WPXDocumentInterface;
00039 class WPXTable;
00040 
00041 enum WP6StyleState { NORMAL, DOCUMENT_NOTE, DOCUMENT_NOTE_GLOBAL,
00042                      BEGIN_BEFORE_NUMBERING,
00043                      BEGIN_NUMBERING_BEFORE_DISPLAY_REFERENCING,
00044                      DISPLAY_REFERENCING,
00045                      BEGIN_NUMBERING_AFTER_DISPLAY_REFERENCING,
00046                      BEGIN_AFTER_NUMBERING, STYLE_BODY, STYLE_END };
00047 
00048 enum WP6ListType { ORDERED, UNORDERED };
00049 
00050 const int STATE_MEMORY = 3;
00051 class WP6StyleStateSequence
00052 {
00053 public:
00054         WP6StyleStateSequence() : m_stateSequence(), m_currentState(), m_previousState() { clear(); }
00055         void setCurrentState(WP6StyleState state) { for (int i=(STATE_MEMORY-1); i>0; i--) m_stateSequence[i] = m_stateSequence[i-1]; m_stateSequence[0]=state; }
00056         WP6StyleState getCurrentState() const { return m_stateSequence[0]; /*currentState;*/ }
00057         WP6StyleState getPreviousState() const { return m_stateSequence[1]; /*m_previousState;*/ }
00058         void clear() { m_stateSequence.clear(); for (int i=0; i<STATE_MEMORY; i++) m_stateSequence.push_back(NORMAL); }
00059 
00060 private:
00061         std::vector<WP6StyleState> m_stateSequence;
00062         WP6StyleState m_currentState;
00063         WP6StyleState m_previousState;
00064 };
00065 
00066 typedef struct _WP6ContentParsingState WP6ContentParsingState;
00067 struct _WP6ContentParsingState
00068 {
00069         _WP6ContentParsingState(WPXTableList tableList, int nextTableIndice = 0);
00070         ~_WP6ContentParsingState();
00071         WPXString m_bodyText;
00072         WPXString m_textBeforeNumber;
00073         WPXString m_textBeforeDisplayReference;
00074         WPXString m_numberText;
00075         WPXString m_textAfterDisplayReference;
00076         WPXString m_textAfterNumber;
00077 
00078         double m_paragraphMarginBottomRelative;
00079         double m_paragraphMarginBottomAbsolute;
00080 
00081         int m_numRemovedParagraphBreaks;
00082         
00083         int m_numListExtraTabs;
00084         bool m_isListReference;
00085 
00086         WPXTableList m_tableList;
00087         WPXTable *m_currentTable;
00088         int m_nextTableIndice;
00089 
00090         std::stack<int> m_listLevelStack;
00091         std::stack<WP6ListType> m_listTypeStack;
00092         uint16_t m_currentOutlineHash; // probably should replace Hash with Key in these sorts of cases
00093         uint8_t m_oldListLevel;
00094         WP6StyleStateSequence m_styleStateSequence;
00095         bool m_putativeListElementHasParagraphNumber;
00096         bool m_putativeListElementHasDisplayReferenceNumber;
00097 
00098         int m_noteTextPID;
00099         int m_numNestedNotes;
00100         
00101         bool m_isFrameOpened;
00102 
00103         uint16_t m_leaderCharacter;
00104         uint8_t m_leaderNumSpaces;
00105         std::vector<WPXTabStop> m_tempTabStops;
00106         std::vector<bool> m_tempUsePreWP9LeaderMethod;
00107 
00108         WPXNumberingType m_currentPageNumberingType;
00109 
00110 private:
00111         _WP6ContentParsingState(const _WP6ContentParsingState&);
00112         _WP6ContentParsingState& operator=(const _WP6ContentParsingState&);
00113 };
00114 
00115 struct _WP6ListLevel
00116 {
00117         int m_level;
00118         bool m_isListElementOpenAtLevel;
00119 };
00120 
00121 class WP6OutlineDefinition
00122 {
00123  public:
00124         WP6OutlineDefinition();
00125         WP6OutlineDefinition(const WP6OutlineLocation outlineLocation, const uint8_t *numberingMethods,
00126                           const uint8_t tabBehaviourFlag);
00127         void update(const uint8_t *numberingMethods, const uint8_t tabBehaviourFlag);
00128 
00129         WPXNumberingType getListType(int level) { return m_listTypes[level]; }
00130 
00131 protected:
00132         void _updateNumberingMethods(const WP6OutlineLocation outlineLocation, const uint8_t *numberingMethods);
00133 
00134 private:
00135         WPXNumberingType m_listTypes[WP6_NUM_LIST_LEVELS];
00136 };
00137 
00138 class WP6ContentListener : public WP6Listener, protected WPXContentListener
00139 {
00140 public:
00141         WP6ContentListener(std::list<WPXPageSpan> &pageList, WPXTableList tableList, WPXDocumentInterface *documentInterface);
00142         ~WP6ContentListener();
00143 
00144         void startDocument() { WPXContentListener::startDocument(); };
00145         void startSubDocument() { WPXContentListener::startSubDocument(); };
00146         void setDate(const uint16_t type, const uint16_t year, 
00147                      const uint8_t month, const uint8_t day, 
00148                      const uint8_t hour, const uint8_t minute, 
00149                      const uint8_t second, const uint8_t dayOfWeek, 
00150                      const uint8_t timeZone, const uint8_t unused);
00151         void setExtendedInformation(const uint16_t type, const WPXString &data);
00152         void setAlignmentCharacter(const uint16_t character);
00153         void setLeaderCharacter(const uint16_t character, const uint8_t numSpaces);
00154         void defineTabStops(const bool isRelative, const std::vector<WPXTabStop> &tabStops, 
00155                                     const std::vector<bool> &usePreWP9LeaderMethods);
00156         void insertCharacter(uint32_t character);
00157         void insertTab(const uint8_t tabType, double tabPosition);
00158         void handleLineBreak();
00159         void insertEOL();
00160         void insertBreak(const uint8_t breakType) { WPXContentListener::insertBreak(breakType); };
00161         void lineSpacingChange(const double lineSpacing) { WPXContentListener::lineSpacingChange(lineSpacing); };
00162         void justificationChange(const uint8_t justification) { WPXContentListener::justificationChange(justification); };
00163         void characterColorChange(const uint8_t red, const uint8_t green, const uint8_t blue);
00164         void characterShadingChange(const uint8_t shading);
00165         void highlightChange(const bool isOn, const RGBSColor color);
00166         void fontChange(const uint16_t matchedFontPointSize, const uint16_t fontPID, const WPXString &fontName);
00167         void attributeChange(const bool isOn, const uint8_t attribute);
00168         void spacingAfterParagraphChange(const double spacingRelative, const double spacingAbsolute);
00169         void pageNumberingChange(const WPXPageNumberPosition /* page numbering position */, const uint16_t /* matchedFontPointSize */, const uint16_t /* fontPID */) {}
00170         void pageMarginChange(const uint8_t /* side */, const uint16_t /* margin */) {}
00171         void pageFormChange(const uint16_t /* length */, const uint16_t /* width */, const WPXFormOrientation /* orientation */) {}
00172         void marginChange(const uint8_t side, const uint16_t margin);
00173         void paragraphMarginChange(const uint8_t side, const int16_t margin);
00174         void indentFirstLineChange(const int16_t offset);
00175         void columnChange(const WPXTextColumnType columnType, const uint8_t numColumns, const std::vector<double> &columnWidth,
00176                                   const std::vector<bool> &isFixedWidth);
00177         void updateOutlineDefinition(const WP6OutlineLocation outlineLocation, const uint16_t outlineHash,
00178                                              const uint8_t *numberingMethods, const uint8_t tabBehaviourFlag);
00179 
00180         void paragraphNumberOn(const uint16_t outlineHash, const uint8_t level, const uint8_t flag);
00181         void paragraphNumberOff();
00182         void displayNumberReferenceGroupOn(const uint8_t subGroup, const uint8_t level);
00183         void displayNumberReferenceGroupOff(const uint8_t subGroup);
00184         void styleGroupOn(const uint8_t subGroup);
00185         void styleGroupOff(const uint8_t subGroup);
00186         void globalOn(const uint8_t systemStyle);
00187         void globalOff();
00188         void noteOn(const uint16_t textPID);
00189         void noteOff(const WPXNoteType noteType);
00190         void headerFooterGroup(const uint8_t /* headerFooterType */, const uint8_t /* occurenceBits */, const uint16_t /* textPID */) {}
00191         void suppressPageCharacteristics(const uint8_t /* suppressCode */) {}
00192         void setPageNumber(const uint16_t /* pageNumber */) {}
00193         void setPageNumberingType(const WPXNumberingType pageNumberingType);
00194         void endDocument() { WPXContentListener::endDocument(); };
00195         void endSubDocument() { WPXContentListener::endSubDocument(); };
00196 
00197         void defineTable(const uint8_t position, const uint16_t leftOffset);
00198         void addTableColumnDefinition(const uint32_t width, const uint32_t leftGutter, const uint32_t rightGutter,
00199                                 const uint32_t attributes, const uint8_t alignment);
00200         void startTable();
00201         void insertRow(const uint16_t rowHeight, const bool isMinimumHeight, const bool isHeaderRow);
00202         void insertCell(const uint8_t colSpan, const uint8_t rowSpan, const uint8_t borderBits,
00203                                 const RGBSColor * cellFgColor, const RGBSColor * cellBgColor,
00204                                 const RGBSColor * cellBorderColor, const WPXVerticalAlignment cellVerticalAlignment, 
00205                                 const bool useCellAttributes, const uint32_t cellAttributes);
00206         void endTable();
00207         void boxOn(const uint8_t anchoringType, const uint8_t generalPositioningFlags, const uint8_t horizontalPositioningFlags,
00208                 const int16_t horizontalOffset, const uint8_t leftColumn, const uint8_t rightColumn,
00209                 const uint8_t verticalPositioningFlags, const int16_t verticalOffset, const uint8_t widthFlags, const uint16_t width,
00210                 const uint8_t heightFlags, const uint16_t height, const uint8_t boxContentType, const uint16_t nativeWidth,
00211                 const uint16_t nativeHeight);
00212         void boxOff();
00213         void insertGraphicsData(const uint16_t packetId);
00214         void insertTextBox(const WP6SubDocument *subDocument);
00215         void commentAnnotation(const uint16_t textPID);
00216 
00217         void undoChange(const uint8_t undoType, const uint16_t undoLevel);
00218 
00219 protected:
00220         void _handleSubDocument(const WPXSubDocument *subDocument, WPXSubDocumentType subDocumentType, WPXTableList tableList, int nextTableIndice = 0);
00221 
00222         //void _handleLineBreakElementBegin();
00223         void _paragraphNumberOn(const uint16_t outlineHash, const uint8_t level);
00224         void _flushText();
00225         void _handleListChange(const uint16_t outlineHash);
00226 
00227         void _changeList();
00228 
00229 private:
00230         WP6ContentListener(const WP6ContentListener&);
00231         WP6ContentListener& operator=(const WP6ContentListener&);
00232         WP6ContentParsingState *m_parseState;
00233 
00234         std::map<uint16_t,WP6OutlineDefinition *> m_outlineDefineHash;
00235 };
00236 
00237 #endif /* WP6CONTENTLISTENER_H */