/* -*- Mode: C++; c-default-style: "k&r"; indent-tabs-mode: nil; tab-width: 2; c-basic-offset: 2 -*- */

/* libmwaw
* Version: MPL 2.0 / LGPLv2+
*
* The contents of this file are subject to the Mozilla Public License Version
* 2.0 (the "License"); you may not use this file except in compliance with
* the License or as specified alternatively below. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* Major Contributor(s):
* Copyright (C) 2002 William Lachance (wrlach@gmail.com)
* Copyright (C) 2002,2004 Marc Maurer (uwog@uwog.net)
* Copyright (C) 2004-2006 Fridrich Strba (fridrich.strba@bluewin.ch)
* Copyright (C) 2006, 2007 Andrew Ziem
* Copyright (C) 2011, 2012 Alonso Laurent (alonso@loria.fr)
*
*
* All Rights Reserved.
*
* For minor contributions see the git repository.
*
* Alternatively, the contents of this file may be used under the terms of
* the GNU Lesser General Public License Version 2 or later (the "LGPLv2+"),
* in which case the provisions of the LGPLv2+ are applicable
* instead of those above.
*/

/*
 * Parser to PowerPoint 95 document ( graphic part )
 *
 */
#ifndef POWER_POINT7_GRAPH
#  define POWER_POINT7_GRAPH

#include <set>
#include <string>
#include <vector>

#include <librevenge/librevenge.h>

#include "libmwaw_internal.hxx"

#include "MWAWDebug.hxx"
#include "MWAWInputStream.hxx"

namespace PowerPoint7GraphInternal
{
struct Frame;
struct Picture;

struct State;
class SubDocument;
}

namespace PowerPoint7Struct
{
struct SlideId;
}

class PowerPoint7Parser;

/** \brief the main class to read the graphic part of a PowerPoint 95 file
 *
 *
 *
 */
class PowerPoint7Graph
{
  friend class PowerPoint7Parser;
  friend class PowerPoint7GraphInternal::SubDocument;
public:
  //! constructor
  explicit PowerPoint7Graph(PowerPoint7Parser &parser);
  //! destructor
  virtual ~PowerPoint7Graph();

  /** returns the file version */
  int version() const;
  /** sets the page size */
  void setPageSize(MWAWVec2i &pageSize);
  /** sets the slide id */
  void setSlideId(PowerPoint7Struct::SlideId const &id);
  /** sets the color list */
  void setColorList(std::vector<MWAWColor> const &colorList);
protected:
  //! try to send the slide content
  bool sendSlide(PowerPoint7Struct::SlideId const &id, bool sendBackground);
  //! try to send a frame
  bool sendFrame(PowerPoint7GraphInternal::Frame const &frame, bool master);
  //! try to send the text content
  bool sendText(int textId);

  //
  // Intermediate level
  //

  //! try to read the bitmap container zone 1027
  bool readBitmapContainer(int level, long endPos, PowerPoint7GraphInternal::Picture &picture);
  //! try to read the font collection 10 zone 2006
  bool readPictureList(int level, long endPos);
  //! try to read a bitmap zone 2012
  bool readBitmap(int level, long endPos, MWAWEmbeddedObject &object, MWAWBox2i &box);
  //! try to read the bitmap type zone 3038
  bool readBitmapFlag(int level, long endPos);

  //! try to read the picture container 4028
  bool readPictureContainer(int level, long endPos, PowerPoint7GraphInternal::Picture &picture);
  //! try to read the picture id container zone 4053
  bool readPictureIdContainer(int level, long endPos, int &id);
  //! try to read the picture id 4036
  bool readPictureId(int level, long endPos, int &id);

  //! try to read the meta file zone 4033
  bool readMetaFile(int level, long endPos, MWAWEmbeddedObject &object);
  //! try to read the meta file container zone 4037
  bool readMetaFileContainer(int level, long endPos, PowerPoint7GraphInternal::Picture &picture);
  //! try to read the meta file box zone 4038
  bool readMetaFileBox(int level, long endPos, MWAWBox2i &box);

  //! try to read the external ole object atom zone: 4035
  bool readExternalOleObjectAtom(int level, long endPos);
  //! try to read the external ole embed zone 4044
  bool readExternalOleEmbed(int level, long endPos, int &id);
  //! try to read the external ole object atom zone: 4045
  bool readExternalOleEmbedAtom(int level, long endPos);

  //! try to read the group zone
  bool readGroup(int level, long endPos);
  //! try to read the zone 3002
  bool readGroupAtom(int level, long endPos);
  //! try to read the graphic style zone 3005
  bool readStyle(int level, long endPos);
  //! try to read the line arrow zone 3007
  bool readLineArrows(int level, long endPos);
  //! try to read the graph rectangle zone 3008
  bool readRect(int level, long endPos);
  //! try to read the graph shape zone 3009
  bool readRectAtom(int level, long endPos);
  //! try to read a place holder container 3010
  bool readPlaceholderContainer(int level, long endPos);
  //! try to read the place holder atom zone 3011
  bool readPlaceholderAtom(int level, long endPos);
  //! try to read the line graph zone 3014
  bool readLine(int level, long endPos);
  //! try to read the graph line atom zone  3015
  bool readLineAtom(int level, long endPos);
  //! try to read the polygon zone 3016
  bool readPolygon(int level, long endPos);
  //! try to read the polygon atom zone 3017
  bool readPolygonAtom(int level, long endPos);
  //! try to read the graph arc zone 3018
  bool readArc(int level, long endPos);
  //! try to read the graph arc atom 3019
  bool readArcAtom(int level, long endPos);

  //! try to read the list of point zone 3035
  bool readPointList(int level, long endPos, std::vector<MWAWVec2i> &points);
  //! try to read the graph zone flags zone 3036
  bool readZoneFlags(int level, long endPos);

  //! try to read the zone 5000: child of GraphRect (only found in 95 an 97 document)
  bool readZone5000(int level, long endPos);
  //! try to read the zone 5000 header: 5001
  bool readZone5000Header(int level, long endPos);
  //! try to read the zone 5000 data: 5002
  bool readZone5000Data(int level, long endPos);

  //
  // low level
  //

private:
  PowerPoint7Graph(PowerPoint7Graph const &orig);
  PowerPoint7Graph &operator=(PowerPoint7Graph const &orig);

protected:
  //
  // data
  //
  //! the parser state
  MWAWParserStatePtr m_parserState;

  //! the state
  shared_ptr<PowerPoint7GraphInternal::State> m_state;

  //! the main parser;
  PowerPoint7Parser *m_mainParser;
};
#endif
// vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab:
