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 <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; // probably should replace Hash with Key in these sorts of cases
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 /* page numbering position */, const unsigned short /* matchedFontPointSize */, const unsigned short /* fontPID */) {}
00204         void pageMarginChange(const unsigned char /* side */, const unsigned short /* margin */) {}
00205         void pageFormChange(const unsigned short /* length */, const unsigned short /* width */, const WPXFormOrientation /* orientation */) {}
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 /* headerFooterType */, const unsigned char /* occurrenceBits */, const unsigned short /* textPID */) {}
00224         void suppressPageCharacteristics(const unsigned char /* suppressCode */) {}
00225         void setPageNumber(const unsigned short /* pageNumber */) {}
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         //void _handleLineBreakElementBegin();
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 /* WP6CONTENTLISTENER_H */
00278 /* vim:set shiftwidth=4 softtabstop=4 noexpandtab: */