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