/**************************************************************
 * 
 * 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 <com/sun/star/awt/FontFamily.hpp>
#include <com/sun/star/awt/FontPitch.hpp>
#include <com/sun/star/table/BorderLine.hpp>
#include <com/sun/star/text/VertOrientation.hpp>
#include <com/sun/star/text/SizeType.hpp>
#include <tools/string.hxx>
#include <xmloff/XMLFontStylesContext.hxx>
#include <xmloff/txtprmap.hxx>
#include <xmloff/xmlimp.hxx>
#include "xmloff/txtimppr.hxx"

#define XML_LINE_LEFT 0
#define XML_LINE_RIGHT 1
#define XML_LINE_TOP 2
#define XML_LINE_BOTTOM 3
#define MIN_BORDER_DIST 49

using ::rtl::OUString;

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::table;
using namespace ::com::sun::star::text;

sal_Bool XMLTextImportPropertyMapper::handleSpecialItem(
			XMLPropertyState& rProperty,
			::std::vector< XMLPropertyState >& rProperties,
			const ::rtl::OUString& rValue,
			const SvXMLUnitConverter& rUnitConverter,
			const SvXMLNamespaceMap& rNamespaceMap ) const
{
	sal_Bool bRet = sal_False;
	sal_Int32 nIndex = rProperty.mnIndex;
	switch( getPropertySetMapper()->GetEntryContextId( nIndex  ) )
	{
	case CTF_FONTNAME:
	case CTF_FONTNAME_CJK:
	case CTF_FONTNAME_CTL:
		if( xFontDecls.Is() )
		{
			DBG_ASSERT(
				( CTF_FONTFAMILYNAME ==
					getPropertySetMapper()->GetEntryContextId(nIndex+1) &&
				  CTF_FONTSTYLENAME ==
					getPropertySetMapper()->GetEntryContextId(nIndex+2) &&
				  CTF_FONTFAMILY ==
					getPropertySetMapper()->GetEntryContextId(nIndex+3) &&
				  CTF_FONTPITCH ==
					getPropertySetMapper()->GetEntryContextId(nIndex+4) &&
				  CTF_FONTCHARSET ==
					getPropertySetMapper()->GetEntryContextId(nIndex+5) ) ||
				( CTF_FONTFAMILYNAME_CJK ==
					getPropertySetMapper()->GetEntryContextId(nIndex+1) &&
				  CTF_FONTSTYLENAME_CJK ==
					getPropertySetMapper()->GetEntryContextId(nIndex+2) &&
				  CTF_FONTFAMILY_CJK ==
					getPropertySetMapper()->GetEntryContextId(nIndex+3) &&
				  CTF_FONTPITCH_CJK ==
					getPropertySetMapper()->GetEntryContextId(nIndex+4) &&
				  CTF_FONTCHARSET_CJK ==
					getPropertySetMapper()->GetEntryContextId(nIndex+5) ) ||
				( CTF_FONTFAMILYNAME_CTL ==
					getPropertySetMapper()->GetEntryContextId(nIndex+1) &&
				  CTF_FONTSTYLENAME_CTL ==
					getPropertySetMapper()->GetEntryContextId(nIndex+2) &&
				  CTF_FONTFAMILY_CTL ==
					getPropertySetMapper()->GetEntryContextId(nIndex+3) &&
				  CTF_FONTPITCH_CTL ==
					getPropertySetMapper()->GetEntryContextId(nIndex+4) &&
				  CTF_FONTCHARSET_CTL ==
					getPropertySetMapper()->GetEntryContextId(nIndex+5) ),
				"illegal property map" );

			((XMLFontStylesContext *)&xFontDecls)->FillProperties(
							rValue, rProperties,
							rProperty.mnIndex+1, rProperty.mnIndex+2,
							rProperty.mnIndex+3, rProperty.mnIndex+4,
							rProperty.mnIndex+5 );
			bRet = sal_False; // the property hasn't been filled
		}
		break;

    // If we want to do StarMath/StarSymbol font conversion, then we'll 
    // want these special items to be treated just like regular ones...
    // For the Writer, we'll catch and convert them in _FillPropertySet;
    // the other apps probably don't care. For the other apps, we just
	// imitate the default non-special-item mechanism.
	case CTF_FONTFAMILYNAME:
	case CTF_FONTFAMILYNAME_CJK:
	case CTF_FONTFAMILYNAME_CTL:
		bRet = getPropertySetMapper()->importXML( rValue, rProperty,
												  rUnitConverter );			
        break;

    case CTF_TEXT_DISPLAY:
		bRet = getPropertySetMapper()->importXML( rValue, rProperty,
												  rUnitConverter );			
        if( SvXMLImport::OOo_2x == GetImport().getGeneratorVersion() )
        {
            sal_Bool bHidden;
            rProperty.maValue >>= bHidden;
            bHidden = !bHidden;
            rProperty.maValue <<= bHidden;
        }
    break;
	default:
		bRet = SvXMLImportPropertyMapper::handleSpecialItem( rProperty,
					rProperties, rValue, rUnitConverter, rNamespaceMap );
		break;
	}

	return bRet;
}

XMLTextImportPropertyMapper::XMLTextImportPropertyMapper(
			const UniReference< XMLPropertySetMapper >& rMapper,
            SvXMLImport& rImp,
			XMLFontStylesContext *pFontDecls ) :
	SvXMLImportPropertyMapper( rMapper, rImp ),
	nSizeTypeIndex( -2 ),
	nWidthTypeIndex( -2 ),
	xFontDecls( pFontDecls )
{
}

XMLTextImportPropertyMapper::~XMLTextImportPropertyMapper()
{
}

void XMLTextImportPropertyMapper::SetFontDecls(
		XMLFontStylesContext *pFontDecls )
{
	xFontDecls = pFontDecls;
}

void XMLTextImportPropertyMapper::FontFinished(
	XMLPropertyState *pFontFamilyNameState,
	XMLPropertyState *pFontStyleNameState,
	XMLPropertyState *pFontFamilyState,
	XMLPropertyState *pFontPitchState,
	XMLPropertyState *pFontCharsetState ) const
{
	if( pFontFamilyNameState && pFontFamilyNameState->mnIndex != -1 )
	{
		OUString sName;
		pFontFamilyNameState->maValue >>= sName;
		if( !sName.getLength() )
			pFontFamilyNameState->mnIndex = -1;
	}
	if( !pFontFamilyNameState || pFontFamilyNameState->mnIndex == -1 )
	{
		if( pFontStyleNameState )
			pFontStyleNameState->mnIndex = -1;
		if( pFontFamilyState )
			pFontFamilyState->mnIndex = -1;
		if( pFontPitchState )
			pFontPitchState->mnIndex = -1;
		if( pFontCharsetState )
			pFontCharsetState->mnIndex = -1;
	}
}

/** since the properties "CharFontFamilyName", "CharFontStyleName", "CharFontFamily",
	"CharFontPitch" and "CharFontSet" and theire CJK and CTL counterparts are only
	usable as a union, we add defaults to all values that are not set as long as we
	have an "CharFontFamilyName"

	#99928# CL */
