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

#include <xmloff/xmlictxt.hxx>
#include <com/sun/star/uno/Reference.h>
#include <rtl/ustring.hxx>


namespace com { namespace sun { namespace star {
	namespace xml { namespace sax { class XAttributeList; } }
	namespace beans { class XPropertySet; }
} } }

enum IndexSourceParamEnum
{
	XML_TOK_INDEXSOURCE_OUTLINE_LEVEL,
	XML_TOK_INDEXSOURCE_USE_INDEX_MARKS,
	XML_TOK_INDEXSOURCE_INDEX_SCOPE,
	XML_TOK_INDEXSOURCE_RELATIVE_TABS,
	XML_TOK_INDEXSOURCE_USE_OTHER_OBJECTS,
	XML_TOK_INDEXSOURCE_USE_SHEET,
	XML_TOK_INDEXSOURCE_USE_CHART,
	XML_TOK_INDEXSOURCE_USE_DRAW,
	XML_TOK_INDEXSOURCE_USE_IMAGE,
	XML_TOK_INDEXSOURCE_USE_MATH,
	XML_TOK_INDEXSOURCE_MAIN_ENTRY_STYLE,
	XML_TOK_INDEXSOURCE_IGNORE_CASE,
	XML_TOK_INDEXSOURCE_SEPARATORS,
	XML_TOK_INDEXSOURCE_COMBINE_ENTRIES,
	XML_TOK_INDEXSOURCE_COMBINE_WITH_DASH,
	XML_TOK_INDEXSOURCE_KEYS_AS_ENTRIES,
	XML_TOK_INDEXSOURCE_COMBINE_WITH_PP,
	XML_TOK_INDEXSOURCE_CAPITALIZE,
	XML_TOK_INDEXSOURCE_USE_OBJECTS,
	XML_TOK_INDEXSOURCE_USE_GRAPHICS,
	XML_TOK_INDEXSOURCE_USE_TABLES,
	XML_TOK_INDEXSOURCE_USE_FRAMES,
	XML_TOK_INDEXSOURCE_COPY_OUTLINE_LEVELS,
	XML_TOK_INDEXSOURCE_USE_CAPTION,
	XML_TOK_INDEXSOURCE_SEQUENCE_NAME,
	XML_TOK_INDEXSOURCE_SEQUENCE_FORMAT,
	XML_TOK_INDEXSOURCE_COMMA_SEPARATED,
	XML_TOK_INDEXSOURCE_USE_INDEX_SOURCE_STYLES,
    XML_TOK_INDEXSOURCE_SORT_ALGORITHM,
    XML_TOK_INDEXSOURCE_LANGUAGE,
    XML_TOK_INDEXSOURCE_COUNTRY,
    XML_TOK_INDEXSOURCE_USER_INDEX_NAME,
    XML_TOK_INDEXSOURCE_USE_OUTLINE_LEVEL
};


/**
 * Superclass for index source elements
 */
class XMLIndexSourceBaseContext : public SvXMLImportContext
{
	const ::rtl::OUString sCreateFromChapter;
	const ::rtl::OUString sIsRelativeTabstops;

	sal_Bool bUseLevelFormats;

	sal_Bool bChapterIndex;		/// chapter-wise or document index?
	sal_Bool bRelativeTabs;		/// tab stops relative to margin or indent?

protected:

	/// property set of index; must be accessible to subclasses
	::com::sun::star::uno::Reference<
		::com::sun::star::beans::XPropertySet> & rIndexPropertySet;

public:

	TYPEINFO();

	XMLIndexSourceBaseContext(
		SvXMLImport& rImport,
		sal_uInt16 nPrfx,
		const ::rtl::OUString& rLocalName,
		::com::sun::star::uno::Reference<
			::com::sun::star::beans::XPropertySet> & rPropSet,
		sal_Bool bLevelFormats);

	~XMLIndexSourceBaseContext();

protected:

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

	virtual void ProcessAttribute(
		enum IndexSourceParamEnum eParam,
		const ::rtl::OUString& rValue);

	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
