/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_xmloff.hxx"
#include "ProcAddAttrTContext.hxx"
#include "MutableAttrList.hxx"
#ifndef _XMLOFF_TRANSFORMERBASE_HXX
#include "TransformerBase.hxx"
#endif
#include <xmloff/nmspmap.hxx>

using ::rtl::OUString;

using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::xml::sax;
using namespace ::xmloff::token;

TYPEINIT1( XMLProcAddAttrTransformerContext, XMLProcAttrTransformerContext);

XMLProcAddAttrTransformerContext::XMLProcAddAttrTransformerContext( 
		XMLTransformerBase& rImp, 
		const OUString& rQName,
	    sal_uInt16 nPrefix,
		::xmloff::token::XMLTokenEnum eToken,
	    sal_uInt16 nActionMap,
		sal_uInt16 nAPrefix,
	   	::xmloff::token::XMLTokenEnum eAToken,
	   	::xmloff::token::XMLTokenEnum eVToken ) :
	XMLProcAttrTransformerContext( rImp, rQName, nPrefix,  eToken, nActionMap ),
	m_aAttrQName( rImp.GetNamespaceMap().GetQNameByKey( nAPrefix, 
									::xmloff::token::GetXMLToken( eAToken ) ) ),
	m_aAttrValue( ::xmloff::token::GetXMLToken( eVToken ) )
{
}

XMLProcAddAttrTransformerContext::~XMLProcAddAttrTransformerContext()
{
}

void XMLProcAddAttrTransformerContext::StartElement( 
		const Reference< XAttributeList >& rAttrList )
{
	Reference< XAttributeList > xAttrList( rAttrList );
	XMLMutableAttributeList *pMutableAttrList =
		GetTransformer().ProcessAttrList( xAttrList, GetActionMap(), 
										  sal_False );
	if( !pMutableAttrList )
	{
		pMutableAttrList = new XMLMutableAttributeList;
		xAttrList = pMutableAttrList;
	}
	pMutableAttrList->AddAttribute( m_aAttrQName, m_aAttrValue );
	GetTransformer().GetDocHandler()->startElement( GetElemQName(), xAttrList );
}

