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

#include <com/sun/star/drawing/XDrawPage.hpp>
#include <com/sun/star/frame/XModel.hpp>
#include <com/sun/star/task/XStatusIndicator.hpp>
#include <xmloff/xmltkmap.hxx>
#include <com/sun/star/container/XNameAccess.hpp>

#ifndef __SGI_STL_VECTOR
#include <vector>
#endif
#include <xmloff/xmlimp.hxx>

//////////////////////////////////////////////////////////////////////////////

enum SdXMLDocElemTokenMap
{
	XML_TOK_DOC_FONTDECLS,
	XML_TOK_DOC_STYLES,
	XML_TOK_DOC_AUTOSTYLES,
	XML_TOK_DOC_MASTERSTYLES,
	XML_TOK_DOC_META,
	XML_TOK_DOC_BODY,
	XML_TOK_DOC_SCRIPT,
	XML_TOK_DOC_SETTINGS,
	XML_TOK_OFFICE_END = XML_TOK_UNKNOWN
};

enum SdXMLBodyElemTokenMap
{
	XML_TOK_BODY_PAGE,
	XML_TOK_BODY_SETTINGS,
	XML_TOK_BODY_HEADER_DECL,
	XML_TOK_BODY_FOOTER_DECL,
	XML_TOK_BODY_DATE_TIME_DECL
};

enum SdXMLStylesElemTokenMap
{
	XML_TOK_STYLES_MASTER_PAGE,
	XML_TOK_STYLES_STYLE,
	XML_TOK_STYLES_PAGE_MASTER,
	XML_TOK_STYLES_PRESENTATION_PAGE_LAYOUT
};

enum SdXMLAutoStylesElemTokenMap
{
	XML_TOK_AUTOSTYLES_STYLE
};

enum SdXMLMasterPageElemTokenMap
{
	XML_TOK_MASTERPAGE_STYLE,
	XML_TOK_MASTERPAGE_NOTES
};

enum SdXMLMasterPageAttrTokenMap
{
	XML_TOK_MASTERPAGE_NAME,
	XML_TOK_MASTERPAGE_DISPLAY_NAME,
	XML_TOK_MASTERPAGE_PAGE_MASTER_NAME,
	XML_TOK_MASTERPAGE_STYLE_NAME,
	XML_TOK_MASTERPAGE_PAGE_LAYOUT_NAME,
	XML_TOK_MASTERPAGE_USE_HEADER_NAME,
	XML_TOK_MASTERPAGE_USE_FOOTER_NAME,
	XML_TOK_MASTERPAGE_USE_DATE_TIME_NAME
};

enum SdXMLPageMasterAttrTokenMap
{
	XML_TOK_PAGEMASTER_NAME
};

enum SdXMLPageMasterStyleAttrTokenMap
{
	XML_TOK_PAGEMASTERSTYLE_MARGIN_TOP,
	XML_TOK_PAGEMASTERSTYLE_MARGIN_BOTTOM,
	XML_TOK_PAGEMASTERSTYLE_MARGIN_LEFT,
	XML_TOK_PAGEMASTERSTYLE_MARGIN_RIGHT,
	XML_TOK_PAGEMASTERSTYLE_PAGE_WIDTH,
	XML_TOK_PAGEMASTERSTYLE_PAGE_HEIGHT,
	XML_TOK_PAGEMASTERSTYLE_PAGE_ORIENTATION
};

enum SdXMLDocStyleAttrTokenMap
{
	XML_TOK_DOCSTYLE_NAME,
	XML_TOK_DOCSTYLE_FAMILY,
	XML_TOK_DOCSTYLE_PARENT_STYLE_NAME,
	XML_TOK_DOCSTYLE_AUTOMATIC
};

enum SdXMLDocStyleElemTokenMap
{
	XML_TOK_DOCSTYLE_PROPERTIES,
	XML_TOK_DOCSTYLE_PRESENTATION_PLACEHOLDER
};

enum SdXMLDrawPageAttrTokenMap
{
	XML_TOK_DRAWPAGE_NAME,
	XML_TOK_DRAWPAGE_STYLE_NAME,
	XML_TOK_DRAWPAGE_MASTER_PAGE_NAME,
	XML_TOK_DRAWPAGE_PAGE_LAYOUT_NAME,
    XML_TOK_DRAWPAGE_DRAWID,
    XML_TOK_DRAWPAGE_XMLID,
	XML_TOK_DRAWPAGE_HREF,
	XML_TOK_DRAWPAGE_USE_HEADER_NAME,
	XML_TOK_DRAWPAGE_USE_FOOTER_NAME,
	XML_TOK_DRAWPAGE_USE_DATE_TIME_NAME
};

