/**************************************************************
 * 
 * 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/drawing/ColorMode.hpp>
#include <com/sun/star/text/HorizontalAdjust.hpp>
#include <com/sun/star/text/WritingMode2.hpp>

#include <tools/debug.hxx>

#include <xmloff/prhdlfac.hxx>
#include <xmloff/xmltypes.hxx>
#include <xmloff/xmltoken.hxx>
#include "xmlbahdl.hxx"
#include <xmloff/NamedBoolPropertyHdl.hxx>
#include <xmloff/XMLConstantsPropertyHandler.hxx>
#include "cdouthdl.hxx"
#include "csmaphdl.hxx"
#include "fonthdl.hxx"
#include "kernihdl.hxx"
#include <postuhdl.hxx>
#include "shadwhdl.hxx"
#include "shdwdhdl.hxx"
#include "undlihdl.hxx"
#include "weighhdl.hxx"
#include "breakhdl.hxx"
#include <adjushdl.hxx>
#include <escphdl.hxx>
#include <chrhghdl.hxx>
#include <chrlohdl.hxx>
#include <lspachdl.hxx>
#include <bordrhdl.hxx>
#include <tabsthdl.hxx>
#include <xmloff/EnumPropertyHdl.hxx>
#include "AttributeContainerHandler.hxx"
#include "durationhdl.hxx"
#include "XMLRectangleMembersHandler.hxx"
#include "DrawAspectHdl.hxx"

using namespace ::com::sun::star;
using namespace ::xmloff::token;

SvXMLEnumMapEntry aXML_ColorMode_EnumMap[] =
{
	{ XML_GREYSCALE,    drawing::ColorMode_GREYS },
	{ XML_MONO,	        drawing::ColorMode_MONO },
	{ XML_WATERMARK,    drawing::ColorMode_WATERMARK },
	{ XML_STANDARD,     drawing::ColorMode_STANDARD },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA aXML_HorizontalAdjust_Enum[] =
{
	{ XML_LEFT,	    text::HorizontalAdjust_LEFT },
	{ XML_CENTER,	text::HorizontalAdjust_CENTER },
	{ XML_RIGHT,	text::HorizontalAdjust_RIGHT },
	{ XML_TOKEN_INVALID, 0 }
};

// aXML_WritingDirection_Enum is used with and without 'page'
// attribute, so you'll find uses of aXML_WritingDirection_Enum
// directly, as well as &(aXML_WritingDirection_Enum[1])
SvXMLEnumMapEntry __READONLY_DATA aXML_WritingDirection_Enum[] =
{
    // aXML_WritingDirection_Enum
    { XML_PAGE,     text::WritingMode2::PAGE },

    // &(aXML_WritingDirection_Enum[1])
    { XML_LR_TB,    text::WritingMode2::LR_TB },
    { XML_RL_TB,    text::WritingMode2::RL_TB },
    { XML_TB_RL,    text::WritingMode2::TB_RL },    
    { XML_TB_LR,    text::WritingMode2::TB_LR },

    // alternative names of the above, as accepted by XSL
    { XML_LR,       text::WritingMode2::LR_TB },
    { XML_RL,       text::WritingMode2::RL_TB },
    { XML_TB,       text::WritingMode2::TB_RL },

    { XML_TOKEN_INVALID, 0 }
};


///////////////////////////////////////////////////////////////////////////
//
// Dtor
//
XMLPropertyHandlerFactory::~XMLPropertyHandlerFactory()
{
	for( CacheMap::iterator pPos = maHandlerCache.begin(); pPos != maHandlerCache.end(); pPos++ )
		delete pPos->second;
}

///////////////////////////////////////////////////////////////////////////
//
// Interface
//
const XMLPropertyHandler* XMLPropertyHandlerFactory::GetPropertyHandler( sal_Int32 nType ) const
{
	DBG_ASSERT( (nType & ~((sal_uInt32)MID_FLAG_MASK)) == 0,
				"GetPropertyHandler called with flags in type" );
	return GetBasicHandler( nType );
}

///////////////////////////////////////////////////////////////////////////
//
// Helper-methods to create and cache PropertyHandler
//
XMLPropertyHandler* XMLPropertyHandlerFactory::GetHdlCache( sal_Int32 nType ) const
{
	XMLPropertyHandler* pRet = NULL;

	if( maHandlerCache.find( nType ) != maHandlerCache.end() )
		pRet = maHandlerCache.find( nType )->second;

	return pRet;
}

void XMLPropertyHandlerFactory::PutHdlCache( sal_Int32 nType, const XMLPropertyHandler* pHdl ) const
{
	// Don't be wondered about the following construct. The  sense is to be able to provide a const-
	// method as class-interface.
	((XMLPropertyHandlerFactory*)this)->maHandlerCache[ nType ] = (XMLPropertyHandler*)pHdl;
}

const XMLPropertyHandler* XMLPropertyHandlerFactory::GetBasicHandler( sal_Int32 nType ) const
{
	const XMLPropertyHandler* pPropHdl = GetHdlCache( nType );

	if( !pPropHdl )
	{
        pPropHdl = CreatePropertyHandler( nType );

		if( pPropHdl )
			PutHdlCache( nType, pPropHdl );
	}

	return pPropHdl;
}

const XMLPropertyHandler* XMLPropertyHandlerFactory::CreatePropertyHandler( sal_Int32 nType )
{
    XMLPropertyHandler* pPropHdl = NULL;

    switch( nType )
    {
        case XML_TYPE_BOOL :
            pPropHdl = new XMLBoolPropHdl;
            break;
        case XML_TYPE_MEASURE :
            pPropHdl = new XMLMeasurePropHdl( 4 );
            break;
        case XML_TYPE_MEASURE8 :
            pPropHdl = new XMLMeasurePropHdl( 1 );
            break;
		case XML_TYPE_MEASURE16:
			pPropHdl = new XMLMeasurePropHdl( 2 );
			break;
		case XML_TYPE_PERCENT :
			pPropHdl = new XMLPercentPropHdl( 4 );
			break;
		case XML_TYPE_PERCENT8 :
			pPropHdl = new XMLPercentPropHdl( 1 );
			break;
		case XML_TYPE_PERCENT16 :
			pPropHdl = new XMLPercentPropHdl( 2 );
			break;
		case XML_TYPE_DOUBLE_PERCENT :
			pPropHdl = new XMLDoublePercentPropHdl();
			break;
		case XML_TYPE_NEG_PERCENT :
			pPropHdl = new XMLNegPercentPropHdl( 4 );
			break;
		case XML_TYPE_NEG_PERCENT8 :
			pPropHdl = new XMLNegPercentPropHdl( 1 );
			break;
		case XML_TYPE_NEG_PERCENT16 :
			pPropHdl = new XMLNegPercentPropHdl( 2 );
			break;
		case XML_TYPE_MEASURE_PX :
			pPropHdl = new XMLMeasurePxPropHdl( 4 );
			break;
		case XML_TYPE_STRING :
			pPropHdl = new XMLStringPropHdl;
			break;
		case XML_TYPE_COLOR :
			pPropHdl = new XMLColorPropHdl;
			break;
		case XML_TYPE_NUMBER :
			pPropHdl = new XMLNumberPropHdl( 4 );
			break;
		case XML_TYPE_NUMBER8 :
			pPropHdl = new XMLNumberPropHdl( 1 );
			break;
		case XML_TYPE_NUMBER16:
			pPropHdl = new XMLNumberPropHdl( 2 );
			break;
		case XML_TYPE_NUMBER_NONE :
			pPropHdl = new XMLNumberNonePropHdl;
			break;
		case XML_TYPE_NUMBER8_NONE :
			pPropHdl = new XMLNumberNonePropHdl( 1 );
			break;
		case XML_TYPE_NUMBER16_NONE :
			pPropHdl = new XMLNumberNonePropHdl( 2 );
			break;
		case XML_TYPE_DOUBLE :
			pPropHdl = new XMLDoublePropHdl;
			break;
		case XML_TYPE_NBOOL :
			pPropHdl = new XMLNBoolPropHdl;
			break;
		case XML_TYPE_COLORTRANSPARENT :
			pPropHdl = new XMLColorTransparentPropHdl;
			break;
		case XML_TYPE_ISTRANSPARENT :
			pPropHdl = new XMLIsTransparentPropHdl;
			break;
		case XML_TYPE_COLORAUTO :
			pPropHdl = new XMLColorAutoPropHdl;
			break;
		case XML_TYPE_ISAUTOCOLOR :
			pPropHdl = new XMLIsAutoColorPropHdl;
			break;
		case XML_TYPE_BUILDIN_CMP_ONLY :
			pPropHdl = new XMLCompareOnlyPropHdl;
			break;

		case XML_TYPE_RECTANGLE_LEFT :
		case XML_TYPE_RECTANGLE_TOP :
		case XML_TYPE_RECTANGLE_WIDTH :
		case XML_TYPE_RECTANGLE_HEIGHT :
			pPropHdl = new XMLRectangleMembersHdl( nType );
			break;

		case XML_TYPE_TEXT_CROSSEDOUT_TYPE:
			pPropHdl = new XMLCrossedOutTypePropHdl ;
			break;
		case XML_TYPE_TEXT_CROSSEDOUT_STYLE:
			pPropHdl = new XMLCrossedOutStylePropHdl ;
			break;
		case XML_TYPE_TEXT_CROSSEDOUT_WIDTH:
			pPropHdl = new XMLCrossedOutWidthPropHdl ;
			break;
		case XML_TYPE_TEXT_CROSSEDOUT_TEXT:
			pPropHdl = new XMLCrossedOutTextPropHdl ;
			break;
		case XML_TYPE_TEXT_BOOLCROSSEDOUT:
            pPropHdl = new XMLNamedBoolPropertyHdl( 
                GetXMLToken(XML_SOLID), 
                GetXMLToken(XML_NONE) );
			break;
		case XML_TYPE_TEXT_ESCAPEMENT:
			pPropHdl = new XMLEscapementPropHdl;
			break;
		case XML_TYPE_TEXT_ESCAPEMENT_HEIGHT:
			pPropHdl = new XMLEscapementHeightPropHdl;
			break;
		case XML_TYPE_TEXT_CASEMAP:
			pPropHdl = new XMLCaseMapPropHdl;
			break;
		case XML_TYPE_TEXT_CASEMAP_VAR:
			pPropHdl = new XMLCaseMapVariantHdl;
			break;
		case XML_TYPE_TEXT_FONTFAMILYNAME:
			pPropHdl = new XMLFontFamilyNamePropHdl;
			break;
		case XML_TYPE_TEXT_FONTFAMILY:
			pPropHdl = new XMLFontFamilyPropHdl;
			break;
		case XML_TYPE_TEXT_FONTENCODING:
			pPropHdl = new XMLFontEncodingPropHdl;
			break;
		case XML_TYPE_TEXT_FONTPITCH:
			pPropHdl = new XMLFontPitchPropHdl;
			break;
		case XML_TYPE_TEXT_KERNING:
			pPropHdl = new XMLKerningPropHdl;
			break;
		case XML_TYPE_TEXT_POSTURE:
			pPropHdl = new XMLPosturePropHdl;
			break;
		case XML_TYPE_TEXT_SHADOWED:
			pPropHdl = new XMLShadowedPropHdl;
			break;
		case XML_TYPE_TEXT_UNDERLINE_TYPE:
			pPropHdl = new XMLUnderlineTypePropHdl;
			break;
		case XML_TYPE_TEXT_UNDERLINE_STYLE:
			pPropHdl = new XMLUnderlineStylePropHdl;
			break;
		case XML_TYPE_TEXT_UNDERLINE_WIDTH:
			pPropHdl = new XMLUnderlineWidthPropHdl;
			break;
		case XML_TYPE_TEXT_UNDERLINE_COLOR:
			pPropHdl = new XMLColorTransparentPropHdl( XML_FONT_COLOR );
			break;
		case XML_TYPE_TEXT_UNDERLINE_HASCOLOR:
			pPropHdl = new XMLIsTransparentPropHdl( XML_FONT_COLOR,
												 	sal_False );
			break;
		case XML_TYPE_TEXT_OVERLINE_TYPE:
			pPropHdl = new XMLUnderlineTypePropHdl;
			break;
		case XML_TYPE_TEXT_OVERLINE_STYLE:
			pPropHdl = new XMLUnderlineStylePropHdl;
			break;
		case XML_TYPE_TEXT_OVERLINE_WIDTH:
			pPropHdl = new XMLUnderlineWidthPropHdl;
			break;
		case XML_TYPE_TEXT_OVERLINE_COLOR:
			pPropHdl = new XMLColorTransparentPropHdl( XML_FONT_COLOR );
			break;
		case XML_TYPE_TEXT_OVERLINE_HASCOLOR:
			pPropHdl = new XMLIsTransparentPropHdl( XML_FONT_COLOR,
												 	sal_False );
			break;
		case XML_TYPE_TEXT_WEIGHT:
			pPropHdl = new XMLFontWeightPropHdl;
			break;
		case XML_TYPE_TEXT_SPLIT:
            pPropHdl = new XMLNamedBoolPropertyHdl( 
                GetXMLToken(XML_AUTO), 
                GetXMLToken(XML_ALWAYS) );
			break;
		case XML_TYPE_TEXT_BREAKBEFORE:
			pPropHdl = new XMLFmtBreakBeforePropHdl;
			break;
		case XML_TYPE_TEXT_BREAKAFTER:
			pPropHdl = new XMLFmtBreakAfterPropHdl;
			break;
		case XML_TYPE_TEXT_SHADOW:
			pPropHdl = new XMLShadowPropHdl;
			break;
		case XML_TYPE_TEXT_ADJUST:
			pPropHdl = new XMLParaAdjustPropHdl;
			break;
		case XML_TYPE_TEXT_ADJUSTLAST:
			pPropHdl = new XMLLastLineAdjustPropHdl;
			break;
		case XML_TYPE_CHAR_HEIGHT:
			pPropHdl = new XMLCharHeightHdl;
			break;
		case XML_TYPE_CHAR_HEIGHT_PROP:
			pPropHdl = new XMLCharHeightPropHdl;
			break;
		case XML_TYPE_CHAR_HEIGHT_DIFF:
			pPropHdl = new XMLCharHeightDiffHdl;
			break;
		case XML_TYPE_CHAR_LANGUAGE:
			pPropHdl = new XMLCharLanguageHdl;
			break;
		case XML_TYPE_CHAR_COUNTRY:
			pPropHdl = new XMLCharCountryHdl;
			break;
		case XML_TYPE_LINE_SPACE_FIXED:
			pPropHdl = new XMLLineHeightHdl;
			break;
		case XML_TYPE_LINE_SPACE_MINIMUM:
			pPropHdl = new XMLLineHeightAtLeastHdl;
			break;
		case XML_TYPE_LINE_SPACE_DISTANCE:
			pPropHdl = new XMLLineSpacingHdl;
			break;
		case XML_TYPE_BORDER_WIDTH:
			pPropHdl = new XMLBorderWidthHdl;
			break;
		case XML_TYPE_BORDER:
			pPropHdl = new XMLBorderHdl;
			break;
		case XML_TYPE_TEXT_TABSTOP:
			pPropHdl = new XMLTabStopPropHdl;
			break;
		case XML_TYPE_ATTRIBUTE_CONTAINER:
			pPropHdl = new XMLAttributeContainerHandler;
			break;
		case XML_TYPE_COLOR_MODE:
			pPropHdl = new XMLEnumPropertyHdl( aXML_ColorMode_EnumMap, 
							::getCppuType((const drawing::ColorMode*)0) );
			break;
		case XML_TYPE_DURATION16_MS:
			pPropHdl = new XMLDurationMS16PropHdl_Impl;
			break;
		case XML_TYPE_TEXT_HORIZONTAL_ADJUST:
			pPropHdl = new XMLEnumPropertyHdl( 
				aXML_HorizontalAdjust_Enum,
				::getCppuType((const text::HorizontalAdjust*)0) );
			break;
		case XML_TYPE_TEXT_DRAW_ASPECT:
			pPropHdl = new DrawAspectHdl;
			break;
        case XML_TYPE_TEXT_WRITING_MODE:
            pPropHdl = new XMLConstantsPropertyHandler( 
                &(aXML_WritingDirection_Enum[1]),
                XML_LR_TB);
            break;
        case XML_TYPE_TEXT_WRITING_MODE_WITH_DEFAULT:
            pPropHdl = new XMLConstantsPropertyHandler( 
                aXML_WritingDirection_Enum,
                XML_PAGE);
            break;
        case XML_TYPE_TEXT_HIDDEN_AS_DISPLAY:
            pPropHdl = new XMLNamedBoolPropertyHdl( 
                GetXMLToken(XML_NONE), 
                GetXMLToken(XML_TRUE) );
			break;
		case XML_TYPE_STYLENAME :
			pPropHdl = new XMLStyleNamePropHdl;
			break;
        case XML_TYPE_NUMBER_NO_ZERO:
            pPropHdl = new XMLNumberWithoutZeroPropHdl( 4 );
            break;
        case XML_TYPE_NUMBER8_NO_ZERO:
            pPropHdl = new XMLNumberWithoutZeroPropHdl( 1 );
            break;
		case XML_TYPE_NUMBER16_NO_ZERO:
            pPropHdl = new XMLNumberWithoutZeroPropHdl( 2 );
            break;
		case XML_TYPE_NUMBER16_AUTO:
            pPropHdl = new XMLNumberWithAutoInsteadZeroPropHdl();
            break;
	}

    return pPropHdl;
}
