1 #ifndef LH_HTML_TAG_H 2 #define LH_HTML_TAG_H 3 4 #include "element.h" 5 #include "style.h" 6 #include "background.h" 7 #include "css_margins.h" 8 #include "borders.h" 9 #include "css_selector.h" 10 #include "stylesheet.h" 11 #include "box.h" 12 #include "table.h" 13 14 namespace litehtml 15 { 16 struct line_context 17 { 18 int calculatedTop; 19 int top; 20 int left; 21 int right; 22 widthline_context23 int width() 24 { 25 return right - left; 26 } fix_topline_context27 void fix_top() 28 { 29 calculatedTop = top; 30 } 31 }; 32 33 class html_tag : public element 34 { 35 friend class elements_iterator; 36 friend class el_table; 37 friend class table_grid; 38 friend class block_box; 39 friend class line_box; 40 public: 41 typedef std::shared_ptr<litehtml::html_tag> ptr; 42 protected: 43 box::vector m_boxes; 44 string_vector m_class_values; 45 tstring m_tag; 46 litehtml::style m_style; 47 string_map m_attrs; 48 vertical_align m_vertical_align; 49 text_align m_text_align; 50 style_display m_display; 51 list_style_type m_list_style_type; 52 list_style_position m_list_style_position; 53 white_space m_white_space; 54 element_float m_float; 55 element_clear m_clear; 56 floated_box::vector m_floats_left; 57 floated_box::vector m_floats_right; 58 elements_vector m_positioned; 59 background m_bg; 60 element_position m_el_position; 61 int m_line_height; 62 bool m_lh_predefined; 63 string_vector m_pseudo_classes; 64 used_selector::vector m_used_styles; 65 66 uint_ptr m_font; 67 int m_font_size; 68 font_metrics m_font_metrics; 69 70 css_margins m_css_margins; 71 css_margins m_css_padding; 72 css_borders m_css_borders; 73 css_length m_css_width; 74 css_length m_css_height; 75 css_length m_css_min_width; 76 css_length m_css_min_height; 77 css_length m_css_max_width; 78 css_length m_css_max_height; 79 css_offsets m_css_offsets; 80 css_length m_css_text_indent; 81 82 overflow m_overflow; 83 visibility m_visibility; 84 int m_z_index; 85 box_sizing m_box_sizing; 86 87 int_int_cache m_cahe_line_left; 88 int_int_cache m_cahe_line_right; 89 90 // data for table rendering 91 std::unique_ptr<table_grid> m_grid; 92 css_length m_css_border_spacing_x; 93 css_length m_css_border_spacing_y; 94 int m_border_spacing_x; 95 int m_border_spacing_y; 96 border_collapse m_border_collapse; 97 98 virtual void select_all(const css_selector& selector, elements_vector& res) override; 99 100 public: 101 html_tag(const std::shared_ptr<litehtml::document>& doc); 102 virtual ~html_tag(); 103 104 /* render functions */ 105 106 virtual int render(int x, int y, int max_width, bool second_pass = false) override; 107 108 virtual int render_inline(const element::ptr &container, int max_width) override; 109 virtual int place_element(const element::ptr &el, int max_width) override; 110 virtual bool fetch_positioned() override; 111 virtual void render_positioned(render_type rt = render_all) override; 112 113 int new_box(const element::ptr &el, int max_width, line_context& line_ctx); 114 115 int get_cleared_top(const element::ptr &el, int line_top) const; 116 int finish_last_box(bool end_of_render = false); 117 118 virtual bool appendChild(const element::ptr &el) override; 119 virtual bool removeChild(const element::ptr &el) override; 120 virtual void clearRecursive() override; 121 virtual const tchar_t* get_tagName() const override; 122 virtual void set_tagName(const tchar_t* tag) override; 123 virtual void set_data(const tchar_t* data) override; 124 virtual element_float get_float() const override; 125 virtual vertical_align get_vertical_align() const override; 126 virtual css_length get_css_left() const override; 127 virtual css_length get_css_right() const override; 128 virtual css_length get_css_top() const override; 129 virtual css_length get_css_bottom() const override; 130 virtual css_length get_css_width() const override; 131 virtual css_offsets get_css_offsets() const override; 132 virtual void set_css_width(css_length& w) override; 133 virtual css_length get_css_height() const override; 134 virtual element_clear get_clear() const override; 135 virtual size_t get_children_count() const override; 136 virtual element::ptr get_child(int idx) const override; 137 virtual element_position get_element_position(css_offsets* offsets = 0) const override; 138 virtual overflow get_overflow() const override; 139 140 virtual void set_attr(const tchar_t* name, const tchar_t* val) override; 141 virtual const tchar_t* get_attr(const tchar_t* name, const tchar_t* def = 0) override; 142 virtual void apply_stylesheet(const litehtml::css& stylesheet) override; 143 virtual void refresh_styles() override; 144 145 virtual bool is_white_space() const override; 146 virtual bool is_body() const override; 147 virtual bool is_break() const override; 148 virtual int get_base_line() override; 149 virtual bool on_mouse_over() override; 150 virtual bool on_mouse_leave() override; 151 virtual bool on_lbutton_down() override; 152 virtual bool on_lbutton_up() override; 153 virtual void on_click() override; 154 virtual bool find_styles_changes(position::vector& redraw_boxes, int x, int y) override; 155 virtual const tchar_t* get_cursor() override; 156 virtual void init_font() override; 157 virtual bool set_pseudo_class(const tchar_t* pclass, bool add) override; 158 virtual bool set_class(const tchar_t* pclass, bool add) override; 159 virtual bool is_replaced() const override; 160 virtual int line_height() const override; 161 virtual white_space get_white_space() const override; 162 virtual style_display get_display() const override; 163 virtual visibility get_visibility() const override; 164 virtual void parse_styles(bool is_reparse = false) override; 165 virtual void draw(uint_ptr hdc, int x, int y, const position* clip) override; 166 virtual void draw_background(uint_ptr hdc, int x, int y, const position* clip) override; 167 168 virtual const tchar_t* get_style_property(const tchar_t* name, bool inherited, const tchar_t* def = 0) override; 169 virtual uint_ptr get_font(font_metrics* fm = 0) override; 170 virtual int get_font_size() const override; 171 172 elements_vector& children(); 173 virtual void calc_outlines(int parent_width) override; 174 virtual void calc_auto_margins(int parent_width) override; 175 176 virtual int select(const css_selector& selector, bool apply_pseudo = true) override; 177 virtual int select(const css_element_selector& selector, bool apply_pseudo = true) override; 178 179 virtual elements_vector select_all(const tstring& selector) override; 180 virtual elements_vector select_all(const css_selector& selector) override; 181 182 virtual element::ptr select_one(const tstring& selector) override; 183 virtual element::ptr select_one(const css_selector& selector) override; 184 185 virtual element::ptr find_ancestor(const css_selector& selector, bool apply_pseudo = true, bool* is_pseudo = 0) override; 186 virtual element::ptr find_adjacent_sibling(const element::ptr& el, const css_selector& selector, bool apply_pseudo = true, bool* is_pseudo = 0) override; 187 virtual element::ptr find_sibling(const element::ptr& el, const css_selector& selector, bool apply_pseudo = true, bool* is_pseudo = 0) override; 188 virtual void get_text(tstring& text) override; 189 virtual void parse_attributes() override; 190 191 virtual bool is_first_child_inline(const element::ptr& el) const override; 192 virtual bool is_last_child_inline(const element::ptr& el) override; 193 virtual bool have_inline_child() const override; 194 virtual void get_content_size(size& sz, int max_width) override; 195 virtual void init() override; 196 virtual void get_inline_boxes(position::vector& boxes) override; 197 virtual bool is_floats_holder() const override; 198 virtual int get_floats_height(element_float el_float = float_none) const override; 199 virtual int get_left_floats_height() const override; 200 virtual int get_right_floats_height() const override; 201 virtual int get_line_left(int y) override; 202 virtual int get_line_right(int y, int def_right) override; 203 virtual void get_line_left_right(int y, int def_right, int& ln_left, int& ln_right) override; 204 virtual void add_float(const element::ptr &el, int x, int y) override; 205 virtual void update_floats(int dy, const element::ptr &parent) override; 206 virtual void add_positioned(const element::ptr &el) override; 207 virtual int find_next_line_top(int top, int width, int def_right) override; 208 virtual void apply_vertical_align() override; 209 virtual void draw_children(uint_ptr hdc, int x, int y, const position* clip, draw_flag flag, int zindex) override; 210 virtual int get_zindex() const override; 211 virtual void draw_stacking_context(uint_ptr hdc, int x, int y, const position* clip, bool with_positioned) override; 212 virtual void calc_document_size(litehtml::size& sz, int x = 0, int y = 0) override; 213 virtual void get_redraw_box(litehtml::position& pos, int x = 0, int y = 0) override; 214 virtual void add_style(const litehtml::style& st) override; 215 virtual element::ptr get_element_by_point(int x, int y, int client_x, int client_y) override; 216 virtual element::ptr get_child_by_point(int x, int y, int client_x, int client_y, draw_flag flag, int zindex) override; 217 218 virtual bool is_nth_child(const element::ptr& el, int num, int off, bool of_type) const override; 219 virtual bool is_nth_last_child(const element::ptr& el, int num, int off, bool of_type) const override; 220 virtual bool is_only_child(const element::ptr& el, bool of_type) const override; 221 virtual const background* get_background(bool own_only = false) override; 222 223 protected: 224 void draw_children_box(uint_ptr hdc, int x, int y, const position* clip, draw_flag flag, int zindex); 225 void draw_children_table(uint_ptr hdc, int x, int y, const position* clip, draw_flag flag, int zindex); 226 int render_box(int x, int y, int max_width, bool second_pass = false); 227 int render_table(int x, int y, int max_width, bool second_pass = false); 228 int fix_line_width(int max_width, element_float flt); 229 void parse_background(); 230 void init_background_paint( position pos, background_paint &bg_paint, const background* bg ); 231 void draw_list_marker( uint_ptr hdc, const position &pos ); 232 void parse_nth_child_params( tstring param, int &num, int &off ); 233 void remove_before_after(); 234 litehtml::element::ptr get_element_before(); 235 litehtml::element::ptr get_element_after(); 236 }; 237 238 /************************************************************************/ 239 /* Inline Functions */ 240 /************************************************************************/ 241 children()242 inline elements_vector& litehtml::html_tag::children() 243 { 244 return m_children; 245 } 246 } 247 248 #endif // LH_HTML_TAG_H 249