MsWks4Text.hxx
Go to the documentation of this file.
00001 /* -*- Mode: C++; c-default-style: "k&r"; indent-tabs-mode: nil; tab-width: 2; c-basic-offset: 2 -*- */
00002 
00003 /* libmwaw
00004 * Version: MPL 2.0 / LGPLv2+
00005 *
00006 * The contents of this file are subject to the Mozilla Public License Version
00007 * 2.0 (the "License"); you may not use this file except in compliance with
00008 * the License or as specified alternatively below. You may obtain a copy of
00009 * the License at http://www.mozilla.org/MPL/
00010 *
00011 * Software distributed under the License is distributed on an "AS IS" basis,
00012 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00013 * for the specific language governing rights and limitations under the
00014 * License.
00015 *
00016 * Major Contributor(s):
00017 * Copyright (C) 2002 William Lachance (wrlach@gmail.com)
00018 * Copyright (C) 2002,2004 Marc Maurer (uwog@uwog.net)
00019 * Copyright (C) 2004-2006 Fridrich Strba (fridrich.strba@bluewin.ch)
00020 * Copyright (C) 2006, 2007 Andrew Ziem
00021 * Copyright (C) 2011, 2012 Alonso Laurent (alonso@loria.fr)
00022 *
00023 *
00024 * All Rights Reserved.
00025 *
00026 * For minor contributions see the git repository.
00027 *
00028 * Alternatively, the contents of this file may be used under the terms of
00029 * the GNU Lesser General Public License Version 2 or later (the "LGPLv2+"),
00030 * in which case the provisions of the LGPLv2+ are applicable
00031 * instead of those above.
00032 */
00033 
00034 #ifndef MS_WKS4_TEXT
00035 #  define MS_WKS4_TEXT
00036 
00037 #include <vector>
00038 
00039 #include "MWAWEntry.hxx"
00040 #include "MWAWDebug.hxx"
00041 #include "MWAWInputStream.hxx"
00042 
00043 namespace MsWks4TextInternal
00044 {
00045 struct Font;
00046 struct Paragraph;
00047 struct State;
00048 }
00049 
00050 class MsWksDocument;
00051 class MsWks4Zone;
00052 
00064 class MsWks4Text
00065 {
00066   friend class MsWks4Zone;
00067 protected:
00068   struct DataFOD;
00075   typedef bool (MsWks4Text::* FDPParser)(MWAWInputStreamPtr &input, long endPos,
00076                                          int &id, std::string &mess);
00077 public:
00079   MsWks4Text(MsWksDocument &document);
00080 
00082   ~MsWks4Text();
00083 
00085   void setDefault(MWAWFont &font);
00086 
00088   int numPages() const;
00089 
00091   void flushExtra(MWAWInputStreamPtr /*input*/) {}
00092 
00093 protected:
00097   bool readStructures(MWAWInputStreamPtr input, bool mainOle);
00098 
00100   bool readText(MWAWInputStreamPtr input, MWAWEntry const &entry, bool mainOle);
00101 
00103   bool readFootNote(MWAWInputStreamPtr input, int id);
00104 
00105   //----------------------------------------
00106   // PLC parsing, setting
00107   //----------------------------------------
00115   typedef bool (MsWks4Text::* DataParser)
00116   (MWAWInputStreamPtr input, long endPos,  long bot, long eot, int id, std::string &mess);
00117 
00125   bool readPLC(MWAWInputStreamPtr input, MWAWEntry const &entry,
00126                std::vector<long> &textPtrs, std::vector<long> &listValues,
00127                DataParser parser = &MsWks4Text::defDataParser);
00135   bool readSimplePLC(MWAWInputStreamPtr &input, MWAWEntry const &entry,
00136                      std::vector<long> &textPtrs,
00137                      std::vector<long> &listValues)
00138   {
00139     return readPLC(input, entry, textPtrs, listValues);
00140   }
00141 
00143   bool defDataParser(MWAWInputStreamPtr input, long endPos,
00144                      long bot, long eot, int id, std::string &mess);
00145 
00147   bool readFontNames(MWAWInputStreamPtr input, MWAWEntry const &entry);
00148 
00150   bool readFont(MWAWInputStreamPtr &input, long endPos,
00151                 int &id, std::string &mess);
00152 
00154   void setProperty(MsWks4TextInternal::Paragraph const &tabs);
00156   bool readParagraph(MWAWInputStreamPtr &input, long endPos,
00157                      int &id, std::string &mess);
00158 
00160   bool ftntDataParser(MWAWInputStreamPtr input, long endPos,
00161                       long bot, long eot, int id, std::string &mess);
00162 
00164   bool eobjDataParser(MWAWInputStreamPtr input, long endPos,
00165                       long bot, long eot, int id, std::string &mess);
00166 
00170   bool toknDataParser(MWAWInputStreamPtr input, long endPos,
00171                       long bot, long eot, int id, std::string &mess);
00172 
00176   bool pgdDataParser(MWAWInputStreamPtr input, long endPos,
00177                      long , long, int id, std::string &mess);
00178 
00180   void flushNote(int noteId);
00181 
00182 protected:
00185   std::vector<DataFOD> mergeSortedLists
00186   (std::vector<DataFOD> const &lst1, std::vector<DataFOD> const &lst2) const;
00187 
00190   bool readFDP(MWAWInputStreamPtr &input, MWAWEntry const &entry,
00191                std::vector<DataFOD> &fods, FDPParser parser);
00192 
00199   bool findFDPStructures(MWAWInputStreamPtr &input, int which);
00207   bool findFDPStructuresByHand(MWAWInputStreamPtr &input, int which);
00208 
00209 protected:
00211   struct DataFOD {
00218     enum Type { ATTR_TEXT, ATTR_PARAG, ATTR_PLC, ATTR_UNKN };
00219 
00221     DataFOD() : m_type(ATTR_UNKN), m_pos(-1), m_defPos(0), m_id(-1) {}
00222 
00224     Type m_type;
00226     long m_pos;
00228     long m_defPos;
00230     int m_id;
00231   };
00232 
00233 private:
00234   MsWks4Text(MsWks4Text const &orig);
00235   MsWks4Text &operator=(MsWks4Text const &orig);
00236 protected:
00238   MWAWParser *m_mainParser;
00240   MWAWParserStatePtr m_parserState;
00241 
00243   MsWksDocument &m_document;
00244 
00246   MWAWEntry m_textPositions;
00247 
00249   mutable shared_ptr<MsWks4TextInternal::State> m_state;
00250 
00252   std::vector<DataFOD> m_FODsList;
00253 
00255   std::vector<MWAWEntry const *> m_FDPCs;
00257   std::vector<MWAWEntry const *> m_FDPPs;
00258 };
00259 
00260 #endif
00261 // vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab: