svgtopt/SVG/Xmldomimpl/src/SVGXmlElementImpl.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 18 Jan 2010 21:03:31 +0200
changeset 1 bfff372fb1f4
parent 0 d46562c3d99d
permissions -rw-r--r--
Revision: 201001 Kit: 201003

/*
* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  XML DOM Implementation source file
 *
*/


#include "SVGXmlElementImpl.h"
#include "SVGXmlDocument.h"

// ---------------------------------------------------------------------------
// This method acts like a ConstructL.
// This class is never instantiated
// The derived classes that are instantiated, call this method within
// their ConstructL methods
// ---------------------------------------------------------------------------

void CXmlElementImpl::InitializeL(  const TUint8 aElemID )
    {
    iElemID=aElemID;
    }

// ---------------------------------------------------------------------------
// Accessor for the integer ID of the current element
// ---------------------------------------------------------------------------
TUint8 CXmlElementImpl::ElemID()
    {
    return iElemID;
    }


// ---------------------------------------------------------------------------
// Destructor
// ---------------------------------------------------------------------------
CXmlElementImpl::~CXmlElementImpl()
    {

    CXmlElementImpl* child = (CXmlElementImpl*)FirstChild();
    while ( child != NULL )
        {
        CXmlElementImpl* sibling = (CXmlElementImpl*)child->NextSibling();
        delete child;
        child = sibling;
        }
    }

// ---------------------------------------------------------------------------
// Set the value for a given attribute
// ---------------------------------------------------------------------------
TInt CXmlElementImpl::SetAttributeL( const TDesC& /* aName */,
                                     const TDesC& /* aValue */ )
    {
    return KErrNone;
    }

// ---------------------------------------------------------------------------
// Remove a given attribute
// At this time this method is not implemented
// ---------------------------------------------------------------------------
TInt CXmlElementImpl::RemoveAttribute( const TDesC& /* aName */ )
    {
    return KErrNone;
    }

// ---------------------------------------------------------------------------
// Accessor for the tag name of the current element
// ---------------------------------------------------------------------------
const TDesC& CXmlElementImpl::TagName()
    {

    HBufC *lEmptyBuf = NULL;
    return *lEmptyBuf;

    }

// ---------------------------------------------------------------------------
// Find out if the current element has child elements
// ---------------------------------------------------------------------------
TBool CXmlElementImpl::HasChildNodes()
    {
    return ( iFirstChild != NULL );
    }

// ---------------------------------------------------------------------------
// Accessor for the first child object of the current element
// ---------------------------------------------------------------------------
MXmlElement* CXmlElementImpl::FirstChild()
    {
    return iFirstChild;
    }

// ---------------------------------------------------------------------------
// Accessor for the last child object of the current element
// ---------------------------------------------------------------------------
MXmlElement* CXmlElementImpl::LastChild()
    {
    return iLastChild;
    }

// ---------------------------------------------------------------------------
// Accessor for the document object of the current element
// ---------------------------------------------------------------------------
MXmlDocument* CXmlElementImpl::OwnerDocument()
    {
    return iOwnerDocument;
    }

// ---------------------------------------------------------------------------
// Accessor for the next sibling (element) object of the current element
// ---------------------------------------------------------------------------
MXmlElement* CXmlElementImpl::NextSibling()
    {
    return iNextSibling;
    }

// ---------------------------------------------------------------------------
// Accessor for the previous sibling (element) object of the current element
// ---------------------------------------------------------------------------
MXmlElement* CXmlElementImpl::PreviousSibling()
    {
    CXmlElementImpl* sibling = this; 
    CXmlElementImpl* previousSibling = NULL;
    
    while ( sibling != NULL )
        {
        sibling = (CXmlElementImpl*)sibling->NextSibling();

        if (sibling == this)
        {
        	return previousSibling;
        }

        	previousSibling = sibling;
        }

    return NULL;
    }

// ---------------------------------------------------------------------------
// Accessor for the parent element object of the current element
// ---------------------------------------------------------------------------
MXmlElement* CXmlElementImpl::ParentNode()
    {
    return iParentNode;
    }

// ---------------------------------------------------------------------------
// Accessor to set the first child object of the current element
// ---------------------------------------------------------------------------
void CXmlElementImpl::SetFirstChild( MXmlElement* aElement )
    {
    iFirstChild = aElement;
    }

// ---------------------------------------------------------------------------
// Accessor to set the last child object of the current element
// ---------------------------------------------------------------------------
void CXmlElementImpl::SetLastChild( MXmlElement* aElement )
    {
    iLastChild = aElement;
    }

// ---------------------------------------------------------------------------
// Accessor to set the document object of the current element
// ---------------------------------------------------------------------------
void CXmlElementImpl::SetOwnerDocument( MXmlDocument* aElement )
    {
    iOwnerDocument = aElement;
    }

