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

#include "XMLIndexSourceBaseContext.hxx"
#include <com/sun/star/uno/Reference.h>


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


/**
 * Import table index source element
 */
class XMLIndexTableSourceContext : public XMLIndexSourceBaseContext
{
	const ::rtl::OUString sCreateFromLabels;
	const ::rtl::OUString sLabelCategory;
	const ::rtl::OUString sLabelDisplayType;

	::rtl::OUString sSequence;
	sal_Int16 nDisplayFormat;

	sal_Bool bSequenceOK;
	sal_Bool bDisplayFormatOK;
	sal_Bool bUseCaption;

public:

	TYPEINFO();

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

	~XMLIndexTableSourceContext();

protected:

	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
