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

#include <xmloff/xmlictxt.hxx>
#include <xmloff/xmltoken.hxx>

#include <vector>
#include <com/sun/star/uno/Reference.h>
#include <com/sun/star/uno/Sequence.h>
#include <com/sun/star/beans/PropertyValues.hpp>


namespace com { namespace sun { namespace star {
	namespace xml { namespace sax { class XAttributeList; } }
	namespace beans { class XPropertySet; }
} } }
namespace rtl {	class OUString; }
struct SvXMLEnumMapEntry;


// constants for the XMLIndexTemplateContext constructor

// TOC and user defined index:
extern const SvXMLEnumMapEntry aLevelNameTOCMap[];
extern const sal_Char* aLevelStylePropNameTOCMap[];
extern const sal_Bool aAllowedTokenTypesTOC[];
extern const sal_Bool aAllowedTokenTypesUser[];

// alphabetical index:
extern const SvXMLEnumMapEntry aLevelNameAlphaMap[];
extern const sal_Char* aLevelStylePropNameAlphaMap[];
extern const sal_Bool aAllowedTokenTypesAlpha[];

// bibliography:
extern const SvXMLEnumMapEntry aLevelNameBibliographyMap[];
extern const sal_Char* aLevelStylePropNameBibliographyMap[];
extern const sal_Bool aAllowedTokenTypesBibliography[];

// table, illustration and object tables:
extern const SvXMLEnumMapEntry* aLevelNameTableMap;	// NULL: no outline-level
extern const sal_Char* aLevelStylePropNameTableMap[];
extern const sal_Bool aAllowedTokenTypesTable[];


/**
 * Import index entry templates
 */
class XMLIndexTemplateContext : public SvXMLImportContext
{
	// pick up PropertyValues to be turned into a sequence.
	::std::vector< ::com::sun::star::beans::PropertyValues > aValueVector;

	::rtl::OUString sStyleName;

	const SvXMLEnumMapEntry* pOutlineLevelNameMap;
	enum ::xmloff::token::XMLTokenEnum eOutlineLevelAttrName;
	const sal_Char** pOutlineLevelStylePropMap;
	const sal_Bool* pAllowedTokenTypesMap;

	sal_Int32 nOutlineLevel;
	sal_Bool bStyleNameOK;
	sal_Bool bOutlineLevelOK;
	sal_Bool bTOC;

	// PropertySet of current index
	::com::sun::star::uno::Reference< 
		::com::sun::star::beans::XPropertySet> & rPropertySet;
	
public:

	// constants made available to other contexts (template entry
	// contexts, in particular)
	const ::rtl::OUString sTokenEntryNumber;
	const ::rtl::OUString sTokenEntryText;
	const ::rtl::OUString sTokenTabStop;
	const ::rtl::OUString sTokenText;
	const ::rtl::OUString sTokenPageNumber;
	const ::rtl::OUString sTokenChapterInfo;
	const ::rtl::OUString sTokenHyperlinkStart;
	const ::rtl::OUString sTokenHyperlinkEnd;
	const ::rtl::OUString sTokenBibliographyDataField;

	const ::rtl::OUString sCharacterStyleName;
	const ::rtl::OUString sTokenType;
	const ::rtl::OUString sText;
	const ::rtl::OUString sTabStopRightAligned;
	const ::rtl::OUString sTabStopPosition;
	const ::rtl::OUString sTabStopFillCharacter;
	const ::rtl::OUString sBibliographyDataField;
	const ::rtl::OUString sChapterFormat;
    const ::rtl::OUString sChapterLevel;//i53420

	const ::rtl::OUString sLevelFormat;
	const ::rtl::OUString sParaStyleLevel;


	XMLIndexTemplateContext(
		SvXMLImport& rImport, 
		::com::sun::star::uno::Reference< 
			::com::sun::star::beans::XPropertySet> & rPropSet,
		sal_uInt16 nPrfx,
		const ::rtl::OUString& rLocalName,
		const SvXMLEnumMapEntry* aLevelNameMap,
		enum ::xmloff::token::XMLTokenEnum eLevelAttrName,
		const sal_Char** aLevelStylePropNameMap,
		const sal_Bool* aAllowedTokenTypes,
		sal_Bool bTOC=sal_False);

	~XMLIndexTemplateContext();

	/** add template; to be called by child template entry contexts */
	void addTemplateEntry(
		const ::com::sun::star::beans::PropertyValues& aValues);

protected:

	virtual void StartElement(
		const ::com::sun::star::uno::Reference< 
			::com::sun::star::xml::sax::XAttributeList> & xAttrList);

	virtual void EndElement();

	virtual SvXMLImportContext *CreateChildContext( 
		sal_uInt16 nPrefix,
		const ::rtl::OUString& rLocalName,
		const ::com::sun::star::uno::Reference< 
			::com::sun::star::xml::sax::XAttributeList> & xAttrList );
};

#endif
