Beispiel #1
0
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
}
Beispiel #6
0
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;
}
Beispiel #9
0
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;
}