// ---------------------------------------------------------------------------
// Accessor to set the next sibling (element) object of the current element
// ---------------------------------------------------------------------------
void CXmlElementImpl::SetNextSibling( MXmlElement* aElement )
    {
    iNextSibling = aElement;
    }

// ---------------------------------------------------------------------------
// Accessor to set the parent element object of the current element
// ---------------------------------------------------------------------------
void CXmlElementImpl::SetParentNode( MXmlElement* aElement )
    {
    iParentNode = aElement;
    }

// ---------------------------------------------------------------------------
// Append a new object as the child of the current element
// Place the new object in the proper location, as the last child
// ---------------------------------------------------------------------------
MXmlElement* CXmlElementImpl::AppendChildL( MXmlElement* aNewChild, TBool /*aIsJSR226Element*/ )
    {
    // if no node was passed, then nothing to do
    if ( aNewChild == NULL )
        {
        return NULL;
        }

    // first remove the node from its parent if it has one
    MXmlElement* lparent = aNewChild->ParentNode();

    
    //AJD the parent != this needs to be removed so AppendChild works correctly
//	if ( parent != NULL && parent != this)

    if ( lparent != NULL )
        {
        lparent->RemoveChild(aNewChild);
        }

    // Set the new node's parent
    aNewChild->SetParentNode( this );
    // Set the new node's next sibling
    aNewChild->SetNextSibling( NULL );
    // If previous sibling is tracked:
    // Set the new node's previous sibling
    //        aNewChild->SetPreviousSibling(iXmlElementImpl->LastChild());
    // Set new node as the first child, if it is
    if ( FirstChild() == NULL )
        {
        SetFirstChild( aNewChild );
        }
    // Set the new node as the next sibling of previously last child
    MXmlElement* lLast   = LastChild();
    if ( lLast )
        {
        lLast->SetNextSibling( aNewChild );
        }
    // Set the new node as last child
    SetLastChild( aNewChild );

    // notity of change to document
    if ( iOwnerDocument )
        {
        aNewChild->SetOwnerDocument(iOwnerDocument);

        iOwnerDocument->ElementAppendedOrRemoved();
        }

    return aNewChild;
    }

// ---------------------------------------------------------------------------
// Remove a given object from the list of child elements
// ---------------------------------------------------------------------------
void CXmlElementImpl::RemoveChild ( MXmlElement* aRemoveChild )
    {
    if ( aRemoveChild )
        {
        // the remove child is the first child
        if ( FirstChild() == aRemoveChild )
            {
            if( aRemoveChild->NextSibling() )
                {
                SetFirstChild( aRemoveChild->NextSibling() );
                }
            else
                {
                // the remove child is the only child
                SetFirstChild( NULL );
                SetLastChild ( NULL );
                }
            }
        // the remove child is any sibling
        else
            {
            // find the child pointing to remove child
            MXmlElement*preSibling   = FirstChild();
            if (preSibling)
            {
            		while ( preSibling && (( preSibling->NextSibling() ) != aRemoveChild) )
                	{
                	preSibling = preSibling->NextSibling();
                	}
					
					if (preSibling)
					{
            			// check if the remove child is the end child
            			if ( LastChild() != aRemoveChild  )
                		{
                			preSibling->SetNextSibling(aRemoveChild->NextSibling());
                		}
            			else
                		{
                			SetLastChild(preSibling);
                		preSibling->SetNextSibling(NULL);
                		}
                	}
                }
            }

        // remove child
        aRemoveChild->SetParentNode( NULL );
        aRemoveChild->SetNextSibling( NULL );
        }

    // notity of change to document
    if ( iOwnerDocument )
        {
        iOwnerDocument->ElementAppendedOrRemoved();
        }
    }

// ---------------------------------------------------------------------------
// Perform a deep clone of this object
// This method is not currently implemented
// ---------------------------------------------------------------------------
MXmlElement* CXmlElementImpl::CloneL(MXmlElement* )
    {
    return NULL;
    }

// ---------------------------------------------------------------------------
// Copy the contents of this object to the passed object
// This method assumes that the passed object has already been
// Created using the proper NewL method.
// ---------------------------------------------------------------------------
void CXmlElementImpl::CopyL( CXmlElementImpl* aDestElement )
    {

    // copy the children and everything down the tree
    MXmlElement* currentChild = FirstChild();

    while ( currentChild != NULL)
        {
        MXmlElement* newElement = currentChild->CloneL(aDestElement);
		if( newElement == NULL )/*Duplicate Cloning of Use returns NULL*/
			{
			break; //breaking out of the while in case of loop
			}
        aDestElement->CXmlElementImpl::AppendChildL(newElement);
        currentChild = currentChild->NextSibling();
        }
    }