enum SdXMLDrawPageElemTokenMap
{
	XML_TOK_DRAWPAGE_NOTES,
	XML_TOK_DRAWPAGE_PAR,
	XML_TOK_DRAWPAGE_SEQ
};

enum SdXMLPresentationPlaceholderAttrTokenMap
{
	XML_TOK_PRESENTATIONPLACEHOLDER_OBJECTNAME,
	XML_TOK_PRESENTATIONPLACEHOLDER_X,
	XML_TOK_PRESENTATIONPLACEHOLDER_Y,
	XML_TOK_PRESENTATIONPLACEHOLDER_WIDTH,
	XML_TOK_PRESENTATIONPLACEHOLDER_HEIGHT
};

//////////////////////////////////////////////////////////////////////////////

struct SdXMLltXDrawPageId
{
  bool operator()(sal_Int32 nId1, sal_Int32 nId2 ) const
  {
    return nId1 < nId2;
  }
};

typedef std::map< sal_Int32, com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage >, SdXMLltXDrawPageId > DrawPageIdMap;

//////////////////////////////////////////////////////////////////////////////

class SvXMLUnitConverter;
class SvXMLTokenMap;
class XMLSdPropHdlFactory;
class XMLPropertySetMapper;
class XMLPropStyleContext;
class SdXMLStylesContext;
class SdXMLMasterStylesContext;

//////////////////////////////////////////////////////////////////////////////

struct DateTimeDeclContextImpl
{
	rtl::OUString maStrText;
	sal_Bool mbFixed;
	rtl::OUString maStrDateTimeFormat;

	DateTimeDeclContextImpl() : mbFixed(sal_True) {}
};

DECLARE_STL_USTRINGACCESS_MAP( ::rtl::OUString, HeaderFooterDeclMap );
DECLARE_STL_USTRINGACCESS_MAP( DateTimeDeclContextImpl, DateTimeDeclMap );

//////////////////////////////////////////////////////////////////////////////

class SdXMLImport: public SvXMLImport
{
	com::sun::star::uno::Reference< com::sun::star::container::XNameAccess > mxDocStyleFamilies;
	com::sun::star::uno::Reference< com::sun::star::container::XIndexAccess > mxDocMasterPages;
	com::sun::star::uno::Reference< com::sun::star::container::XIndexAccess > mxDocDrawPages;
	com::sun::star::uno::Reference< com::sun::star::container::XNameAccess > mxPageLayouts;

	// contexts for Style and AutoStyle import
	SdXMLMasterStylesContext*	mpMasterStylesContext;

	// token map lists
	SvXMLTokenMap*				mpDocElemTokenMap;
	SvXMLTokenMap*				mpBodyElemTokenMap;
	SvXMLTokenMap*				mpStylesElemTokenMap;
	SvXMLTokenMap*				mpAutoStylesElemTokenMap;
	SvXMLTokenMap*				mpMasterPageElemTokenMap;
	SvXMLTokenMap*				mpMasterPageAttrTokenMap;
	SvXMLTokenMap*				mpPageMasterAttrTokenMap;
	SvXMLTokenMap*				mpPageMasterStyleAttrTokenMap;
	SvXMLTokenMap*				mpDocStyleAttrTokenMap;
	SvXMLTokenMap*				mpDocStyleElemTokenMap;
	SvXMLTokenMap*				mpDrawPageAttrTokenMap;
	SvXMLTokenMap*				mpDrawPageElemTokenMap;
	SvXMLTokenMap*				mpPresentationPlaceholderAttrTokenMap;

	sal_uInt16					mnStyleFamilyMask;

	sal_Int32					mnNewPageCount;
	sal_Int32					mnNewMasterPageCount;

	sal_Bool					mbIsDraw;
	sal_Bool					mbLoadDoc;
	sal_Bool					mbPreview;

	DrawPageIdMap				maDrawPageIds;

	::rtl::OUString				msPageLayouts;
	::rtl::OUString				msPreview;

	HeaderFooterDeclMap			maHeaderDeclsMap;
	HeaderFooterDeclMap			maFooterDeclsMap;
	DateTimeDeclMap				maDateTimeDeclsMap;

protected:
	// This method is called after the namespace map has been updated, but
	// before a context for the current element has been pushed.
	virtual SvXMLImportContext *CreateContext(sal_uInt16 nPrefix,
	  const rtl::OUString& rLocalName,
	  const com::sun::star::uno::Reference<
		com::sun::star::xml::sax::XAttributeList>& xAttrList);

public:
	// #110680#
	SdXMLImport(
		const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceFactory,
		sal_Bool bIsDraw, sal_uInt16 nImportFlags = IMPORT_ALL );
	~SdXMLImport() throw ();

	// XImporter
	virtual void SAL_CALL setTargetDocument( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent >& xDoc ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);

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

