/**************************************************************
 *
 * 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 <tools/debug.hxx>
#include <rtl/ustrbuf.hxx>
#include <tools/fontenum.hxx>
#include <com/sun/star/uno/Any.hxx>
#include <com/sun/star/style/DropCapFormat.hpp>
#include <com/sun/star/text/FontRelief.hpp>
#include <com/sun/star/text/WrapTextMode.hpp>
#include <com/sun/star/text/XTextColumns.hpp>
#include <com/sun/star/text/TextColumn.hpp>
#include <com/sun/star/text/RelOrientation.hpp>
#include <com/sun/star/text/HoriOrientation.hpp>
#include <com/sun/star/text/VertOrientation.hpp>
#include <com/sun/star/text/RubyAdjust.hpp>
#include <com/sun/star/text/FontEmphasis.hpp>
#include <com/sun/star/text/ParagraphVertAlign.hpp>
#include <xmloff/xmltypes.hxx>
#include <xmloff/xmluconv.hxx>
#include <xmloff/xmltoken.hxx>
#include "XMLAnchorTypePropHdl.hxx"
#include <xmloff/XMLConstantsPropertyHandler.hxx>
#include "XMLClipPropertyHandler.hxx"
#include "XMLTextColumnsPropertyHandler.hxx"
#include <xmloff/NamedBoolPropertyHdl.hxx>
#include "txtprhdl.hxx"
#include <com/sun/star/text/WrapInfluenceOnPosition.hpp>

//UUUU
#include <xmloff/EnumPropertyHdl.hxx>
#include <com/sun/star/drawing/FillStyle.hpp>
#include "XMLFillBitmapSizePropertyHandler.hxx"
#include "XMLBitmapLogicalSizePropertyHandler.hxx"
#include <com/sun/star/drawing/RectanglePoint.hpp>
#include <com/sun/star/drawing/BitmapMode.hpp>
#include "XMLBitmapRepeatOffsetPropertyHandler.hxx"

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

using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::style;
using namespace ::com::sun::star::text;
using namespace ::xmloff::token;

//UUUU
using namespace ::com::sun::star::drawing;

//UUUU
extern SvXMLEnumMapEntry aXML_FillStyle_EnumMap[];
extern SvXMLEnumMapEntry aXML_RefPoint_EnumMap[];
extern SvXMLEnumMapEntry aXML_BitmapMode_EnumMap[];

#define CONSTASCII_USTRINGPARAM_CMP(s) s, sizeof(s)-1

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

SvXMLEnumMapEntry __READONLY_DATA pXML_HoriPos_Enum[] =
{
	{ XML_FROM_LEFT,		HoriOrientation::NONE	},
	{ XML_FROM_INSIDE,		HoriOrientation::NONE	},	// import only
	{ XML_LEFT,		    	HoriOrientation::LEFT	},
	{ XML_INSIDE,			HoriOrientation::LEFT	},	// import only
	{ XML_CENTER,			HoriOrientation::CENTER	},
	{ XML_RIGHT,			HoriOrientation::RIGHT	},
	{ XML_OUTSIDE,			HoriOrientation::RIGHT	},	// import only
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_HoriPosMirrored_Enum[] =
{
	{ XML_FROM_INSIDE,		HoriOrientation::NONE	},
	{ XML_INSIDE,			HoriOrientation::LEFT	},
	{ XML_CENTER,			HoriOrientation::CENTER	},
	{ XML_OUTSIDE,			HoriOrientation::RIGHT	},
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_HoriRel_Enum[] =
{
	{ XML_PARAGRAPH,			RelOrientation::FRAME	},
	{ XML_PARAGRAPH_CONTENT,	RelOrientation::PRINT_AREA	},
	{ XML_PAGE,				    RelOrientation::PAGE_FRAME	},
	{ XML_PAGE_CONTENT,		    RelOrientation::PAGE_PRINT_AREA	},
	{ XML_PARAGRAPH_START_MARGIN,	RelOrientation::FRAME_LEFT	},
	{ XML_PARAGRAPH_END_MARGIN,	RelOrientation::FRAME_RIGHT	},
	{ XML_PAGE_START_MARGIN,	RelOrientation::PAGE_LEFT	},
	{ XML_PAGE_END_MARGIN,		RelOrientation::PAGE_RIGHT	},
	{ XML_CHAR,				    RelOrientation::CHAR	},
	{ XML_FRAME,				RelOrientation::FRAME	},		// import only
	{ XML_FRAME_CONTENT,		RelOrientation::PRINT_AREA	},	// import only
	{ XML_FRAME_START_MARGIN,	RelOrientation::FRAME_LEFT	},	// import only
	{ XML_FRAME_END_MARGIN, 	RelOrientation::FRAME_RIGHT	},	// import only
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_HoriRelFrame_Enum[] =
{
	{ XML_FRAME,				RelOrientation::FRAME	},
	{ XML_FRAME_CONTENT,		RelOrientation::PRINT_AREA	},
	{ XML_PAGE,				    RelOrientation::PAGE_FRAME	},
	{ XML_PAGE_CONTENT,		    RelOrientation::PAGE_PRINT_AREA	},
	{ XML_FRAME_START_MARGIN,	RelOrientation::FRAME_LEFT	},
	{ XML_FRAME_END_MARGIN,	    RelOrientation::FRAME_RIGHT	},
	{ XML_PAGE_START_MARGIN,	RelOrientation::PAGE_LEFT	},
	{ XML_PAGE_END_MARGIN,		RelOrientation::PAGE_RIGHT	},
	{ XML_CHAR,				    RelOrientation::CHAR	},
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_HoriMirror_Enum[] =
{
	{ XML_FROM_LEFT,		sal_False	},
	{ XML_FROM_INSIDE,		sal_True	},
	{ XML_LEFT,		    	sal_False	},
	{ XML_INSIDE,			sal_True	},
	{ XML_CENTER,			sal_False	},
	{ XML_RIGHT,			sal_False	},
	{ XML_OUTSIDE,			sal_True	},
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_VertPos_Enum[] =
{
	{ XML_FROM_TOP,		    VertOrientation::NONE		},
	{ XML_TOP,				VertOrientation::TOP		},
	{ XML_TOP,				VertOrientation::CHAR_TOP	},	// export only
	{ XML_TOP,				VertOrientation::LINE_TOP	},	// export only
	{ XML_MIDDLE,			VertOrientation::CENTER		},
	{ XML_MIDDLE,			VertOrientation::CHAR_CENTER	},	// export only
	{ XML_MIDDLE,			VertOrientation::LINE_CENTER	},	// export only
	{ XML_BOTTOM,			VertOrientation::BOTTOM		},
	{ XML_BOTTOM,			VertOrientation::CHAR_BOTTOM	},	// export only
	{ XML_BOTTOM,			VertOrientation::LINE_BOTTOM	},	// export only
	{ XML_BELOW,			VertOrientation::CHAR_BOTTOM	},	// import only
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_VertPosAtChar_Enum[] =
{
	{ XML_FROM_TOP,		    VertOrientation::NONE		},
	{ XML_TOP,				VertOrientation::TOP		},
	{ XML_TOP,				VertOrientation::CHAR_TOP	},	// export only
	{ XML_TOP,				VertOrientation::LINE_TOP	},	// export only
	{ XML_MIDDLE,			VertOrientation::CENTER		},
	{ XML_MIDDLE,			VertOrientation::CHAR_CENTER	},	// export only
	{ XML_MIDDLE,			VertOrientation::LINE_CENTER	},	// export only
	{ XML_BOTTOM,			VertOrientation::BOTTOM		},
	{ XML_BELOW,			VertOrientation::CHAR_BOTTOM	},	// export only
	{ XML_BOTTOM,			VertOrientation::LINE_BOTTOM	},	// export only
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_VertRel_Enum[] =
{
	{ XML_PARAGRAPH,			RelOrientation::FRAME	},
	{ XML_PARAGRAPH_CONTENT,	RelOrientation::PRINT_AREA	},
	{ XML_CHAR,				    RelOrientation::CHAR	},
    // DVO, OD 17.09.2003 #i18732# - allow vertical alignment at page
    { XML_PAGE,                 RelOrientation::PAGE_FRAME  },
    { XML_PAGE_CONTENT,         RelOrientation::PAGE_PRINT_AREA },
	{ XML_FRAME,				RelOrientation::FRAME	},		// import only
	{ XML_FRAME_CONTENT,		RelOrientation::PRINT_AREA	},	// import only
    // OD 13.11.2003 #i22341# - new vertical alignment at top of line
    { XML_LINE,                 RelOrientation::TEXT_LINE },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_VertRelPage_Enum[] =
{
	{ XML_PAGE,			RelOrientation::FRAME	},
	{ XML_PAGE_CONTENT,	RelOrientation::PRINT_AREA	},
	{ XML_PAGE,			RelOrientation::PAGE_FRAME	},
	{ XML_PAGE_CONTENT,	RelOrientation::PAGE_PRINT_AREA	},
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_VertRelFrame_Enum[] =
{
	{ XML_FRAME,			RelOrientation::FRAME	},
	{ XML_FRAME_CONTENT,	RelOrientation::PRINT_AREA	},
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_VertRelAsChar_Enum[] =
{
	{ XML_BASELINE,		VertOrientation::TOP		},
	{ XML_BASELINE,		VertOrientation::CENTER		},	// export only
	{ XML_BASELINE,		VertOrientation::BOTTOM		},	// export only
	{ XML_TEXT,			VertOrientation::CHAR_TOP	},
	{ XML_TEXT,			VertOrientation::CHAR_CENTER	},	// export only
	{ XML_TEXT,			VertOrientation::CHAR_BOTTOM	},	// export only
    { XML_LINE,			VertOrientation::LINE_TOP	},
	{ XML_LINE,			VertOrientation::LINE_CENTER	},	// export only
	{ XML_LINE,			VertOrientation::LINE_BOTTOM	},	// export only
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_RubyAdjust_Enum[] =
{
	{ XML_LEFT,				    RubyAdjust_LEFT },
    { XML_CENTER,				RubyAdjust_CENTER },
	{ XML_RIGHT,				RubyAdjust_RIGHT },
	{ XML_DISTRIBUTE_LETTER,	RubyAdjust_BLOCK },
	{ XML_DISTRIBUTE_SPACE,	    RubyAdjust_INDENT_BLOCK },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_FontRelief_Enum[] =
{
	{ XML_NONE,				FontRelief::NONE		},
	{ XML_ENGRAVED,			FontRelief::ENGRAVED	},
	{ XML_EMBOSSED,			FontRelief::EMBOSSED	},
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_VerticalAlign_Enum[] =
{
	{ XML_TOP,			ParagraphVertAlign::TOP		},
	{ XML_MIDDLE,		ParagraphVertAlign::CENTER	},
	{ XML_BOTTOM,		ParagraphVertAlign::BOTTOM	},
	{ XML_BASELINE,	    ParagraphVertAlign::BASELINE	},
	{ XML_AUTO,		    ParagraphVertAlign::AUTOMATIC	},
	{ XML_TOKEN_INVALID, 0 }
};

// OD 2004-05-05 #i28701#
SvXMLEnumMapEntry __READONLY_DATA pXML_WrapInfluenceOnPosition_Enum[] =
{
    // --> OD 2004-10-18 #i35017# - tokens have been renamed and
    // <XML_ITERATIVE> has been added
    { XML_ONCE_SUCCESSIVE, WrapInfluenceOnPosition::ONCE_SUCCESSIVE },
    { XML_ONCE_CONCURRENT, WrapInfluenceOnPosition::ONCE_CONCURRENT },
    { XML_ITERATIVE,       WrapInfluenceOnPosition::ITERATIVE },
    // <--
    { XML_TOKEN_INVALID, 0 }
};

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

class XMLDropCapPropHdl_Impl : public XMLPropertyHandler
{
public:
	virtual ~XMLDropCapPropHdl_Impl ();

	virtual bool equals(
			const ::com::sun::star::uno::Any& r1,
			const ::com::sun::star::uno::Any& r2 ) const;

	/// TabStops will be imported/exported as XML-Elements. So the Import/Export-work must be done at another place.
	virtual sal_Bool importXML(
			const ::rtl::OUString& rStrImpValue,
			::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
	virtual sal_Bool exportXML(
			::rtl::OUString& rStrExpValue,
			const ::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
};

XMLDropCapPropHdl_Impl::~XMLDropCapPropHdl_Impl ()
{
}

bool XMLDropCapPropHdl_Impl::equals(
		const Any& r1,
		const Any& r2 ) const
{
	DropCapFormat aFormat1, aFormat2;
	r1 >>= aFormat1;
	r2 >>= aFormat2;

	return	(aFormat1.Lines <=1 && aFormat2.Lines <=1) ||
			(aFormat1.Lines == aFormat2.Lines &&
			 aFormat1.Count == aFormat2.Count &&
			 aFormat1.Distance == aFormat2.Distance);
}

sal_Bool XMLDropCapPropHdl_Impl::importXML(
		const OUString&,
	   	Any&,
		const SvXMLUnitConverter& ) const
{
	DBG_ASSERT( sal_False, "drop caps are an element import property" );
	return sal_False;
}

sal_Bool XMLDropCapPropHdl_Impl::exportXML(
		OUString&,
		const Any&,
		const SvXMLUnitConverter& ) const
{
	DBG_ASSERT( sal_False, "drop caps are an element export property" );
	return sal_False;
}

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

class XMLOpaquePropHdl_Impl : public XMLPropertyHandler
{
public:
	virtual ~XMLOpaquePropHdl_Impl ();

	virtual sal_Bool importXML(
			const ::rtl::OUString& rStrImpValue,
			::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
	virtual sal_Bool exportXML(
			::rtl::OUString& rStrExpValue,
			const ::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
};

sal_Bool XMLOpaquePropHdl_Impl::importXML(
		const OUString& rStrImpValue,
	   	Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_Bool bRet = sal_True;
	sal_Bool bVal = sal_False;
	if( IsXMLToken( rStrImpValue, XML_FOREGROUND ) )
		bVal = sal_True;
	else if( !IsXMLToken( rStrImpValue, XML_BACKGROUND ) )
		bRet = sal_False;

	if( bRet )
		rValue.setValue( &bVal, ::getBooleanCppuType() );

	return bRet;
}

sal_Bool XMLOpaquePropHdl_Impl::exportXML(
		OUString& rStrExpValue,
		const Any& rValue,
		const SvXMLUnitConverter& ) const
{
	if( *(sal_Bool *)rValue.getValue() )
	   	rStrExpValue = GetXMLToken( XML_FOREGROUND );
	else
	   	rStrExpValue = GetXMLToken( XML_BACKGROUND );

	return sal_True;
}

XMLOpaquePropHdl_Impl::~XMLOpaquePropHdl_Impl ()
{
}

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

class XMLContourModePropHdl_Impl : public XMLPropertyHandler
{
public:
	virtual ~XMLContourModePropHdl_Impl ();

	virtual sal_Bool importXML(
			const ::rtl::OUString& rStrImpValue,
			::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
	virtual sal_Bool exportXML(
			::rtl::OUString& rStrExpValue,
			const ::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
};

sal_Bool XMLContourModePropHdl_Impl::importXML(
		const OUString& rStrImpValue,
	   	Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_Bool bRet = sal_True;
	sal_Bool bVal = sal_False;
	if( IsXMLToken( rStrImpValue, XML_OUTSIDE ) )
		bVal = sal_True;
	else if( ! IsXMLToken( rStrImpValue, XML_FULL ) )
		bRet = sal_False;

	if( bRet )
		rValue.setValue( &bVal, ::getBooleanCppuType() );

	return bRet;
}

sal_Bool XMLContourModePropHdl_Impl::exportXML(
		OUString& rStrExpValue,
		const Any& rValue,
		const SvXMLUnitConverter& ) const
{
	if( *(sal_Bool *)rValue.getValue() )
	   	rStrExpValue = GetXMLToken( XML_OUTSIDE );
	else
	   	rStrExpValue = GetXMLToken( XML_FULL );

	return sal_True;
}

XMLContourModePropHdl_Impl::~XMLContourModePropHdl_Impl()
{
}

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

class XMLParagraphOnlyPropHdl_Impl : public XMLPropertyHandler
{
public:
	virtual ~XMLParagraphOnlyPropHdl_Impl ();

	virtual sal_Bool importXML(
			const ::rtl::OUString& rStrImpValue,
			::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
	virtual sal_Bool exportXML(
			::rtl::OUString& rStrExpValue,
			const ::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
};

sal_Bool XMLParagraphOnlyPropHdl_Impl::importXML(
		const OUString& rStrImpValue,
	   	Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_Bool bRet = sal_True;
	sal_Bool bVal = sal_False;

	if( ! IsXMLToken( rStrImpValue, XML_NO_LIMIT ) )
	{
		sal_Int32 nValue = 0;
		bRet = SvXMLUnitConverter::convertNumber( nValue, rStrImpValue );
		bVal = 1 == nValue;
	}

	if( bRet )
		rValue.setValue( &bVal, ::getBooleanCppuType() );

	return bRet;
}

sal_Bool XMLParagraphOnlyPropHdl_Impl::exportXML(
		OUString& rStrExpValue,
		const Any& rValue,
		const SvXMLUnitConverter& ) const
{
	if( *(sal_Bool *)rValue.getValue() )
	   	rStrExpValue = GetXMLToken( XML_1 );
	else
	   	rStrExpValue = GetXMLToken( XML_NO_LIMIT );

	return sal_True;
}

XMLParagraphOnlyPropHdl_Impl::~XMLParagraphOnlyPropHdl_Impl()
{
}

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

SvXMLEnumMapEntry __READONLY_DATA pXML_Wrap_Enum[] =
{
	{ XML_NONE,		    WrapTextMode_NONE },
	{ XML_RUN_THROUGH,	WrapTextMode_THROUGHT },
	{ XML_PARALLEL,	    WrapTextMode_PARALLEL },
	{ XML_DYNAMIC,		WrapTextMode_DYNAMIC },
	{ XML_LEFT,		    WrapTextMode_LEFT },
	{ XML_RIGHT,		WrapTextMode_RIGHT },
	{ XML_TOKEN_INVALID, 0 }
};

class XMLWrapPropHdl_Impl : public XMLPropertyHandler
{
public:
	virtual ~XMLWrapPropHdl_Impl ();

	virtual sal_Bool importXML(
			const ::rtl::OUString& rStrImpValue,
			::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
	virtual sal_Bool exportXML(
			::rtl::OUString& rStrExpValue,
			const ::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
};

sal_Bool XMLWrapPropHdl_Impl::importXML(
		const OUString& rStrImpValue,
	   	Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_uInt16 nWrap;
	sal_Bool bRet = SvXMLUnitConverter::convertEnum( nWrap, rStrImpValue,
												pXML_Wrap_Enum );

	if( bRet )
		rValue <<= (WrapTextMode)nWrap;

	return bRet;
}

sal_Bool XMLWrapPropHdl_Impl::exportXML(
		OUString& rStrExpValue,
		const Any& rValue,
		const SvXMLUnitConverter& ) const
{
	OUStringBuffer aOut;
	WrapTextMode eVal;

	rValue >>= eVal;

	sal_Bool bRet = SvXMLUnitConverter::convertEnum( aOut, eVal, pXML_Wrap_Enum, XML_NONE );

	rStrExpValue = aOut.makeStringAndClear();

	return bRet;
}

XMLWrapPropHdl_Impl::~XMLWrapPropHdl_Impl ()
{
}

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

class XMLFrameProtectPropHdl_Impl : public XMLPropertyHandler
{
	const OUString sVal;
public:
	XMLFrameProtectPropHdl_Impl( enum XMLTokenEnum eVal ) :
	   	sVal( GetXMLToken(eVal) ) {}
	virtual ~XMLFrameProtectPropHdl_Impl ();

	virtual sal_Bool importXML(
			const ::rtl::OUString& rStrImpValue,
			::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
	virtual sal_Bool exportXML(
			::rtl::OUString& rStrExpValue,
			const ::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
};

sal_Bool XMLFrameProtectPropHdl_Impl::importXML(
		const OUString& rStrImpValue,
	   	Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_Bool bRet = sal_True;
	sal_Bool bVal = sal_False;
	if( ! IsXMLToken( rStrImpValue, XML_NONE ) )
	{
		bRet = sal_False;
		SvXMLTokenEnumerator aTokenEnum( rStrImpValue );
		OUString aToken;
		while( aTokenEnum.getNextToken( aToken ) )
		{
			bRet = sal_True;
			if( aToken == sVal )
			{
				bVal = sal_True;
				break;
			}
		}
	}

	if( bRet )
		rValue.setValue( &bVal, ::getBooleanCppuType() );

	return bRet;
}

sal_Bool XMLFrameProtectPropHdl_Impl::exportXML(
		OUString& rStrExpValue,
		const Any& rValue,
		const SvXMLUnitConverter& ) const
{
	if( *(sal_Bool *)rValue.getValue() )
	{
		if( !rStrExpValue.getLength() ||
			IsXMLToken( rStrExpValue, XML_NONE ) )
		{
	   		rStrExpValue = sVal;
		}
		else
		{
			OUStringBuffer aOut( rStrExpValue.getLength() + 1 +
								 sVal.getLength() );
			aOut.append( rStrExpValue );
			aOut.append( (sal_Unicode)' ' );
			aOut.append( sVal );
			rStrExpValue = aOut.makeStringAndClear();
		}
	}
	else if( !rStrExpValue.getLength() )
	{
	   	rStrExpValue = GetXMLToken( XML_NONE );
	}

	return sal_True;
}

XMLFrameProtectPropHdl_Impl::~XMLFrameProtectPropHdl_Impl()
{
}

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

SvXMLEnumMapEntry __READONLY_DATA pXML_Anchor_Enum[] =
{
	{ XML_CHAR,		    TextContentAnchorType_AT_CHARACTER },
	{ XML_PAGE,	        TextContentAnchorType_AT_PAGE },
	{ XML_FRAME,	    TextContentAnchorType_AT_FRAME },
	{ XML_PARAGRAPH,		TextContentAnchorType_AT_PARAGRAPH },
	{ XML_AS_CHAR,	    TextContentAnchorType_AS_CHARACTER },
	{ XML_TOKEN_INVALID, 0 }
};


sal_Bool XMLAnchorTypePropHdl::importXML(
		const OUString& rStrImpValue,
	   	Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_uInt16 nAnchor;
	sal_Bool bRet = SvXMLUnitConverter::convertEnum( nAnchor, rStrImpValue,
												pXML_Anchor_Enum );

	if( bRet )
		rValue <<= (TextContentAnchorType)nAnchor;

	return bRet;
}

sal_Bool XMLAnchorTypePropHdl::exportXML(
		OUString& rStrExpValue,
		const Any& rValue,
		const SvXMLUnitConverter& ) const
{
	OUStringBuffer aOut;
	TextContentAnchorType eVal;

	rValue >>= eVal;

	sal_Bool bRet = SvXMLUnitConverter::convertEnum( aOut, eVal, pXML_Anchor_Enum, XML_PARAGRAPH );

	rStrExpValue = aOut.makeStringAndClear();

	return bRet;
}

XMLAnchorTypePropHdl::~XMLAnchorTypePropHdl()
{
}

sal_Bool XMLAnchorTypePropHdl::convert( const OUString& rStrImpValue,
				 TextContentAnchorType& rType )
{
	sal_uInt16 nAnchor;
	sal_Bool bRet = SvXMLUnitConverter::convertEnum( nAnchor, rStrImpValue,
												pXML_Anchor_Enum );
	if( bRet )
		rType = (TextContentAnchorType)nAnchor;
	return bRet;
}

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


XMLTextColumnsPropertyHandler::~XMLTextColumnsPropertyHandler ()
{
}

bool XMLTextColumnsPropertyHandler::equals(
		const Any& r1,
		const Any& r2 ) const
{
	Reference < XTextColumns > xColumns1;
	r1 >>= xColumns1;

	Reference < XTextColumns > xColumns2;
	r2 >>= xColumns2;

	if( xColumns1->getColumnCount() != xColumns2->getColumnCount() ||
	  	xColumns1->getReferenceValue() != xColumns2->getReferenceValue() )
		return sal_False;

	Sequence < TextColumn > aColumns1 = xColumns1->getColumns();
	Sequence < TextColumn > aColumns2 = xColumns2->getColumns();
	sal_Int32 nCount = aColumns1.getLength();
	if( aColumns2.getLength() != nCount )
		return sal_False;

	const TextColumn *pColumns1 = aColumns1.getArray();
	const TextColumn *pColumns2 = aColumns2.getArray();

	while( nCount-- )
	{
		if( pColumns1->Width != pColumns2->Width ||
		 	pColumns1->LeftMargin != pColumns2->LeftMargin ||
		 	pColumns1->RightMargin != pColumns2->RightMargin )
			return sal_False;

		pColumns1++;
		pColumns2++;
	}

	return sal_True;
}

sal_Bool XMLTextColumnsPropertyHandler::importXML(
		const OUString&,
	   	Any&,
		const SvXMLUnitConverter& ) const
{
	DBG_ASSERT( sal_False, "columns are an element import property" );
	return sal_False;
}

sal_Bool XMLTextColumnsPropertyHandler::exportXML(
		OUString&,
		const Any&,
		const SvXMLUnitConverter& ) const
{
	DBG_ASSERT( sal_False, "columns are an element export property" );
	return sal_False;
}

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

class XMLHoriMirrorPropHdl_Impl : public XMLPropertyHandler
{
public:
	virtual ~XMLHoriMirrorPropHdl_Impl ();

	virtual sal_Bool importXML(
			const ::rtl::OUString& rStrImpValue,
			::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
	virtual sal_Bool exportXML(
			::rtl::OUString& rStrExpValue,
			const ::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
};

sal_Bool XMLHoriMirrorPropHdl_Impl::importXML(
		const OUString& rStrImpValue,
	   	Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_uInt16 nHoriMirror;
	sal_Bool bRet = SvXMLUnitConverter::convertEnum( nHoriMirror, rStrImpValue,
												pXML_HoriMirror_Enum );

	if( bRet )
	{
		sal_Bool bTmp = nHoriMirror != 0;
		rValue.setValue( &bTmp, ::getBooleanCppuType() );
	}

	return bRet;
}

sal_Bool XMLHoriMirrorPropHdl_Impl::exportXML(
		OUString&,
		const Any&,
		const SvXMLUnitConverter& ) const
{
	DBG_ASSERT( sal_False, "HorMirror property shouldn't be exported" );

	return sal_False;
}

XMLHoriMirrorPropHdl_Impl::~XMLHoriMirrorPropHdl_Impl ()
{
}

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

class XMLGrfMirrorPropHdl_Impl : public XMLPropertyHandler
{
	const OUString sVal;
	sal_Bool bHori;

public:
	XMLGrfMirrorPropHdl_Impl( enum XMLTokenEnum eVal, sal_Bool bH ) :
	   	sVal( GetXMLToken( eVal ) ),
		bHori( bH ) {}
	virtual ~XMLGrfMirrorPropHdl_Impl ();

	virtual sal_Bool importXML(
			const ::rtl::OUString& rStrImpValue,
			::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
	virtual sal_Bool exportXML(
			::rtl::OUString& rStrExpValue,
			const ::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
};

sal_Bool XMLGrfMirrorPropHdl_Impl::importXML(
		const OUString& rStrImpValue,
	   	Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_Bool bRet = sal_True;
	sal_Bool bVal = sal_False;
	if( ! IsXMLToken( rStrImpValue, XML_NONE ) )
	{
		bRet = sal_False;
		SvXMLTokenEnumerator aTokenEnum( rStrImpValue );
		OUString aToken;
		while( aTokenEnum.getNextToken( aToken ) )
		{
			bRet = sal_True;
			if( aToken == sVal ||
			 	(bHori && IsXMLToken( aToken, XML_HORIZONTAL ) ) )
			{
				bVal = sal_True;
				break;
			}
		}
	}

	if( bRet )
		rValue.setValue( &bVal, ::getBooleanCppuType() );

	return bRet;
}

sal_Bool XMLGrfMirrorPropHdl_Impl::exportXML(
		OUString& rStrExpValue,
		const Any& rValue,
		const SvXMLUnitConverter& ) const
{
	if( *(sal_Bool *)rValue.getValue() )
	{
		if( !rStrExpValue.getLength() ||
			IsXMLToken( rStrExpValue, XML_NONE ) )
		{
	   		rStrExpValue = sVal;
		}
		else if( bHori &&
                 // --> OD 2005-05-12 #i49139#
                 // XML_HORIZONTAL_ON_LEFT_PAGES and XML_HORIZONTAL_ON_RIGHT_PAGES
                 // are replaced by XML_HORIZONTAL_ON_EVEN and XML_HORIZONTAL_ON_ODD.
                 ( IsXMLToken( rStrExpValue, XML_HORIZONTAL_ON_EVEN ) ||
                   IsXMLToken( rStrExpValue, XML_HORIZONTAL_ON_ODD ) ))
                 // <--
		{
			rStrExpValue = GetXMLToken( XML_HORIZONTAL );
		}
		else
		{
			OUStringBuffer aOut( rStrExpValue.getLength() + 1 +
								 sVal.getLength() );
			aOut.append( rStrExpValue );
			aOut.append( (sal_Unicode)' ' );
			aOut.append( sVal );
			rStrExpValue = aOut.makeStringAndClear();
		}
	}
	else if( !rStrExpValue.getLength() )
	{
	   	rStrExpValue = GetXMLToken( XML_NONE );
	}

	return sal_True;
}

XMLGrfMirrorPropHdl_Impl::~XMLGrfMirrorPropHdl_Impl()
{
}

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

SvXMLEnumMapEntry __READONLY_DATA pXML_Emphasize_Enum[] =
{
	{ XML_NONE,	    FontEmphasis::NONE },
	{ XML_DOT,		FontEmphasis::DOT_ABOVE },
	{ XML_CIRCLE,	FontEmphasis::CIRCLE_ABOVE },
	{ XML_DISC,	    FontEmphasis::DISK_ABOVE },
	{ XML_ACCENT,	FontEmphasis::ACCENT_ABOVE },
	{ XML_TOKEN_INVALID, 0 }
};
class XMLTextEmphasizePropHdl_Impl : public XMLPropertyHandler
{
public:
	XMLTextEmphasizePropHdl_Impl() {}
	virtual ~XMLTextEmphasizePropHdl_Impl();

	virtual sal_Bool importXML(
			const ::rtl::OUString& rStrImpValue,
			::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
	virtual sal_Bool exportXML(
			::rtl::OUString& rStrExpValue,
			const ::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
};

sal_Bool XMLTextEmphasizePropHdl_Impl::importXML(
		const OUString& rStrImpValue,
	   	Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_Bool bRet = sal_True;
	sal_uInt16 nVal = FontEmphasis::NONE;
	sal_Bool bBelow = sal_False;
	sal_Bool bHasPos = sal_False, bHasType = sal_False;
	OUString aToken;

	SvXMLTokenEnumerator aTokenEnum( rStrImpValue );
	while( aTokenEnum.getNextToken( aToken ) )
	{
		if( !bHasPos && IsXMLToken( aToken, XML_ABOVE ) )
		{
			bBelow = sal_False;
			bHasPos = sal_True;
		}
		else if( !bHasPos && IsXMLToken( aToken, XML_BELOW ) )
		{
			bBelow = sal_True;
			bHasPos = sal_True;
		}
		else if( !bHasType &&
			 	 SvXMLUnitConverter::convertEnum( nVal, aToken,
											 pXML_Emphasize_Enum ))
		{
			bHasType = sal_True;
		}
		else
		{
			bRet = sal_False;
			break;
		}
	}

	if( bRet )
	{
		if( FontEmphasis::NONE != nVal && bBelow )
			nVal += 10;
		rValue <<= (sal_Int16)nVal;
	}

	return bRet;
}

sal_Bool XMLTextEmphasizePropHdl_Impl::exportXML(
		OUString& rStrExpValue,
		const Any& rValue,
		const SvXMLUnitConverter& ) const
{
	OUStringBuffer aOut( 15 );
	sal_Bool bRet = sal_True;
	sal_Int16 nType = sal_Int16();
	if( rValue >>= nType )
	{
		sal_Bool bBelow = sal_False;
		if( nType > 10 )
		{
			bBelow = sal_True;
			nType -= 10;
		}
		bRet = SvXMLUnitConverter::convertEnum( aOut, nType,
										   pXML_Emphasize_Enum,
										   XML_DOT );
		if( bRet )
		{
			if( nType != 0 )
			{
				enum XMLTokenEnum ePos = bBelow ? XML_BELOW : XML_ABOVE;
				aOut.append( (sal_Unicode)' ' );
				aOut.append( GetXMLToken(ePos) );
			}
			rStrExpValue = aOut.makeStringAndClear();
		}
	}

	return bRet;
}

XMLTextEmphasizePropHdl_Impl::~XMLTextEmphasizePropHdl_Impl()
{
}


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

class XMLTextCombineCharPropHdl_Impl : public XMLPropertyHandler
{
public:
	XMLTextCombineCharPropHdl_Impl() {}
	virtual ~XMLTextCombineCharPropHdl_Impl();

	virtual sal_Bool importXML(
			const ::rtl::OUString& rStrImpValue,
			::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
	virtual sal_Bool exportXML(
			::rtl::OUString& rStrExpValue,
			const ::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
};

sal_Bool XMLTextCombineCharPropHdl_Impl::importXML(
		const OUString& rStrImpValue,
	   	Any& rValue,
		const SvXMLUnitConverter& ) const
{
	if( rStrImpValue.getLength() )
		rValue <<= rStrImpValue.copy( 0, 1 );
	else
		rValue <<= rStrImpValue;

	return sal_True;
}

sal_Bool XMLTextCombineCharPropHdl_Impl::exportXML(
		OUString& rStrExpValue,
		const Any& rValue,
		const SvXMLUnitConverter& ) const
{
	rValue >>= rStrExpValue;

    // #i114107# attribute of type "character": export only if length is 1
    return (1 == rStrExpValue.getLength())  ? sal_True : sal_False;
}

XMLTextCombineCharPropHdl_Impl::~XMLTextCombineCharPropHdl_Impl()
{
}

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

class XMLTextRelWidthHeightPropHdl_Impl : public XMLPropertyHandler
{
public:
	XMLTextRelWidthHeightPropHdl_Impl() {}
	virtual ~XMLTextRelWidthHeightPropHdl_Impl();

	virtual sal_Bool importXML(
			const ::rtl::OUString& rStrImpValue,
			::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
	virtual sal_Bool exportXML(
			::rtl::OUString& rStrExpValue,
			const ::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
};

sal_Bool XMLTextRelWidthHeightPropHdl_Impl::importXML(
		const OUString& rStrImpValue,
	   	Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_Bool bRet;
	sal_Int32 nValue;
	bRet = SvXMLUnitConverter::convertPercent( nValue, rStrImpValue );
	if( bRet )
		rValue <<= (sal_Int16)nValue;

	return bRet;
}

sal_Bool XMLTextRelWidthHeightPropHdl_Impl::exportXML(
		OUString& rStrExpValue,
		const Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_Bool bRet = sal_False;
	sal_Int16 nValue = sal_Int16();
	if( (rValue >>= nValue) && nValue > 0 )
	{
		OUStringBuffer aOut;
	 	SvXMLUnitConverter::convertPercent( aOut, nValue );
		rStrExpValue = aOut.makeStringAndClear();

		bRet = sal_True;
	}

	return bRet;
}

XMLTextRelWidthHeightPropHdl_Impl::~XMLTextRelWidthHeightPropHdl_Impl()
{
}

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

class XMLTextSyncWidthHeightPropHdl_Impl : public XMLPropertyHandler
{
	const OUString sValue;

public:
	XMLTextSyncWidthHeightPropHdl_Impl( enum XMLTokenEnum eValue ) :
   		sValue( GetXMLToken(eValue) )	{}
	virtual ~XMLTextSyncWidthHeightPropHdl_Impl();

	virtual sal_Bool importXML(
			const ::rtl::OUString& rStrImpValue,
			::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
	virtual sal_Bool exportXML(
			::rtl::OUString& rStrExpValue,
			const ::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
};

sal_Bool XMLTextSyncWidthHeightPropHdl_Impl::importXML(
		const OUString& rStrImpValue,
	   	Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_Bool bValue = (rStrImpValue == sValue );
	rValue.setValue( &bValue, ::getBooleanCppuType() );

	return sal_True;
}

sal_Bool XMLTextSyncWidthHeightPropHdl_Impl::exportXML(
		OUString& rStrExpValue,
		const Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_Bool bRet = sal_False;
	if( *(sal_Bool *)rValue.getValue() )
	{
		rStrExpValue = sValue;
		bRet = sal_True;
	}

	return bRet;
}

XMLTextSyncWidthHeightPropHdl_Impl::~XMLTextSyncWidthHeightPropHdl_Impl()
{
}

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

class XMLTextRotationAnglePropHdl_Impl : public XMLPropertyHandler
{

public:
	XMLTextRotationAnglePropHdl_Impl()	{}
	virtual ~XMLTextRotationAnglePropHdl_Impl();

	virtual sal_Bool importXML(
			const ::rtl::OUString& rStrImpValue,
			::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
	virtual sal_Bool exportXML(
			::rtl::OUString& rStrExpValue,
			const ::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
};

sal_Bool XMLTextRotationAnglePropHdl_Impl::importXML(
		const OUString& rStrImpValue,
	   	Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_Int32 nValue;
	sal_Bool bRet = SvXMLUnitConverter::convertNumber( nValue, rStrImpValue );
	if( bRet )
	{
		nValue = (nValue % 360 );
		if( nValue < 0 )
			nValue = 360 + nValue;
		sal_Int16 nAngle;
		if( nValue < 45 || nValue > 315 )
			nAngle = 0;
		else if( nValue < 180 )
			nAngle = 900;
		else /* if nValalue <= 315 ) */
			nAngle = 2700;
		rValue <<= nAngle;
	}

	return bRet;
}

