6#include "css_offsets.h"
12 class element :
public std::enable_shared_from_this<element>
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;
24 std::weak_ptr<element> m_parent;
25 std::weak_ptr<litehtml::document> m_doc;
27 elements_vector m_children;
34 int m_userdatageneration;
36 virtual void select_all(
const css_selector& selector, elements_vector& res);
38 element(
const std::shared_ptr<litehtml::document>& doc);
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;
58 int margin_top()
const;
59 int margin_bottom()
const;
60 int margin_left()
const;
61 int margin_right()
const;
64 int padding_top()
const;
65 int padding_bottom()
const;
66 int padding_left()
const;
67 int padding_right()
const;
70 int border_top()
const;
71 int border_bottom()
const;
72 int border_left()
const;
73 int border_right()
const;
76 bool in_normal_flow()
const;
78 bool is_inline_box()
const;
80 bool collapse_top_margin()
const;
81 bool collapse_bottom_margin()
const;
82 bool is_positioned()
const;
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);
95 std::shared_ptr<document> get_document()
const;
97 virtual elements_vector select_all(
const tstring& selector);
98 virtual elements_vector select_all(
const css_selector& selector);
100 virtual element::ptr select_one(
const tstring& selector);
101 virtual element::ptr select_one(
const css_selector& selector);
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);
112 virtual void set_inner_html(
const litehtml::tchar_t * str,
litehtml::css* user_styles = 0);
114 virtual bool appendChild(
const ptr &el);
115 virtual bool removeChild(
const ptr &el);
116 virtual void clearRecursive();
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;
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);
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);
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);
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);
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; }
216 inline int litehtml::element::right()
const
218 return left() + width();
221 inline int litehtml::element::left()
const
223 return m_pos.left() - margin_left() - m_padding.left - m_borders.left;
226 inline int litehtml::element::top()
const
228 return m_pos.top() - margin_top() - m_padding.top - m_borders.top;
231 inline int litehtml::element::bottom()
const
233 return top() + height();
236 inline int litehtml::element::height()
const
238 return m_pos.height + margin_top() + margin_bottom() + m_padding.height() + m_borders.height();
241 inline int litehtml::element::width()
const
243 return m_pos.width + margin_left() + margin_right() + m_padding.width() + m_borders.width();
246 inline int litehtml::element::content_margins_top()
const
248 return margin_top() + m_padding.top + m_borders.top;
251 inline int litehtml::element::content_margins_bottom()
const
253 return margin_bottom() + m_padding.bottom + m_borders.bottom;
256 inline int litehtml::element::content_margins_left()
const
258 return margin_left() + m_padding.left + m_borders.left;
261 inline int litehtml::element::content_margins_right()
const
263 return margin_right() + m_padding.right + m_borders.right;
266 inline int litehtml::element::content_margins_width()
const
268 return content_margins_left() + content_margins_right();
271 inline int litehtml::element::content_margins_height()
const
273 return content_margins_top() + content_margins_bottom();
286 inline int litehtml::element::padding_top()
const
288 return m_padding.top;
291 inline int litehtml::element::padding_bottom()
const
293 return m_padding.bottom;
296 inline int litehtml::element::padding_left()
const
298 return m_padding.left;
301 inline int litehtml::element::padding_right()
const
303 return m_padding.right;
306 inline bool litehtml::element::in_normal_flow()
const
308 if(get_element_position() != element_position_absolute && get_display() != display_none)
315 inline int litehtml::element::border_top()
const
317 return m_borders.top;
320 inline int litehtml::element::border_bottom()
const
322 return m_borders.bottom;
325 inline int litehtml::element::border_left()
const
327 return m_borders.left;
330 inline int litehtml::element::border_right()
const
332 return m_borders.right;
335 inline bool litehtml::element::skip()
340 inline void litehtml::element::skip(
bool val)
345 inline bool litehtml::element::have_parent()
const
347 return !m_parent.expired();
350 inline element::ptr litehtml::element::parent()
const
352 return m_parent.lock();
355 inline void litehtml::element::parent(element::ptr par)
360 inline int litehtml::element::margin_top()
const
362 return m_margins.top;
365 inline int litehtml::element::margin_bottom()
const
367 return m_margins.bottom;
370 inline int litehtml::element::margin_left()
const
372 return m_margins.left;
375 inline int litehtml::element::margin_right()
const
377 return m_margins.right;
383 ret.left = margin_left();
384 ret.right = margin_right();
385 ret.top = margin_top();
386 ret.bottom = margin_bottom();
391 inline bool litehtml::element::is_positioned()
const
393 return (get_element_position() > element_position_static);
396 inline bool litehtml::element::is_visible()
const
398 return !(m_skip || get_display() == display_none || get_visibility() != visibility_visible);
401 inline position& litehtml::element::get_position()
406 inline std::shared_ptr<document> element::get_document()
const