1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
2 /* libodfgen
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 Ariya Hidayat (ariya@kde.org)
11  * Copyright (C) 2006 Fridrich Strba (fridrich.strba@bluewin.ch)
12  *
13  * For minor contributions see the git repository.
14  *
15  * Alternatively, the contents of this file may be used under the terms
16  * of the GNU Lesser General Public License Version 2.1 or later
17  * (LGPLv2.1+), in which case the provisions of the LGPLv2.1+ are
18  * applicable instead of those above.
19  *
20  * For further information visit http://libwpd.sourceforge.net
21  */
22 
23 /* "This product is not manufactured, approved, or supported by
24  * Corel Corporation or Corel Corporation Limited."
25  */
26 
27 #include <stdio.h>
28 
29 #include <iostream>
30 #include <fstream>
31 
32 #include <librevenge/librevenge.h>
33 #include <libodfgen/libodfgen.hxx>
34 
35 #include "StringDocumentHandler.hxx"
36 
37 template <class Generator>
sendTableContent(Generator & generator)38 static void sendTableContent(Generator &generator)
39 {
40 	librevenge::RVNGPropertyList span;
41 	span.insert("style:font-name","Courier");
42 	span.insert("fo:font-size", 13, librevenge::RVNG_POINT);
43 	span.insert("librevenge:span-id",1);
44 	generator.defineCharacterStyle(span);
45 	span.clear();
46 	span.insert("librevenge:span-id",1);
47 
48 	librevenge::RVNGPropertyList para;
49 	para.insert("librevenge:paragraph-id",1);
50 	para.insert("fo:margin-left",0.1,librevenge::RVNG_INCH);
51 	para.insert("fo:text-align","left");
52 	generator.defineParagraphStyle(para);
53 	para.clear();
54 	para.insert("librevenge:paragraph-id",1);
55 
56 	librevenge::RVNGPropertyList row, cell;
57 	row.insert("librevenge:is-header-row", false);
58 	cell.insert("table:number-rows-spanned", 1);
59 	cell.insert("table:number-columns-spanned", 1);
60 
61 	row.insert("style:row-height", 1, librevenge::RVNG_INCH);
62 	generator.openTableRow(row);
63 	cell.insert("librevenge:row", 1);
64 	cell.insert("librevenge:column", 1);
65 	cell.insert("fo:border", "1pt dashed #00ff00");
66 	generator.openTableCell(cell);
67 	generator.closeTableCell();
68 	cell.remove("fo:border");
69 
70 	cell.insert("librevenge:column", 2);
71 	generator.openTableCell(cell);
72 	generator.openParagraph(para);
73 	generator.openSpan(span);
74 	generator.insertText("B1");
75 	generator.closeSpan();
76 	generator.closeParagraph();
77 	generator.closeTableCell();
78 
79 	cell.insert("librevenge:column", 3);
80 	cell.insert("fo:background-color", "#ff0000");
81 	generator.openTableCell(cell);
82 	generator.closeTableCell();
83 	cell.remove("fo:background-color");
84 	generator.closeTableRow();
85 
86 	row.insert("style:row-height", 0.3, librevenge::RVNG_INCH);
87 	generator.openTableRow(row);
88 	cell.insert("librevenge:row", 2);
89 
90 	cell.insert("librevenge:column", 1);
91 	cell.insert("table:number-rows-spanned", 2);
92 	cell.insert("table:number-columns-spanned", 2);
93 	generator.openTableCell(cell);
94 	generator.openParagraph(para);
95 	generator.openSpan(span);
96 	generator.insertText("2 rows 2 col");
97 	generator.closeSpan();
98 	generator.closeParagraph();
99 	generator.closeTableCell();
100 	generator.insertCoveredTableCell(librevenge::RVNGPropertyList());
101 	cell.insert("librevenge:column", 3);
102 	cell.insert("table:number-rows-spanned", 2);
103 	cell.insert("table:number-columns-spanned", 1);
104 	generator.openTableCell(cell);
105 	generator.openParagraph(para);
106 	generator.openSpan(span);
107 	generator.insertText("2 rows");
108 	generator.closeSpan();
109 	generator.closeParagraph();
110 	generator.closeTableCell();
111 	generator.closeTableRow();
112 
113 	row.insert("style:row-height", 1, librevenge::RVNG_INCH);
114 	generator.openTableRow(row);
115 	generator.insertCoveredTableCell(librevenge::RVNGPropertyList());
116 	generator.insertCoveredTableCell(librevenge::RVNGPropertyList());
117 	generator.insertCoveredTableCell(librevenge::RVNGPropertyList());
118 	generator.closeTableRow();
119 
120 	// copy of table 1
121 	row.insert("style:row-height", 1, librevenge::RVNG_INCH);
122 	generator.openTableRow(row);
123 	cell.insert("librevenge:row", 4);
124 	cell.insert("table:number-rows-spanned", 1);
125 	cell.insert("librevenge:column", 1);
126 	cell.insert("fo:border", "1pt dashed #00ff00");
127 	generator.openTableCell(cell);
128 	generator.closeTableCell();
129 	cell.remove("fo:border");
130 
131 	cell.insert("librevenge:column", 2);
132 	generator.openTableCell(cell);
133 	generator.openParagraph(para);
134 	generator.openSpan(span);
135 	generator.insertText("B1");
136 	generator.closeSpan();
137 	generator.closeParagraph();
138 	generator.closeTableCell();
139 
140 	cell.insert("librevenge:column", 3);
141 	cell.insert("fo:background-color", "#ff0000");
142 	generator.openTableCell(cell);
143 	generator.closeTableCell();
144 	cell.remove("fo:background-color");
145 	generator.closeTableRow();
146 }
147 
createOdt()148 static void createOdt()
149 {
150 	StringDocumentHandler content;
151 	OdtGenerator generator;
152 	generator.addDocumentHandler(&content, ODF_FLAT_XML);
153 
154 	generator.startDocument(librevenge::RVNGPropertyList());
155 	librevenge::RVNGPropertyList page;
156 	page.insert("librevenge:num-pages", 1);
157 	page.insert("fo:page-height", 11.5, librevenge::RVNG_INCH);
158 	page.insert("fo:page-width", 9, librevenge::RVNG_INCH);
159 	page.insert("style:print-orientation", "portrait");
160 	page.insert("fo:margin-left", 0.1, librevenge::RVNG_INCH);
161 	page.insert("fo:margin-right", 0.1, librevenge::RVNG_INCH);
162 	page.insert("fo:margin-top", 0.1, librevenge::RVNG_INCH);
163 	page.insert("fo:margin-bottom", 0.1, librevenge::RVNG_INCH);
164 	generator.openPageSpan(page);
165 
166 	librevenge::RVNGPropertyList textbox;
167 	textbox.insert("svg:x",0.2, librevenge::RVNG_INCH);
168 	textbox.insert("svg:y",0.2, librevenge::RVNG_INCH);
169 	textbox.insert("svg:width",200, librevenge::RVNG_POINT);
170 	textbox.insert("fo:min-height",100, librevenge::RVNG_POINT);
171 	textbox.insert("text:anchor-type", "page");
172 	textbox.insert("text:anchor-page-number", 1);
173 	textbox.insert("style:vertical-rel", "page");
174 	textbox.insert("style:horizontal-rel", "page");
175 	textbox.insert("style:horizontal-pos", "from-left");
176 	textbox.insert("style:vertical-pos", "from-top");
177 
178 	textbox.insert("draw:stroke", "none");
179 	textbox.insert("draw:fill", "none");
180 	generator.openFrame(textbox);
181 	generator.openTextBox(librevenge::RVNGPropertyList());
182 
183 	librevenge::RVNGPropertyList table;
184 	librevenge::RVNGPropertyListVector columns;
185 	for (size_t c = 0; c < 3; ++c)
186 	{
187 		librevenge::RVNGPropertyList column;
188 		column.insert("style:column-width", 2, librevenge::RVNG_INCH);
189 		columns.append(column);
190 	}
191 	table.insert("style:width", 6, librevenge::RVNG_INCH);
192 	table.insert("librevenge:table-columns", columns);
193 	generator.openTable(table);
194 	sendTableContent(generator);
195 	generator.closeTable();
196 
197 	generator.closeTextBox();
198 	generator.closeFrame();
199 
200 	generator.closePageSpan();
201 	generator.endDocument();
202 
203 	std::ofstream file("testTable1.odt");
204 	file << content.cstr();
205 }
206 
createOds()207 static void createOds()
208 {
209 	StringDocumentHandler content;
210 	OdsGenerator generator;
211 	generator.addDocumentHandler(&content, ODF_FLAT_XML);
212 
213 	generator.startDocument(librevenge::RVNGPropertyList());
214 	librevenge::RVNGPropertyList page;
215 	page.insert("librevenge:num-pages", 1);
216 	page.insert("fo:page-height", 11.5, librevenge::RVNG_INCH);
217 	page.insert("fo:page-width", 9, librevenge::RVNG_INCH);
218 	page.insert("style:print-orientation", "portrait");
219 	page.insert("fo:margin-left", 0.1, librevenge::RVNG_INCH);
220 	page.insert("fo:margin-right", 0.1, librevenge::RVNG_INCH);
221 	page.insert("fo:margin-top", 0.1, librevenge::RVNG_INCH);
222 	page.insert("fo:margin-bottom", 0.1, librevenge::RVNG_INCH);
223 	generator.openPageSpan(page);
224 
225 	librevenge::RVNGPropertyList list;
226 	librevenge::RVNGPropertyListVector columns;
227 	for (size_t c = 0; c < 2; c++)
228 	{
229 		librevenge::RVNGPropertyList column;
230 		column.insert("style:column-width", 3, librevenge::RVNG_INCH);
231 		columns.append(column);
232 	}
233 	list.insert("librevenge:columns", columns);
234 	generator.openSheet(list);
235 
236 	librevenge::RVNGPropertyList textbox;
237 	textbox.insert("svg:x",0.2, librevenge::RVNG_INCH);
238 	textbox.insert("svg:y",0.2, librevenge::RVNG_INCH);
239 	textbox.insert("svg:width",6, librevenge::RVNG_INCH);
240 	textbox.insert("svg:height",180, librevenge::RVNG_POINT);
241 	textbox.insert("text:anchor-type", "page");
242 	textbox.insert("text:anchor-page-number", 1);
243 	textbox.insert("style:vertical-rel", "page");
244 	textbox.insert("style:horizontal-rel", "page");
245 	textbox.insert("style:horizontal-pos", "from-left");
246 	textbox.insert("style:vertical-pos", "from-top");
247 
248 	textbox.insert("draw:stroke", "none");
249 	textbox.insert("draw:fill", "none");
250 	generator.openFrame(textbox);
251 	librevenge::RVNGPropertyList table;
252 	columns.clear();
253 	for (size_t c = 0; c < 3; ++c)
254 	{
255 		librevenge::RVNGPropertyList column;
256 		column.insert("style:column-width", 2, librevenge::RVNG_INCH);
257 		columns.append(column);
258 	}
259 	table.insert("style:width", 6, librevenge::RVNG_INCH);
260 	table.insert("librevenge:table-columns", columns);
261 	generator.openTable(table);
262 	sendTableContent(generator);
263 	generator.closeTable();
264 	generator.closeFrame();
265 
266 	list.clear();
267 	list.insert("style:row-height", 40, librevenge::RVNG_POINT);
268 	generator.openSheetRow(list);
269 	generator.closeSheetRow();
270 	generator.closeSheet();
271 
272 	generator.closePageSpan();
273 	generator.endDocument();
274 
275 	std::ofstream file("testTable1.ods");
276 	file << content.cstr();
277 }
278 
createOdg()279 static void createOdg()
280 {
281 	StringDocumentHandler content;
282 	OdgGenerator generator;
283 	generator.addDocumentHandler(&content, ODF_FLAT_XML);
284 
285 	generator.startDocument(librevenge::RVNGPropertyList());
286 	librevenge::RVNGPropertyList page;
287 	page.insert("svg:x",0, librevenge::RVNG_POINT);
288 	page.insert("svg:y",0, librevenge::RVNG_POINT);
289 	page.insert("svg:width", 9, librevenge::RVNG_INCH);
290 	page.insert("svg:height", 11, librevenge::RVNG_INCH);
291 	page.insert("librevenge:enforce-frame",true);
292 	generator.startPage(page);
293 
294 	librevenge::RVNGPropertyList table;
295 	table.insert("svg:x",2, librevenge::RVNG_INCH);
296 	table.insert("svg:y",2, librevenge::RVNG_INCH);
297 	table.insert("svg:width",200, librevenge::RVNG_POINT);
298 	table.insert("fo:min-height",100, librevenge::RVNG_POINT);
299 	table.insert("draw:stroke", "none");
300 	table.insert("draw:fill", "none");
301 
302 	librevenge::RVNGPropertyListVector columns;
303 	for (size_t c = 0; c < 3; ++c)
304 	{
305 		librevenge::RVNGPropertyList column;
306 		column.insert("style:column-width", 2, librevenge::RVNG_INCH);
307 		columns.append(column);
308 	}
309 	table.insert("librevenge:table-columns", columns);
310 
311 	generator.startTableObject(table);
312 	sendTableContent(generator);
313 	generator.endTableObject();
314 
315 	generator.endPage();
316 	generator.endDocument();
317 
318 	std::ofstream file("testTable1.odg");
319 	file << content.cstr();
320 }
321 
createOdp()322 static void createOdp()
323 {
324 	StringDocumentHandler content;
325 	OdpGenerator generator;
326 	generator.addDocumentHandler(&content, ODF_FLAT_XML);
327 
328 	generator.startDocument(librevenge::RVNGPropertyList());
329 	librevenge::RVNGPropertyList page;
330 	page.insert("svg:x",0, librevenge::RVNG_POINT);
331 	page.insert("svg:y",0, librevenge::RVNG_POINT);
332 	page.insert("svg:width", 9, librevenge::RVNG_INCH);
333 	page.insert("svg:height", 11, librevenge::RVNG_INCH);
334 	generator.startSlide(page);
335 
336 	librevenge::RVNGPropertyList table;
337 	table.insert("svg:x",0.2, librevenge::RVNG_INCH);
338 	table.insert("svg:y",0.02, librevenge::RVNG_INCH);
339 	table.insert("svg:width",200, librevenge::RVNG_POINT);
340 	table.insert("fo:min-height",100, librevenge::RVNG_POINT);
341 	table.insert("draw:stroke", "none");
342 	table.insert("draw:fill", "none");
343 
344 	librevenge::RVNGPropertyListVector columns;
345 	for (size_t c = 0; c < 3; ++c)
346 	{
347 		librevenge::RVNGPropertyList column;
348 		column.insert("style:column-width", 2, librevenge::RVNG_INCH);
349 		columns.append(column);
350 	}
351 	table.insert("librevenge:table-columns", columns);
352 
353 	generator.startTableObject(table);
354 	sendTableContent(generator);
355 	generator.endTableObject();
356 
357 	generator.endSlide();
358 	generator.endDocument();
359 
360 	std::ofstream file("testTable1.odp");
361 	file << content.cstr();
362 }
363 
364 
main()365 int main()
366 {
367 	try
368 	{
369 		createOdg();
370 		createOdp();
371 		createOds();
372 		createOdt();
373 	}
374 	catch (...)
375 	{
376 		fprintf(stderr, "ERROR: parse exception\n");
377 		return 1;
378 	}
379 
380 	return 0;
381 }
382 
383 /* vim:set shiftwidth=4 softtabstop=4 noexpandtab: */
384 
385