	void SetProgress(sal_Int32 nProg);

	virtual void SetViewSettings(const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& aViewProps);
	virtual void SetConfigurationSettings(const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& aConfigProps);

	// namespace office
    // NB: in contrast to other CreateFooContexts, this particular one handles
    //     the root element (i.e. office:document-meta)
	SvXMLImportContext* CreateMetaContext(const rtl::OUString& rLocalName,
		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList >& xAttrList);
	SvXMLImportContext* CreateScriptContext( const ::rtl::OUString& rLocalName );
	SvXMLImportContext* CreateBodyContext(const rtl::OUString& rLocalName,
		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList >& xAttrList);
	SvXMLStylesContext* CreateStylesContext(const rtl::OUString& rLocalName,
		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList >& xAttrList);
	SvXMLStylesContext* CreateAutoStylesContext(const rtl::OUString& rLocalName,
		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList >& xAttrList);
	SvXMLImportContext* CreateMasterStylesContext(const rtl::OUString& rLocalName,
		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList >& xAttrList);
	SvXMLImportContext *CreateFontDeclsContext(const ::rtl::OUString& rLocalName,
		const ::com::sun::star::uno::Reference<	::com::sun::star::xml::sax::XAttributeList > & xAttrList );

	// Styles and AutoStyles contexts
	const SdXMLMasterStylesContext* GetMasterStylesContext() const { return mpMasterStylesContext; }

	sal_uInt16 GetStyleFamilyMask() const { return mnStyleFamilyMask; }
	sal_Bool IsStylesOnlyMode() const { return !mbLoadDoc; }

	const SvXMLTokenMap& GetDocElemTokenMap();
	const SvXMLTokenMap& GetBodyElemTokenMap();
	const SvXMLTokenMap& GetStylesElemTokenMap();
	const SvXMLTokenMap& GetMasterPageElemTokenMap();
	const SvXMLTokenMap& GetMasterPageAttrTokenMap();
	const SvXMLTokenMap& GetPageMasterAttrTokenMap();
	const SvXMLTokenMap& GetPageMasterStyleAttrTokenMap();
	const SvXMLTokenMap& GetDrawPageAttrTokenMap();
	const SvXMLTokenMap& GetDrawPageElemTokenMap();
	const SvXMLTokenMap& GetPresentationPlaceholderAttrTokenMap();

	// export local parameters concerning page access and similar
	const com::sun::star::uno::Reference<
		com::sun::star::container::XNameAccess >& GetLocalDocStyleFamilies() const { return mxDocStyleFamilies; }
	const com::sun::star::uno::Reference<
		com::sun::star::container::XIndexAccess >& GetLocalMasterPages() const { return mxDocMasterPages; }
	const com::sun::star::uno::Reference<
		com::sun::star::container::XIndexAccess >& GetLocalDrawPages() const { return mxDocDrawPages; }

	sal_Int32 GetNewPageCount() const { return mnNewPageCount; }
	void IncrementNewPageCount() { mnNewPageCount++; }
	sal_Int32 GetNewMasterPageCount() const { return mnNewMasterPageCount; }
	void IncrementNewMasterPageCount() { mnNewMasterPageCount++; }

	com::sun::star::uno::Reference< com::sun::star::container::XNameAccess > getPageLayouts() const { return mxPageLayouts; }

	sal_Bool IsDraw() const { return mbIsDraw; }
	sal_Bool IsImpress() const { return !mbIsDraw; }

	// import pool defaults. Parameter contains pool defaults read
	// from input data. These data needs to be set at the model.
	void ImportPoolDefaults(const XMLPropStyleContext* pPool);

	// #80365#
    virtual void SetStatistics(
        const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::NamedValue> & i_rStats);

	sal_Bool IsPreview() const { return mbPreview; }

    // XServiceInfo ( : SvXMLExport )
    virtual ::rtl::OUString SAL_CALL getImplementationName() throw( ::com::sun::star::uno::RuntimeException );

	void AddHeaderDecl( const ::rtl::OUString& rName, const ::rtl::OUString& rText );
	void AddFooterDecl( const ::rtl::OUString& rName, const ::rtl::OUString& rText );
	void AddDateTimeDecl( const ::rtl::OUString& rName, const ::rtl::OUString& rText, sal_Bool bFixed, const ::rtl::OUString& rDateTimeFormat );

	::rtl::OUString GetHeaderDecl( const ::rtl::OUString& rName ) const;
	::rtl::OUString GetFooterDecl( const ::rtl::OUString& rName ) const;
	::rtl::OUString GetDateTimeDecl( const ::rtl::OUString& rName, sal_Bool& rbFixed, ::rtl::OUString& rDateTimeFormat );

};

#endif	//  _SDXMLIMP_HXX
