PoDoFo 1.0.0-dev
Loading...
Searching...
No Matches
PdfFieldChildrenCollection.h
1
7#ifndef PDF_FIELD_CHILDREN_COLLECTION_H
8#define PDF_FIELD_CHILDREN_COLLECTION_H
9
10#include "PdfObject.h"
11#include <podofo/auxiliary/Rect.h>
12
13namespace PoDoFo
14{
15 class PdfField;
16 class PdfPage;
17
18 class PODOFO_API PdfFieldChildrenCollectionBase
19 {
20 friend class PdfField;
21
22 private:
23 PdfFieldChildrenCollectionBase(PdfField& field);
24
25 public:
26 PdfField& CreateChild();
27 PdfField& CreateChild(PdfPage& page, const Rect& rect);
28
29 PdfField& GetFieldAt(unsigned index);
30
31 const PdfField& GetFieldAt(unsigned index) const;
32
33 PdfField& GetField(const PdfReference& ref);
34
35 const PdfField& GetField(const PdfReference& ref) const;
36
37 void RemoveFieldAt(unsigned index);
38
39 void RemoveField(const PdfReference& ref);
40
41 unsigned GetCount() const;
42
43 bool HasKidsArray() const;
44
45 public:
46 using FieldList = std::vector<std::shared_ptr<PdfField>>;
47
48 template <typename TField, typename TListIterator>
49 class Iterator final
50 {
51 friend class PdfFieldChildrenCollectionBase;
52 public:
53 using difference_type = void;
54 using value_type = TField*;
55 using pointer = void;
56 using reference = void;
57 using iterator_category = std::forward_iterator_tag;
58 public:
59 Iterator() { }
60 private:
61 Iterator(const TListIterator& iterator) : m_iterator(iterator) { }
62 public:
63 Iterator(const Iterator&) = default;
64 Iterator& operator=(const Iterator&) = default;
65 bool operator==(const Iterator& rhs) const
66 {
67 return m_iterator == rhs.m_iterator;
68 }
69 bool operator!=(const Iterator& rhs) const
70 {
71 return m_iterator != rhs.m_iterator;
72 }
73 Iterator& operator++()
74 {
75 m_iterator++;
76 return *this;
77 }
78 Iterator operator++(int)
79 {
80 auto copy = *this;
81 m_iterator++;
82 return copy;
83 }
84 value_type operator*()
85 {
86 return m_iterator.get();
87 }
88 value_type operator->()
89 {
90 return m_iterator.get();
91 }
92 private:
93 TListIterator m_iterator;
94 };
95
96 using iterator = Iterator<PdfField, FieldList::iterator>;
97 using const_iterator = Iterator<const PdfField, FieldList::const_iterator>;
98
99 public:
100 iterator begin();
101 iterator end();
102 const_iterator begin() const;
103 const_iterator end() const;
104
105 private:
106 // To be called by PdfField
107 PdfField& AddChild(const std::shared_ptr<PdfField>& field);
108 private:
109 PdfArray* getKidsArray() const;
110 void initFields();
111 PdfField& getFieldAt(unsigned index) const;
112 PdfField& getField(const PdfReference& ref) const;
113 void fixIndices(unsigned index);
114
115 private:
116 using FieldMap = std::map<PdfReference, unsigned>;
117
118 private:
119 FieldList m_Fields;
120 FieldMap m_fieldMap;
121 PdfField* m_field;
122 PdfArray* m_kidsArray;
123 };
124
125 // TODO
126 template <typename TField>
127 class PdfFieldChildrenCollection final : PdfFieldChildrenCollectionBase
128 {
129
130 };
131}
132
133#endif // PDF_FIELD_CHILDREN_COLLECTION_H
SPDX-FileCopyrightText: (C) 2022 Francesco Pretto ceztko@gmail.com SPDX-License-Identifier: LGPL-2....
Definition basetypes.h:16