void XMLTextImportPropertyMapper::FontDefaultsCheck(
										XMLPropertyState* pFontFamilyName,
										XMLPropertyState* pFontStyleName,
										XMLPropertyState* pFontFamily,
										XMLPropertyState* pFontPitch,
										XMLPropertyState* pFontCharSet,
										XMLPropertyState** ppNewFontStyleName,
										XMLPropertyState** ppNewFontFamily,
										XMLPropertyState** ppNewFontPitch,
										XMLPropertyState** ppNewFontCharSet ) const
{
	if( pFontFamilyName )
	{
		OUString sEmpty;
		Any aAny;

		if( !pFontStyleName )
		{
			aAny <<= sEmpty;
	#ifdef DBG_UTIL
				sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
												pFontFamilyName->mnIndex + 1 );
				DBG_ASSERT( nTmp == CTF_FONTSTYLENAME || nTmp == CTF_FONTSTYLENAME_CJK || nTmp == CTF_FONTSTYLENAME_CTL,
							"wrong property context id" );
	#endif
				*ppNewFontStyleName = new XMLPropertyState( pFontFamilyName->mnIndex + 1,
													   aAny );
		}

		if( !pFontFamily )
		{
			aAny <<= (sal_Int16)com::sun::star::awt::FontFamily::DONTKNOW;

	#ifdef DBG_UTIL
				sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
												pFontFamilyName->mnIndex + 2 );
				DBG_ASSERT( nTmp == CTF_FONTFAMILY || nTmp == CTF_FONTFAMILY_CJK || nTmp == CTF_FONTFAMILY_CTL,
							"wrong property context id" );
	#endif
				*ppNewFontFamily = new XMLPropertyState( pFontFamilyName->mnIndex + 2,
													   aAny );
		}

		if( !pFontPitch )
		{
			aAny <<= (sal_Int16)com::sun::star::awt::FontPitch::DONTKNOW;
	#ifdef DBG_UTIL
				sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
												pFontFamilyName->mnIndex + 3 );
				DBG_ASSERT( nTmp == CTF_FONTPITCH || nTmp == CTF_FONTPITCH_CJK || nTmp == CTF_FONTPITCH_CTL,
							"wrong property context id" );
	#endif
				*ppNewFontPitch = new XMLPropertyState( pFontFamilyName->mnIndex + 3,
													   aAny );
		}

		if( !pFontCharSet )
		{
			aAny <<= (sal_Int16)gsl_getSystemTextEncoding();
	#ifdef DBG_UTIL
				sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
												pFontFamilyName->mnIndex + 4 );
				DBG_ASSERT( nTmp == CTF_FONTCHARSET || nTmp == CTF_FONTCHARSET_CJK || nTmp == CTF_FONTCHARSET_CTL,
							"wrong property context id" );
	#endif
				*ppNewFontCharSet = new XMLPropertyState( pFontFamilyName->mnIndex + 4,
													   aAny );
		}
	}
}

