Initial commit of litehtml_viewer
[claws.git] / src / plugins / litehtml_viewer / litehtml / document.h
diff --git a/src/plugins/litehtml_viewer/litehtml/document.h b/src/plugins/litehtml_viewer/litehtml/document.h
new file mode 100644 (file)
index 0000000..33287f4
--- /dev/null
@@ -0,0 +1,124 @@
+#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