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>
sendText(Generator & generator,int numExtraLines=0)38 static void sendText(Generator &generator, int numExtraLines=0)
39 {
40 	librevenge::RVNGPropertyList span;
41 	span.insert("style:font-name","Geneva");
42 	span.insert("fo:font-size", 12, 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("style:display-name","Default");
51 	generator.defineParagraphStyle(para);
52 
53 	para.clear();
54 	para.insert("librevenge:paragraph-id",1);
55 	generator.openParagraph(para);
56 	generator.openSpan(span);
57 	generator.insertText("basic ");
58 	generator.closeSpan();
59 	generator.closeParagraph();
60 
61 	para.clear();
62 	para.insert("fo:margin-left",1,librevenge::RVNG_INCH);
63 	para.insert("fo:text-align","center");
64 	para.insert("style:display-name","Center");
65 	generator.openParagraph(para);
66 	generator.openSpan(span);
67 	generator.insertText("center(style)");
68 	generator.closeSpan();
69 	generator.closeParagraph();
70 
71 	para.clear();
72 	para.insert("fo:margin-left",1,librevenge::RVNG_INCH);
73 	para.insert("fo:text-align","center");
74 	generator.openParagraph(para);
75 	generator.openSpan(span);
76 	generator.insertText("center(no style)");
77 	generator.closeSpan();
78 	generator.closeParagraph();
79 
80 	para.clear();
81 	para.insert("librevenge:paragraph-id",1);
82 	generator.openParagraph(para);
83 	generator.openSpan(span);
84 	generator.insertText("basic");
85 	generator.insertLineBreak();
86 	generator.insertText("again");
87 	for (int i=0; i<numExtraLines; ++i)
88 		generator.insertLineBreak();
89 	generator.closeSpan();
90 	generator.closeParagraph();
91 }
92 
createOdt()93 static void createOdt()
94 {
95 	StringDocumentHandler content;
96 	OdtGenerator generator;
97 	generator.addDocumentHandler(&content, ODF_FLAT_XML);
98 
99 	generator.startDocument(librevenge::RVNGPropertyList());
100 	librevenge::RVNGPropertyList page;
101 	page.insert("librevenge:num-pages", 2);
102 	page.insert("fo:page-height", 11.5, librevenge::RVNG_INCH);
103 	page.insert("fo:page-width", 9, librevenge::RVNG_INCH);
104 	page.insert("style:print-orientation", "portrait");
105 	page.insert("fo:margin-left", 0.1, librevenge::RVNG_INCH);
106 	page.insert("fo:margin-right", 0.1, librevenge::RVNG_INCH);
107 	page.insert("fo:margin-top", 0.1, librevenge::RVNG_INCH);
108 	page.insert("fo:margin-bottom", 0.1, librevenge::RVNG_INCH);
109 	generator.openPageSpan(page);
110 
111 	librevenge::RVNGPropertyList header;
112 	header.insert("librevenge:occurence", "all");
113 	generator.openHeader(header);
114 	sendText(generator, 0);
115 	generator.closeHeader();
116 
117 	sendText(generator, 50);
118 
119 	librevenge::RVNGPropertyList paraPage;
120 	paraPage.insert("fo:break-before", "page");
121 	generator.openParagraph(paraPage);
122 	generator.closeParagraph();
123 	sendText(generator, 50);
124 
125 	generator.closePageSpan();
126 
127 	// 2nd page span
128 	page.insert("librevenge:num-pages", 1);
129 	page.insert("fo:page-height", 5.5, librevenge::RVNG_INCH);
130 	page.insert("fo:page-width", 4, librevenge::RVNG_INCH);
131 	page.insert("style:print-orientation", "portrait");
132 	page.insert("fo:margin-left", 1, librevenge::RVNG_INCH);
133 	page.insert("fo:margin-right", 1, librevenge::RVNG_INCH);
134 	page.insert("fo:margin-top", 1, librevenge::RVNG_INCH);
135 	page.insert("fo:margin-bottom", 1, librevenge::RVNG_INCH);
136 	generator.openPageSpan(page);
137 
138 	generator.openParagraph(paraPage);
139 	generator.closeParagraph();
140 
141 	sendText(generator, 50);
142 
143 	generator.closePageSpan();
144 
145 	// 3rd page span
146 	page.insert("librevenge:num-pages", 1);
147 	page.insert("fo:page-height", 11.5, librevenge::RVNG_INCH);
148 	page.insert("fo:page-width", 9, librevenge::RVNG_INCH);
149 	page.insert("style:print-orientation", "portrait");
150 	page.insert("fo:margin-left", 0.1, librevenge::RVNG_INCH);
151 	page.insert("fo:margin-right", 0.1, librevenge::RVNG_INCH);
152 	page.insert("fo:margin-top", 0.1, librevenge::RVNG_INCH);
153 	page.insert("fo:margin-bottom", 0.1, librevenge::RVNG_INCH);
154 	generator.openPageSpan(page);
155 
156 	generator.openParagraph(paraPage);
157 	generator.closeParagraph();
158 
159 	librevenge::RVNGPropertyList section, column;
160 
161 	librevenge::RVNGPropertyListVector columns;
162 	column.insert("style:rel-width", "4in");
163 	columns.append(column);
164 	columns.append(column);
165 	section.insert("style:columns", columns);
166 
167 	generator.openSection(section);
168 	sendText(generator, 50);
169 	generator.closeSection();
170 
171 	generator.closePageSpan();
172 
173 	generator.endDocument();
174 
175 	std::ofstream file("testPageSpan1.odt");
176 	file << content.cstr();
177 }
178 
createOds()179 static void createOds()
180 {
181 	StringDocumentHandler content;
182 	OdsGenerator generator;
183 	generator.addDocumentHandler(&content, ODF_FLAT_XML);
184 
185 	generator.startDocument(librevenge::RVNGPropertyList());
186 	librevenge::RVNGPropertyList page;
187 	page.insert("librevenge:num-pages", 2);
188 	page.insert("fo:page-height", 11.5, librevenge::RVNG_INCH);
189 	page.insert("fo:page-width", 9, librevenge::RVNG_INCH);
190 	page.insert("style:print-orientation", "portrait");
191 	page.insert("fo:margin-left", 0.1, librevenge::RVNG_INCH);
192 	page.insert("fo:margin-right", 0.1, librevenge::RVNG_INCH);
193 	page.insert("fo:margin-top", 0.1, librevenge::RVNG_INCH);
194 	page.insert("fo:margin-bottom", 0.1, librevenge::RVNG_INCH);
195 	generator.openPageSpan(page);
196 
197 	librevenge::RVNGPropertyList list;
198 	librevenge::RVNGPropertyListVector columns;
199 	for (size_t c = 0; c < 2; c++)
200 	{
201 		librevenge::RVNGPropertyList column;
202 		column.insert("style:column-width", 3, librevenge::RVNG_INCH);
203 		columns.append(column);
204 	}
205 	list.insert("librevenge:columns", columns);
206 	generator.openSheet(list);
207 	list.clear();
208 	list.insert("style:row-height", 40, librevenge::RVNG_POINT);
209 	generator.openSheetRow(list);
210 	list.clear();
211 	list.insert("librevenge:column", 1);
212 	list.insert("librevenge:row", 1);
213 	list.insert("table:number-columns-spanned", 1);
214 	list.insert("table:number-rows-spanned", 1);
215 	generator.openSheetCell(list);
216 	sendText(generator);
217 	generator.closeSheetCell();
218 	generator.closeSheetRow();
219 	generator.closeSheet();
220 
221 	list.clear();
222 	list.insert("librevenge:columns", columns);
223 	generator.openSheet(list);
224 	generator.closeSheet();
225 
226 	generator.closePageSpan();
227 
228 	page.insert("fo:page-height", 5.5, librevenge::RVNG_INCH);
229 	page.insert("fo:page-width", 4, librevenge::RVNG_INCH);
230 	page.insert("style:print-orientation", "portrait");
231 	page.insert("fo:margin-left", 1, librevenge::RVNG_INCH);
232 	page.insert("fo:margin-right", 1, librevenge::RVNG_INCH);
233 	page.insert("fo:margin-top", 1, librevenge::RVNG_INCH);
234 	page.insert("fo:margin-bottom", 1, librevenge::RVNG_INCH);
235 	generator.openPageSpan(page);
236 
237 	list.clear();
238 	list.insert("librevenge:columns", columns);
239 	generator.openSheet(list);
240 	list.clear();
241 	list.insert("style:row-height", 100, librevenge::RVNG_POINT);
242 	generator.openSheetRow(list);
243 	list.clear();
244 	list.insert("librevenge:column", 2);
245 	list.insert("librevenge:row", 1);
246 	list.insert("table:number-columns-spanned", 1);
247 	list.insert("table:number-rows-spanned", 1);
248 	generator.openSheetCell(list);
249 	sendText(generator);
250 	generator.closeSheetCell();
251 	generator.closeSheetRow();
252 	generator.closeSheet();
253 	generator.closePageSpan();
254 
255 	generator.endDocument();
256 
257 	std::ofstream file("testPageSpan1.ods");
258 	file << content.cstr();
259 }
260 
createOdg()261 static void createOdg()
262 {
263 	StringDocumentHandler content;
264 	OdgGenerator generator;
265 	generator.addDocumentHandler(&content, ODF_FLAT_XML);
266 
267 	generator.startDocument(librevenge::RVNGPropertyList());
268 	librevenge::RVNGPropertyList page;
269 	page.insert("draw:name", "Page with text");
270 	page.insert("svg:width", 9, librevenge::RVNG_INCH);
271 	page.insert("svg:height", 11, librevenge::RVNG_INCH);
272 	page.insert("librevenge:enforce-frame",true);
273 	generator.startPage(page);
274 
275 	librevenge::RVNGPropertyList textbox;
276 	textbox.insert("svg:x",0.2, librevenge::RVNG_INCH);
277 	textbox.insert("svg:y",0.02, librevenge::RVNG_INCH);
278 	textbox.insert("svg:width",200, librevenge::RVNG_POINT);
279 	textbox.insert("svg:height",100, librevenge::RVNG_POINT);
280 	textbox.insert("draw:stroke", "none");
281 	textbox.insert("draw:fill", "none");
282 	generator.startTextObject(textbox);
283 	sendText(generator);
284 	generator.endTextObject();
285 	generator.endPage();
286 
287 	page.insert("draw:name", "Empty");
288 	page.insert("svg:width", 3, librevenge::RVNG_INCH);
289 	page.insert("svg:height", 5, librevenge::RVNG_INCH);
290 	generator.startPage(page);
291 	generator.endPage();
292 	generator.endDocument();
293 
294 	std::ofstream file("testPageSpan1.odg");
295 	file << content.cstr();
296 }
297 
createOdp()298 static void createOdp()
299 {
300 	StringDocumentHandler content;
301 	OdpGenerator generator;
302 	generator.addDocumentHandler(&content, ODF_FLAT_XML);
303 
304 	generator.startDocument(librevenge::RVNGPropertyList());
305 	librevenge::RVNGPropertyList page;
306 	page.insert("draw:name", "Page with text");
307 	page.insert("svg:width", 9, librevenge::RVNG_INCH);
308 	page.insert("svg:height", 11, librevenge::RVNG_INCH);
309 	generator.startSlide(page);
310 
311 	librevenge::RVNGPropertyList textbox;
312 	textbox.insert("svg:x",0.2, librevenge::RVNG_INCH);
313 	textbox.insert("svg:y",0.02, librevenge::RVNG_INCH);
314 	textbox.insert("svg:width",200, librevenge::RVNG_POINT);
315 	textbox.insert("svg:height",100, librevenge::RVNG_POINT);
316 	textbox.insert("draw:stroke", "none");
317 	textbox.insert("draw:fill", "none");
318 	generator.startTextObject(textbox);
319 	sendText(generator);
320 	generator.endTextObject();
321 
322 	generator.endSlide();
323 
324 	page.insert("draw:name", "Empty");
325 	page.insert("svg:width", 3, librevenge::RVNG_INCH);
326 	page.insert("svg:height", 5, librevenge::RVNG_INCH);
327 	generator.startSlide(page);
328 	generator.endSlide();
329 
330 	generator.endDocument();
331 
332 	std::ofstream file("testPageSpan1.odp");
333 	file << content.cstr();
334 }
335 
336 
main()337 int main()
338 {
339 	try
340 	{
341 		createOdg();
342 		createOdp();
343 		createOds();
344 		createOdt();
345 	}
346 	catch (...)
347 	{
348 		fprintf(stderr, "ERROR: parse exception\n");
349 		return 1;
350 	}
351 
352 	return 0;
353 }
354 
355 /* vim:set shiftwidth=4 softtabstop=4 noexpandtab: */
356 
357