/*
 * sxenewedit.cpp - An single SXE edit that creates a new node
 * Copyright (C) 2006  Joonas Govenius
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 *
 */

#include "sxenewedit.h"
#include "sxesession.h"

//----------------------------------------------------------------------------
// SxeNewEdit
//----------------------------------------------------------------------------

SxeNewEdit::SxeNewEdit(const QString rid, const QDomNode &node, const QString parent, double primaryWeight, bool remote) : SxeEdit(rid, remote) {
    parent_ = parent;
    primaryWeight_ = primaryWeight;

    switch(node.nodeType()) {
        case QDomNode::ElementNode:
            type_ = "element";
            identifier_ = node.nodeName();
            ns_ = node.namespaceURI();
            break;

        case QDomNode::AttributeNode:
            type_ = "attr";
            identifier_ = node.nodeName();
            data_ = node.nodeValue();
            ns_ = node.namespaceURI();
            break;

        case QDomNode::TextNode:
            type_ = "text";
            data_ = node.toText().data();
            break;

        case QDomNode::ProcessingInstructionNode:
            type_ = "processinginstruction";
            identifier_ = node.toProcessingInstruction().target();
            data_ = node.toProcessingInstruction().data();
            break;

        case QDomNode::CommentNode:
            type_ = "comment";
            data_ = node.toComment().data();
            break;

        // case QDomNode::DocumentTypeNode:
        //     type_ = "documenttype";
        //
        //     break;

        default:
            qDebug() << QString("unknown QDomNode::NodeType encountered in SxeNewEdit::SxeNewEdit(). nodeType: %1.").arg(node.nodeType()).toLatin1();
            break;
    }
}

SxeNewEdit::SxeNewEdit(const QDomElement &sxeElement, bool remote) : SxeEdit(sxeElement.attribute("rid"), remote) {
    type_ = sxeElement.attribute("type");
    parent_ = sxeElement.attribute("parent");
    primaryWeight_ = sxeElement.attribute("primary-weight").toDouble();

    if(type_ == "processinginstruction") {
        identifier_ = sxeElement.attribute("pitarget");
        data_ = sxeElement.attribute("pidata");
    } else {
        identifier_ = sxeElement.attribute("name");
        ns_ = sxeElement.attribute("ns");
        data_ = sxeElement.attribute("chdata");
    }
}

SxeEdit::EditType SxeNewEdit::type() const {
    return SxeEdit::New;
};


QDomElement SxeNewEdit::xml(QDomDocument &doc) const {
    QDomElement edit = doc.createElementNS(SXENS, "new");

    edit.setAttribute("rid", rid_);
    edit.setAttribute("type", type_);
    edit.setAttribute("parent", parent_);
    edit.setAttribute("primary-weight", primaryWeight_);

    if(type_ == "element" || type_ == "attr") {
        edit.setAttribute("name", identifier_);
        if(!ns_.isEmpty())
            edit.setAttribute("ns", ns_);
    } if(type_ == "text" || type_ == "attr" || type_ == "comment")
        edit.setAttribute("chdata", data_);
    if(type_ == "processinginstruction") {
        edit.setAttribute("pitarget", identifier_);
        edit.setAttribute("pidata", data_);
    }

    return edit;
}

QDomNode::NodeType SxeNewEdit::nodeType() const {
    if(type_ == "element")
        return QDomNode::ElementNode;
    else if(type_ == "attr")
        return QDomNode::AttributeNode;
    else if(type_ == "text")
        return QDomNode::TextNode;
    else if(type_ == "comment")
        return QDomNode::CommentNode;
    else if(type_ == "processinginstruction")
        return QDomNode::ProcessingInstructionNode;
    else
        return QDomNode::BaseNode;
}

QString SxeNewEdit::parent() const {
    return parent_;
}

double SxeNewEdit::primaryWeight() const {
    return primaryWeight_;
}

QString SxeNewEdit::name() const {
    return identifier_;
}

QString SxeNewEdit::nameSpace() const {
    return ns_;
}

QString SxeNewEdit::chdata() const {
    return data_;
}

QString SxeNewEdit::processingInstructionTarget() const {
    return identifier_;
}

QString SxeNewEdit::processingInstructionData() const {
    return data_;
}
