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