/**************************************************************
 *
 * 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_XMLAUTOTEXTEVENTEXPORT_HXX
#define _XMLOFF_XMLAUTOTEXTEVENTEXPORT_HXX

#include <xmloff/xmlexp.hxx>

#include <set>


namespace rtl {	class OUString; }
namespace com { namespace sun { namespace star {
	namespace container { class XNameAccess; }
	namespace frame { class XModel; }
	namespace lang { class XMultiServiceFactory; }
	namespace uno { template<class X> class Reference; }
	namespace uno { template<class X> class Sequence; }
	namespace uno { class XInterface; }
	namespace uno { class Exception; }
	namespace xml { namespace sax { class XDocumentHandler; } }
} } }


/**
 * Component for the export of events attached to autotext blocks.
 * Via the XInitialization interface it expects up to two strings, the
 * first giving the file name (URL) of the autotext group, and the second
 * identifying the autotext. If one of the strings is not given, it
 * will export the whole group / all groups.
 */
class XMLAutoTextEventExport : public SvXMLExport
{
	::com::sun::star::uno::Reference<
		::com::sun::star::container::XNameAccess> xEvents;

	const ::rtl::OUString sEventType;
	const ::rtl::OUString sNone;


public:

	// #110680#
	//XMLAutoTextEventExport();
	XMLAutoTextEventExport(
		const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceFactory, sal_uInt16 nFlags
		);

	// #110680#
	//XMLAutoTextEventExport(
	//	const ::rtl::OUString& rFileName,
	//	const ::com::sun::star::uno::Reference<
	//		::com::sun::star::xml::sax::XDocumentHandler > & rHandler,
	//	const ::com::sun::star::uno::Reference<
	//		::com::sun::star::frame::XModel > & rModel,
	//	const ::com::sun::star::uno::Reference<
	//		::com::sun::star::container::XNameAccess > & rEvents);
	XMLAutoTextEventExport(
		const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceFactory,
		const ::rtl::OUString& rFileName,
		const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XDocumentHandler > & rHandler,
		const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > & rModel,
		const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > & rEvents, sal_uInt16 nFlags);

	~XMLAutoTextEventExport();

	// XInitialization
    virtual void SAL_CALL initialize(
		const ::com::sun::star::uno::Sequence<
			::com::sun::star::uno::Any> & rArguments )
		throw(
			::com::sun::star::uno::Exception,
			::com::sun::star::uno::RuntimeException);

protected:

	/// export the events off all autotexts
	virtual sal_uInt32 exportDoc(
        enum ::xmloff::token::XMLTokenEnum eClass = xmloff::token::XML_TOKEN_INVALID );

	/// does the document have any events ?
	sal_Bool hasEvents();

	/// export the events element
	void exportEvents();


	/// add the namespaces used by events
	/// (to be called for the document element)
	void addNamespaces();


	// methods without content:
	virtual void _ExportMeta();
	virtual void _ExportScripts();
	virtual void _ExportFontDecls();
	virtual void _ExportStyles( sal_Bool bUsed ) ;
	virtual void _ExportAutoStyles();
	virtual void _ExportMasterStyles();
	virtual void _ExportChangeTracking();
	virtual void _ExportContent();
};



// global functions to support the component

::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL
	XMLAutoTextEventExport_getSupportedServiceNames()
	throw();

::rtl::OUString SAL_CALL XMLAutoTextEventExport_getImplementationName()
	throw();

::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL
	XMLAutoTextEventExportOOO_createInstance(
		const ::com::sun::star::uno::Reference<
			::com::sun::star::lang::XMultiServiceFactory > & )
	throw( ::com::sun::star::uno::Exception );

::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL
	XMLAutoTextEventExportOOO_getSupportedServiceNames()
	throw();

::rtl::OUString SAL_CALL XMLAutoTextEventExportOOO_getImplementationName()
	throw();

::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL
	XMLAutoTextEventExportOOO_createInstance(
		const ::com::sun::star::uno::Reference<
			::com::sun::star::lang::XMultiServiceFactory > & )
	throw( ::com::sun::star::uno::Exception );

#endif