void XMLTextImportPropertyMapper::finished(
			::std::vector< XMLPropertyState >& rProperties,
			sal_Int32 /*nStartIndex*/, sal_Int32 /*nEndIndex*/ ) const
{
	sal_Bool bHasAnyHeight = sal_False;
	sal_Bool bHasAnyMinHeight = sal_False;
	sal_Bool bHasAnyWidth = sal_False;
	sal_Bool bHasAnyMinWidth = sal_False;

	XMLPropertyState* pFontFamilyName = 0;
	XMLPropertyState* pFontStyleName = 0;
	XMLPropertyState* pFontFamily = 0;
	XMLPropertyState* pFontPitch = 0;
	XMLPropertyState* pFontCharSet = 0;
	XMLPropertyState* pNewFontStyleName = 0;
	XMLPropertyState* pNewFontFamily = 0;
	XMLPropertyState* pNewFontPitch = 0;
	XMLPropertyState* pNewFontCharSet = 0;
	XMLPropertyState* pFontFamilyNameCJK = 0;
	XMLPropertyState* pFontStyleNameCJK = 0;
	XMLPropertyState* pFontFamilyCJK = 0;
	XMLPropertyState* pFontPitchCJK = 0;
	XMLPropertyState* pFontCharSetCJK = 0;
	XMLPropertyState* pNewFontStyleNameCJK = 0;
	XMLPropertyState* pNewFontFamilyCJK = 0;
	XMLPropertyState* pNewFontPitchCJK = 0;
	XMLPropertyState* pNewFontCharSetCJK = 0;
	XMLPropertyState* pFontFamilyNameCTL = 0;
	XMLPropertyState* pFontStyleNameCTL = 0;
	XMLPropertyState* pFontFamilyCTL = 0;
	XMLPropertyState* pFontPitchCTL = 0;
	XMLPropertyState* pFontCharSetCTL = 0;
	XMLPropertyState* pNewFontStyleNameCTL = 0;
	XMLPropertyState* pNewFontFamilyCTL = 0;
	XMLPropertyState* pNewFontPitchCTL = 0;
	XMLPropertyState* pNewFontCharSetCTL = 0;
	XMLPropertyState* pAllBorderDistance = 0;
	XMLPropertyState* pBorderDistances[4] = { 0, 0, 0, 0 };
	XMLPropertyState* pNewBorderDistances[4] = { 0, 0, 0, 0 };
	XMLPropertyState* pAllBorder = 0;
	XMLPropertyState* pBorders[4] = { 0, 0, 0, 0 };
	XMLPropertyState* pNewBorders[4] = { 0, 0, 0, 0 };
	XMLPropertyState* pAllBorderWidth = 0;
	XMLPropertyState* pBorderWidths[4] = { 0, 0, 0, 0 };
	XMLPropertyState* pAnchorType = 0;
	XMLPropertyState* pVertOrient = 0;
	XMLPropertyState* pVertOrientRelAsChar = 0;
	XMLPropertyState* pBackTransparency = NULL; // transparency in %
	XMLPropertyState* pBackTransparent = NULL;  // transparency as boolean

    XMLPropertyState* pAllParaMargin = 0;
    XMLPropertyState* pParaMargins[4] = { 0, 0, 0, 0 };
    ::std::auto_ptr<XMLPropertyState> pNewParaMargins[4];

    XMLPropertyState* pAllMargin = 0;
    XMLPropertyState* pMargins[4] = { 0, 0, 0, 0 };
    ::std::auto_ptr<XMLPropertyState> pNewMargins[4];

	for( ::std::vector< XMLPropertyState >::iterator aIter = rProperties.begin();
		 aIter != rProperties.end();
		 ++aIter )
	{
        XMLPropertyState* property = &(*aIter);
		if( -1 == property->mnIndex )
			continue;

		switch( getPropertySetMapper()->GetEntryContextId( property->mnIndex ) )
		{
		case CTF_FONTFAMILYNAME:	pFontFamilyName = property;	break;
		case CTF_FONTSTYLENAME:	pFontStyleName = property;	break;
		case CTF_FONTFAMILY:	pFontFamily = property;	break;
		case CTF_FONTPITCH:	pFontPitch = property;	break;
		case CTF_FONTCHARSET:	pFontCharSet = property;	break;
								
		case CTF_FONTFAMILYNAME_CJK:	pFontFamilyNameCJK = property;	break;
		case CTF_FONTSTYLENAME_CJK:	pFontStyleNameCJK = property;	break;
		case CTF_FONTFAMILY_CJK:	pFontFamilyCJK = property;	break;
		case CTF_FONTPITCH_CJK:	pFontPitchCJK = property;	break;
		case CTF_FONTCHARSET_CJK:	pFontCharSetCJK = property;	break;

		case CTF_FONTFAMILYNAME_CTL:	pFontFamilyNameCTL = property;	break;
		case CTF_FONTSTYLENAME_CTL:	pFontStyleNameCTL = property;	break;
		case CTF_FONTFAMILY_CTL:	pFontFamilyCTL = property;	break;
		case CTF_FONTPITCH_CTL:	pFontPitchCTL = property;	break;
		case CTF_FONTCHARSET_CTL:	pFontCharSetCTL = property;	break;

		case CTF_ALLBORDERDISTANCE:		pAllBorderDistance = property; break;
		case CTF_LEFTBORDERDISTANCE:	pBorderDistances[XML_LINE_LEFT] = property; break;
		case CTF_RIGHTBORDERDISTANCE:	pBorderDistances[XML_LINE_RIGHT] = property; break;
		case CTF_TOPBORDERDISTANCE:		pBorderDistances[XML_LINE_TOP] = property; break;
		case CTF_BOTTOMBORDERDISTANCE:	pBorderDistances[XML_LINE_BOTTOM] = property; break;
		case CTF_ALLBORDER:				pAllBorder = property; break;
		case CTF_LEFTBORDER:			pBorders[XML_LINE_LEFT] = property; break;
		case CTF_RIGHTBORDER:			pBorders[XML_LINE_RIGHT] = property; break;
		case CTF_TOPBORDER:				pBorders[XML_LINE_TOP] = property; break;
		case CTF_BOTTOMBORDER:			pBorders[XML_LINE_BOTTOM] = property; break;

		case CTF_ALLBORDERWIDTH:		pAllBorderWidth = property; break;
		case CTF_LEFTBORDERWIDTH:		pBorderWidths[XML_LINE_LEFT] = property; break;
		case CTF_RIGHTBORDERWIDTH:		pBorderWidths[XML_LINE_RIGHT] = property; break;
		case CTF_TOPBORDERWIDTH:		pBorderWidths[XML_LINE_TOP] = property; break;
		case CTF_BOTTOMBORDERWIDTH:		pBorderWidths[XML_LINE_BOTTOM] = property; break;
		case CTF_ANCHORTYPE:			pAnchorType = property; break;
		case CTF_VERTICALPOS:  			pVertOrient = property; break;
		case CTF_VERTICALREL_ASCHAR: 	pVertOrientRelAsChar = property; break;

		case CTF_FRAMEHEIGHT_MIN_ABS:
		case CTF_FRAMEHEIGHT_MIN_REL:
//		case CTF_SYNCHEIGHT_MIN:
										bHasAnyMinHeight = sal_True;
										// no break here!
		case CTF_FRAMEHEIGHT_ABS:
		case CTF_FRAMEHEIGHT_REL:
//		case CTF_SYNCHEIGHT:
										bHasAnyHeight = sal_True; break;
		case CTF_FRAMEWIDTH_MIN_ABS:
		case CTF_FRAMEWIDTH_MIN_REL:
										bHasAnyMinWidth = sal_True;
										// no break here!
		case CTF_FRAMEWIDTH_ABS:
		case CTF_FRAMEWIDTH_REL:
										bHasAnyWidth = sal_True; break;
        case CTF_BACKGROUND_TRANSPARENCY: pBackTransparency = property; break;
        case CTF_BACKGROUND_TRANSPARENT:  pBackTransparent = property; break;

        case CTF_PARAMARGINALL:
            pAllParaMargin = property;
            break;
        case CTF_PARAMARGINALL_REL:
            {
                sal_uInt32 nValue;
                property->maValue >>= nValue;
                // treat fo:margin="100%" as it is not exisiting as the
                // corresponding core attribute classes - <SvxULSpaceItem> and
                // <SvxLRSpaceItem> - are not able to treat such a value correctly.
                // The result will be the same as the values will be inherited
                // from parent, when the no margin attribute is given.
                if ( nValue != 100 )
                {
                    pAllParaMargin = property;
                }
            }
            break;

        case CTF_PARALEFTMARGIN:
        case CTF_PARALEFTMARGIN_REL:
                pParaMargins[XML_LINE_LEFT] = property; break;

        case CTF_PARARIGHTMARGIN:
        case CTF_PARARIGHTMARGIN_REL:
                pParaMargins[XML_LINE_RIGHT] = property; break;

        case CTF_PARATOPMARGIN:
        case CTF_PARATOPMARGIN_REL:
                pParaMargins[XML_LINE_TOP] = property; break;

        case CTF_PARABOTTOMMARGIN:
        case CTF_PARABOTTOMMARGIN_REL:
                pParaMargins[XML_LINE_BOTTOM] = property; break;

        case CTF_MARGINALL:
                pAllMargin = property; break;
        case CTF_MARGINLEFT:
                pMargins[XML_LINE_LEFT] = property; break;
        case CTF_MARGINRIGHT:
                pMargins[XML_LINE_RIGHT] = property; break;
        case CTF_MARGINTOP:
                pMargins[XML_LINE_TOP] = property; break;
        case CTF_MARGINBOTTOM:
                pMargins[XML_LINE_BOTTOM] = property; break;
		}
	}

	if( pFontFamilyName || pFontStyleName || pFontFamily ||
		pFontPitch || pFontCharSet )
		FontFinished( pFontFamilyName, pFontStyleName, pFontFamily,
					  pFontPitch, pFontCharSet );
	if( pFontFamilyNameCJK || pFontStyleNameCJK || pFontFamilyCJK ||
		pFontPitchCJK || pFontCharSetCJK )
		FontFinished( pFontFamilyNameCJK, pFontStyleNameCJK, pFontFamilyCJK,
					  pFontPitchCJK, pFontCharSetCJK );
	if( pFontFamilyNameCTL || pFontStyleNameCTL || pFontFamilyCTL ||
		pFontPitchCTL || pFontCharSetCTL )
		FontFinished( pFontFamilyNameCTL, pFontStyleNameCTL, pFontFamilyCTL,
					  pFontPitchCTL, pFontCharSetCTL );

    for (sal_uInt16 i = 0; i < 4; i++)
    {
        if ( pAllParaMargin != NULL
             && pParaMargins[i] == NULL )
        {
#ifdef DBG_UTIL
            sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
                                        pAllParaMargin->mnIndex + (2*i) + 2 );
            OSL_ENSURE( nTmp >= CTF_PARALEFTMARGIN &&
                        nTmp <= CTF_PARABOTTOMMARGIN_REL,
                        "wrong property context id" );
#endif
            // IMPORTANT NOTE: the index calculation depends on the right order in the property map
            pNewParaMargins[i].reset(
                new XMLPropertyState( pAllParaMargin->mnIndex + (2*i) + 2,
                                      pAllParaMargin->maValue ) );
        }

        if (pAllMargin && !pMargins[i])
        {
#ifdef DBG_UTIL
            sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
                                        pAllMargin->mnIndex + i + 1 );
            OSL_ENSURE( nTmp >= CTF_MARGINLEFT && nTmp <= CTF_MARGINBOTTOM,
                        "wrong property context id" );
#endif
            // IMPORTANT NOTE: the index calculation depends on the right order in the property map
            pNewMargins[i].reset(
                new XMLPropertyState( pAllMargin->mnIndex + i + 1,
                                      pAllMargin->maValue ) );
        }
		if( pAllBorderDistance && !pBorderDistances[i] )
		{
#ifdef DBG_UTIL
			sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
										pAllBorderDistance->mnIndex + i + 1 );
			DBG_ASSERT( nTmp >= CTF_LEFTBORDERDISTANCE &&
						nTmp <= CTF_BOTTOMBORDERDISTANCE,
						"wrong property context id" );
