/**************************************************************
 *
 * 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.
 *
 *************************************************************/



#ifndef _XMLOFF_PERSATTRLISTTCONTEXT_HXX
#define _XMLOFF_PERSATTRLISTTCONTEXT_HXX

#include <xmloff/xmltoken.hxx>
#include "TransformerContext.hxx"


class XMLPersAttrListTContext : public XMLTransformerContext
{

	::com::sun::star::uno::Reference<
		::com::sun::star::xml::sax::XAttributeList > m_xAttrList;
	::rtl::OUString m_aElemQName;
	sal_uInt16 m_nActionMap;

protected:

	void SetExportQName( const ::rtl::OUString& r ) { m_aElemQName = r; }

public:
	TYPEINFO();

	// A contexts constructor does anything that is required if an element
	// starts. Namespace processing has been done already.
	// Note that virtual methods cannot be used inside constructors. Use
	// StartElement instead if this is required.
	XMLPersAttrListTContext( XMLTransformerBase& rTransformer,
						   const ::rtl::OUString& rQName );

	// attr list persistence + attribute processing
	XMLPersAttrListTContext( XMLTransformerBase& rTransformer,
						   const ::rtl::OUString& rQName,
		   				   sal_uInt16 nActionMap );

	// attr list persistence + renaming
	XMLPersAttrListTContext( XMLTransformerBase& rTransformer,
						   const ::rtl::OUString& rQName,
		   				   sal_uInt16 nPrefix,
		   				   ::xmloff::token::XMLTokenEnum eToken );

	// attr list persistence + renaming + attribute processing
	XMLPersAttrListTContext( XMLTransformerBase& rTransformer,
						   const ::rtl::OUString& rQName,
		   				   sal_uInt16 nPrefix,
		   				   ::xmloff::token::XMLTokenEnum eToken,
		   				   sal_uInt16 nActionMap );

	// A contexts destructor does anything that is required if an element
	// ends. By default, nothing is done.
	// Note that virtual methods cannot be used inside destructors. Use
	// EndElement instead if this is required.
	virtual ~XMLPersAttrListTContext();

	// Create a childs element context. By default, the import's
	// CreateContext method is called to create a new default context.
	virtual XMLTransformerContext *CreateChildContext( sal_uInt16 nPrefix,
								   const ::rtl::OUString& rLocalName,
								   const ::rtl::OUString& rQName,
								   const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList );

	// StartElement is called after a context has been constructed and
	// before a elements context is parsed. It may be used for actions that
	// require virtual methods. The default is to do nothing.
	virtual void StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList );

	// EndElement is called before a context will be destructed, but
	// after a elements context has been parsed. It may be used for actions
	// that require virtual methods. The default is to do nothing.
	virtual void EndElement();

	// This method is called for all characters that are contained in the
	// current element.
	virtual void Characters( const ::rtl::OUString& rChars );

	virtual sal_Bool IsPersistent() const;
	virtual void Export();
	virtual void ExportContent();

	const ::rtl::OUString& GetExportQName() const { return m_aElemQName; }

	void AddAttribute( sal_uInt16 nAPrefix,
		::xmloff::token::XMLTokenEnum eAToken,
	   	::xmloff::token::XMLTokenEnum eVToken );

	void AddAttribute( sal_uInt16 nAPrefix,
		::xmloff::token::XMLTokenEnum eAToken,
        const ::rtl::OUString & rValue );

	::com::sun::star::uno::Reference<
		::com::sun::star::xml::sax::XAttributeList >
        GetAttrList() const;
};

#endif	//  _XMLOFF_PERSATTRLISTTCONTEXT_HXX
