Photon 1.0.0
Loading...
Searching...
No Matches
element.h
Go to the documentation of this file.
1#ifndef LH_ELEMENT_H
2#define LH_ELEMENT_H
3
4#include <memory>
5#include <tuple>
6#include <list>
7#include "stylesheet.h"
8#include "css_offsets.h"
9#include "css_margins.h"
10#include "css_properties.h"
11
12namespace litehtml
13{
14 class line_box;
15 class dumper;
16 class render_item;
17
18 class element : public std::enable_shared_from_this<element>
19 {
20 friend class line_box;
21 friend class html_tag;
22 friend class el_table;
23 friend class document;
24 public:
25 typedef std::shared_ptr<element> ptr;
26 typedef std::shared_ptr<const element> const_ptr;
27 typedef std::weak_ptr<element> weak_ptr;
28 protected:
29 std::weak_ptr<element> m_parent;
30 std::weak_ptr<document> m_doc;
33 std::list<std::weak_ptr<render_item>> m_renders;
35
36 virtual void select_all(const css_selector& selector, elements_list& res);
38
39 private:
40 std::map<string_id, int> m_counter_values;
41
42 public:
43 explicit element(const std::shared_ptr<document>& doc);
44 virtual ~element() = default;
45
46 const css_properties& css() const;
48
49 bool in_normal_flow() const;
50 bool is_inline() const; // returns true if element is inline
51 bool is_inline_box() const; // returns true if element is inline box (inline-table, inline-box, inline-flex)
52 bool is_block_box() const;
53 position get_placement() const;
54 bool is_positioned() const;
55 bool is_float() const;
56 bool is_block_formatting_context() const;
57
58 bool is_root() const;
59 element::ptr parent() const;
60 void parent(const element::ptr& par);
61 // returns true for elements inside a table (but outside cells) that don't participate in table rendering
62 bool is_table_skip() const;
63
64 std::shared_ptr<document> get_document() const;
65 const std::list<std::shared_ptr<element>>& children() const;
66
67 virtual elements_list select_all(const string& selector);
68 virtual elements_list select_all(const css_selector& selector);
69
70 virtual element::ptr select_one(const string& selector);
71 virtual element::ptr select_one(const css_selector& selector);
72
73 virtual bool appendChild(const ptr &el);
74 virtual bool removeChild(const ptr &el);
75 virtual void clearRecursive();
76
77 virtual string_id id() const;
78 virtual string_id tag() const;
79 virtual const char* get_tagName() const;
80 virtual void set_tagName(const char* tag);
81 virtual void set_data(const char* data);
82
83 virtual void set_attr(const char* name, const char* val);
84 virtual const char* get_attr(const char* name, const char* def = nullptr) const;
85 virtual void apply_stylesheet(const litehtml::css& stylesheet);
86 virtual void refresh_styles();
87 virtual bool is_white_space() const;
88 virtual bool is_space() const;
89 virtual bool is_comment() const;
90 virtual bool is_body() const;
91 virtual bool is_break() const;
92 virtual bool is_text() const;
93
94 virtual bool on_mouse_over();
95 virtual bool on_mouse_leave();
96 virtual bool on_lbutton_down();
97 virtual bool on_lbutton_up();
98 virtual void on_click();
99 virtual bool set_pseudo_class(string_id cls, bool add);
100 virtual bool set_class(const char* pclass, bool add);
101 virtual bool is_replaced() const;
102 virtual void compute_styles(bool recursive = true);
103 virtual void draw(uint_ptr hdc, int x, int y, const position *clip, const std::shared_ptr<render_item>& ri);
104 virtual void draw_background(uint_ptr hdc, int x, int y, const position *clip, const std::shared_ptr<render_item> &ri);
105
106 virtual void get_text(string& text);
107 virtual void parse_attributes();
108 virtual int select(const css_selector::vector& selector_list, bool apply_pseudo = true);
109 virtual int select(const string& selector);
110 virtual int select(const css_selector& selector, bool apply_pseudo = true);
111 virtual int select(const css_element_selector& selector, bool apply_pseudo = true);
112 virtual element::ptr find_ancestor(const css_selector& selector, bool apply_pseudo = true, bool* is_pseudo = nullptr);
113 virtual bool is_ancestor(const ptr &el) const;
114 virtual element::ptr find_adjacent_sibling(const element::ptr& el, const css_selector& selector, bool apply_pseudo = true, bool* is_pseudo = nullptr);
115 virtual element::ptr find_sibling(const element::ptr& el, const css_selector& selector, bool apply_pseudo = true, bool* is_pseudo = nullptr);
116 virtual void get_content_size(size& sz, int max_width);
117 virtual bool is_nth_child(const element::ptr& el, int num, int off, bool of_type, const css_selector::vector& selector_list = {}) const;
118 virtual bool is_nth_last_child(const element::ptr& el, int num, int off, bool of_type, const css_selector::vector& selector_list = {}) const;
119 virtual bool is_only_child(const element::ptr& el, bool of_type) const;
120 virtual void add_style(const style& style);
121 virtual const background* get_background(bool own_only = false);
122
123 virtual string dump_get_name();
124 virtual std::vector<std::tuple<string, string>> dump_get_attrs();
125 void dump(litehtml::dumper& cout);
126
127 std::tuple<element::ptr, element::ptr, element::ptr> split_inlines();
128 virtual std::shared_ptr<render_item> create_render_item(const std::shared_ptr<render_item>& parent_ri);
130 void add_render(const std::shared_ptr<render_item>& ri);
131 bool find_styles_changes( position::vector& redraw_boxes);
137 {
138 return _add_before_after(1, style);
139 }
140
141 string get_counter_value(const string& counter_name);
142 string get_counters_value(const string_vector& parameters);
143 void increment_counter(const string_id& counter_name_id, const int increment = 1);
144 void reset_counter(const string_id& counter_name_id, const int value = 0);
145
146 private:
147 std::vector<element::ptr> get_siblings_before() const;
148 bool find_counter(const string_id& counter_name_id, std::map<string_id, int>::iterator& map_iterator);
149 void parse_counter_tokens(const string_vector& tokens, const int default_value, std::function<void(const string_id&, const int)> handler) const;
150 };
151
153 // INLINE FUNCTIONS //
155
157 {
158 if(css().get_position() != element_position_absolute && css().get_display() != display_none)
159 {
160 return true;
161 }
162 return false;
163 }
164
165 inline bool litehtml::element::is_root() const
166 {
167 return m_parent.expired();
168 }
169
171 {
172 return m_parent.lock();
173 }
174
176 {
177 m_parent = par;
178 }
179
181 {
182 return (css().get_position() > element_position_static);
183 }
184
185 inline bool litehtml::element::is_float() const
186 {
187 return (css().get_float() != float_none);
188 }
189
190 inline std::shared_ptr<document> element::get_document() const
191 {
192 return m_doc.lock();
193 }
194
195 inline const css_properties& element::css() const
196 {
197 return m_css;
198 }
199
201 {
202 return m_css;
203 }
204
205 inline bool element::is_block_box() const
206 {
207 if (css().get_display() == display_block ||
208 css().get_display() == display_flex ||
209 css().get_display() == display_table ||
210 css().get_display() == display_list_item)
211 {
212 return true;
213 }
214 return false;
215 }
216
217 inline const std::list<std::shared_ptr<element>>& element::children() const
218 {
219 return m_children;
220 }
221}
222
223#endif // LH_ELEMENT_H
Definition background.h:91
Definition css_selector.h:173
Definition css_properties.h:17
Definition css_selector.h:195
std::vector< css_selector::ptr > vector
Definition css_selector.h:198
Definition stylesheet.h:45
Definition document.h:45
Definition document.h:31
Definition el_table.h:16
Definition element.h:19
virtual bool is_space() const
virtual void on_click()
virtual void select_all(const css_selector &selector, elements_list &res)
virtual bool is_nth_child(const element::ptr &el, int num, int off, bool of_type, const css_selector::vector &selector_list={}) const
virtual element::ptr find_adjacent_sibling(const element::ptr &el, const css_selector &selector, bool apply_pseudo=true, bool *is_pseudo=nullptr)
elements_list m_children
Definition element.h:31
bool is_inline_box() const
Definition element.cpp:63
bool is_float() const
Definition element.h:185
virtual bool on_lbutton_up()
virtual element::ptr find_ancestor(const css_selector &selector, bool apply_pseudo=true, bool *is_pseudo=nullptr)
virtual const char * get_tagName() const
used_selector::vector m_used_styles
Definition element.h:34
css_properties m_css
Definition element.h:32
virtual string_id id() const
element::ptr _add_before_after(int type, const style &style)
Definition element.cpp:259
virtual element::ptr select_one(const string &selector)
virtual void get_content_size(size &sz, int max_width)
virtual void get_text(string &text)
bool is_block_formatting_context() const
Definition element.cpp:275
virtual element::ptr find_sibling(const element::ptr &el, const css_selector &selector, bool apply_pseudo=true, bool *is_pseudo=nullptr)
virtual std::vector< std::tuple< string, string > > dump_get_attrs()
Definition element.cpp:98
virtual bool on_mouse_leave()
virtual ~element()=default
const css_properties & css() const
Definition element.h:195
virtual void parse_attributes()
void increment_counter(const string_id &counter_name_id, const int increment=1)
Definition element.cpp:400
element::ptr add_pseudo_before(const style &style)
Definition element.h:132
virtual void draw_background(uint_ptr hdc, int x, int y, const position *clip, const std::shared_ptr< render_item > &ri)
bool is_block_box() const
Definition element.h:205
bool in_normal_flow() const
Definition element.h:156
virtual bool set_class(const char *pclass, bool add)
std::shared_ptr< const element > const_ptr
Definition element.h:26
void dump(litehtml::dumper &cout)
Definition element.cpp:103
virtual bool removeChild(const ptr &el)
virtual const char * get_attr(const char *name, const char *def=nullptr) const
bool is_table_skip() const
Definition element.cpp:88
virtual element::ptr select_one(const css_selector &selector)
element::ptr add_pseudo_after(const style &style)
Definition element.h:136
element::ptr parent() const
Definition element.h:170
string get_counters_value(const string_vector &parameters)
Definition element.cpp:311
void parse_counter_tokens(const string_vector &tokens, const int default_value, std::function< void(const string_id &, const int)> handler) const
Definition element.cpp:384
virtual elements_list select_all(const css_selector &selector)
bool find_counter(const string_id &counter_name_id, std::map< string_id, int >::iterator &map_iterator)
Definition element.cpp:344
bool requires_styles_update()
Definition element.cpp:191
bool is_inline() const
Definition element.cpp:50
virtual string_id tag() const
virtual bool is_comment() const
virtual void add_style(const style &style)
bool find_styles_changes(position::vector &redraw_boxes)
Definition element.cpp:212
std::weak_ptr< element > weak_ptr
Definition element.h:27
void reset_counter(const string_id &counter_name_id, const int value=0)
Definition element.cpp:412
virtual bool on_lbutton_down()
const std::list< std::shared_ptr< element > > & children() const
Definition element.h:217
virtual bool is_text() const
std::shared_ptr< element > ptr
Definition element.h:25
virtual void set_tagName(const char *tag)
position get_placement() const
Definition element.cpp:20
virtual void clearRecursive()
virtual int select(const css_selector &selector, bool apply_pseudo=true)
virtual void compute_styles(bool recursive=true)
bool is_root() const
Definition element.h:165
void add_render(const std::shared_ptr< render_item > &ri)
Definition element.cpp:207
virtual bool is_nth_last_child(const element::ptr &el, int num, int off, bool of_type, const css_selector::vector &selector_list={}) const
virtual elements_list select_all(const string &selector)
std::list< std::weak_ptr< render_item > > m_renders
Definition element.h:33
virtual const background * get_background(bool own_only=false)
std::tuple< element::ptr, element::ptr, element::ptr > split_inlines()
virtual int select(const css_element_selector &selector, bool apply_pseudo=true)
css_properties & css_w()
Definition element.h:200
bool is_positioned() const
Definition element.h:180
std::shared_ptr< document > get_document() const
Definition element.h:190
std::weak_ptr< document > m_doc
Definition element.h:30
virtual bool is_white_space() const
virtual void refresh_styles()
virtual bool is_ancestor(const ptr &el) const
Definition element.cpp:74
virtual bool is_replaced() const
virtual bool is_body() const
virtual string dump_get_name()
Definition element.cpp:93
virtual void apply_stylesheet(const litehtml::css &stylesheet)
virtual void draw(uint_ptr hdc, int x, int y, const position *clip, const std::shared_ptr< render_item > &ri)
virtual int select(const css_selector::vector &selector_list, bool apply_pseudo=true)
virtual bool is_break() const
virtual void set_data(const char *data)
std::map< string_id, int > m_counter_values
Definition element.h:40
std::vector< element::ptr > get_siblings_before() const
Definition element.cpp:369
string get_counter_value(const string &counter_name)
Definition element.cpp:301
virtual bool is_only_child(const element::ptr &el, bool of_type) const
virtual void set_attr(const char *name, const char *val)
virtual std::shared_ptr< render_item > create_render_item(const std::shared_ptr< render_item > &parent_ri)
Definition element.cpp:131
virtual bool on_mouse_over()
virtual int select(const string &selector)
virtual bool set_pseudo_class(string_id cls, bool add)
virtual bool appendChild(const ptr &el)
std::weak_ptr< element > m_parent
Definition element.h:29
Definition html_tag.h:18
Definition line_box.h:110
Definition style.h:40
std::vector< used_selector::ptr > vector
Definition css_selector.h:262
Definition core.h:1598
type
Definition core.h:681
Definition background.h:12
@ element_position_absolute
Definition types.h:565
@ element_position_static
Definition types.h:563
void increment(int &index, const string &str)
Definition encodings.cpp:1700
std::uintptr_t uint_ptr
Definition types.h:17
@ float_none
Definition types.h:482
const char * name
Definition encodings.cpp:1358
std::list< std::shared_ptr< element > > elements_list
Definition types.h:32
std::vector< string > string_vector
Definition types.h:34
@ display_none
Definition types.h:329
@ display_block
Definition types.h:330
@ display_flex
Definition types.h:345
@ display_list_item
Definition types.h:334
@ display_table
Definition types.h:335
Definition format.h:1901
Definition types.h:103
std::vector< position > vector
Definition types.h:104
Definition types.h:89