#endif
			pNewBorderDistances[i] =
				new XMLPropertyState( pAllBorderDistance->mnIndex + i + 1,
									  pAllBorderDistance->maValue );
			pBorderDistances[i] = pNewBorderDistances[i];
		}
		if( pAllBorder && !pBorders[i] )
		{
#ifdef DBG_UTIL
			sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
											pAllBorder->mnIndex + i + 1 );
			DBG_ASSERT( nTmp >= CTF_LEFTBORDER && nTmp <= CTF_BOTTOMBORDER,
						"wrong property context id" );
#endif
			pNewBorders[i] = new XMLPropertyState( pAllBorder->mnIndex + i + 1,
												   pAllBorder->maValue );
			pBorders[i] = pNewBorders[i];
		}
		if( !pBorderWidths[i] )
			pBorderWidths[i] = pAllBorderWidth;
		else
			pBorderWidths[i]->mnIndex = -1;

#ifdef XML_CHECK_UI_CONSTRAINS
		sal_Bool bHasBorder = sal_False;
		if( pBorders[i] )
		{
			table::BorderLine aBorderLine;
			pBorders[i]->maValue >>= aBorderLine;

 			if( pBorderWidths[i] )
			{
				table::BorderLine aBorderLineWidth;
				pBorderWidths[i]->maValue >>= aBorderLineWidth;
				aBorderLine.OuterLineWidth = aBorderLineWidth.OuterLineWidth;
				aBorderLine.InnerLineWidth = aBorderLineWidth.InnerLineWidth;
				aBorderLine.LineDistance = aBorderLineWidth.LineDistance;

				pBorders[i]->maValue <<= aBorderLine;
			}
			bHasBorder = (aBorderLine.OuterLineWidth +
						  aBorderLine.InnerLineWidth) > 0;
		}
		if( bHasBorder )
		{
			if( !pBorderDistances[i] )
			{
#ifdef DBG_UTIL
				sal_Int16 nTmp = getPropertySetMapper()->GetEntryContextId(
										pBorders[i]->mnIndex + 5 );
				DBG_ASSERT( nTmp >= CTF_LEFTBORDERDISTANCE &&
							nTmp <= CTF_BOTTOMBORDERDISTANCE,
							"wrong property context id" );
#endif

				pNewBorderDistances[i] =
					new XMLPropertyState( pBorders[i]->mnIndex + 5 );
				pNewBorderDistances[i]->maValue <<= (sal_Int32)MIN_BORDER_DIST;
				pBorderDistances[i] = pNewBorderDistances[i];
			}
			else
			{
				sal_Int32 nDist;
				pBorderDistances[i]->maValue >>= nDist;
				if( nDist < MIN_BORDER_DIST )
					pBorderDistances[i]->maValue <<= (sal_Int32)MIN_BORDER_DIST;
			}
		}
		else
		{
			if( pBorderDistances[i] )
			{
				sal_Int32 nDist;
				pBorderDistances[i]->maValue >>= nDist;
				if( nDist > 0 )
					pBorderDistances[i]->maValue <<= (sal_Int32)0;
			}
		}