sal_Bool XMLTextRotationAnglePropHdl_Impl::exportXML(
		OUString& rStrExpValue,
		const Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_Int16 nAngle = sal_Int16();
	sal_Bool bRet = ( rValue >>= nAngle );
	if( bRet )
	{
		OUStringBuffer aOut;
		SvXMLUnitConverter::convertNumber( aOut, nAngle / 10 );
		rStrExpValue = aOut.makeStringAndClear();
	}
	OSL_ENSURE( bRet, "illegal rotation angle" );

	return bRet;
}

XMLTextRotationAnglePropHdl_Impl::~XMLTextRotationAnglePropHdl_Impl()
{
}
// ---------------------------------------------------------------------------
class XMLNumber8OneBasedHdl : public XMLPropertyHandler
{

public:
	XMLNumber8OneBasedHdl()	{}
	virtual ~XMLNumber8OneBasedHdl() {};

	virtual sal_Bool importXML(
			const ::rtl::OUString& rStrImpValue,
			::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
	virtual sal_Bool exportXML(
			::rtl::OUString& rStrExpValue,
			const ::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& ) const;
};

sal_Bool XMLNumber8OneBasedHdl::importXML(
		const OUString& rStrImpValue,
	   	Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_Int32 nValue = 0;
	sal_Bool bRet = SvXMLUnitConverter::convertNumber( nValue, rStrImpValue );
    if( bRet )
        rValue <<= static_cast<sal_Int8>( nValue - 1 );
	return bRet;
}

sal_Bool XMLNumber8OneBasedHdl::exportXML(
		OUString& rStrExpValue,
		const Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_Int8 nValue = sal_Int8();
	sal_Bool bRet = ( rValue >>= nValue );
    if( bRet )
	{
        OUStringBuffer aOut;
	 	SvXMLUnitConverter::convertNumber( aOut, nValue + 1 );
		rStrExpValue = aOut.makeStringAndClear();
	}
	return bRet;
}
// ---------------------------------------------------------------------------
class XMLTextPropertyHandlerFactory_Impl
{
public:
	const XMLPropertyHandler *GetPropertyHandler( sal_Int32 nType ) const;

