
/***************************************************************************
 *                                                                         *
 *   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.                                   *
 *                                                                         *
 *   copyright (C) 2004-2007                                               *
 *   Umbrello UML Modeller Authors <uml-devel@uml.sf.net>                  *
 ***************************************************************************/

/*  This code generated by:
 *      Author : thomas
 *      Date   : Wed Sep 26 2003
 */

// own header
#include "xmlelementcodeblock.h"

// qt/kde includes
#include <kdebug.h>

// local includes
#include "xmlcodecomment.h"
#include "../attribute.h"
#include "../codedocument.h"

// Constructors/Destructors
//

XMLElementCodeBlock::XMLElementCodeBlock ( CodeDocument * parentDoc, const TQString & nodeName, const TQString & comment)
        : HierarchicalCodeBlock(parentDoc)
{
    init(parentDoc, nodeName, comment);
}

XMLElementCodeBlock::~XMLElementCodeBlock ( ) { }

//
// Methods
//

/**
 * Save the XMI representation of this object
 */
void XMLElementCodeBlock::saveToXMI ( TQDomDocument & doc, TQDomElement & root ) {
    TQDomElement blockElement = doc.createElement( "xmlelementblock" );

    setAttributesOnNode(doc, blockElement);

    root.appendChild( blockElement );
}

/**
 * load params from the appropriate XMI element node.
 */
void XMLElementCodeBlock::loadFromXMI ( TQDomElement & root )
{
    setAttributesFromNode(root);
}

/** set attributes of the node that represents this class
 * in the XMI document.
 */
void XMLElementCodeBlock::setAttributesOnNode ( TQDomDocument & doc, TQDomElement & docElement)
{

    // superclass call
    HierarchicalCodeBlock::setAttributesOnNode(doc,docElement);

    // now set local attributes/fields
    docElement.setAttribute("nodeName",getNodeName());

}

/** set the class attributes of this object from
 * the passed element node.
 */
void XMLElementCodeBlock::setAttributesFromNode ( TQDomElement & root) {

    // superclass call
    HierarchicalCodeBlock::setAttributesFromNode(root);

    // now set local attributes
    setNodeName(root.attribute("nodeName","UNKNOWN"));

}

// Accessor methods
//

void XMLElementCodeBlock::setNodeName (const TQString &name) {
    m_nodeName = name;
}

TQString XMLElementCodeBlock::getNodeName () {
    return m_nodeName;
}

void XMLElementCodeBlock::addAttribute (UMLAttribute * at) {
    m_attList.append(at);
}

UMLAttributeList * XMLElementCodeBlock::getAttributeList() {
    return & m_attList;
}


// Other methods
//

/**
 * update the start and end text for this ownedhierarchicalcodeblock.
 */
void XMLElementCodeBlock::updateContent ( )
{

    TQString endLine = getNewLineEndingChars();

    TQString nodeName = getNodeName();

    // Now update START/ENDING Text
    TQString startText = '<' + nodeName;
    TQString endText = "";

    UMLAttributeList * alist = getAttributeList();
    for (UMLAttribute *at = alist->first(); at; at=alist->next())
    {
        if(at->getInitialValue().isEmpty())
            kWarning()<<" XMLElementCodeBlock : cant print out attribute that lacks an initial value"<<endl;
        else {
            startText.append(" " +at->getName()+"=\"");
            startText.append(at->getInitialValue()+"\"");
        }
    }

    // now set close of starting/ending node, the style depending on whether we have child text or not
    if(getTextBlockList()->count())
    {
        startText.append(">");
        endText = "</" + nodeName + '>';
    } else {
        startText.append("/>");
        endText = "";
    }

    setStartText(startText);
    setEndText(endText);

}

void XMLElementCodeBlock::init (CodeDocument *parentDoc, const TQString &nodeName, const TQString &comment)
{

    setComment(new XMLCodeComment(parentDoc));
    getComment()->setText(comment);

    m_nodeName = nodeName;

    updateContent();

}


#include "xmlelementcodeblock.moc"
