--- /dev/null
+#pragma once\r
+#include "style.h"\r
+#include "types.h"\r
+#include "context.h"\r
+#include "gumbo.h"\r
+\r
+namespace litehtml\r
+{\r
+ struct css_text\r
+ {\r
+ typedef std::vector<css_text> vector;\r
+\r
+ tstring text;\r
+ tstring baseurl;\r
+ tstring media;\r
+ \r
+ css_text()\r
+ {\r
+ }\r
+\r
+ css_text(const tchar_t* txt, const tchar_t* url, const tchar_t* media_str)\r
+ {\r
+ text = txt ? txt : _t("");\r
+ baseurl = url ? url : _t("");\r
+ media = media_str ? media_str : _t("");\r
+ }\r
+\r
+ css_text(const css_text& val)\r
+ {\r
+ text = val.text;\r
+ baseurl = val.baseurl;\r
+ media = val.media;\r
+ }\r
+ };\r
+\r
+ struct stop_tags_t\r
+ {\r
+ const litehtml::tchar_t* tags;\r
+ const litehtml::tchar_t* stop_parent;\r
+ };\r
+\r
+ struct ommited_end_tags_t\r
+ {\r
+ const litehtml::tchar_t* tag;\r
+ const litehtml::tchar_t* followed_tags;\r
+ };\r
+\r
+ class html_tag;\r
+\r
+ class document : public std::enable_shared_from_this<document>\r
+ {\r
+ public:\r
+ typedef std::shared_ptr<document> ptr;\r
+ typedef std::weak_ptr<document> weak_ptr;\r
+ private:\r
+ std::shared_ptr<element> m_root;\r
+ document_container* m_container;\r
+ fonts_map m_fonts;\r
+ css_text::vector m_css;\r
+ litehtml::css m_styles;\r
+ litehtml::web_color m_def_color;\r
+ litehtml::context* m_context;\r
+ litehtml::size m_size;\r
+ position::vector m_fixed_boxes;\r
+ media_query_list::vector m_media_lists;\r
+ element::ptr m_over_element;\r
+ elements_vector m_tabular_elements;\r
+ media_features m_media;\r
+ tstring m_lang;\r
+ tstring m_culture;\r
+ public:\r
+ document(litehtml::document_container* objContainer, litehtml::context* ctx);\r
+ virtual ~document();\r
+\r
+ litehtml::document_container* container() { return m_container; }\r
+ uint_ptr get_font(const tchar_t* name, int size, const tchar_t* weight, const tchar_t* style, const tchar_t* decoration, font_metrics* fm);\r
+ int render(int max_width, render_type rt = render_all);\r
+ void draw(uint_ptr hdc, int x, int y, const position* clip);\r
+ web_color get_def_color() { return m_def_color; }\r
+ int cvt_units(const tchar_t* str, int fontSize, bool* is_percent = 0) const;\r
+ int cvt_units(css_length& val, int fontSize, int size = 0) const;\r
+ int width() const;\r
+ int height() const;\r
+ void add_stylesheet(const tchar_t* str, const tchar_t* baseurl, const tchar_t* media);\r
+ bool on_mouse_over(int x, int y, int client_x, int client_y, position::vector& redraw_boxes);\r
+ bool on_lbutton_down(int x, int y, int client_x, int client_y, position::vector& redraw_boxes);\r
+ bool on_lbutton_up(int x, int y, int client_x, int client_y, position::vector& redraw_boxes);\r
+ bool on_mouse_leave(position::vector& redraw_boxes);\r
+ litehtml::element::ptr create_element(const tchar_t* tag_name, const string_map& attributes);\r
+ element::ptr root();\r
+ void get_fixed_boxes(position::vector& fixed_boxes);\r
+ void add_fixed_box(const position& pos);\r
+ void add_media_list(media_query_list::ptr list);\r
+ bool media_changed();\r
+ bool lang_changed();\r
+ bool match_lang(const tstring & lang);\r
+ void add_tabular(const element::ptr& el);\r
+\r
+ static litehtml::document::ptr createFromString(const tchar_t* str, litehtml::document_container* objPainter, litehtml::context* ctx, litehtml::css* user_styles = 0);\r
+ static litehtml::document::ptr createFromUTF8(const char* str, litehtml::document_container* objPainter, litehtml::context* ctx, litehtml::css* user_styles = 0);\r
+ \r
+ private:\r
+ litehtml::uint_ptr add_font(const tchar_t* name, int size, const tchar_t* weight, const tchar_t* style, const tchar_t* decoration, font_metrics* fm);\r
+\r
+ void create_node(GumboNode* node, elements_vector& elements);\r
+ bool update_media_lists(const media_features& features);\r
+ void fix_tables_layout();\r
+ void fix_table_children(element::ptr& el_ptr, style_display disp, const tchar_t* disp_str);\r
+ void fix_table_parent(element::ptr& el_ptr, style_display disp, const tchar_t* disp_str);\r
+ };\r
+\r
+ inline element::ptr document::root()\r
+ {\r
+ return m_root;\r
+ }\r
+ inline void document::add_tabular(const element::ptr& el)\r
+ {\r
+ m_tabular_elements.push_back(el);\r
+ }\r
+ inline bool document::match_lang(const tstring & lang)\r
+ {\r
+ return lang == m_lang || lang == m_culture;\r
+ }\r
+}\r