/src/libcdr/src/lib/CDROutputElementList.cpp
Line | Count | Source |
1 | | /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* |
3 | | * This file is part of the libcdr project. |
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 | | |
10 | | #include "CDROutputElementList.h" |
11 | | |
12 | | namespace libcdr |
13 | | { |
14 | | |
15 | | namespace |
16 | | { |
17 | | |
18 | | static void separateTabsAndInsertText(librevenge::RVNGDrawingInterface *iface, const librevenge::RVNGString &text) |
19 | 2.11k | { |
20 | 2.11k | if (!iface || text.empty()) |
21 | 0 | return; |
22 | 2.11k | librevenge::RVNGString tmpText; |
23 | 2.11k | librevenge::RVNGString::Iter i(text); |
24 | 10.9k | for (i.rewind(); i.next();) |
25 | 8.87k | { |
26 | 8.87k | if (*(i()) == '\t') |
27 | 0 | { |
28 | 0 | if (!tmpText.empty()) |
29 | 0 | { |
30 | 0 | if (iface) |
31 | 0 | iface->insertText(tmpText); |
32 | 0 | tmpText.clear(); |
33 | 0 | } |
34 | |
|
35 | 0 | if (iface) |
36 | 0 | iface->insertTab(); |
37 | 0 | } |
38 | 8.87k | else if (*(i()) == '\n') |
39 | 283 | { |
40 | 283 | if (!tmpText.empty()) |
41 | 3 | { |
42 | 3 | if (iface) |
43 | 3 | iface->insertText(tmpText); |
44 | 3 | tmpText.clear(); |
45 | 3 | } |
46 | | |
47 | 283 | if (iface) |
48 | 283 | iface->insertLineBreak(); |
49 | 283 | } |
50 | 8.58k | else |
51 | 8.58k | { |
52 | 8.58k | tmpText.append(i()); |
53 | 8.58k | } |
54 | 8.87k | } |
55 | 2.11k | if (iface && !tmpText.empty()) |
56 | 1.83k | iface->insertText(tmpText); |
57 | 2.11k | } |
58 | | |
59 | | static void separateSpacesAndInsertText(librevenge::RVNGDrawingInterface *iface, const librevenge::RVNGString &text) |
60 | 2.11k | { |
61 | 2.11k | if (!iface) |
62 | 0 | return; |
63 | 2.11k | if (text.empty()) |
64 | 0 | { |
65 | 0 | iface->insertText(text); |
66 | 0 | return; |
67 | 0 | } |
68 | 2.11k | librevenge::RVNGString tmpText; |
69 | 2.11k | int numConsecutiveSpaces = 0; |
70 | 2.11k | librevenge::RVNGString::Iter i(text); |
71 | 10.9k | for (i.rewind(); i.next();) |
72 | 8.87k | { |
73 | 8.87k | if (*(i()) == ' ') |
74 | 937 | numConsecutiveSpaces++; |
75 | 7.93k | else |
76 | 7.93k | numConsecutiveSpaces = 0; |
77 | | |
78 | 8.87k | if (numConsecutiveSpaces > 1) |
79 | 0 | { |
80 | 0 | if (!tmpText.empty()) |
81 | 0 | { |
82 | 0 | separateTabsAndInsertText(iface, tmpText); |
83 | 0 | tmpText.clear(); |
84 | 0 | } |
85 | |
|
86 | 0 | if (iface) |
87 | 0 | iface->insertSpace(); |
88 | 0 | } |
89 | 8.87k | else |
90 | 8.87k | { |
91 | 8.87k | tmpText.append(i()); |
92 | 8.87k | } |
93 | 8.87k | } |
94 | 2.11k | separateTabsAndInsertText(iface, tmpText); |
95 | 2.11k | } |
96 | | |
97 | | } // anonymous namespace |
98 | | |
99 | | class CDROutputElement |
100 | | { |
101 | | public: |
102 | 629k | CDROutputElement() {} |
103 | 629k | virtual ~CDROutputElement() {} |
104 | | virtual void draw(librevenge::RVNGDrawingInterface *painter) = 0; |
105 | | }; |
106 | | |
107 | | |
108 | | class CDRStyleOutputElement : public CDROutputElement |
109 | | { |
110 | | public: |
111 | | CDRStyleOutputElement(const librevenge::RVNGPropertyList &propList); |
112 | 308k | ~CDRStyleOutputElement() override {} |
113 | | void draw(librevenge::RVNGDrawingInterface *painter) override; |
114 | | private: |
115 | | librevenge::RVNGPropertyList m_propList; |
116 | | }; |
117 | | |
118 | | |
119 | | class CDRPathOutputElement : public CDROutputElement |
120 | | { |
121 | | public: |
122 | | CDRPathOutputElement(const librevenge::RVNGPropertyList &propList); |
123 | 299k | ~CDRPathOutputElement() override {} |
124 | | void draw(librevenge::RVNGDrawingInterface *painter) override; |
125 | | private: |
126 | | librevenge::RVNGPropertyList m_propList; |
127 | | }; |
128 | | |
129 | | |
130 | | class CDRGraphicObjectOutputElement : public CDROutputElement |
131 | | { |
132 | | public: |
133 | | CDRGraphicObjectOutputElement(const librevenge::RVNGPropertyList &propList); |
134 | 3.40k | ~CDRGraphicObjectOutputElement() override {} |
135 | | void draw(librevenge::RVNGDrawingInterface *painter) override; |
136 | | private: |
137 | | librevenge::RVNGPropertyList m_propList; |
138 | | }; |
139 | | |
140 | | |
141 | | class CDRStartTextObjectOutputElement : public CDROutputElement |
142 | | { |
143 | | public: |
144 | | CDRStartTextObjectOutputElement(const librevenge::RVNGPropertyList &propList); |
145 | 242 | ~CDRStartTextObjectOutputElement() override {} |
146 | | void draw(librevenge::RVNGDrawingInterface *painter) override; |
147 | | private: |
148 | | librevenge::RVNGPropertyList m_propList; |
149 | | }; |
150 | | |
151 | | |
152 | | class CDROpenParagraphOutputElement : public CDROutputElement |
153 | | { |
154 | | public: |
155 | | CDROpenParagraphOutputElement(const librevenge::RVNGPropertyList &propList); |
156 | 438 | ~CDROpenParagraphOutputElement() override {} |
157 | | void draw(librevenge::RVNGDrawingInterface *painter) override; |
158 | | private: |
159 | | librevenge::RVNGPropertyList m_propList; |
160 | | }; |
161 | | |
162 | | |
163 | | class CDROpenSpanOutputElement : public CDROutputElement |
164 | | { |
165 | | public: |
166 | | CDROpenSpanOutputElement(const librevenge::RVNGPropertyList &propList); |
167 | 5.67k | ~CDROpenSpanOutputElement() override {} |
168 | | void draw(librevenge::RVNGDrawingInterface *painter) override; |
169 | | private: |
170 | | librevenge::RVNGPropertyList m_propList; |
171 | | }; |
172 | | |
173 | | |
174 | | class CDRInsertTextOutputElement : public CDROutputElement |
175 | | { |
176 | | public: |
177 | | CDRInsertTextOutputElement(const librevenge::RVNGString &text); |
178 | 5.67k | ~CDRInsertTextOutputElement() override {} |
179 | | void draw(librevenge::RVNGDrawingInterface *painter) override; |
180 | | private: |
181 | | librevenge::RVNGString m_text; |
182 | | }; |
183 | | |
184 | | |
185 | | class CDRCloseSpanOutputElement : public CDROutputElement |
186 | | { |
187 | | public: |
188 | | CDRCloseSpanOutputElement(); |
189 | 0 | ~CDRCloseSpanOutputElement() override {} |
190 | | void draw(librevenge::RVNGDrawingInterface *painter) override; |
191 | | }; |
192 | | |
193 | | |
194 | | class CDRCloseParagraphOutputElement : public CDROutputElement |
195 | | { |
196 | | public: |
197 | | CDRCloseParagraphOutputElement(); |
198 | 0 | ~CDRCloseParagraphOutputElement() override {} |
199 | | void draw(librevenge::RVNGDrawingInterface *painter) override; |
200 | | }; |
201 | | |
202 | | |
203 | | class CDREndTextObjectOutputElement : public CDROutputElement |
204 | | { |
205 | | public: |
206 | | CDREndTextObjectOutputElement(); |
207 | 0 | ~CDREndTextObjectOutputElement() override {} |
208 | | void draw(librevenge::RVNGDrawingInterface *painter) override; |
209 | | }; |
210 | | |
211 | | class CDRStartLayerOutputElement : public CDROutputElement |
212 | | { |
213 | | public: |
214 | | CDRStartLayerOutputElement(const librevenge::RVNGPropertyList &propList); |
215 | 8 | ~CDRStartLayerOutputElement() override {} |
216 | | void draw(librevenge::RVNGDrawingInterface *painter) override; |
217 | | private: |
218 | | librevenge::RVNGPropertyList m_propList; |
219 | | }; |
220 | | |
221 | | class CDREndLayerOutputElement : public CDROutputElement |
222 | | { |
223 | | public: |
224 | | CDREndLayerOutputElement(); |
225 | 0 | ~CDREndLayerOutputElement() override {} |
226 | | void draw(librevenge::RVNGDrawingInterface *painter) override; |
227 | | }; |
228 | | |
229 | | CDRStyleOutputElement::CDRStyleOutputElement(const librevenge::RVNGPropertyList &propList) : |
230 | 308k | m_propList(propList) {} |
231 | | |
232 | | void CDRStyleOutputElement::draw(librevenge::RVNGDrawingInterface *painter) |
233 | 197k | { |
234 | 197k | if (painter) |
235 | 197k | painter->setStyle(m_propList); |
236 | 197k | } |
237 | | |
238 | | |
239 | | CDRPathOutputElement::CDRPathOutputElement(const librevenge::RVNGPropertyList &propList) : |
240 | 299k | m_propList(propList) {} |
241 | | |
242 | | void CDRPathOutputElement::draw(librevenge::RVNGDrawingInterface *painter) |
243 | 196k | { |
244 | 196k | if (painter) |
245 | 196k | painter->drawPath(m_propList); |
246 | 196k | } |
247 | | |
248 | | |
249 | | CDRGraphicObjectOutputElement::CDRGraphicObjectOutputElement(const librevenge::RVNGPropertyList &propList) : |
250 | 3.40k | m_propList(propList) {} |
251 | | |
252 | | void CDRGraphicObjectOutputElement::draw(librevenge::RVNGDrawingInterface *painter) |
253 | 2.67k | { |
254 | 2.67k | if (painter) |
255 | 2.67k | painter->drawGraphicObject(m_propList); |
256 | 2.67k | } |
257 | | |
258 | | |
259 | | CDRStartTextObjectOutputElement::CDRStartTextObjectOutputElement(const librevenge::RVNGPropertyList &propList) : |
260 | 242 | m_propList(propList) {} |
261 | | |
262 | | void CDRStartTextObjectOutputElement::draw(librevenge::RVNGDrawingInterface *painter) |
263 | 239 | { |
264 | 239 | if (painter) |
265 | 239 | painter->startTextObject(m_propList); |
266 | 239 | } |
267 | | |
268 | | CDROpenSpanOutputElement::CDROpenSpanOutputElement(const librevenge::RVNGPropertyList &propList) : |
269 | 5.67k | m_propList(propList) {} |
270 | | |
271 | | void CDROpenSpanOutputElement::draw(librevenge::RVNGDrawingInterface *painter) |
272 | 2.11k | { |
273 | 2.11k | if (painter) |
274 | 2.11k | painter->openSpan(m_propList); |
275 | 2.11k | } |
276 | | |
277 | | |
278 | | CDROpenParagraphOutputElement::CDROpenParagraphOutputElement(const librevenge::RVNGPropertyList &propList) : |
279 | 438 | m_propList(propList) {} |
280 | | |
281 | | void CDROpenParagraphOutputElement::draw(librevenge::RVNGDrawingInterface *painter) |
282 | 435 | { |
283 | 435 | if (painter) |
284 | 435 | painter->openParagraph(m_propList); |
285 | 435 | } |
286 | | |
287 | | |
288 | | CDRInsertTextOutputElement::CDRInsertTextOutputElement(const librevenge::RVNGString &text) : |
289 | 5.67k | m_text(text) {} |
290 | | |
291 | | void CDRInsertTextOutputElement::draw(librevenge::RVNGDrawingInterface *painter) |
292 | 2.11k | { |
293 | 2.11k | if (painter) |
294 | 2.11k | separateSpacesAndInsertText(painter, m_text); |
295 | 2.11k | } |
296 | | |
297 | 5.67k | CDRCloseSpanOutputElement::CDRCloseSpanOutputElement() {} |
298 | | |
299 | | void CDRCloseSpanOutputElement::draw(librevenge::RVNGDrawingInterface *painter) |
300 | 2.11k | { |
301 | 2.11k | if (painter) |
302 | 2.11k | painter->closeSpan(); |
303 | 2.11k | } |
304 | | |
305 | | |
306 | 438 | CDRCloseParagraphOutputElement::CDRCloseParagraphOutputElement() {} |
307 | | |
308 | | void CDRCloseParagraphOutputElement::draw(librevenge::RVNGDrawingInterface *painter) |
309 | 435 | { |
310 | 435 | if (painter) |
311 | 435 | painter->closeParagraph(); |
312 | 435 | } |
313 | | |
314 | | |
315 | 242 | CDREndTextObjectOutputElement::CDREndTextObjectOutputElement() {} |
316 | | |
317 | | void CDREndTextObjectOutputElement::draw(librevenge::RVNGDrawingInterface *painter) |
318 | 239 | { |
319 | 239 | if (painter) |
320 | 239 | painter->endTextObject(); |
321 | 239 | } |
322 | | |
323 | | |
324 | 8 | CDREndLayerOutputElement::CDREndLayerOutputElement() {} |
325 | | |
326 | | void CDREndLayerOutputElement::draw(librevenge::RVNGDrawingInterface *painter) |
327 | 8 | { |
328 | 8 | if (painter) |
329 | 8 | painter->endLayer(); |
330 | 8 | } |
331 | | |
332 | | |
333 | | CDRStartLayerOutputElement::CDRStartLayerOutputElement(const librevenge::RVNGPropertyList &propList) : |
334 | 8 | m_propList(propList) {} |
335 | | |
336 | | void CDRStartLayerOutputElement::draw(librevenge::RVNGDrawingInterface *painter) |
337 | 8 | { |
338 | 8 | if (painter) |
339 | 8 | painter->startLayer(m_propList); |
340 | 8 | } |
341 | | |
342 | | |
343 | | CDROutputElementList::CDROutputElementList() |
344 | 424k | : m_elements() |
345 | 424k | { |
346 | 424k | } |
347 | | |
348 | | CDROutputElementList::~CDROutputElementList() |
349 | 732k | { |
350 | 732k | } |
351 | | |
352 | | void CDROutputElementList::draw(librevenge::RVNGDrawingInterface *painter) const |
353 | 197k | { |
354 | 197k | for (const auto &element : m_elements) |
355 | 404k | element->draw(painter); |
356 | 197k | } |
357 | | |
358 | | void CDROutputElementList::addStyle(const librevenge::RVNGPropertyList &propList) |
359 | 308k | { |
360 | 308k | m_elements.push_back(std::make_shared<CDRStyleOutputElement>(propList)); |
361 | 308k | } |
362 | | |
363 | | void CDROutputElementList::addPath(const librevenge::RVNGPropertyList &propList) |
364 | 299k | { |
365 | 299k | m_elements.push_back(std::make_shared<CDRPathOutputElement>(propList)); |
366 | 299k | } |
367 | | |
368 | | void CDROutputElementList::addGraphicObject(const librevenge::RVNGPropertyList &propList) |
369 | 3.40k | { |
370 | 3.40k | m_elements.push_back(std::make_shared<CDRGraphicObjectOutputElement>(propList)); |
371 | 3.40k | } |
372 | | |
373 | | void CDROutputElementList::addStartTextObject(const librevenge::RVNGPropertyList &propList) |
374 | 242 | { |
375 | 242 | m_elements.push_back(std::make_shared<CDRStartTextObjectOutputElement>(propList)); |
376 | 242 | } |
377 | | |
378 | | void CDROutputElementList::addOpenParagraph(const librevenge::RVNGPropertyList &propList) |
379 | 438 | { |
380 | 438 | m_elements.push_back(std::make_shared<CDROpenParagraphOutputElement>(propList)); |
381 | 438 | } |
382 | | |
383 | | void CDROutputElementList::addOpenSpan(const librevenge::RVNGPropertyList &propList) |
384 | 5.67k | { |
385 | 5.67k | m_elements.push_back(std::make_shared<CDROpenSpanOutputElement>(propList)); |
386 | 5.67k | } |
387 | | |
388 | | void CDROutputElementList::addInsertText(const librevenge::RVNGString &text) |
389 | 5.67k | { |
390 | 5.67k | m_elements.push_back(std::make_shared<CDRInsertTextOutputElement>(text)); |
391 | 5.67k | } |
392 | | |
393 | | void CDROutputElementList::addCloseSpan() |
394 | 5.67k | { |
395 | 5.67k | m_elements.push_back(std::make_shared<CDRCloseSpanOutputElement>()); |
396 | 5.67k | } |
397 | | |
398 | | void CDROutputElementList::addCloseParagraph() |
399 | 438 | { |
400 | 438 | m_elements.push_back(std::make_shared<CDRCloseParagraphOutputElement>()); |
401 | 438 | } |
402 | | |
403 | | void CDROutputElementList::addEndTextObject() |
404 | 242 | { |
405 | 242 | m_elements.push_back(std::make_shared<CDREndTextObjectOutputElement>()); |
406 | 242 | } |
407 | | |
408 | | void CDROutputElementList::addStartGroup(const librevenge::RVNGPropertyList &propList) |
409 | 8 | { |
410 | 8 | m_elements.push_back(std::make_shared<CDRStartLayerOutputElement>(propList)); |
411 | 8 | } |
412 | | |
413 | | void CDROutputElementList::addEndGroup() |
414 | 8 | { |
415 | 8 | m_elements.push_back(std::make_shared<CDREndLayerOutputElement>()); |
416 | 8 | } |
417 | | |
418 | | } // namespace libcdr |
419 | | |
420 | | /* vim:set shiftwidth=2 softtabstop=2 expandtab: */ |