QXPContentCollector.h
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2/*
3 * This file is part of the libqxp 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#ifndef QXPCONTENTCOLLECTOR_H_INCLUDED
11#define QXPCONTENTCOLLECTOR_H_INCLUDED
12
13#include "QXPCollector.h"
14#include <vector>
15#include <unordered_map>
16#include <map>
17#include <memory>
18#include <functional>
19#include <type_traits>
20
21#include "QXPTypes.h"
22
23namespace libqxp
24{
25
27{
28 // disable copying
31
32public:
33 QXPContentCollector(librevenge::RVNGDrawingInterface *painter);
35
36 void startDocument() override;
37 void endDocument() override;
38
39 void startPage(const Page &page) override;
40 void endPage() override;
41
42 void collectDocumentProperties(const QXPDocumentProperties &props) override;
43
44 void collectLine(const std::shared_ptr<Line> &line) override;
45 void collectBox(const std::shared_ptr<Box> &box) override;
46 void collectTextBox(const std::shared_ptr<TextBox> &box) override;
47 void collectTextPath(const std::shared_ptr<TextPath> &textPath) override;
48 void collectGroup(const std::shared_ptr<Group> &group) override;
49
50 void collectText(const std::shared_ptr<Text> &text, const unsigned linkId) override;
51
52private:
53 struct CollectedPage;
54
55 template<typename T>
56 using ObjectHandler = std::function<void(const std::shared_ptr<T> &obj, const CollectedPage &)>;
57
58 template<typename T, typename TThis>
59 using ObjectHandlerMember = std::function<void(TThis *, const std::shared_ptr<T> &obj, const CollectedPage &)>;
60
62 {
63 public:
64 virtual ~CollectedObjectInterface() = default;
65
66 virtual void draw(const CollectedPage &page) = 0;
67
68 virtual unsigned zIndex() const = 0;
69 virtual void setZIndex(unsigned value) = 0;
70 };
71
72 template<typename T>
74 {
75 static_assert(std::is_base_of<Object, T>::value, "T is not Object");
76 public:
77 const std::shared_ptr<T> object;
78
79 CollectedObject(const std::shared_ptr<T> &obj, const ObjectHandler<T> &handler)
80 : object(obj), m_handler(handler), m_isProcessed(false)
81 { }
82
83 void draw(const CollectedPage &page) override
84 {
85 if (!m_isProcessed)
86 {
87 m_isProcessed = true;
88 m_handler(object, page);
89 }
90 }
91
92 unsigned zIndex() const override
93 {
94 return object->zIndex;
95 }
96
97 void setZIndex(unsigned value) override
98 {
99 object->zIndex = value;
100 }
101
102 private:
105 };
106
108 {
110 std::vector<std::shared_ptr<CollectedObject<Group>>> groups;
111 std::vector<std::shared_ptr<TextObject>> linkedTextObjects;
112 std::map<unsigned, std::shared_ptr<CollectedObjectInterface>> objects;
113
114 CollectedPage(const PageSettings &pageSettings)
115 : settings(pageSettings), groups(), linkedTextObjects(), objects()
116 { }
117
118 double getX(const double x) const;
119 double getX(const std::shared_ptr<Object> &obj) const;
120 double getY(const double y) const;
121 double getY(const std::shared_ptr<Object> &obj) const;
122 Point getPoint(const Point &p) const;
123 };
124
125 librevenge::RVNGDrawingInterface *m_painter;
126
130
131 std::vector<CollectedPage> m_unprocessedPages;
132
133 std::unordered_map<unsigned, std::shared_ptr<Text>> m_linkTextMap;
134 std::unordered_map<unsigned, std::unordered_map<unsigned, std::shared_ptr<TextObject>>> m_linkIndexedTextObjectsMap;
135
137
138 CollectedPage &getInsertionPage(const std::shared_ptr<Object> &obj);
139
140 template<typename T>
141 std::shared_ptr<CollectedObject<T>> addObject(const std::shared_ptr<T> &obj, const ObjectHandlerMember<T, QXPContentCollector> &handler)
142 {
143 auto collectedObj = std::make_shared<CollectedObject<T>>(obj, std::bind(handler, this, std::placeholders::_1, std::placeholders::_2));
144 getInsertionPage(obj).objects[m_currentObjectIndex] = collectedObj;
146 return collectedObj;
147 }
148
149 void draw(bool force = false);
150
151 void collectTextObject(const std::shared_ptr<TextObject> &textObj, CollectedPage &page);
152 void updateLinkedTexts();
154
155 void drawLine(const std::shared_ptr<Line> &line, const CollectedPage &page);
156 void drawBox(const std::shared_ptr<Box> &box, const CollectedPage &page);
157 void drawRectangle(const std::shared_ptr<Box> &box, const CollectedPage &page);
158 void drawOval(const std::shared_ptr<Box> &oval, const CollectedPage &page);
159 void drawPolygon(const std::shared_ptr<Box> &polygon, const CollectedPage &page);
160 void drawBezierBox(const std::shared_ptr<Box> &box, const CollectedPage &page);
161 void drawTextBox(const std::shared_ptr<TextBox> &textbox, const CollectedPage &page);
162 void drawTextPath(const std::shared_ptr<TextPath> &textPath, const CollectedPage &page);
163 void drawText(const std::shared_ptr<Text> &text, const LinkedTextSettings &linkSettings);
164 void drawGroup(const std::shared_ptr<Group> &group, const CollectedPage &page);
165
166 void writeFill(librevenge::RVNGPropertyList &propList, const boost::optional<Fill> &fill);
167 void writeFrame(librevenge::RVNGPropertyList &propList, const Frame &frame, const bool runaround, const bool allowHairline = false);
168};
169
170}
171
172#endif // QXPCONTENTCOLLECTOR_H_INCLUDED
173
174/* vim:set shiftwidth=2 softtabstop=2 expandtab: */
Definition: QXPCollector.h:28
Definition: QXPContentCollector.h:62
virtual void draw(const CollectedPage &page)=0
Definition: QXPContentCollector.h:74
bool m_isProcessed
Definition: QXPContentCollector.h:104
void draw(const CollectedPage &page) override
Definition: QXPContentCollector.h:83
void setZIndex(unsigned value) override
Definition: QXPContentCollector.h:97
unsigned zIndex() const override
Definition: QXPContentCollector.h:92
CollectedObject(const std::shared_ptr< T > &obj, const ObjectHandler< T > &handler)
Definition: QXPContentCollector.h:79
const std::shared_ptr< T > object
Definition: QXPContentCollector.h:77
const ObjectHandler< T > m_handler
Definition: QXPContentCollector.h:103
Definition: QXPContentCollector.h:27
void endDocument() override
Definition: QXPContentCollector.cpp:320
bool m_isCollectingFacingPage
Definition: QXPContentCollector.h:128
std::vector< CollectedPage > m_unprocessedPages
Definition: QXPContentCollector.h:131
librevenge::RVNGDrawingInterface * m_painter
Definition: QXPContentCollector.h:125
void drawOval(const std::shared_ptr< Box > &oval, const CollectedPage &page)
Definition: QXPContentCollector.cpp:632
void collectTextObject(const std::shared_ptr< TextObject > &textObj, CollectedPage &page)
Definition: QXPContentCollector.cpp:474
void drawBezierBox(const std::shared_ptr< Box > &box, const CollectedPage &page)
Definition: QXPContentCollector.cpp:682
void drawText(const std::shared_ptr< Text > &text, const LinkedTextSettings &linkSettings)
Definition: QXPContentCollector.cpp:831
void startPage(const Page &page) override
Definition: QXPContentCollector.cpp:336
std::function< void(const std::shared_ptr< T > &obj, const CollectedPage &)> ObjectHandler
Definition: QXPContentCollector.h:56
~QXPContentCollector()
Definition: QXPContentCollector.cpp:302
QXPDocumentProperties m_docProps
Definition: QXPContentCollector.h:136
void drawRectangle(const std::shared_ptr< Box > &box, const CollectedPage &page)
Definition: QXPContentCollector.cpp:597
CollectedPage & getInsertionPage(const std::shared_ptr< Object > &obj)
Definition: QXPContentCollector.cpp:416
std::function< void(TThis *, const std::shared_ptr< T > &obj, const CollectedPage &)> ObjectHandlerMember
Definition: QXPContentCollector.h:59
void drawGroup(const std::shared_ptr< Group > &group, const CollectedPage &page)
Definition: QXPContentCollector.cpp:1047
void updateLinkedTexts()
Definition: QXPContentCollector.cpp:496
void drawLine(const std::shared_ptr< Line > &line, const CollectedPage &page)
Definition: QXPContentCollector.cpp:535
void writeFill(librevenge::RVNGPropertyList &propList, const boost::optional< Fill > &fill)
Definition: QXPContentCollector.cpp:1079
void writeFrame(librevenge::RVNGPropertyList &propList, const Frame &frame, const bool runaround, const bool allowHairline=false)
Definition: QXPContentCollector.cpp:1090
std::shared_ptr< CollectedObject< T > > addObject(const std::shared_ptr< T > &obj, const ObjectHandlerMember< T, QXPContentCollector > &handler)
Definition: QXPContentCollector.h:141
void drawTextPath(const std::shared_ptr< TextPath > &textPath, const CollectedPage &page)
Definition: QXPContentCollector.cpp:762
void collectText(const std::shared_ptr< Text > &text, const unsigned linkId) override
Definition: QXPContentCollector.cpp:399
QXPContentCollector & operator=(const QXPContentCollector &other)=delete
void drawBox(const std::shared_ptr< Box > &box, const CollectedPage &page)
Definition: QXPContentCollector.cpp:577
void collectLine(const std::shared_ptr< Line > &line) override
Definition: QXPContentCollector.cpp:358
void draw(bool force=false)
Definition: QXPContentCollector.cpp:425
unsigned m_currentObjectIndex
Definition: QXPContentCollector.h:129
void drawTextBox(const std::shared_ptr< TextBox > &textbox, const CollectedPage &page)
Definition: QXPContentCollector.cpp:712
std::unordered_map< unsigned, std::shared_ptr< Text > > m_linkTextMap
Definition: QXPContentCollector.h:133
bool hasUnfinishedLinkedTexts()
Definition: QXPContentCollector.cpp:519
void collectGroup(const std::shared_ptr< Group > &group) override
Definition: QXPContentCollector.cpp:392
void drawPolygon(const std::shared_ptr< Box > &polygon, const CollectedPage &page)
Definition: QXPContentCollector.cpp:656
bool m_isDocumentStarted
Definition: QXPContentCollector.h:127
void collectTextPath(const std::shared_ptr< TextPath > &textPath) override
Definition: QXPContentCollector.cpp:380
void collectDocumentProperties(const QXPDocumentProperties &props) override
Definition: QXPContentCollector.cpp:353
std::unordered_map< unsigned, std::unordered_map< unsigned, std::shared_ptr< TextObject > > > m_linkIndexedTextObjectsMap
Definition: QXPContentCollector.h:134
void endPage() override
Definition: QXPContentCollector.cpp:347
QXPContentCollector(const QXPContentCollector &other)=delete
void startDocument() override
Definition: QXPContentCollector.cpp:310
void collectTextBox(const std::shared_ptr< TextBox > &box) override
Definition: QXPContentCollector.cpp:368
void collectBox(const std::shared_ptr< Box > &box) override
Definition: QXPContentCollector.cpp:363
Definition: libqxp_utils.cpp:25
Definition: QXPTypes.h:345
Definition: QXPTypes.h:362
Definition: QXPTypes.h:537
Definition: QXPTypes.h:546
Definition: QXPTypes.h:25
Definition: QXPContentCollector.h:108
double getX(const double x) const
Definition: QXPContentCollector.cpp:1163
std::map< unsigned, std::shared_ptr< CollectedObjectInterface > > objects
Definition: QXPContentCollector.h:112
const PageSettings settings
Definition: QXPContentCollector.h:109
double getY(const double y) const
Definition: QXPContentCollector.cpp:1173
std::vector< std::shared_ptr< CollectedObject< Group > > > groups
Definition: QXPContentCollector.h:110
Point getPoint(const Point &p) const
Definition: QXPContentCollector.cpp:1183
CollectedPage(const PageSettings &pageSettings)
Definition: QXPContentCollector.h:114
std::vector< std::shared_ptr< TextObject > > linkedTextObjects
Definition: QXPContentCollector.h:111
Definition: QXPTypes.h:561

Generated for libqxp by doxygen 1.9.6