svgtopt/SVG/SVGImpl/src/SVGMpathElementImpl.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 00:46:06 +0200
changeset 2 0c844a8549ae
parent 0 d46562c3d99d
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* 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:  SVG Implementation source file
 *
*/


#if !defined(__E32BASE_H__)
#include <e32base.h>
#endif

#include "SVGMpathElementImpl.h"
#include "GfxGeneralPath.h"
#include "SVGDocumentImpl.h"
#include "SVGSchemaData.h"

_LIT( XLINKHREF, "xlink:href" );

// ---------------------------------------------------------------------------
// Two phase construction
// ---------------------------------------------------------------------------


CSvgMpathElementImpl* CSvgMpathElementImpl::NewL(  const TUint8 aElemID,
                                                  CSvgDocumentImpl* aDoc )
    {
    CSvgMpathElementImpl*   self    = new ( ELeave )
                                      CSvgMpathElementImpl( aDoc );
    CleanupStack::PushL( self );
    self->ConstructL(  aElemID );
    CleanupStack::Pop();

    return self;
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
CSvgMpathElementImpl* CSvgMpathElementImpl::NewLC(  const TUint8 aElemID,
                                                   CSvgDocumentImpl* aDoc )
    {
    CSvgMpathElementImpl*   self    = new ( ELeave )
                                      CSvgMpathElementImpl( aDoc );
    CleanupStack::PushL( self );
    self->ConstructL( aElemID );

    return self;
    }



// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
CSvgMpathElementImpl::~CSvgMpathElementImpl()
    {
    if ( iSvgUriReferenceImpl )
        {
        delete iSvgUriReferenceImpl;
        iSvgUriReferenceImpl = NULL;
        }
    if ( iParsedHref )
    {
    	delete iParsedHref;
    	iParsedHref = NULL;
    }

    }

// *******************************************************
// From MXmlElement


// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
TInt CSvgMpathElementImpl::SetAttributeL( const TDesC& aName,
                                          const TDesC& aValue )
    {
    if ( this->SetXlinkAttributeL( aName, aValue ) )
        {
        // Get the path from the xlink
        TBuf<10>    lTmpXlink( XLINKHREF );
        if ( aName == lTmpXlink )
            {
            if( iReqAttrFlag == KAtrXlinkhref)
                {
                iReqAttrFlag =0;
                }
            CSvgElementImpl*targetEl    = NULL;
            TInt            pos         = KErrNotFound;
            // If the first char is '#' then remove it
            // This is possible if coming from cXML parser and not CVG Decoder

            pos = aValue.Locate( '#' );
            if ( pos != KErrNotFound && pos == 0 )
                {
                iParsedHref = HBufC::NewL( aValue.Length() );
                TPtr    tPtr    = iParsedHref->Des();
                tPtr.Copy( aValue );
                tPtr.Delete( pos, 1 );
                targetEl = ( CSvgElementImpl * ) ((CSvgDocumentImpl*)iOwnerDocument)->GetElementById( tPtr );
                }
            else
                {
                return pos;
                }

			if (targetEl)
			{
            	targetEl->GetAttributePath( KAtrData, iShape );
			}
			else
			{
				iNeedTarget = ETrue;
			}

            if ( iShape )
                {
                CSvgElementImpl*parentEl    = ( CSvgElementImpl* )
                                              ParentNode();
                if ( parentEl )
                    {
                    parentEl->SetAttributePathL( KAtrData, iShape );
                    }
                }
            }

        return KErrNone;
        }


    CSvgElementImpl::SetAttributeL(aName,aValue);

    return KErrNone;
    }

// From MXmlElementOpt

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
TInt CSvgMpathElementImpl::GetAttributePath( const TInt aNameId,
                                             CGfxGeneralPath*& aValue )
    {
    if ( aNameId == KAtrData )
        {
        aValue = iShape;
        }
    else
        {
        aValue = NULL;
        return KErrNoAttribute;
        }

    return KErrNone;
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
TInt CSvgMpathElementImpl::SetAttributePathL( const TInt aNameId,
                                              CGfxGeneralPath* /* aValue */ )
    {
    if ( aNameId == KAtrData )
        {
        }
    else
        {
        return KErrNoAttribute;
        }

    return KErrNone;
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
TBool CSvgMpathElementImpl::DrawL( CGfx2dGc* /*aGc*/, CSvgElementImpl* /*aElement*/ )
    {

    return EFalse;

    /*
    if (iNeedTarget)
    {
    	CSvgElementImpl* targetEl = NULL;

    	iNeedTarget = EFalse;

    	if ( iParsedHref && iParsedHref->Length() > 0)
    	{
        	TPtr    tPtr    = iParsedHref->Des();
        	targetEl = ( CSvgElementImpl * ) ((CSvgDocumentImpl*)iOwnerDocument)->GetElementById( tPtr );

			if (targetEl)
			{
           		targetEl->GetAttributePath( KAtrData, iShape );
			}
			else
			{
				iNeedTarget = ETrue;
			}
		}
    }

    this->DrawShapeL( aGc, *iShape, aElement );
    return EFalse;
    */
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------

void CSvgMpathElementImpl::ConstructL(  const TUint8 aElemID )
    {
    CSvgElementImpl::InitializeL(  aElemID );
    iReqAttrFlag = KAtrXlinkhref;

    iSvgUriReferenceImpl = CSvgUriReferenceImpl::NewL();
    iParsedHref = NULL;
    iNeedTarget = EFalse;
    }



// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------

CSvgMpathElementImpl::CSvgMpathElementImpl( CSvgDocumentImpl* aDoc )
    {
    SetOwnerDocument(aDoc);
    }


// ---------------------------------------------------------------------------
// perform a deep clone of this object
// ---------------------------------------------------------------------------
MXmlElement* CSvgMpathElementImpl::CloneL(MXmlElement* aParentElement)
    {
    // create new polyline
    CSvgMpathElementImpl* newElement = CSvgMpathElementImpl::NewL(  this->ElemID(), ((CSvgDocumentImpl*)iOwnerDocument) );
    CleanupStack::PushL(newElement);
    newElement->iParentNode = aParentElement;
    // copy everything over
    this->CopyL(newElement);
    CleanupStack::Pop();
    return newElement;
    }


// ---------------------------------------------------------------------------
// perform a deep copy of this object
// ---------------------------------------------------------------------------
void CSvgMpathElementImpl::CopyL( CSvgMpathElementImpl* aDestElement )
    {
    if(aDestElement)
		{
	    // copy stuff from superclass
	    this->CSvgElementImpl::CopyL(aDestElement);
        // copy iShape
        aDestElement->iShape->SetPointTypeArrayL( iShape->PointTypeArray() );
        aDestElement->iShape->SetPointCoordsArrayL( iShape->PointCoordsArrayAll() );
        // copy the reference to idoc (CSvgDocumentImpl)
	    aDestElement->iOwnerDocument = this->iOwnerDocument;
		}
    }

// ---------------------------------------------------------------------------
// perform a deep copy of this object
// ---------------------------------------------------------------------------
void CSvgMpathElementImpl::SetAttributePathByIdL(const TDesC& aId)
    {
    CSvgElementImpl*targetEl    = NULL;
    targetEl = ( CSvgElementImpl * ) ((CSvgDocumentImpl*)iOwnerDocument)->GetElementById( aId );
    targetEl->GetAttributePath( KAtrData, iShape );

    if ( iShape )
        {
        CSvgElementImpl*parentEl    = ( CSvgElementImpl* )
                                       ParentNode();
        if ( parentEl )
           {
            parentEl->SetAttributePathL( KAtrData, iShape );
           }
        }
    }

void CSvgMpathElementImpl::Print( TBool aIsEncodeOn )
{
	if (!aIsEncodeOn)
	{
	#ifdef _DEBUG
	RDebug::Printf("<mpath xlink:href=\"hmm\">"/*, Href()*/);
	#endif
	}
}