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