/**************************************************************
 *
 * 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/xml/sax/SAXParseException.hpp>
#include <com/sun/star/xml/sax/SAXException.hpp>
#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
#include <com/sun/star/xml/sax/XAttributeList.hpp>
#include <rtl/ustrbuf.hxx>
#include <xmloff/nmspmap.hxx>
#include <xmloff/xmltoken.hxx>
#include "xmloff/xmlnmspe.hxx"
#include "PropType.hxx"
#include "DeepTContext.hxx"
#include "ProcAttrTContext.hxx"
#ifndef _XMLOFF_TRANSFOERMERBASE_HXX
#include "TransformerBase.hxx"
#endif
#include "TransformerActions.hxx"
#include "ActionMapTypesOASIS.hxx"
#include "MutableAttrList.hxx"
#include "PropertyActionsOASIS.hxx"
#include "StyleOASISTContext.hxx"
#include <xmloff/xmluconv.hxx>
#include <rtl/ustrbuf.hxx>

using ::rtl::OUString;
using namespace ::xmloff::token;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::xml::sax;
//------------------------------------------------------------------------------

static sal_uInt16 aAttrActionMaps[XML_PROP_TYPE_END] =
{
	PROP_OASIS_GRAPHIC_ATTR_ACTIONS,
	PROP_OASIS_DRAWING_PAGE_ATTR_ACTIONS,				// DRAWING_PAGE
	PROP_OASIS_PAGE_LAYOUT_ATTR_ACTIONS,
	PROP_OASIS_HEADER_FOOTER_ATTR_ACTIONS,
	PROP_OASIS_TEXT_ATTR_ACTIONS,
	PROP_OASIS_PARAGRAPH_ATTR_ACTIONS,
	MAX_OASIS_PROP_ACTIONS,				// RUBY
	PROP_OASIS_SECTION_ATTR_ACTIONS,
	PROP_OASIS_TABLE_ATTR_ACTIONS,
	PROP_OASIS_TABLE_COLUMN_ATTR_ACTIONS,
	PROP_OASIS_TABLE_ROW_ATTR_ACTIONS,
	PROP_OASIS_TABLE_CELL_ATTR_ACTIONS,
	PROP_OASIS_LIST_LEVEL_ATTR_ACTIONS,
	PROP_OASIS_CHART_ATTR_ACTIONS
};

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

class XMLPropertiesTContext_Impl : public XMLPersElemContentTContext
{
	::com::sun::star::uno::Reference<
		::com::sun::star::xml::sax::XAttributeList > m_xAttrList;

	XMLPropType m_ePropType;
    sal_Bool    m_bControlStyle;
	::rtl::OUString m_aStyleFamily;

public:

	void SetQNameAndPropType( const ::rtl::OUString& rQName,
		   					  XMLPropType ePropType	)
	{
		m_ePropType = ePropType;
		XMLTransformerContext::SetQName( rQName );
	};

	TYPEINFO();

	XMLPropertiesTContext_Impl( XMLTransformerBase& rTransformer,
						   const ::rtl::OUString& rQName,
						   XMLPropType eP,
                           const ::rtl::OUString& rStyleFamily,
                           sal_Bool _bControlStyle = sal_False );

	virtual ~XMLPropertiesTContext_Impl();

	virtual void StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList );

	virtual void Export();

	static XMLPropType GetPropType( const OUString& rLocalName );

	static OUString MergeUnderline( XMLTokenEnum eUnderline,
		   								sal_Bool bBold, sal_Bool bDouble );
	static OUString MergeLineThrough( XMLTokenEnum eLineThrough,
										sal_Bool bBold, sal_Bool bDouble,
	   									sal_Unicode c );
};

TYPEINIT1( XMLPropertiesTContext_Impl, XMLPersElemContentTContext );

XMLPropertiesTContext_Impl::XMLPropertiesTContext_Impl(
	XMLTransformerBase& rImp, const OUString& rQName, XMLPropType eP,
        const ::rtl::OUString& rStyleFamily, sal_Bool _bControlStyle ) :
	XMLPersElemContentTContext( rImp, rQName, XML_NAMESPACE_STYLE,
								XML_PROPERTIES),
	m_ePropType( eP ),
    m_bControlStyle( _bControlStyle ),
	m_aStyleFamily( rStyleFamily )
{
}

XMLPropertiesTContext_Impl::~XMLPropertiesTContext_Impl()
{
}

void XMLPropertiesTContext_Impl::StartElement(
		const Reference< XAttributeList >& rAttrList )
{
	XMLTransformerActions *pActions =  0;
	sal_uInt16 nActionMap = aAttrActionMaps[m_ePropType];
	if( nActionMap < MAX_OASIS_PROP_ACTIONS )
	{
		pActions = GetTransformer().GetUserDefinedActions( nActionMap );
		OSL_ENSURE( pActions, "go no actions" );
	}

	if( pActions )
	{
		XMLMutableAttributeList *pAttrList = 0;
		if( !m_xAttrList.is() )
		{
			pAttrList = new XMLMutableAttributeList();
			m_xAttrList = pAttrList;
		}
		else
		{
			pAttrList =
				static_cast< XMLMutableAttributeList * >( m_xAttrList.get() );
		}

		XMLTokenEnum eUnderline = XML_TOKEN_END;
		sal_Bool bBoldUnderline = sal_False, bDoubleUnderline = sal_False;
		XMLTokenEnum eLineThrough = XML_TOKEN_END;
		sal_Bool bBoldLineThrough = sal_False, bDoubleLineThrough = sal_False;
		sal_Unicode cLineThroughChar = 0;

        bool bIntervalMinorFound = false;
        double fIntervalMajor = 0.0;
        sal_Int32 nIntervalMinorDivisor = 0;

		// #i25616#
		OUString aOpacityValueRemember;
		OUString aImageOpacityValueRemember;

		sal_Int16 nAttrCount = rAttrList.is() ? rAttrList->getLength() : 0;
		for( sal_Int16 i=0; i < nAttrCount; i++ )
		{
			const OUString& rAttrName = rAttrList->getNameByIndex( i );
			const OUString& rAttrValue = rAttrList->getValueByIndex( i );
			OUString aLocalName;
			sal_uInt16 nPrefix =
				GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName,
																 &aLocalName );

			XMLTransformerActions::key_type aKey( nPrefix, aLocalName );
			XMLTransformerActions::const_iterator aIter =
				pActions->find( aKey );
			if( !(aIter == pActions->end() ) )
			{
				switch( (*aIter).second.m_nActionType )
				{
                case XML_ATACTION_REMOVE:
                    break;
				case XML_ATACTION_COPY:
					pAttrList->AddAttribute( rAttrName, rAttrValue );
					break;
				case XML_ATACTION_RENAME:
					{
						OUString aNewAttrQName(
							GetTransformer().GetNamespaceMap().GetQNameByKey(
								(*aIter).second.GetQNamePrefixFromParam1(),
								::xmloff::token::GetXMLToken(
								(*aIter).second.GetQNameTokenFromParam1()) ) );
						pAttrList->AddAttribute( aNewAttrQName, rAttrValue );
					}
					break;
				case XML_ATACTION_IN2INCH:
					{
						OUString aAttrValue( rAttrValue );
						XMLTransformerBase::ReplaceSingleInWithInch(
								aAttrValue );
						pAttrList->AddAttribute( rAttrName, aAttrValue );
					}
					break;
				case XML_ATACTION_INS2INCHS:
					{
						OUString aAttrValue( rAttrValue );
						XMLTransformerBase::ReplaceInWithInch(
								aAttrValue );
						pAttrList->AddAttribute( rAttrName, aAttrValue );
					}
					break;
				case XML_ATACTION_DECODE_STYLE_NAME_REF:
					{
						OUString aAttrValue( rAttrValue );
						GetTransformer().DecodeStyleName(aAttrValue);
						pAttrList->AddAttribute( rAttrName, aAttrValue );
					}
					break;
				case XML_ATACTION_RENAME_DECODE_STYLE_NAME_REF:
					{
						OUString aNewAttrQName(
							GetTransformer().GetNamespaceMap().GetQNameByKey(
								(*aIter).second.GetQNamePrefixFromParam1(),
								::xmloff::token::GetXMLToken(
								(*aIter).second.GetQNameTokenFromParam1()) ) );
						OUString aAttrValue( rAttrValue );
						GetTransformer().DecodeStyleName(aAttrValue);
						pAttrList->AddAttribute( aNewAttrQName, aAttrValue );
					}
					break;
				case XML_ATACTION_NEG_PERCENT:
					{
						OUString aAttrValue( rAttrValue );
						GetTransformer().NegPercent(aAttrValue);
						pAttrList->AddAttribute( rAttrName, aAttrValue );
					}
					break;
				case XML_ATACTION_RENAME_NEG_PERCENT:
					{
						OUString aNewAttrQName(
							GetTransformer().GetNamespaceMap().GetQNameByKey(
								(*aIter).second.GetQNamePrefixFromParam1(),
								::xmloff::token::GetXMLToken(
								(*aIter).second.GetQNameTokenFromParam1()) ) );
						OUString aAttrValue( rAttrValue );
						GetTransformer().NegPercent(aAttrValue);
						pAttrList->AddAttribute( aNewAttrQName, aAttrValue );
					}
					break;
				case XML_OPTACTION_LINE_MODE:
					{
						sal_Bool bWordMode =
							IsXMLToken( rAttrValue, XML_SKIP_WHITE_SPACE );
						OUString aAttrQName(
							GetTransformer().GetNamespaceMap().GetQNameByKey(
								XML_NAMESPACE_FO,
								GetXMLToken( XML_SCORE_SPACES ) ) );
						sal_Int16 nIndex =
							pAttrList->GetIndexByName( aAttrQName );
						if( -1 != nIndex )
						{
							if( bWordMode )
							{
								const OUString& rOldValue =
									pAttrList->getValueByIndex( nIndex );
								if( !IsXMLToken( rOldValue, XML_TRUE ) )
								{
									pAttrList->SetValueByIndex( nIndex,
											GetXMLToken( XML_TRUE ) );
								}
							}
						}
						else
						{
							OUString aAttrValue( GetXMLToken( bWordMode
										? XML_FALSE
										: XML_TRUE ) );
							pAttrList->AddAttribute( aAttrQName, aAttrValue );
						}
					}
					break;
				case XML_OPTACTION_KEEP_WITH_NEXT:
					{
						OUString aAttrValue( GetXMLToken(
										IsXMLToken( rAttrValue, XML_ALWAYS )
													? XML_TRUE
													: XML_FALSE) );
						pAttrList->AddAttribute( rAttrName, aAttrValue );
					}
					break;
				case XML_OPTACTION_UNDERLINE_WIDTH:
					if( IsXMLToken( rAttrValue, XML_BOLD ) )
						bBoldUnderline = sal_True;
					break;
				case XML_OPTACTION_UNDERLINE_TYPE:
					if( IsXMLToken( rAttrValue, XML_DOUBLE ) )
						bDoubleUnderline = sal_True;
					break;
				case XML_OPTACTION_UNDERLINE_STYLE:
					eUnderline = GetTransformer().GetToken( rAttrValue );
					break;
				case XML_OPTACTION_LINETHROUGH_WIDTH:
					if( IsXMLToken( rAttrValue, XML_BOLD ) )
						bBoldLineThrough = sal_True;
					break;
				case XML_OPTACTION_LINETHROUGH_TYPE:
					if( IsXMLToken( rAttrValue, XML_DOUBLE ) )
						bDoubleLineThrough = sal_True;
					break;
				case XML_OPTACTION_LINETHROUGH_STYLE:
					eLineThrough = GetTransformer().GetToken( rAttrValue );
					break;
				case XML_OPTACTION_LINETHROUGH_TEXT:
					if( rAttrValue.getLength() )
						cLineThroughChar = rAttrValue[0];
					break;
				case XML_OPTACTION_INTERPOLATION:
                    {
                        // 0: none
                        sal_Int32 nSplineType = 0;
                        if( IsXMLToken( rAttrValue, XML_CUBIC_SPLINE ))
                            nSplineType = 1;
                        else if( IsXMLToken( rAttrValue, XML_B_SPLINE ))
                            nSplineType = 2;

                        pAttrList->AddAttribute(
                            GetTransformer().GetNamespaceMap().GetQNameByKey(
                                XML_NAMESPACE_CHART,
                                GetXMLToken( XML_SPLINES )),
                            OUString::valueOf( nSplineType ));
                    }
					break;
                case XML_OPTACTION_INTERVAL_MAJOR:
                    pAttrList->AddAttribute( rAttrName, rAttrValue );
                    SvXMLUnitConverter::convertDouble( fIntervalMajor, rAttrValue );
                    break;
                case XML_OPTACTION_INTERVAL_MINOR_DIVISOR:
                    SvXMLUnitConverter::convertNumber( nIntervalMinorDivisor, rAttrValue );
                    bIntervalMinorFound = true;
					break;
				case XML_OPTACTION_SYMBOL_TYPE:
                    {
                        // if symbol_type is "named-symbol" the "symbol"
                        // property is set in the action XML_OPTACTION_SYMBOL_NAME
                        sal_Int32 nSymbolType = 0;
                        if( IsXMLToken( rAttrValue, XML_NONE ))
                            nSymbolType = -3;
                        else if( IsXMLToken( rAttrValue, XML_AUTOMATIC ))
                            nSymbolType = -2;
                        else if( IsXMLToken( rAttrValue, XML_IMAGE ))
                            nSymbolType = -1;

                        if( nSymbolType < 0 )
                            pAttrList->AddAttribute(
                                GetTransformer().GetNamespaceMap().GetQNameByKey(
                                    XML_NAMESPACE_CHART,
                                    GetXMLToken( XML_SYMBOL )),
                                OUString::valueOf( nSymbolType ));
                    }
                    break;
                case XML_OPTACTION_SYMBOL_NAME:
                    {
                        // assume "symbol-type" == "named-symbol"
                        sal_Int32 nSymbolType = -3; // NONE
                        // "square" just has an awkward token-name
                        if( IsXMLToken( rAttrValue, XML_GRADIENTSTYLE_SQUARE ))
                            nSymbolType = 0;
                        else if( IsXMLToken( rAttrValue, XML_DIAMOND ))
                            nSymbolType = 1;
                        else if( IsXMLToken( rAttrValue, XML_ARROW_DOWN ))
                            nSymbolType = 2;
                        else if( IsXMLToken( rAttrValue, XML_ARROW_UP ))
                            nSymbolType = 3;
                        else if( IsXMLToken( rAttrValue, XML_ARROW_RIGHT ))
                            nSymbolType = 4;
                        else if( IsXMLToken( rAttrValue, XML_ARROW_LEFT ))
                            nSymbolType = 5;
                        else if( IsXMLToken( rAttrValue, XML_BOW_TIE ))
                            nSymbolType = 6;
                        else if( IsXMLToken( rAttrValue, XML_HOURGLASS ))
                            nSymbolType = 7;
                        else if( IsXMLToken( rAttrValue, XML_CIRCLE ))
                            nSymbolType = 8;
                        else if( IsXMLToken( rAttrValue, XML_STAR ))
                            nSymbolType = 9;
                        else if( IsXMLToken( rAttrValue, XML_X ))
                            nSymbolType = 10;
                        else if( IsXMLToken( rAttrValue, XML_PLUS ))
                            nSymbolType = 11;
                        else if( IsXMLToken( rAttrValue, XML_ASTERISK ))
                            nSymbolType = 12;
                        else if( IsXMLToken( rAttrValue, XML_HORIZONTAL_BAR ))
                            nSymbolType = 13;
                        else if( IsXMLToken( rAttrValue, XML_VERTICAL_BAR ))
                            nSymbolType = 14;

                        if( nSymbolType >= 0 )
                            pAttrList->AddAttribute(
                                GetTransformer().GetNamespaceMap().GetQNameByKey(
                                    XML_NAMESPACE_CHART,
                                    GetXMLToken( XML_SYMBOL )),
                                OUString::valueOf( nSymbolType ));
                    }
                    break;
				// #i25616#
                case XML_OPTACTION_OPACITY:
					aOpacityValueRemember = rAttrValue;
					GetTransformer().NegPercent(aOpacityValueRemember);
					break;

				// #i25616#
                case XML_OPTACTION_IMAGE_OPACITY:
					aImageOpacityValueRemember = rAttrValue;
					GetTransformer().NegPercent(aImageOpacityValueRemember);
					break;

                case XML_OPTACTION_KEEP_TOGETHER:
                    pAttrList->AddAttribute(
                        GetTransformer().GetNamespaceMap().GetQNameByKey(
                            XML_NAMESPACE_STYLE,GetXMLToken(XML_BREAK_INSIDE)),
                        GetXMLToken(
                            IsXMLToken( rAttrValue, XML_ALWAYS )
                            ? XML_COLUMNSPLIT_AVOID
                            : XML_COLUMNSPLIT_AUTO ) );
                    break;

                case XML_OPTACTION_CONTROL_TEXT_ALIGN:
                    if ( m_bControlStyle )
                    {
						OUString aNewAttrQName(
							GetTransformer().GetNamespaceMap().GetQNameByKey(
								XML_NAMESPACE_STYLE,
								::xmloff::token::GetXMLToken(
								XML_TEXT_ALIGN ) ) );
						pAttrList->AddAttribute( aNewAttrQName, rAttrValue );
                    }
                    else
                    {
						OUString aNewAttrQName(
							GetTransformer().GetNamespaceMap().GetQNameByKey(
								XML_NAMESPACE_FO,
								::xmloff::token::GetXMLToken(
								XML_TEXT_ALIGN ) ) );
						pAttrList->AddAttribute( aNewAttrQName, rAttrValue );
                    }
                    break;

				case XML_OPTACTION_DRAW_WRITING_MODE:
					if( IsXMLToken( m_aStyleFamily, XML_GRAPHICS ) )
					{
						pAttrList->AddAttribute(
							GetTransformer().GetNamespaceMap().GetQNameByKey(
									XML_NAMESPACE_DRAW,
									GetXMLToken( XML_WRITING_MODE ) ), rAttrValue );
					}
					pAttrList->AddAttribute( rAttrName, rAttrValue );
					break;

				case XML_ATACTION_CAPTION_ESCAPE_OASIS:
					{
						OUString aAttrValue( rAttrValue );
						if( aAttrValue.indexOf( sal_Unicode('%') ) != -1 )
						{
							sal_Int32 nValue = 0;
							SvXMLUnitConverter::convertPercent( nValue, rAttrValue );
							if( nValue )
							{
								nValue *= 100;
								rtl::OUStringBuffer aOut;
					 			SvXMLUnitConverter::convertPercent( aOut, nValue );
								aAttrValue = aOut.makeStringAndClear();
							}
						}
						else
						{
							XMLTransformerBase::ReplaceSingleInWithInch( aAttrValue );
						}

						pAttrList->AddAttribute( rAttrName, aAttrValue );
					}
					break;

				case XML_ATACTION_DECODE_PROTECT:
					{
						pAttrList->AddAttribute( rAttrName, rAttrValue );

						if( rAttrValue.indexOf( GetXMLToken( XML_SIZE ) ) != -1 )
							pAttrList->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey(
                                    XML_NAMESPACE_DRAW,
                                    GetXMLToken( XML_SIZE_PROTECT )), GetXMLToken( XML_TRUE ) );

						if( rAttrValue.indexOf( GetXMLToken( XML_POSITION ) ) != -1 )
							pAttrList->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey(
                                    XML_NAMESPACE_DRAW,
                                    GetXMLToken( XML_MOVE_PROTECT )), GetXMLToken( XML_TRUE ) );
					}
					break;

				case XML_ATACTION_DRAW_MIRROR_OASIS: // renames style:mirror to draw:mirror and adapts values
					{
						// keep original for writer graphic objects
                        // --> OD 2005-05-12 #i49139# - adapts attribute values,
                        OUString aNewAttrValue;
                        SvXMLTokenEnumerator aTokenEnum( rAttrValue );
                        OUString aToken;
                        while( aTokenEnum.getNextToken( aToken ) )
                        {
                            if ( aNewAttrValue.getLength() > 0 )
                            {
                                aNewAttrValue += rtl::OUString::createFromAscii( " " );
                            }

                            if ( IsXMLToken( aToken, XML_HORIZONTAL_ON_EVEN ) )
                            {
                                aNewAttrValue += GetXMLToken( XML_HORIZONTAL_ON_LEFT_PAGES );
                            }
                            else if ( IsXMLToken( aToken, XML_HORIZONTAL_ON_ODD ) )
                            {
                                aNewAttrValue += GetXMLToken( XML_HORIZONTAL_ON_RIGHT_PAGES );
                            }
                            else
                            {
                                aNewAttrValue += aToken;
                            }
                        }
                        pAttrList->AddAttribute( rAttrName, aNewAttrValue );
                        // <--

						// create old draw:mirror for drawing graphic objects
						OUString aAttrValue( GetXMLToken( IsXMLToken( rAttrValue, XML_HORIZONTAL ) ? XML_TRUE : XML_FALSE ) );
						pAttrList->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey(
                                    XML_NAMESPACE_DRAW,
                                    GetXMLToken( XML_MIRROR )), aAttrValue );
					}
					break;
				case XML_ATACTION_GAMMA_OASIS:		 // converts percentage value to double
					{
						sal_Int32 nValue;
						SvXMLUnitConverter::convertPercent( nValue, rAttrValue );
						const double fValue = ((double)nValue) / 100.0;
						pAttrList->AddAttribute( rAttrName, OUString::valueOf( fValue ) );
					}
					break;
				case XML_ATACTION_OPACITY_FIX:
					{
						sal_Int32 nValue;
						if( rAttrValue.indexOf( sal_Unicode('%') ) != -1 )
						{
							SvXMLUnitConverter::convertPercent( nValue, rAttrValue );
						}
						else
						{
							nValue = sal_Int32( rAttrValue.toDouble() * 100.0 );
						}
						nValue = 100 - nValue;

						rtl::OUStringBuffer aOut;
						SvXMLUnitConverter::convertPercent( aOut, nValue );
						pAttrList->AddAttribute( rAttrName, aOut.makeStringAndClear() );
					}
					break;
				default:
					OSL_ENSURE( sal_False, "unknown action" );
					break;
				}
			}
			else
			{
				pAttrList->AddAttribute( rAttrName, rAttrValue );
			}
		}
		if( XML_TOKEN_END != eUnderline )
			pAttrList->AddAttribute(
					GetTransformer().GetNamespaceMap().GetQNameByKey(
						XML_NAMESPACE_STYLE,
						GetXMLToken( XML_TEXT_UNDERLINE ) ),
					MergeUnderline( eUnderline, bBoldUnderline,
									bDoubleUnderline ) );
		if( XML_TOKEN_END != eLineThrough )
			pAttrList->AddAttribute(
					GetTransformer().GetNamespaceMap().GetQNameByKey(
						XML_NAMESPACE_STYLE,
						GetXMLToken( XML_TEXT_CROSSING_OUT ) ),
					MergeLineThrough( eLineThrough, bBoldLineThrough,
									bDoubleLineThrough, cLineThroughChar ) );
        if( bIntervalMinorFound )
        {
            double fIntervalMinor = 0.0;
            if( nIntervalMinorDivisor != 0)
                fIntervalMinor = fIntervalMajor / static_cast< double >( nIntervalMinorDivisor );

            ::rtl::OUStringBuffer aBuf;
            SvXMLUnitConverter::convertDouble( aBuf, fIntervalMinor );
            pAttrList->AddAttribute(
                GetTransformer().GetNamespaceMap().GetQNameByKey(
                    XML_NAMESPACE_CHART,
                    GetXMLToken( XML_INTERVAL_MINOR )),
                aBuf.makeStringAndClear());
        }

		// #i25616#
		if(aOpacityValueRemember.getLength() || aImageOpacityValueRemember.getLength())
		{
			pAttrList->AddAttribute(
					GetTransformer().GetNamespaceMap().GetQNameByKey(
						XML_NAMESPACE_DRAW,
						GetXMLToken( XML_TRANSPARENCY ) ),
					aImageOpacityValueRemember.getLength()
					? aImageOpacityValueRemember : aOpacityValueRemember );
		}
	}
	else
	{
		if( !m_xAttrList.is() )
		{
			m_xAttrList = new XMLMutableAttributeList( rAttrList, sal_True );
		}
		else
		{
			static_cast< XMLMutableAttributeList * >( m_xAttrList.get() )
				->AppendAttributeList( rAttrList );
		}
	}
}

void XMLPropertiesTContext_Impl::Export()
{
	OUString aNewQName( GetTransformer().GetNamespaceMap().GetQNameByKey(
				XML_NAMESPACE_STYLE,
				::xmloff::token::GetXMLToken( XML_PROPERTIES ) ) );
	GetTransformer().GetDocHandler()->startElement( GetExportQName(),
													m_xAttrList );
	ExportContent();
	GetTransformer().GetDocHandler()->endElement( GetExportQName() );
}

XMLPropType XMLPropertiesTContext_Impl::GetPropType( const OUString& rLocalName )
{
	XMLPropType eProp = XML_PROP_TYPE_END;
	if( IsXMLToken( rLocalName, XML_GRAPHIC_PROPERTIES )  )
		eProp = XML_PROP_TYPE_GRAPHIC;
	else if( IsXMLToken( rLocalName, XML_DRAWING_PAGE_PROPERTIES ) )
		eProp = XML_PROP_TYPE_DRAWING_PAGE;
	else if( IsXMLToken( rLocalName, XML_PAGE_LAYOUT_PROPERTIES ) )
		eProp = XML_PROP_TYPE_PAGE_LAYOUT;
	else if( IsXMLToken( rLocalName, XML_HEADER_FOOTER_PROPERTIES ) )
		eProp = XML_PROP_TYPE_HEADER_FOOTER;
	else if( IsXMLToken( rLocalName, XML_TEXT_PROPERTIES ) )
		eProp = XML_PROP_TYPE_TEXT;
	else if( IsXMLToken( rLocalName, XML_PARAGRAPH_PROPERTIES ) )
		eProp = XML_PROP_TYPE_PARAGRAPH;
	else if( IsXMLToken( rLocalName, XML_RUBY_PROPERTIES ) )
		eProp = XML_PROP_TYPE_RUBY;
	else if( IsXMLToken( rLocalName, XML_SECTION_PROPERTIES ) )
		eProp = XML_PROP_TYPE_SECTION;
	else if( IsXMLToken( rLocalName, XML_TABLE_PROPERTIES ) )
		eProp = XML_PROP_TYPE_TABLE;
	else if( IsXMLToken( rLocalName, XML_TABLE_COLUMN_PROPERTIES ) )
		eProp = XML_PROP_TYPE_TABLE_COLUMN;
	else if( IsXMLToken( rLocalName, XML_TABLE_ROW_PROPERTIES ) )
		eProp = XML_PROP_TYPE_TABLE_ROW;
	else if( IsXMLToken( rLocalName, XML_TABLE_CELL_PROPERTIES ) )
		eProp = XML_PROP_TYPE_TABLE_CELL;
	else if( IsXMLToken( rLocalName, XML_LIST_LEVEL_PROPERTIES ) )
		eProp = XML_PROP_TYPE_LIST_LEVEL;
	else if( IsXMLToken( rLocalName, XML_CHART_PROPERTIES ) )
		eProp = XML_PROP_TYPE_CHART;

	return eProp;
}

OUString XMLPropertiesTContext_Impl::MergeUnderline(
			XMLTokenEnum eUnderline, sal_Bool bBold, sal_Bool bDouble )
{
	if( bDouble )
	{
		switch( eUnderline )
		{
		case XML_WAVE:
			eUnderline = XML_DOUBLE_WAVE;
			break;
		default:
			eUnderline = XML_DOUBLE;
			break;
		}
	}
	else if( bBold )
	{
		switch( eUnderline )
		{
		case XML_NONE:
		case XML_SOLID:
			eUnderline = XML_BOLD;
			break;
		case XML_DOTTED:
			eUnderline = XML_BOLD_DOTTED;
			break;
		case XML_DASH:
			eUnderline = XML_BOLD_DASH;
			break;
		case XML_LONG_DASH:
			eUnderline = XML_BOLD_LONG_DASH;
			break;
		case XML_DOT_DASH:
			eUnderline = XML_BOLD_DOT_DASH;
			break;
		case XML_DOT_DOT_DASH:
			eUnderline = XML_BOLD_DOT_DOT_DASH;
			break;
		case XML_WAVE:
			eUnderline = XML_BOLD_WAVE;
			break;
		default:
			OSL_ENSURE( false, "xmloff::XMLPropertiesTContext_Impl::MergeUnderline(), missing underline case!" );
			break;
		}
	}
	else
	{
		switch( eUnderline )
		{
		case XML_SOLID:
			eUnderline = XML_SINGLE;
			break;
		case XML_NONE:
			eUnderline = XML_NONE;
			break;
		default:
			OSL_ENSURE( false, "xmloff::XMLPropertiesTContext_Impl::MergeUnderline(), missing underline case!" );
			break;
		}
	}

	return GetXMLToken( eUnderline );
}

OUString XMLPropertiesTContext_Impl::MergeLineThrough(
			XMLTokenEnum eLineThrough, sal_Bool bBold, sal_Bool bDouble,
	   		sal_Unicode c )
{
	if( c )
		eLineThrough = c=='/' ? XML_SLASH : XML_uX;
	else if( bDouble )
		eLineThrough = XML_DOUBLE_LINE;
	else if( bBold )
		eLineThrough = XML_THICK_LINE;
	else if( XML_NONE != eLineThrough )
		eLineThrough = XML_SINGLE_LINE;

	return GetXMLToken( eLineThrough );
}

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

TYPEINIT1( XMLStyleOASISTContext, XMLPersElemContentTContext );

XMLStyleOASISTContext::XMLStyleOASISTContext( XMLTransformerBase& rImp,
							  				  const OUString& rQName,
	   										  sal_Bool bPersistent ) :
	XMLPersElemContentTContext ( rImp, rQName ),
	m_bPersistent( bPersistent ),
    m_bControlStyle( false )
{
}

XMLStyleOASISTContext::XMLStyleOASISTContext(
		XMLTransformerBase& rImp,
	  	const OUString& rQName,
	    sal_uInt16 nPrefix,
		::xmloff::token::XMLTokenEnum eToken,
	   	sal_Bool bPersistent ) :
	XMLPersElemContentTContext( rImp, rQName, nPrefix, eToken ),
	m_bPersistent( bPersistent )
{
}

XMLStyleOASISTContext::~XMLStyleOASISTContext()
{
}

XMLTransformerContext *XMLStyleOASISTContext::CreateChildContext(
			sal_uInt16 nPrefix,
			const OUString& rLocalName,
			const OUString& rQName,
			const Reference< XAttributeList >& rAttrList )
{
	XMLTransformerContext *pContext = 0;

	if( XML_NAMESPACE_STYLE == nPrefix )
	{
		XMLPropType ePropType =
			XMLPropertiesTContext_Impl::GetPropType( rLocalName );
		if( XML_PROP_TYPE_END != ePropType )
		{
			// if no properties context exist start a new one.
			if( !m_xPropContext.is() )
				m_xPropContext = new XMLPropertiesTContext_Impl(
                    GetTransformer(), rQName, ePropType, m_aStyleFamily, m_bControlStyle );
			else
				m_xPropContext->SetQNameAndPropType( rQName, ePropType );
			pContext = m_xPropContext.get();
		}
	}
	if( !pContext )
	{
		// if a properties context exist close it
		if( m_xPropContext.is() && !m_bPersistent )
		{
			m_xPropContext->Export();
			m_xPropContext = 0;
		}

		pContext = m_bPersistent
						? XMLPersElemContentTContext::CreateChildContext(
								nPrefix, rLocalName, rQName, rAttrList )
						: XMLTransformerContext::CreateChildContext(
								nPrefix, rLocalName, rQName, rAttrList );
	}

	return pContext;
}

void XMLStyleOASISTContext::StartElement(
		const Reference< XAttributeList >& rAttrList )
{
	XMLTransformerActions *pActions =
		GetTransformer().GetUserDefinedActions( OASIS_STYLE_ACTIONS );
	OSL_ENSURE( pActions, "go no actions" );

	Reference< XAttributeList > xAttrList( rAttrList );
	XMLMutableAttributeList *pMutableAttrList = 0;
	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
	sal_Int16 nFamilyAttr = -1;
	m_bControlStyle = sal_False;

	for( sal_Int16 i=0; i < nAttrCount; i++ )
	{
		const OUString& rAttrName = xAttrList->getNameByIndex( i );
		OUString aLocalName;
		sal_uInt16 nPrefix =
			GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName,
																 &aLocalName );
		XMLTransformerActions::key_type aKey( nPrefix, aLocalName );
		XMLTransformerActions::const_iterator aIter =
			pActions->find( aKey );
		if( !(aIter == pActions->end() ) )
		{
			if( !pMutableAttrList )
			{
				pMutableAttrList =
						new XMLMutableAttributeList( xAttrList );
				xAttrList = pMutableAttrList;
			}
			const OUString& rAttrValue = xAttrList->getValueByIndex( i );
			switch( (*aIter).second.m_nActionType )
			{
			case XML_ATACTION_STYLE_FAMILY:
				if( IsXMLToken( rAttrValue, XML_GRAPHIC ) )
				{
					m_aStyleFamily = GetXMLToken( XML_GRAPHICS ) ;
					pMutableAttrList->SetValueByIndex( i, m_aStyleFamily );
				}
				else
				{
					m_aStyleFamily = rAttrValue;

					if( IsXMLToken( rAttrValue, XML_PARAGRAPH ) )
						nFamilyAttr = i;
				}

				break;
			case XML_ATACTION_STYLE_DISPLAY_NAME:
			case XML_ATACTION_REMOVE:
				pMutableAttrList->RemoveAttributeByIndex( i );
				--i;
				--nAttrCount;
				break;
			case XML_ATACTION_DECODE_STYLE_NAME:
				m_bControlStyle = 0 == rAttrValue.compareToAscii( "ctrl", 4 );
			case XML_ATACTION_DECODE_STYLE_NAME_REF:
				{
					OUString aAttrValue( rAttrValue );
					if( GetTransformer().DecodeStyleName(aAttrValue) )
						pMutableAttrList->SetValueByIndex( i, aAttrValue );
				}
				break;
			case XML_ATACTION_IN2INCH:
				{
					OUString aAttrValue( rAttrValue );
					if( XMLTransformerBase::ReplaceSingleInWithInch(
								aAttrValue ) )
						pMutableAttrList->SetValueByIndex( i, aAttrValue );
				}
				break;
			case XML_ATACTION_NEG_PERCENT:
				{
					OUString aAttrValue( rAttrValue );
					if( GetTransformer().NegPercent(aAttrValue) )
						pMutableAttrList->SetValueByIndex( i, aAttrValue );
				}
				break;
			case XML_ATACTION_URI_OASIS:
				{
					OUString aAttrValue( rAttrValue );
					if( GetTransformer().ConvertURIToOOo( aAttrValue,
							static_cast< sal_Bool >((*aIter).second.m_nParam1)))
						pMutableAttrList->SetValueByIndex( i, aAttrValue );
				}
				break;
			default:
				OSL_ENSURE( sal_False, "unknown action" );
				break;
			}
		}
	}

	if( m_bControlStyle && nFamilyAttr != -1 )
		pMutableAttrList->SetValueByIndex( nFamilyAttr, GetXMLToken( XML_CONTROL ) );


	if( m_bPersistent )
		XMLPersElemContentTContext::StartElement( xAttrList );
	else
		GetTransformer().GetDocHandler()->startElement( GetExportQName(),
														xAttrList );
}

void XMLStyleOASISTContext::EndElement()
{
	if( m_bPersistent )
	{
		XMLPersElemContentTContext::EndElement();
	}
	else
	{
		// if a properties context exist close it
		if( m_xPropContext.is() )
		{
			m_xPropContext->Export();
			m_xPropContext = 0;
		}
		GetTransformer().GetDocHandler()->endElement( GetExportQName() );
	}
}

void XMLStyleOASISTContext::Characters( const OUString& )
{
	// element content only:
}

void XMLStyleOASISTContext::ExportContent()
{
	if( m_xPropContext.is() )
		m_xPropContext->Export();
	XMLPersElemContentTContext::ExportContent();
}

sal_Bool XMLStyleOASISTContext::IsPersistent() const
{
	return m_bPersistent;
}

XMLTransformerActions *XMLStyleOASISTContext::CreateTransformerActions(
		sal_uInt16 nType )
{
	XMLTransformerActionInit *pInit = 0;

	switch( nType )
	{
	case PROP_OASIS_GRAPHIC_ATTR_ACTIONS:
		pInit = aGraphicPropertyOASISAttrActionTable;
		break;
	case PROP_OASIS_DRAWING_PAGE_ATTR_ACTIONS:
		pInit = aDrawingPagePropertyOASISAttrActionTable;
		break;
	case PROP_OASIS_PAGE_LAYOUT_ATTR_ACTIONS:
		pInit = aPageLayoutPropertyOASISAttrActionTable;
		break;
	case PROP_OASIS_HEADER_FOOTER_ATTR_ACTIONS:
		pInit = aHeaderFooterPropertyOASISAttrActionTable;
		break;
	case PROP_OASIS_TEXT_ATTR_ACTIONS:
		pInit = aTextPropertyOASISAttrActionTable;
		break;
	case PROP_OASIS_PARAGRAPH_ATTR_ACTIONS:
		pInit = aParagraphPropertyOASISAttrActionTable;
		break;
	case PROP_OASIS_SECTION_ATTR_ACTIONS:
		pInit = aSectionPropertyOASISAttrActionTable;
		break;
	case PROP_OASIS_TABLE_ATTR_ACTIONS:
		pInit = aTablePropertyOASISAttrActionTable;
		break;
	case PROP_OASIS_TABLE_COLUMN_ATTR_ACTIONS:
		pInit = aTableColumnPropertyOASISAttrActionTable;
		break;
	case PROP_OASIS_TABLE_ROW_ATTR_ACTIONS:
		pInit = aTableRowPropertyOASISAttrActionTable;
		break;
	case PROP_OASIS_TABLE_CELL_ATTR_ACTIONS:
		pInit = aTableCellPropertyOASISAttrActionTable;
		break;
	case PROP_OASIS_LIST_LEVEL_ATTR_ACTIONS:
		pInit = aListLevelPropertyOASISAttrActionTable;
		break;
	case PROP_OASIS_CHART_ATTR_ACTIONS:
		pInit = aChartPropertyOASISAttrActionTable;
		break;
	}

	XMLTransformerActions *pActions = 0;
	if( pInit )
		pActions = new XMLTransformerActions( pInit );

	return pActions;
}
