1 #ifndef LH_DOCUMENT_H 2 #define LH_DOCUMENT_H 3 4 #include "style.h" 5 #include "types.h" 6 #include "context.h" 7 #include "gumbo.h" 8 9 namespace litehtml 10 { 11 struct css_text 12 { 13 typedef std::vector<css_text> vector; 14 15 tstring text; 16 tstring baseurl; 17 tstring media; 18 css_textcss_text19 css_text() 20 { 21 } 22 css_textcss_text23 css_text(const tchar_t* txt, const tchar_t* url, const tchar_t* media_str) 24 { 25 text = txt ? txt : _t(""); 26 baseurl = url ? url : _t(""); 27 media = media_str ? media_str : _t(""); 28 } 29 css_textcss_text30 css_text(const css_text& val) 31 { 32 text = val.text; 33 baseurl = val.baseurl; 34 media = val.media; 35 } 36 }; 37 38 struct stop_tags_t 39 { 40 const litehtml::tchar_t* tags; 41 const litehtml::tchar_t* stop_parent; 42 }; 43 44 struct ommited_end_tags_t 45 { 46 const litehtml::tchar_t* tag; 47 const litehtml::tchar_t* followed_tags; 48 }; 49 50 class html_tag; 51 52 class document : public std::enable_shared_from_this<document> 53 { 54 public: 55 typedef std::shared_ptr<document> ptr; 56 typedef std::weak_ptr<document> weak_ptr; 57 private: 58 std::shared_ptr<element> m_root; 59 document_container* m_container; 60 fonts_map m_fonts; 61 css_text::vector m_css; 62 litehtml::css m_styles; 63 litehtml::web_color m_def_color; 64 litehtml::context* m_context; 65 litehtml::size m_size; 66 position::vector m_fixed_boxes; 67 media_query_list::vector m_media_lists; 68 element::ptr m_over_element; 69 elements_vector m_tabular_elements; 70 media_features m_media; 71 tstring m_lang; 72 tstring m_culture; 73 public: 74 document(litehtml::document_container* objContainer, litehtml::context* ctx); 75 virtual ~document(); 76 container()77 litehtml::document_container* container() { return m_container; } 78 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); 79 int render(int max_width, render_type rt = render_all); 80 void draw(uint_ptr hdc, int x, int y, const position* clip); get_def_color()81 web_color get_def_color() { return m_def_color; } 82 int cvt_units(const tchar_t* str, int fontSize, bool* is_percent = 0) const; 83 int cvt_units(css_length& val, int fontSize, int size = 0) const; 84 int width() const; 85 int height() const; 86 void add_stylesheet(const tchar_t* str, const tchar_t* baseurl, const tchar_t* media); 87 bool on_mouse_over(int x, int y, int client_x, int client_y, position::vector& redraw_boxes); 88 bool on_lbutton_down(int x, int y, int client_x, int client_y, position::vector& redraw_boxes); 89 bool on_lbutton_up(int x, int y, int client_x, int client_y, position::vector& redraw_boxes); 90 bool on_mouse_leave(position::vector& redraw_boxes); 91 litehtml::element::ptr create_element(const tchar_t* tag_name, const string_map& attributes); 92 element::ptr root(); 93 const element::ptr over_element() const; 94 void get_fixed_boxes(position::vector& fixed_boxes); 95 void add_fixed_box(const position& pos); 96 void add_media_list(media_query_list::ptr list); 97 bool media_changed(); 98 bool lang_changed(); 99 bool match_lang(const tstring & lang); 100 void add_tabular(const element::ptr& el); 101 102 static litehtml::document::ptr createFromString(const tchar_t* str, litehtml::document_container* objPainter, litehtml::context* ctx, litehtml::css* user_styles = 0); 103 static litehtml::document::ptr createFromUTF8(const char* str, litehtml::document_container* objPainter, litehtml::context* ctx, litehtml::css* user_styles = 0); 104 105 private: 106 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); 107 108 void create_node(GumboNode* node, elements_vector& elements); 109 bool update_media_lists(const media_features& features); 110 void fix_tables_layout(); 111 void fix_table_children(element::ptr& el_ptr, style_display disp, const tchar_t* disp_str); 112 void fix_table_parent(element::ptr& el_ptr, style_display disp, const tchar_t* disp_str); 113 }; 114 root()115 inline element::ptr document::root() 116 { 117 return m_root; 118 } over_element()119 inline const element::ptr document::over_element() const 120 { 121 return m_over_element; 122 } add_tabular(const element::ptr & el)123 inline void document::add_tabular(const element::ptr& el) 124 { 125 m_tabular_elements.push_back(el); 126 } match_lang(const tstring & lang)127 inline bool document::match_lang(const tstring & lang) 128 { 129 return lang == m_lang || lang == m_culture; 130 } 131 } 132 133 #endif // LH_DOCUMENT_H 134