#else
		if( pBorders[i] && pBorderWidths[i] )
		{
			table::BorderLine aBorderLine;
			pBorders[i]->maValue >>= aBorderLine;

			table::BorderLine aBorderLineWidth;
			pBorderWidths[i]->maValue >>= aBorderLineWidth;

			aBorderLine.OuterLineWidth = aBorderLineWidth.OuterLineWidth;
			aBorderLine.InnerLineWidth = aBorderLineWidth.InnerLineWidth;
			aBorderLine.LineDistance = aBorderLineWidth.LineDistance;

			pBorders[i]->maValue <<= aBorderLine;
		}
#endif
	}

    if (pAllParaMargin)
    {
        pAllParaMargin->mnIndex = -1;
    }
    if (pAllMargin)
    {
        pAllMargin->mnIndex = -1;
    }

	if( pAllBorderDistance )
		pAllBorderDistance->mnIndex = -1;

	if( pAllBorder )
		pAllBorder->mnIndex = -1;

	if( pAllBorderWidth )
		pAllBorderWidth->mnIndex = -1;

	if( pVertOrient && pVertOrientRelAsChar )
	{
		sal_Int16 nVertOrient;
		pVertOrient->maValue >>= nVertOrient;
		sal_Int16 nVertOrientRel = 0;
		pVertOrientRelAsChar->maValue >>= nVertOrientRel;
		switch( nVertOrient )
		{
		case VertOrientation::TOP:
			nVertOrient = nVertOrientRel;
			break;
		case VertOrientation::CENTER:
			switch( nVertOrientRel )
			{
			case VertOrientation::CHAR_TOP:
				nVertOrient = VertOrientation::CHAR_CENTER;
				break;
			case VertOrientation::LINE_TOP:
				nVertOrient = VertOrientation::LINE_CENTER;
				break;
			}
			break;
		case VertOrientation::BOTTOM:
			switch( nVertOrientRel )
			{
			case VertOrientation::CHAR_TOP:
				nVertOrient = VertOrientation::CHAR_BOTTOM;
				break;
			case VertOrientation::LINE_TOP:
				nVertOrient = VertOrientation::LINE_BOTTOM;
				break;
			}
			break;
		}
		pVertOrient->maValue <<= nVertOrient;
		pVertOrientRelAsChar->mnIndex = -1;
	}

	FontDefaultsCheck( pFontFamilyName,
					   pFontStyleName, pFontFamily, pFontPitch, pFontCharSet,
					   &pNewFontStyleName, &pNewFontFamily, &pNewFontPitch, &pNewFontCharSet );

	FontDefaultsCheck( pFontFamilyNameCJK,
					   pFontStyleNameCJK, pFontFamilyCJK, pFontPitchCJK, pFontCharSetCJK,
					   &pNewFontStyleNameCJK, &pNewFontFamilyCJK, &pNewFontPitchCJK, &pNewFontCharSetCJK );

	FontDefaultsCheck( pFontFamilyNameCTL,
					   pFontStyleNameCTL, pFontFamilyCTL, pFontPitchCTL, pFontCharSetCTL,
					   &pNewFontStyleNameCTL, &pNewFontFamilyCTL, &pNewFontPitchCTL, &pNewFontCharSetCTL );

    // #i5775# don't overwrite %transparency with binary transparency
    if( ( pBackTransparency != NULL ) && ( pBackTransparent != NULL ) )
    {
        if( ! *(sal_Bool*)(pBackTransparent->maValue.getValue()) )
            pBackTransparent->mnIndex = -1;
    }


	// insert newly created properties. This inavlidates all iterators!
    // Most of the pXXX variables in this method are iterators and will be 
    // invalidated!!!

	if( pNewFontStyleName )
	{
		rProperties.push_back( *pNewFontStyleName );
		delete pNewFontStyleName;
	}

	if( pNewFontFamily )
	{
		rProperties.push_back( *pNewFontFamily );
		delete pNewFontFamily;
	}

	if( pNewFontPitch )
	{
		rProperties.push_back( *pNewFontPitch );
		delete pNewFontPitch;
	}

	if( pNewFontCharSet )
	{
		rProperties.push_back( *pNewFontCharSet );
		delete pNewFontCharSet;
	}

	if( pNewFontStyleNameCJK )
	{
		rProperties.push_back( *pNewFontStyleNameCJK );
		delete pNewFontStyleNameCJK;
	}

	if( pNewFontFamilyCJK )
	{
		rProperties.push_back( *pNewFontFamilyCJK );
		delete pNewFontFamilyCJK;
	}

	if( pNewFontPitchCJK )
	{
		rProperties.push_back( *pNewFontPitchCJK );
		delete pNewFontPitchCJK;
	}

	if( pNewFontCharSetCJK )
	{
		rProperties.push_back( *pNewFontCharSetCJK );
		delete pNewFontCharSetCJK;
	}

	if( pNewFontStyleNameCTL)
	{
		rProperties.push_back( *pNewFontStyleNameCTL );
		delete pNewFontStyleNameCTL;
	}

	if( pNewFontFamilyCTL )
	{
		rProperties.push_back( *pNewFontFamilyCTL );
		delete pNewFontFamilyCTL;
	}

	if( pNewFontPitchCTL )
	{
		rProperties.push_back( *pNewFontPitchCTL );
		delete pNewFontPitchCTL;
	}

	if( pNewFontCharSetCTL )
	{
		rProperties.push_back( *pNewFontCharSetCTL );
		delete pNewFontCharSetCTL;
	}

    for (sal_uInt16 i=0; i<4; i++)
    {
        if (pNewParaMargins[i].get())
        {
            rProperties.push_back(*pNewParaMargins[i]);
        }
        if (pNewMargins[i].get())
        {
            rProperties.push_back(*pNewMargins[i]);
        }
		if( pNewBorderDistances[i] )
		{
			rProperties.push_back( *pNewBorderDistances[i] );
			delete pNewBorderDistances[i];
		}
		if( pNewBorders[i] )
		{
			rProperties.push_back( *pNewBorders[i] );
			delete pNewBorders[i];
		}
	}

	if( bHasAnyHeight )
	{
		if( nSizeTypeIndex == -2 )
		{
			const_cast < XMLTextImportPropertyMapper * > ( this )
				->nSizeTypeIndex  = -1;
			sal_Int32 nPropCount = getPropertySetMapper()->GetEntryCount();
			for( sal_Int32 j=0; j < nPropCount; j++ )
			{
				if( CTF_SIZETYPE == getPropertySetMapper()
						->GetEntryContextId( j ) )
				{
					const_cast < XMLTextImportPropertyMapper * > ( this )
						->nSizeTypeIndex = j;
					break;
				}
			}
		}
		if( nSizeTypeIndex != -1 )
		{
			XMLPropertyState aSizeTypeState( nSizeTypeIndex );
			aSizeTypeState.maValue <<= (sal_Int16)( bHasAnyMinHeight
														? SizeType::MIN
														: SizeType::FIX);
			rProperties.push_back( aSizeTypeState );
		}
	}

	if( bHasAnyWidth )
	{
		if( nWidthTypeIndex == -2 )
		{
			const_cast < XMLTextImportPropertyMapper * > ( this )
				->nWidthTypeIndex  = -1;
			sal_Int32 nCount = getPropertySetMapper()->GetEntryCount();
			for( sal_Int32 j=0; j < nCount; j++ )
			{
				if( CTF_FRAMEWIDTH_TYPE	 == getPropertySetMapper()
						->GetEntryContextId( j ) )
				{
					const_cast < XMLTextImportPropertyMapper * > ( this )
						->nWidthTypeIndex = j;
					break;
				}
			}
		}
		if( nWidthTypeIndex != -1 )
		{
			XMLPropertyState aSizeTypeState( nWidthTypeIndex );
			aSizeTypeState.maValue <<= (sal_Int16)( bHasAnyMinWidth
														? SizeType::MIN
														: SizeType::FIX);
			rProperties.push_back( aSizeTypeState );
		}
	}

    // DO NOT USE ITERATORS/POINTERS INTO THE rProperties-VECTOR AFTER
    // THIS LINE.  All iterators into the rProperties-vector, especially all
    // pXXX-type variables set in the first switch statement of this method, 
    // may have been invalidated by the above push_back() calls!
}