1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
2 /* libwps
3  * Version: MPL 2.0 / LGPLv2.1+
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * Major Contributor(s):
10  * Copyright (C) 2006, 2007 Andrew Ziem
11  * Copyright (C) 2003-2005 William Lachance (william.lachance@sympatico.ca)
12  * Copyright (C) 2003 Marc Maurer (uwog@uwog.net)
13  *
14  * For minor contributions see the git repository.
15  *
16  * Alternatively, the contents of this file may be used under the terms
17  * of the GNU Lesser General Public License Version 2.1 or later
18  * (LGPLv2.1+), in which case the provisions of the LGPLv2.1+ are
19  * applicable instead of those above.
20  */
21 
22 #ifndef LOTUS_CHART_H
23 #define LOTUS_CHART_H
24 
25 #include <ostream>
26 #include <string>
27 #include <map>
28 #include <vector>
29 
30 #include <librevenge-stream/librevenge-stream.h>
31 
32 #include "libwps_internal.h"
33 
34 #include "WPSDebug.h"
35 #include "WKSChart.h"
36 #include "WKSContentListener.h"
37 
38 #include "Lotus.h"
39 
40 namespace LotusChartInternal
41 {
42 class Chart;
43 struct State;
44 }
45 
46 class LotusStyleManager;
47 class WPSGraphicStyle;
48 
49 /**
50  * This class parses Microsoft Works chart file
51  *
52  */
53 class LotusChart
54 {
55 public:
56 	friend class LotusParser;
57 	friend class LotusChartInternal::Chart;
58 
59 	//! constructor
60 	explicit LotusChart(LotusParser &parser);
61 	//! clean internal state
62 	void cleanState();
63 	//! update internal state (must be called one time before sending data)
64 	void updateState();
65 	//! destructor
66 	~LotusChart();
67 	//! sets the listener
setListener(WKSContentListenerPtr & listen)68 	void setListener(WKSContentListenerPtr &listen)
69 	{
70 		m_listener = listen;
71 	}
72 
73 protected:
74 	//! return the file version
75 	int version() const;
76 
77 	//! return the number of chart
78 	int getNumCharts() const;
79 	//! returns a map chart name to chart id map
80 	std::map<std::string,int> getNameToChartIdMap() const;
81 	//! update a chart, so that it can be send
82 	void updateChart(LotusChartInternal::Chart &chart, int id);
83 	//! try to send the charts(for Windows .wk3 file)
84 	bool sendCharts();
85 	//! try to send a chart
86 	bool sendChart(int cId, WPSPosition const &pos, WPSGraphicStyle const &style);
87 	//! try to send the text
88 	bool sendText(std::shared_ptr<WPSStream> stream, WPSEntry const &entry);
89 
90 	//! reads a structure which define a chart: 11
91 	bool readChart(std::shared_ptr<WPSStream> stream);
92 	//! reads the chart name or title: 12
93 	bool readChartName(std::shared_ptr<WPSStream> stream);
94 
95 	// zone 1b
96 
97 	//! reads a chart data: 2710 (wk3mac)
98 	bool readMacHeader(std::shared_ptr<WPSStream> stream, long endPos, int &chartId);
99 	//! reads a placement position(wk3mac): 2774
100 	bool readMacPlacement(std::shared_ptr<WPSStream> stream, long endPos);
101 	//! reads a legend position(wk3mac): 277e
102 	bool readMacLegend(std::shared_ptr<WPSStream> stream, long endPos);
103 	//! reads a plot area position(wk3mac): 2788
104 	bool readMacPlotArea(std::shared_ptr<WPSStream> stream, long endPos);
105 	//! reads an axis style(wk3mac): 27d8
106 	bool readMacAxis(std::shared_ptr<WPSStream> stream, long endPos);
107 	//! reads a serie style(wk3mac): 27e2
108 	bool readMacSerie(std::shared_ptr<WPSStream> stream, long endPos);
109 	//! reads a 3D floor style(wk3mac): 2846
110 	bool readMacFloor(std::shared_ptr<WPSStream> stream, long endPos);
111 	//! reads a manual position(wk3mac): 2904
112 	bool readMacPosition(std::shared_ptr<WPSStream> stream, long endPos);
113 
114 	//! reads a plot area style: 2a30 (unsure)
115 	bool readPlotArea(std::shared_ptr<WPSStream> stream, long endPos);
116 	//! reads a serie style: 2a31
117 	bool readSerie(std::shared_ptr<WPSStream> stream, long endPos);
118 	//! reads a serie name: 2a32 (serie 6-...)
119 	bool readSerieName(std::shared_ptr<WPSStream> stream, long endPos);
120 	//! reads a serie width style: 2a33
121 	static bool readSerieWidth(std::shared_ptr<WPSStream> stream, long endPos);
122 	//! reads a list of font style: 2a34
123 	static bool readFontsStyle(std::shared_ptr<WPSStream> stream, long endPos);
124 	//! reads a some frame styles: 2a35
125 	bool readFramesStyle(std::shared_ptr<WPSStream> stream, long endPos);
126 
127 	//! convert a link zone in a chart position(if possible)
128 	bool convert(LotusParser::Link const &link, WKSChart::Position(&positions)[2]) const;
129 private:
130 	LotusChart(LotusChart const &orig) = delete;
131 	LotusChart &operator=(LotusChart const &orig) = delete;
132 	std::shared_ptr<WKSContentListener> m_listener; /** the listener (if set)*/
133 	//! the main parser
134 	LotusParser &m_mainParser;
135 	//! the style manager
136 	std::shared_ptr<LotusStyleManager> m_styleManager;
137 	//! the internal state
138 	std::shared_ptr<LotusChartInternal::State> m_state;
139 };
140 
141 #endif /* WPS4_H */
142 /* vim:set shiftwidth=4 softtabstop=4 noexpandtab: */
143