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

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

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


enum LineNumberingToken 
{
	XML_TOK_LINENUMBERING_STYLE_NAME,
	XML_TOK_LINENUMBERING_NUMBER_LINES,
	XML_TOK_LINENUMBERING_COUNT_EMPTY_LINES,
	XML_TOK_LINENUMBERING_COUNT_IN_TEXT_BOXES,
	XML_TOK_LINENUMBERING_RESTART_NUMBERING,
	XML_TOK_LINENUMBERING_OFFSET,
	XML_TOK_LINENUMBERING_NUM_FORMAT,
	XML_TOK_LINENUMBERING_NUM_LETTER_SYNC,
	XML_TOK_LINENUMBERING_NUMBER_POSITION,
	XML_TOK_LINENUMBERING_INCREMENT
//	XML_TOK_LINENUMBERING_LINENUMBERING_CONFIGURATION,
//	XML_TOK_LINENUMBERING_INCREMENT,
//	XML_TOK_LINENUMBERING_LINENUMBERING_SEPARATOR,
};


/** import <text:linenumbering-configuration> elements */
class XMLLineNumberingImportContext : public SvXMLStyleContext
{
	const ::rtl::OUString sCharStyleName;
	const ::rtl::OUString sCountEmptyLines;
	const ::rtl::OUString sCountLinesInFrames;
	const ::rtl::OUString sDistance;
	const ::rtl::OUString sInterval;
	const ::rtl::OUString sSeparatorText;
	const ::rtl::OUString sNumberPosition;
	const ::rtl::OUString sNumberingType;
	const ::rtl::OUString sIsOn;
	const ::rtl::OUString sRestartAtEachPage;
	const ::rtl::OUString sSeparatorInterval;

	::rtl::OUString sStyleName;
	::rtl::OUString sNumFormat;
	::rtl::OUString sNumLetterSync;
	::rtl::OUString sSeparator;
	sal_Int32 nOffset;
	sal_Int16 nNumberPosition;
	sal_Int16 nIncrement;
	sal_Int16 nSeparatorIncrement;
	sal_Bool bNumberLines;
	sal_Bool bCountEmptyLines;
	sal_Bool bCountInFloatingFrames;
	sal_Bool bRestartNumbering;

public:	

	TYPEINFO();

	XMLLineNumberingImportContext(
		SvXMLImport& rImport, 
		sal_uInt16 nPrfx,
		const ::rtl::OUString& rLocalName,
		const ::com::sun::star::uno::Reference< 
			::com::sun::star::xml::sax::XAttributeList> & xAttrList);

	~XMLLineNumberingImportContext();

	// to be used by child context: set separator info
	void SetSeparatorText(const ::rtl::OUString& sText);
	void SetSeparatorIncrement(sal_Int16 nIncr);

protected:

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

	void ProcessAttribute(
		enum LineNumberingToken eToken,
		::rtl::OUString sValue);

	virtual void CreateAndInsert(sal_Bool bOverwrite);

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

	void ProcessAttribute(
		const ::rtl::OUString sLocalName,
		const ::rtl::OUString sValue);
};

#endif
