/**************************************************************
 *
 * 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 <com/sun/star/awt/FontFamily.hpp>
#include <com/sun/star/awt/FontPitch.hpp>

#include <rtl/logfile.hxx>

#include <xmloff/nmspmap.hxx>
#include "xmloff/xmlnmspe.hxx"
#include <xmloff/xmltoken.hxx>
#include "fonthdl.hxx"
#include <xmloff/xmlimp.hxx>
#include <xmloff/maptype.hxx>
#include <xmloff/XMLFontStylesContext.hxx>


using ::rtl::OUString;
using ::rtl::OUStringBuffer;

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::xml::sax;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::awt;
using namespace ::xmloff::token;


#define XML_STYLE_FAMILY_FONT 1

enum XMLFontStyleAttrTokens
{
	XML_TOK_FONT_STYLE_ATTR_FAMILY,
	XML_TOK_FONT_STYLE_ATTR_FAMILY_GENERIC,
	XML_TOK_FONT_STYLE_ATTR_STYLENAME,
	XML_TOK_FONT_STYLE_ATTR_PITCH,
	XML_TOK_FONT_STYLE_ATTR_CHARSET,

	XML_TOK_FONT_STYLE_ATTR_END=XML_TOK_UNKNOWN
};

const SvXMLTokenMapEntry* lcl_getFontStyleAttrTokenMap()
{
    static __FAR_DATA SvXMLTokenMapEntry aFontStyleAttrTokenMap[] =
    {
	    { XML_NAMESPACE_SVG, XML_FONT_FAMILY,
			    XML_TOK_FONT_STYLE_ATTR_FAMILY },
	    { XML_NAMESPACE_STYLE, XML_FONT_FAMILY_GENERIC,
			    XML_TOK_FONT_STYLE_ATTR_FAMILY_GENERIC },
	    { XML_NAMESPACE_STYLE, XML_FONT_ADORNMENTS,
			    XML_TOK_FONT_STYLE_ATTR_STYLENAME },
	    { XML_NAMESPACE_STYLE, XML_FONT_PITCH,
			    XML_TOK_FONT_STYLE_ATTR_PITCH },
	    { XML_NAMESPACE_STYLE, XML_FONT_CHARSET,
			    XML_TOK_FONT_STYLE_ATTR_CHARSET },

	    XML_TOKEN_MAP_END
    };
    return aFontStyleAttrTokenMap;
}

class XMLFontStyleContext_Impl : public SvXMLStyleContext
{
	Any aFamilyName;
	Any aStyleName;
	Any aFamily;
	Any aPitch;
	Any aEnc;

	SvXMLImportContextRef xStyles;

	XMLFontStylesContext *GetStyles()
	{
		return ((XMLFontStylesContext *)&xStyles);
	}

public:

	TYPEINFO();

	XMLFontStyleContext_Impl( SvXMLImport& rImport, sal_uInt16 nPrfx,
			const ::rtl::OUString& rLName,
			const ::com::sun::star::uno::Reference<
				::com::sun::star::xml::sax::XAttributeList > & xAttrList,
			XMLFontStylesContext& rStyles );
	virtual ~XMLFontStyleContext_Impl();

	void SetAttribute( sal_uInt16 nPrefixKey, const OUString& rLocalName,
					   const OUString& rValue );

	void FillProperties( ::std::vector< XMLPropertyState > &rProps,
						 sal_Int32 nFamilyNameIdx,
						 sal_Int32 nStyleNameIdx,
						 sal_Int32 nFamilyIdx,
						 sal_Int32 nPitchIdx,
						 sal_Int32 nCharsetIdx ) const;

};

TYPEINIT1( XMLFontStyleContext_Impl, SvXMLStyleContext );

XMLFontStyleContext_Impl::XMLFontStyleContext_Impl( SvXMLImport& rImport,
		sal_uInt16 nPrfx, const OUString& rLName,
		const Reference< XAttributeList > & xAttrList,
		XMLFontStylesContext& rStyles ) :
	SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList, XML_STYLE_FAMILY_FONT ),
	xStyles( &rStyles )
{
	OUString sEmpty;
	aFamilyName <<= sEmpty;
	aStyleName <<= sEmpty;
	aFamily <<= (sal_Int16)FontFamily::DONTKNOW;
	aPitch <<= (sal_Int16)FontPitch::DONTKNOW;
	aEnc <<= (sal_Int16)rStyles.GetDfltCharset();
}

void XMLFontStyleContext_Impl::SetAttribute( sal_uInt16 nPrefixKey,
										const OUString& rLocalName,
										const OUString& rValue )
{
	SvXMLUnitConverter& rUnitConv = GetImport().GetMM100UnitConverter();
	const SvXMLTokenMap& rTokenMap = GetStyles()->GetFontStyleAttrTokenMap();
	Any aAny;

	switch( rTokenMap.Get( nPrefixKey, rLocalName ) )
	{
	case XML_TOK_FONT_STYLE_ATTR_FAMILY:
		if( GetStyles()->GetFamilyNameHdl().importXML( rValue, aAny,
														  rUnitConv ) )
			aFamilyName = aAny;
		break;
	case XML_TOK_FONT_STYLE_ATTR_STYLENAME:
		aStyleName <<= rValue;
		break;
	case XML_TOK_FONT_STYLE_ATTR_FAMILY_GENERIC:
		if( GetStyles()->GetFamilyHdl().importXML( rValue, aAny,
													  rUnitConv ) )
			aFamily = aAny;
		break;
	case XML_TOK_FONT_STYLE_ATTR_PITCH:
		if( GetStyles()->GetPitchHdl().importXML( rValue, aAny,
													  rUnitConv ) )
			aPitch = aAny;
		break;
	case XML_TOK_FONT_STYLE_ATTR_CHARSET:
		if( GetStyles()->GetEncodingHdl().importXML( rValue, aAny,
													  rUnitConv ) )
			aEnc = aAny;
		break;
	default:
		SvXMLStyleContext::SetAttribute( nPrefixKey, rLocalName, rValue );
		break;
	}
}

XMLFontStyleContext_Impl::~XMLFontStyleContext_Impl()
{
}

void XMLFontStyleContext_Impl::FillProperties(
		::std::vector< XMLPropertyState > &rProps,
		sal_Int32 nFamilyNameIdx,
		sal_Int32 nStyleNameIdx,
		sal_Int32 nFamilyIdx,
		sal_Int32 nPitchIdx,
		sal_Int32 nCharsetIdx ) const
{
	if( nFamilyNameIdx != -1 )
	{
		XMLPropertyState aPropState( nFamilyNameIdx, aFamilyName );
		rProps.push_back( aPropState );
	}
	if( nStyleNameIdx != -1 )
	{
		XMLPropertyState aPropState( nStyleNameIdx, aStyleName );
		rProps.push_back( aPropState );
	}
	if( nFamilyIdx != -1 )
	{
		XMLPropertyState aPropState( nFamilyIdx, aFamily );
		rProps.push_back( aPropState );
	}
	if( nPitchIdx != -1 )
	{
		XMLPropertyState aPropState( nPitchIdx, aPitch );
		rProps.push_back( aPropState );
	}
	if( nCharsetIdx != -1 )
	{
		XMLPropertyState aPropState( nCharsetIdx, aEnc );
		rProps.push_back( aPropState );
	}
}

SvXMLStyleContext *XMLFontStylesContext::CreateStyleChildContext(
		sal_uInt16 nPrefix,
		const ::rtl::OUString& rLocalName,
		const ::com::sun::star::uno::Reference<
			::com::sun::star::xml::sax::XAttributeList > & xAttrList )
{
	SvXMLStyleContext *pStyle;
	if( XML_NAMESPACE_STYLE == nPrefix &&
		IsXMLToken( rLocalName, XML_FONT_FACE ) )
	{
		pStyle = new XMLFontStyleContext_Impl( GetImport(), nPrefix,
											   rLocalName, xAttrList, *this );
	}
	else
	{
		pStyle = SvXMLStylesContext::CreateStyleChildContext( nPrefix,
											   rLocalName, xAttrList );
	}

	return pStyle;
}

TYPEINIT1( XMLFontStylesContext, SvXMLStylesContext );

XMLFontStylesContext::XMLFontStylesContext( SvXMLImport& rImport,
		sal_uInt16 nPrfx, const OUString& rLName,
		const Reference< XAttributeList > & xAttrList,
		rtl_TextEncoding eDfltEnc ) :
	SvXMLStylesContext( rImport, nPrfx, rLName, xAttrList ),
	pFamilyNameHdl( new XMLFontFamilyNamePropHdl ),
	pFamilyHdl( new XMLFontFamilyPropHdl ),
	pPitchHdl( new XMLFontPitchPropHdl ),
	pEncHdl( new XMLFontEncodingPropHdl ),
	pFontStyleAttrTokenMap( new SvXMLTokenMap(lcl_getFontStyleAttrTokenMap()) ),
	eDfltEncoding( eDfltEnc )
{
}

XMLFontStylesContext::~XMLFontStylesContext()
{
	delete pFamilyNameHdl;
	delete pFamilyHdl;
	delete pPitchHdl;
	delete pEncHdl;
	delete pFontStyleAttrTokenMap;
}

sal_Bool XMLFontStylesContext::FillProperties( const OUString& rName,
						 ::std::vector< XMLPropertyState > &rProps,
						 sal_Int32 nFamilyNameIdx,
						 sal_Int32 nStyleNameIdx,
						 sal_Int32 nFamilyIdx,
						 sal_Int32 nPitchIdx,
						 sal_Int32 nCharsetIdx ) const
{
    const SvXMLStyleContext* pStyle = FindStyleChildContext( XML_STYLE_FAMILY_FONT, rName, sal_True );
	const XMLFontStyleContext_Impl *pFontStyle = PTR_CAST( XMLFontStyleContext_Impl,pStyle);// use temp var, PTR_CAST is a bad macro, FindStyleChildContext will be called twice
	if( pFontStyle )
		pFontStyle->FillProperties( rProps, nFamilyNameIdx, nStyleNameIdx,
									nFamilyIdx, nPitchIdx, nCharsetIdx );
	return 0 != pFontStyle;
}
