/**************************************************************
 * 
 * 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( !this, "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( !this, "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;
}
