XMLSize_t DOMElementImpl::getChildElementCount() const { XMLSize_t count = 0; DOMElement* child = getFirstElementChild(); while (child != NULL) { ++count; child = child->getNextElementSibling(); } return count; }
unsigned int HTMLTableRowElementImp::getCellCount() { // TODO: Better to keep the result unsigned int count = 0; for (Element child = getFirstElementChild(); child; child = child.getNextElementSibling()) { if (dynamic_cast<HTMLTableCellElementImp*>(child.self())) ++count; } return count; }
html::HTMLTableCellElement HTMLTableRowElementImp::getCell(unsigned int index) { unsigned int count = 0; for (Element child = getFirstElementChild(); child; child = child.getNextElementSibling()) { if (HTMLTableCellElementImp* cell = dynamic_cast<HTMLTableCellElementImp*>(child.self())) { if (count == index) return cell; ++count; } } return 0; }
html::HTMLTableCellElement HTMLTableRowElementImp::getCell(unsigned int index) { unsigned int count = 0; for (Element child = getFirstElementChild(); child; child = child.getNextElementSibling()) { if (auto cell = std::dynamic_pointer_cast<HTMLTableCellElementImp>(child.self())) { if (count == index) return cell; ++count; } } return nullptr; }
void HTMLTableRowElementImp::deleteCell(int index) { if (index < 0) return; // TODO: throw an IndexSizeError exception int count = 0; for (Element child = getFirstElementChild(); child; child = child.getNextElementSibling()) { if (dynamic_cast<HTMLTableCellElementImp*>(child.self())) { if (count == index) { removeChild(child); return; } ++count; } } // TODO: throw an IndexSizeError exception }
DOMElement * DOMElementImpl::getNextElementSibling() const { DOMNode* n = getNextLogicalSibling(this); while (n != NULL) { switch (n->getNodeType()) { case DOMNode::ELEMENT_NODE: return (DOMElement*) n; case DOMNode::ENTITY_REFERENCE_NODE: { DOMElement* e = getFirstElementChild(n); if (e != NULL) return e; } break; default: break; } n = getNextLogicalSibling(n); } return NULL; }
html::HTMLElement HTMLTableRowElementImp::insertCell(int index) { if (index < -1) return 0; // TODO: throw an IndexSizeError exception int count = 0; for (Element child = getFirstElementChild(); child; child = child.getNextElementSibling()) { if (HTMLTableCellElementImp* cell = dynamic_cast<HTMLTableCellElementImp*>(child.self())) { if (count == index) { html::HTMLTableDataCellElement td = new(std::nothrow) HTMLTableDataCellElementImp(getOwnerDocumentImp()); if (td) insertBefore(td, cell); return td; } ++count; } } if (count < index) return 0; // TODO: throw an IndexSizeError exception html::HTMLTableDataCellElement td = new(std::nothrow) HTMLTableDataCellElementImp(getOwnerDocumentImp()); if (td) appendChild(td); return td; }
html::HTMLElement HTMLTableRowElementImp::insertCell(int index) { if (index < -1) return nullptr; // TODO: throw an IndexSizeError exception int count = 0; for (Element child = getFirstElementChild(); child; child = child.getNextElementSibling()) { if (auto cell = std::dynamic_pointer_cast<HTMLTableCellElementImp>(child.self())) { if (count == index) { html::HTMLTableDataCellElement td = std::make_shared<HTMLTableDataCellElementImp>(getOwnerDocumentImp().get()); if (td) insertBefore(td, cell); return td; } ++count; } } if (count < index) return nullptr; // TODO: throw an IndexSizeError exception html::HTMLTableDataCellElement td = std::make_shared<HTMLTableDataCellElementImp>(getOwnerDocumentImp().get()); if (td) appendChild(td); return td; }
xptr apply_before_delete_triggers_on_subtree(xptr node, node_triggers_map *fired_triggers) { if (tr_globals::internal_auth_switch == BLOCK_AUTH_CHECK) return node; schema_node_cptr scm_node = getSchemaNode(node); node_triggers_map attribute_fired_triggers; node_triggers_map element_fired_triggers; typedef std::pair< schema_node_xptr, std::vector<trigger_cell_xptr> > mapPair; std::pair< node_triggers_map::iterator, bool > mapRes; /*1. Evalute triggers for this node if there are some in fired_triggers map*/ node_triggers_map::iterator mapIter; trigger_cell_cptr trc = XNULL; mapIter = fired_triggers->find(scm_node.ptr()); xptr parent=nodeGetParent(node); if( mapIter != fired_triggers->end()) for(std::vector<trigger_cell_xptr>::size_type i=0; i< mapIter->second.size(); i++) { trc = mapIter->second.at(i); if(trc->execute_trigger_action(XNULL, node, parent) == XNULL) return XNULL; } // if the node is attribute - it has no children to process if (scm_node->type == attribute) return node; /*2. Find all fired triggers for all the children of the node (attribute_fired_triggers and element_fired_triggers)*/ sc_ref_item* scm_child = scm_node->children->first; while(scm_child !=NULL) { cat_list<trigger_cell_xptr>::item* scm_trc = scm_child->object.snode->trigger_list->first; if(scm_trc!=NULL) { std::vector<trigger_cell_xptr> triggers_vec; if(scm_child->object.snode->type == attribute) mapRes = attribute_fired_triggers.insert( mapPair (scm_child->object.snode, triggers_vec) ); else mapRes = element_fired_triggers.insert( mapPair (scm_child->object.snode, triggers_vec) ); while(scm_trc!=NULL) { if((scm_trc->object->trigger_event == TRIGGER_DELETE_EVENT) && (scm_trc->object->trigger_granularity == TRIGGER_FOR_EACH_STATEMENT) && (scm_trc->object->trigger_time == TRIGGER_BEFORE)) mapRes.first->second.push_back(scm_trc->object); scm_trc=scm_trc->next; } } scm_child=scm_child->next; } /*Call this function on all children recursively*/ xptr attr_child = getFirstAttributeChild(node); while(attr_child!=XNULL) { if(apply_before_delete_triggers_on_subtree(attr_child, &attribute_fired_triggers) ==XNULL) return XNULL; attr_child = getNextAttribute(attr_child); } xptr elem_child = getFirstElementChild(node); while(elem_child!=XNULL) { if(apply_before_delete_triggers_on_subtree(elem_child, &element_fired_triggers) == XNULL) return XNULL; elem_child = getNextElement(elem_child); } return node; }