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