	XMLTextPropertyHandlerFactory_Impl();
	~XMLTextPropertyHandlerFactory_Impl();
};

const XMLPropertyHandler *XMLTextPropertyHandlerFactory_Impl::GetPropertyHandler
	( sal_Int32 nType ) const
{
	const XMLPropertyHandler* pHdl = 0;
	switch( nType )
	{
	case XML_TYPE_TEXT_DROPCAP:
		pHdl = new XMLDropCapPropHdl_Impl;
		break;
	case XML_TYPE_TEXT_WRAP:
		pHdl = new XMLWrapPropHdl_Impl;
		break;
	case XML_TYPE_TEXT_PARAGRAPH_ONLY:
		pHdl = new XMLParagraphOnlyPropHdl_Impl;
		break;
	case XML_TYPE_TEXT_WRAP_OUTSIDE:
		pHdl = new XMLContourModePropHdl_Impl;
		break;
	case XML_TYPE_TEXT_OPAQUE:
		pHdl = new XMLOpaquePropHdl_Impl;
		break;
	case XML_TYPE_TEXT_PROTECT_CONTENT:
		pHdl = new XMLFrameProtectPropHdl_Impl( XML_CONTENT );
		break;
	case XML_TYPE_TEXT_PROTECT_SIZE:
		pHdl = new XMLFrameProtectPropHdl_Impl( XML_SIZE );
		break;
	case XML_TYPE_TEXT_PROTECT_POSITION:
		pHdl = new XMLFrameProtectPropHdl_Impl( XML_POSITION );
		break;
	case XML_TYPE_TEXT_ANCHOR_TYPE:
		pHdl = new XMLAnchorTypePropHdl;
		break;
	case XML_TYPE_TEXT_COLUMNS:
		pHdl = new XMLTextColumnsPropertyHandler;
		break;
	case XML_TYPE_TEXT_HORIZONTAL_POS:
		pHdl = new XMLConstantsPropertyHandler( pXML_HoriPos_Enum, XML_TOKEN_INVALID );
		break;
	case XML_TYPE_TEXT_HORIZONTAL_POS_MIRRORED:
		pHdl = new XMLConstantsPropertyHandler( pXML_HoriPosMirrored_Enum, XML_TOKEN_INVALID );
		break;
	case XML_TYPE_TEXT_HORIZONTAL_REL:
		pHdl = new XMLConstantsPropertyHandler( pXML_HoriRel_Enum, XML_TOKEN_INVALID );
		break;
	case XML_TYPE_TEXT_HORIZONTAL_REL_FRAME:
		pHdl = new XMLConstantsPropertyHandler( pXML_HoriRelFrame_Enum, XML_TOKEN_INVALID );
		break;
	case XML_TYPE_TEXT_HORIZONTAL_MIRROR:
		pHdl = new XMLHoriMirrorPropHdl_Impl;
		break;
	case XML_TYPE_TEXT_VERTICAL_POS:
		pHdl = new XMLConstantsPropertyHandler( pXML_VertPos_Enum, XML_TOKEN_INVALID );
		break;
	case XML_TYPE_TEXT_VERTICAL_POS_AT_CHAR:
		pHdl = new XMLConstantsPropertyHandler( pXML_VertPosAtChar_Enum, XML_TOKEN_INVALID );
		break;
	case XML_TYPE_TEXT_VERTICAL_REL:
		pHdl = new XMLConstantsPropertyHandler( pXML_VertRel_Enum, XML_TOKEN_INVALID );
		break;
	case XML_TYPE_TEXT_VERTICAL_REL_PAGE:
		pHdl = new XMLConstantsPropertyHandler( pXML_VertRelPage_Enum, XML_TOKEN_INVALID );
		break;
	case XML_TYPE_TEXT_VERTICAL_REL_FRAME:
		pHdl = new XMLConstantsPropertyHandler( pXML_VertRelFrame_Enum, XML_TOKEN_INVALID );
		break;
	case XML_TYPE_TEXT_VERTICAL_REL_AS_CHAR:
		pHdl = new XMLConstantsPropertyHandler( pXML_VertRelAsChar_Enum, XML_TOKEN_INVALID );
		break;
	case XML_TYPE_TEXT_MIRROR_VERTICAL:
		pHdl = new XMLGrfMirrorPropHdl_Impl( XML_VERTICAL, sal_False );
		break;
	case XML_TYPE_TEXT_MIRROR_HORIZONTAL_LEFT:
        // --> OD 2005-05-12 #i49139#
        // XML_HORIZONTAL_ON_LEFT_PAGES is replaced by XML_HORIZONTAL_ON_EVEN.
        pHdl = new XMLGrfMirrorPropHdl_Impl( XML_HORIZONTAL_ON_EVEN, sal_True );
        // <--
		break;
	case XML_TYPE_TEXT_MIRROR_HORIZONTAL_RIGHT:
        // --> OD 2005-05-12 #i49139#
        // XML_HORIZONTAL_ON_RIGHT_PAGES is replaced by XML_HORIZONTAL_ON_ODD.
        pHdl = new XMLGrfMirrorPropHdl_Impl( XML_HORIZONTAL_ON_ODD, sal_True );
        // <--
		break;
	case XML_TYPE_TEXT_CLIP:
		pHdl = new XMLClipPropertyHandler( sal_False );
		break;
	case XML_TYPE_TEXT_CLIP11:
		pHdl = new XMLClipPropertyHandler( sal_True );
		break;
	case XML_TYPE_TEXT_EMPHASIZE:
		pHdl = new XMLTextEmphasizePropHdl_Impl;
		break;
	case XML_TYPE_TEXT_COMBINE:
		pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken( XML_LINES ),
                                            GetXMLToken( XML_NONE ) );
		break;
	case XML_TYPE_TEXT_COMBINE_CHARACTERS:
		pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken( XML_LETTERS ),
                                            GetXMLToken( XML_NONE ) );
		break;
	case XML_TYPE_TEXT_COMBINECHAR:
		pHdl = new XMLTextCombineCharPropHdl_Impl;
		break;
	case XML_TYPE_TEXT_AUTOSPACE:
		pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken( XML_IDEOGRAPH_ALPHA ),
                                            GetXMLToken( XML_NONE ) );
		break;
	case XML_TYPE_TEXT_PUNCTUATION_WRAP:
		pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken( XML_HANGING ),
                                            GetXMLToken( XML_SIMPLE ) );
		break;
	case XML_TYPE_TEXT_LINE_BREAK:
		pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken( XML_STRICT ),
                                            GetXMLToken( XML_NORMAL ) );
		break;
	case XML_TYPE_TEXT_REL_WIDTH_HEIGHT:
		pHdl = new XMLTextRelWidthHeightPropHdl_Impl;
		break;
	case XML_TYPE_TEXT_SYNC_WIDTH_HEIGHT:
		pHdl = new XMLTextSyncWidthHeightPropHdl_Impl( XML_SCALE );
		break;
	case XML_TYPE_TEXT_SYNC_WIDTH_HEIGHT_MIN:
		pHdl = new XMLTextSyncWidthHeightPropHdl_Impl( XML_SCALE_MIN );
		break;
	case XML_TYPE_TEXT_RUBY_ADJUST:
		pHdl = new XMLConstantsPropertyHandler( pXML_RubyAdjust_Enum, XML_TOKEN_INVALID );
		break;
	case XML_TYPE_TEXT_FONT_RELIEF:
		pHdl = new XMLConstantsPropertyHandler( pXML_FontRelief_Enum, XML_TOKEN_INVALID );
		break;
	case XML_TYPE_TEXT_ROTATION_ANGLE:
		pHdl = new XMLTextRotationAnglePropHdl_Impl;
		break;
	case XML_TYPE_TEXT_ROTATION_SCALE:
		pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken( XML_FIXED ),
                                            GetXMLToken( XML_LINE_HEIGHT ) );
		break;
	case XML_TYPE_TEXT_VERTICAL_ALIGN:
		pHdl = new XMLConstantsPropertyHandler( pXML_VerticalAlign_Enum, XML_TOKEN_INVALID );
		break;
	case XML_TYPE_TEXT_RUBY_POSITION:
		pHdl = new XMLNamedBoolPropertyHdl( ::xmloff::token::XML_ABOVE,
											::xmloff::token::XML_BELOW );
		break;
    // OD 2004-05-05 #i28701#
    case XML_TYPE_WRAP_INFLUENCE_ON_POSITION:
        pHdl = new XMLConstantsPropertyHandler( pXML_WrapInfluenceOnPosition_Enum,
                                                XML_TOKEN_INVALID );
        break;
    case XML_TYPE_BORDER_MODEL:
        pHdl = new XMLNamedBoolPropertyHdl( xmloff::token::XML_COLLAPSING,
                                            xmloff::token::XML_SEPARATING );
        break;
	case XML_TYPE_TEXT_LINE_MODE:
		pHdl = new XMLNamedBoolPropertyHdl(
									::xmloff::token::XML_SKIP_WHITE_SPACE,
                                    ::xmloff::token::XML_CONTINUOUS);
		break;
	case XML_TYPE_TEXT_KEEP:
		pHdl = new XMLNamedBoolPropertyHdl(
									::xmloff::token::XML_ALWAYS,
                                    ::xmloff::token::XML_AUTO);
		break;
	case XML_TYPE_TEXT_NKEEP:
		pHdl = new XMLNamedBoolPropertyHdl(
									::xmloff::token::XML_AUTO,
                                    ::xmloff::token::XML_ALWAYS);
		break;
    case XML_TYPE_TEXT_NUMBER8_ONE_BASED:
        pHdl = new XMLNumber8OneBasedHdl();
        break;

        //UUUU
        case XML_SW_TYPE_FILLSTYLE:
            pHdl = new XMLEnumPropertyHdl( aXML_FillStyle_EnumMap, ::getCppuType((const FillStyle*)0) );
            break;
        case XML_SW_TYPE_FILLBITMAPSIZE:
            pHdl = new XMLFillBitmapSizePropertyHandler();
            break;
        case XML_SW_TYPE_LOGICAL_SIZE:
            pHdl = new XMLBitmapLogicalSizePropertyHandler();
            break;
        case XML_SW_TYPE_BITMAP_REFPOINT:
            pHdl = new XMLEnumPropertyHdl( aXML_RefPoint_EnumMap, getCppuType((const RectanglePoint*)0) );
            break;
        case XML_SW_TYPE_BITMAP_MODE:
            pHdl = new XMLEnumPropertyHdl( aXML_BitmapMode_EnumMap, getCppuType((const BitmapMode*)0) );
            break;
        case XML_SW_TYPE_BITMAPREPOFFSETX:
        case XML_SW_TYPE_BITMAPREPOFFSETY:
            pHdl = new XMLBitmapRepeatOffsetPropertyHandler(XML_SW_TYPE_BITMAPREPOFFSETX == nType);
            break;

        //UUUU
        default:
        {
            OSL_ENSURE(false, "XMLPropertyHandler missing (!)");
            break;
        }
    }

	return pHdl;
}

XMLTextPropertyHandlerFactory_Impl::XMLTextPropertyHandlerFactory_Impl()
{
}

XMLTextPropertyHandlerFactory_Impl::~XMLTextPropertyHandlerFactory_Impl()
{
}

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

XMLTextPropertyHandlerFactory::XMLTextPropertyHandlerFactory() :
	XMLPropertyHandlerFactory(),
   pImpl( new XMLTextPropertyHandlerFactory_Impl )
{
}

XMLTextPropertyHandlerFactory::~XMLTextPropertyHandlerFactory()
{
	delete pImpl;
}

const XMLPropertyHandler *XMLTextPropertyHandlerFactory::GetPropertyHandler(
		sal_Int32 nType ) const
{
	const XMLPropertyHandler *pHdl =
		XMLPropertyHandlerFactory::GetPropertyHandler( nType );

	if( !pHdl )
	{
		const XMLPropertyHandler *pNewHdl = pImpl->GetPropertyHandler( nType );

		if( pNewHdl )
			PutHdlCache( nType, pNewHdl );

		pHdl = pNewHdl;
	}

	return pHdl;
}
