CL_String CL_DomElement::get_text() const { CL_String str; if (has_child_nodes() == false) return str; CL_DomNode cur = get_first_child(); while (!cur.is_null()) { if (cur.is_text() || cur.is_cdata_section()) str.append(cur.get_node_value()); if (cur.is_element()) str.append(cur.to_element().get_text()); cur = cur.get_next_sibling(); } return str; }
void CL_GUIComponent::load_css_layout(const CL_String &xml_filename, const CL_String &css_filename) { CL_CSSDocument2 css_document; css_document.add_sheet(css_filename); CL_File file(xml_filename); CL_DomDocument dom(file, false); CL_DomNode cur = dom.get_document_element().get_first_child(); std::vector<CL_CSSLayoutElement> element_stack; { CL_DomSelectNode select_node(dom.get_document_element()); impl->css_element.apply_properties(css_document.select(&select_node)); impl->css_element.apply_properties(dom.get_document_element().get_attribute("style")); impl->css_element.set_col_span(dom.get_document_element().get_attribute_int("colspan", 1)); impl->css_element.set_row_span(dom.get_document_element().get_attribute_int("rowspan", 1)); } element_stack.push_back(impl->css_element); while (!cur.is_null()) { CL_CSSLayoutElement child_css_element; if (cur.is_element()) { CL_DomElement cur_element = cur.to_element(); CL_DomSelectNode select_node(cur_element); child_css_element = element_stack.back().create_element(cur_element.get_tag_name()); child_css_element.apply_properties(css_document.select(&select_node)); child_css_element.apply_properties(cur_element.get_attribute("style")); child_css_element.set_col_span(cur_element.get_attribute_int("colspan", 1)); child_css_element.set_row_span(cur_element.get_attribute_int("rowspan", 1)); } else if (cur.is_text()) { CL_DomText cur_text = cur.to_text(); element_stack.back().create_text(cur_text.get_node_value()); } CL_DomNode next = cur.get_first_child(); if (next.is_null()) { next = cur.get_next_sibling(); if (next.is_null()) { next = cur.get_parent_node(); while (!next.is_null() && next.get_next_sibling().is_null()) next = next.get_parent_node(); if (!next.is_null()) next = next.get_next_sibling(); } } else { element_stack.push_back(child_css_element); } cur = next; } CL_GraphicContext gc = get_gc(); impl->css_layout.layout(gc, get_size()); }