Cogs.Core
element.h
1#ifndef LH_ELEMENT_H
2#define LH_ELEMENT_H
3
4#include <memory>
5#include "stylesheet.h"
6#include "css_offsets.h"
7
8namespace litehtml
9{
10 class box;
11
12 class element : public std::enable_shared_from_this<element>
13 {
14 friend class block_box;
15 friend class line_box;
16 friend class html_tag;
17 friend class el_table;
18 friend class document;
19 public:
20 typedef std::shared_ptr<litehtml::element> ptr;
21 typedef std::shared_ptr<const litehtml::element> const_ptr;
22 typedef std::weak_ptr<litehtml::element> weak_ptr;
23 protected:
24 std::weak_ptr<element> m_parent;
25 std::weak_ptr<litehtml::document> m_doc;
26 litehtml::box* m_box;
27 elements_vector m_children;
28 position m_pos;
29 margins m_margins;
30 margins m_padding;
31 margins m_borders;
32 bool m_skip;
33 void * m_userdata;
34 int m_userdatageneration;
35
36 virtual void select_all(const css_selector& selector, elements_vector& res);
37 public:
38 element(const std::shared_ptr<litehtml::document>& doc);
39 virtual ~element();
40
41 // returns refer to m_pos member;
42 position& get_position();
43
44 int left() const;
45 int right() const;
46 int top() const;
47 int bottom() const;
48 int height() const;
49 int width() const;
50
51 int content_margins_top() const;
52 int content_margins_bottom() const;
53 int content_margins_left() const;
54 int content_margins_right() const;
55 int content_margins_width() const;
56 int content_margins_height() const;
57
58 int margin_top() const;
59 int margin_bottom() const;
60 int margin_left() const;
61 int margin_right() const;
62 margins get_margins() const;
63
64 int padding_top() const;
65 int padding_bottom() const;
66 int padding_left() const;
67 int padding_right() const;
68 margins get_paddings() const;
69
70 int border_top() const;
71 int border_bottom() const;
72 int border_left() const;
73 int border_right() const;
74 margins get_borders() const;
75
76 bool in_normal_flow() const;
77 litehtml::web_color get_color(const tchar_t* prop_name, bool inherited, const litehtml::web_color& def_color = litehtml::web_color());
78 bool is_inline_box() const;
79 position get_placement() const;
80 bool collapse_top_margin() const;
81 bool collapse_bottom_margin() const;
82 bool is_positioned() const;
83
84 bool skip();
85 void skip(bool val);
86 bool have_parent() const;
87 element::ptr parent() const;
88 void parent(element::ptr par);
89 bool is_visible() const;
90 int calc_width(int defVal) const;
91 int get_inline_shift_left();
92 int get_inline_shift_right();
93 void apply_relative_shift(int parent_width);
94
95 std::shared_ptr<document> get_document() const;
96
97 virtual elements_vector select_all(const tstring& selector);
98 virtual elements_vector select_all(const css_selector& selector);
99
100 virtual element::ptr select_one(const tstring& selector);
101 virtual element::ptr select_one(const css_selector& selector);
102
103 virtual int render(int x, int y, int max_width, bool second_pass = false);
104 virtual int render_inline(const ptr &container, int max_width);
105 virtual int place_element(const ptr &el, int max_width);
106 virtual void calc_outlines( int parent_width );
107 virtual void calc_auto_margins(int parent_width);
108 virtual void apply_vertical_align();
109 virtual bool fetch_positioned();
110 virtual void render_positioned(render_type rt = render_all);
111
112 virtual void set_inner_html(const litehtml::tchar_t * str, litehtml::css* user_styles = 0);
113
114 virtual bool appendChild(const ptr &el);
115 virtual bool removeChild(const ptr &el);
116 virtual void clearRecursive();
117
118 virtual const tchar_t* get_tagName() const;
119 virtual void set_tagName(const tchar_t* tag);
120 virtual void set_data(const tchar_t* data);
121 virtual element_float get_float() const;
122 virtual vertical_align get_vertical_align() const;
123 virtual element_clear get_clear() const;
124 virtual size_t get_children_count() const;
125 virtual element::ptr get_child(size_t idx) const;
126 virtual overflow get_overflow() const;
127
128 virtual css_length get_css_left() const;
129 virtual css_length get_css_right() const;
130 virtual css_length get_css_top() const;
131 virtual css_length get_css_bottom() const;
132 virtual css_offsets get_css_offsets() const;
133 virtual css_length get_css_width() const;
134 virtual void set_css_width(css_length& w);
135 virtual css_length get_css_height() const;
136
137 virtual void set_attr(const tchar_t* name, const tchar_t* val);
138 virtual const tchar_t* get_attr(const tchar_t* name, const tchar_t* def = 0) const;
139 virtual void apply_stylesheet(const litehtml::css& stylesheet);
140 virtual void refresh_styles();
141 virtual bool is_white_space() const;
142 virtual bool is_body() const;
143 virtual bool is_break() const;
144 virtual int get_base_line();
145 virtual bool on_mouse_over();
146 virtual bool on_mouse_leave();
147 virtual bool on_lbutton_down();
148 virtual bool on_lbutton_up();
149 virtual void on_click();
150 virtual bool find_styles_changes(position::vector& redraw_boxes, int x, int y);
151 virtual const tchar_t* get_cursor();
152 virtual void init_font();
153 virtual bool is_point_inside(int x, int y);
154 virtual bool set_pseudo_class(const tchar_t* pclass, bool add);
155 virtual bool set_class(const tchar_t* pclass, bool add);
156 virtual bool is_replaced() const;
157 virtual int line_height() const;
158 virtual white_space get_white_space() const;
159 virtual style_display get_display() const;
160 virtual visibility get_visibility() const;
161 virtual element_position get_element_position(css_offsets* offsets = 0) const;
162 virtual void get_inline_boxes(position::vector& boxes);
163 virtual void parse_styles(bool is_reparse = false);
164 virtual void draw(uint_ptr hdc, int x, int y, const position* clip);
165 virtual void draw_background( uint_ptr hdc, int x, int y, const position* clip );
166 virtual const tchar_t* get_style_property(const tchar_t* name, bool inherited, const tchar_t* def = 0);
167 virtual uint_ptr get_font(font_metrics* fm = 0);
168 virtual int get_font_size() const;
169 virtual void get_text(tstring& text);
170 virtual const tchar_t * get_text() const { return nullptr; }
171 virtual void parse_attributes();
172 virtual int select(const css_selector& selector, bool apply_pseudo = true);
173 virtual int select(const css_element_selector& selector, bool apply_pseudo = true);
174 virtual element::ptr find_ancestor(const css_selector& selector, bool apply_pseudo = true, bool* is_pseudo = 0);
175 virtual bool is_ancestor(const ptr &el) const;
176 virtual element::ptr find_adjacent_sibling(const element::ptr& el, const css_selector& selector, bool apply_pseudo = true, bool* is_pseudo = 0);
177 virtual element::ptr find_sibling(const element::ptr& el, const css_selector& selector, bool apply_pseudo = true, bool* is_pseudo = 0);
178 virtual bool is_first_child_inline(const element::ptr& el) const;
179 virtual bool is_last_child_inline(const element::ptr& el);
180 virtual bool have_inline_child() const;
181 virtual void get_content_size(size& sz, int max_width);
182 virtual void init();
183 virtual bool is_floats_holder() const;
184 virtual int get_floats_height(element_float el_float = float_none) const;
185 virtual int get_left_floats_height() const;
186 virtual int get_right_floats_height() const;
187 virtual int get_line_left(int y);
188 virtual int get_line_right(int y, int def_right);
189 virtual void get_line_left_right(int y, int def_right, int& ln_left, int& ln_right);
190 virtual void add_float(const ptr &el, int x, int y);
191 virtual void update_floats(int dy, const ptr &parent);
192 virtual void add_positioned(const ptr &el);
193 virtual int find_next_line_top(int top, int width, int def_right);
194 virtual int get_zindex() const;
195 virtual void draw_stacking_context(uint_ptr hdc, int x, int y, const position* clip, bool with_positioned);
196 virtual void draw_children( uint_ptr hdc, int x, int y, const position* clip, draw_flag flag, int zindex );
197 virtual bool is_nth_child(const element::ptr& el, int num, int off, bool of_type) const;
198 virtual bool is_nth_last_child(const element::ptr& el, int num, int off, bool of_type) const;
199 virtual bool is_only_child(const element::ptr& el, bool of_type) const;
200 virtual bool get_predefined_height(int& p_height) const;
201 virtual void calc_document_size(litehtml::size& sz, int x = 0, int y = 0);
202 virtual void get_redraw_box(litehtml::position& pos, int x = 0, int y = 0);
203 virtual void add_style(const litehtml::style& st);
204 virtual element::ptr get_element_by_point(int x, int y, int client_x, int client_y);
205 virtual element::ptr get_child_by_point(int x, int y, int client_x, int client_y, draw_flag flag, int zindex);
206 virtual const background* get_background(bool own_only = false);
207 void set_userdata(void * data, int generation = 0) { m_userdata = data; m_userdatageneration = generation; }
208 void * get_userdata() const { return m_userdata; }
209 int get_userdata_generation() const { return m_userdatageneration; }
210 };
211
213 // INLINE FUNCTIONS //
215
216 inline int litehtml::element::right() const
217 {
218 return left() + width();
219 }
220
221 inline int litehtml::element::left() const
222 {
223 return m_pos.left() - margin_left() - m_padding.left - m_borders.left;
224 }
225
226 inline int litehtml::element::top() const
227 {
228 return m_pos.top() - margin_top() - m_padding.top - m_borders.top;
229 }
230
231 inline int litehtml::element::bottom() const
232 {
233 return top() + height();
234 }
235
236 inline int litehtml::element::height() const
237 {
238 return m_pos.height + margin_top() + margin_bottom() + m_padding.height() + m_borders.height();
239 }
240
241 inline int litehtml::element::width() const
242 {
243 return m_pos.width + margin_left() + margin_right() + m_padding.width() + m_borders.width();
244 }
245
246 inline int litehtml::element::content_margins_top() const
247 {
248 return margin_top() + m_padding.top + m_borders.top;
249 }
250
251 inline int litehtml::element::content_margins_bottom() const
252 {
253 return margin_bottom() + m_padding.bottom + m_borders.bottom;
254 }
255
256 inline int litehtml::element::content_margins_left() const
257 {
258 return margin_left() + m_padding.left + m_borders.left;
259 }
260
261 inline int litehtml::element::content_margins_right() const
262 {
263 return margin_right() + m_padding.right + m_borders.right;
264 }
265
266 inline int litehtml::element::content_margins_width() const
267 {
268 return content_margins_left() + content_margins_right();
269 }
270
271 inline int litehtml::element::content_margins_height() const
272 {
273 return content_margins_top() + content_margins_bottom();
274 }
275
276 inline litehtml::margins litehtml::element::get_paddings() const
277 {
278 return m_padding;
279 }
280
281 inline litehtml::margins litehtml::element::get_borders() const
282 {
283 return m_borders;
284 }
285
286 inline int litehtml::element::padding_top() const
287 {
288 return m_padding.top;
289 }
290
291 inline int litehtml::element::padding_bottom() const
292 {
293 return m_padding.bottom;
294 }
295
296 inline int litehtml::element::padding_left() const
297 {
298 return m_padding.left;
299 }
300
301 inline int litehtml::element::padding_right() const
302 {
303 return m_padding.right;
304 }
305
306 inline bool litehtml::element::in_normal_flow() const
307 {
308 if(get_element_position() != element_position_absolute && get_display() != display_none)
309 {
310 return true;
311 }
312 return false;
313 }
314
315 inline int litehtml::element::border_top() const
316 {
317 return m_borders.top;
318 }
319
320 inline int litehtml::element::border_bottom() const
321 {
322 return m_borders.bottom;
323 }
324
325 inline int litehtml::element::border_left() const
326 {
327 return m_borders.left;
328 }
329
330 inline int litehtml::element::border_right() const
331 {
332 return m_borders.right;
333 }
334
335 inline bool litehtml::element::skip()
336 {
337 return m_skip;
338 }
339
340 inline void litehtml::element::skip(bool val)
341 {
342 m_skip = val;
343 }
344
345 inline bool litehtml::element::have_parent() const
346 {
347 return !m_parent.expired();
348 }
349
350 inline element::ptr litehtml::element::parent() const
351 {
352 return m_parent.lock();
353 }
354
355 inline void litehtml::element::parent(element::ptr par)
356 {
357 m_parent = par;
358 }
359
360 inline int litehtml::element::margin_top() const
361 {
362 return m_margins.top;
363 }
364
365 inline int litehtml::element::margin_bottom() const
366 {
367 return m_margins.bottom;
368 }
369
370 inline int litehtml::element::margin_left() const
371 {
372 return m_margins.left;
373 }
374
375 inline int litehtml::element::margin_right() const
376 {
377 return m_margins.right;
378 }
379
380 inline litehtml::margins litehtml::element::get_margins() const
381 {
382 margins ret;
383 ret.left = margin_left();
384 ret.right = margin_right();
385 ret.top = margin_top();
386 ret.bottom = margin_bottom();
387
388 return ret;
389 }
390
391 inline bool litehtml::element::is_positioned() const
392 {
393 return (get_element_position() > element_position_static);
394 }
395
396 inline bool litehtml::element::is_visible() const
397 {
398 return !(m_skip || get_display() == display_none || get_visibility() != visibility_visible);
399 }
400
401 inline position& litehtml::element::get_position()
402 {
403 return m_pos;
404 }
405
406 inline std::shared_ptr<document> element::get_document() const
407 {
408 return m_doc.lock();
409 }
410}
411
412#endif // LH_ELEMENT_H