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



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_xmloff.hxx"


#include "XMLIndexSourceBaseContext.hxx"
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/container/XIndexReplace.hpp>
#include "XMLIndexTemplateContext.hxx"
#include "XMLIndexTitleTemplateContext.hxx"
#include "XMLIndexTOCStylesContext.hxx"
#include <xmloff/xmlictxt.hxx>
#include <xmloff/xmlimp.hxx>
#include <xmloff/txtimp.hxx>
#include "xmloff/xmlnmspe.hxx"
#include <xmloff/nmspmap.hxx>
#include <xmloff/xmltoken.hxx>
#include <xmloff/xmluconv.hxx>
#include <tools/debug.hxx>
#include <rtl/ustring.hxx>



using namespace ::xmloff::token;

using ::rtl::OUString;
using ::com::sun::star::beans::XPropertySet;
using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::Any;
using ::com::sun::star::xml::sax::XAttributeList;

const sal_Char sAPI_CreateFromChapter[] = "CreateFromChapter";
const sal_Char sAPI_IsRelativeTabstops[] = "IsRelativeTabstops";

static __FAR_DATA SvXMLTokenMapEntry aIndexSourceTokenMap[] =
{
	{ XML_NAMESPACE_TEXT,
		  XML_OUTLINE_LEVEL,
		  XML_TOK_INDEXSOURCE_OUTLINE_LEVEL},
	{ XML_NAMESPACE_TEXT,
		  XML_USE_INDEX_MARKS,
		  XML_TOK_INDEXSOURCE_USE_INDEX_MARKS },
	{ XML_NAMESPACE_TEXT,
		  XML_INDEX_SCOPE,
		  XML_TOK_INDEXSOURCE_INDEX_SCOPE },
	{ XML_NAMESPACE_TEXT,
		  XML_RELATIVE_TAB_STOP_POSITION,
		  XML_TOK_INDEXSOURCE_RELATIVE_TABS } ,
	{ XML_NAMESPACE_TEXT,
		  XML_USE_OTHER_OBJECTS,
		  XML_TOK_INDEXSOURCE_USE_OTHER_OBJECTS },
	{ XML_NAMESPACE_TEXT,
		  XML_USE_SPREADSHEET_OBJECTS,
		  XML_TOK_INDEXSOURCE_USE_SHEET },
	{ XML_NAMESPACE_TEXT,
		  XML_USE_CHART_OBJECTS,
		  XML_TOK_INDEXSOURCE_USE_CHART },
	{ XML_NAMESPACE_TEXT,
		  XML_USE_DRAW_OBJECTS,
		  XML_TOK_INDEXSOURCE_USE_DRAW },
	{ XML_NAMESPACE_TEXT,
		  XML_USE_IMAGE_OBJECTS,
		  XML_TOK_INDEXSOURCE_USE_IMAGE },
	{ XML_NAMESPACE_TEXT,
		  XML_USE_MATH_OBJECTS,
		  XML_TOK_INDEXSOURCE_USE_MATH },
	{ XML_NAMESPACE_TEXT,
		  XML_MAIN_ENTRY_STYLE_NAME,
		  XML_TOK_INDEXSOURCE_MAIN_ENTRY_STYLE },
	{ XML_NAMESPACE_TEXT,
		  XML_IGNORE_CASE,
		  XML_TOK_INDEXSOURCE_IGNORE_CASE },
	{ XML_NAMESPACE_TEXT,
		  XML_ALPHABETICAL_SEPARATORS,
		  XML_TOK_INDEXSOURCE_SEPARATORS },
	{ XML_NAMESPACE_TEXT,
		  XML_COMBINE_ENTRIES,
		  XML_TOK_INDEXSOURCE_COMBINE_ENTRIES },
	{ XML_NAMESPACE_TEXT,
		  XML_COMBINE_ENTRIES_WITH_DASH,
		  XML_TOK_INDEXSOURCE_COMBINE_WITH_DASH },
	{ XML_NAMESPACE_TEXT,
		  XML_USE_KEYS_AS_ENTRIES,
		  XML_TOK_INDEXSOURCE_KEYS_AS_ENTRIES },
	{ XML_NAMESPACE_TEXT,
		  XML_COMBINE_ENTRIES_WITH_PP,
		  XML_TOK_INDEXSOURCE_COMBINE_WITH_PP },
	{ XML_NAMESPACE_TEXT,
		  XML_CAPITALIZE_ENTRIES,
		  XML_TOK_INDEXSOURCE_CAPITALIZE },
	{ XML_NAMESPACE_TEXT,
		  XML_USE_OBJECTS,
		  XML_TOK_INDEXSOURCE_USE_OBJECTS },
	{ XML_NAMESPACE_TEXT,
		  XML_USE_GRAPHICS,
		  XML_TOK_INDEXSOURCE_USE_GRAPHICS },
	{ XML_NAMESPACE_TEXT,
		  XML_USE_TABLES,
		  XML_TOK_INDEXSOURCE_USE_TABLES },
	{ XML_NAMESPACE_TEXT,
		  XML_USE_FLOATING_FRAMES,
		  XML_TOK_INDEXSOURCE_USE_FRAMES },
	{ XML_NAMESPACE_TEXT,
		  XML_COPY_OUTLINE_LEVELS,
		  XML_TOK_INDEXSOURCE_COPY_OUTLINE_LEVELS },
	{ XML_NAMESPACE_TEXT,
		  XML_USE_CAPTION,
		  XML_TOK_INDEXSOURCE_USE_CAPTION },
	{ XML_NAMESPACE_TEXT,
		  XML_CAPTION_SEQUENCE_NAME,
		  XML_TOK_INDEXSOURCE_SEQUENCE_NAME },
	{ XML_NAMESPACE_TEXT,
		  XML_CAPTION_SEQUENCE_FORMAT,
		  XML_TOK_INDEXSOURCE_SEQUENCE_FORMAT },
	{ XML_NAMESPACE_TEXT,
		  XML_COMMA_SEPARATED,
		  XML_TOK_INDEXSOURCE_COMMA_SEPARATED },
	{ XML_NAMESPACE_TEXT,
		  XML_USE_INDEX_SOURCE_STYLES,
		  XML_TOK_INDEXSOURCE_USE_INDEX_SOURCE_STYLES },
    { XML_NAMESPACE_TEXT, XML_SORT_ALGORITHM,
          XML_TOK_INDEXSOURCE_SORT_ALGORITHM },
    { XML_NAMESPACE_FO, XML_LANGUAGE, XML_TOK_INDEXSOURCE_LANGUAGE },
    { XML_NAMESPACE_FO, XML_COUNTRY, XML_TOK_INDEXSOURCE_COUNTRY },
    { XML_NAMESPACE_TEXT, XML_INDEX_NAME, XML_TOK_INDEXSOURCE_USER_INDEX_NAME },
	{ XML_NAMESPACE_TEXT,
		  XML_USE_OUTLINE_LEVEL,
		  XML_TOK_INDEXSOURCE_USE_OUTLINE_LEVEL},

	XML_TOKEN_MAP_END
};


TYPEINIT1( XMLIndexSourceBaseContext, SvXMLImportContext );

XMLIndexSourceBaseContext::XMLIndexSourceBaseContext(
	SvXMLImport& rImport,
	sal_uInt16 nPrfx,
	const OUString& rLocalName,
	Reference<XPropertySet> & rPropSet,
	sal_Bool bLevelFormats)
:	SvXMLImportContext(rImport, nPrfx, rLocalName)
,	sCreateFromChapter(RTL_CONSTASCII_USTRINGPARAM(sAPI_CreateFromChapter))
,	sIsRelativeTabstops(RTL_CONSTASCII_USTRINGPARAM(sAPI_IsRelativeTabstops))
,	bUseLevelFormats(bLevelFormats)
,	bChapterIndex(sal_False)
,	bRelativeTabs(sal_True)
,	rIndexPropertySet(rPropSet)
{
}

XMLIndexSourceBaseContext::~XMLIndexSourceBaseContext()
{
}

void XMLIndexSourceBaseContext::StartElement(
	const Reference<XAttributeList> & xAttrList)
{
	SvXMLTokenMap aTokenMap(aIndexSourceTokenMap);

	// process attributes
	sal_Int16 nLength = xAttrList->getLength();
	for(sal_Int16 i=0; i<nLength; i++)
	{
		// map to IndexSourceParamEnum
		OUString sLocalName;
		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
			GetKeyByAttrName( xAttrList->getNameByIndex(i), &sLocalName );
		sal_uInt16 nToken = aTokenMap.Get(nPrefix, sLocalName);

		// process attribute
		ProcessAttribute((enum IndexSourceParamEnum)nToken,
						 xAttrList->getValueByIndex(i));
	}
}

void XMLIndexSourceBaseContext::ProcessAttribute(
	enum IndexSourceParamEnum eParam,
	const OUString& rValue)
{
	switch (eParam)
	{
		case XML_TOK_INDEXSOURCE_INDEX_SCOPE:
			if ( IsXMLToken( rValue, XML_CHAPTER ) )
			{
				bChapterIndex = sal_True;
			}
			break;

		case XML_TOK_INDEXSOURCE_RELATIVE_TABS:
		{
			sal_Bool bTmp;
			if (SvXMLUnitConverter::convertBool(bTmp, rValue))
			{
				bRelativeTabs = bTmp;
			}
			break;
		}

		default:
			// unknown attribute -> ignore
			break;
	}
}

void XMLIndexSourceBaseContext::EndElement()
{
	Any aAny;

	aAny.setValue(&bRelativeTabs, ::getBooleanCppuType());
	rIndexPropertySet->setPropertyValue(sIsRelativeTabstops, aAny);

	aAny.setValue(&bChapterIndex, ::getBooleanCppuType());
	rIndexPropertySet->setPropertyValue(sCreateFromChapter, aAny);
}

SvXMLImportContext* XMLIndexSourceBaseContext::CreateChildContext(
	sal_uInt16 nPrefix,
	const OUString& rLocalName,
	const Reference<XAttributeList> & xAttrList )
{
	SvXMLImportContext* pContext = NULL;

	if (XML_NAMESPACE_TEXT == nPrefix)
	{
		if ( IsXMLToken( rLocalName, XML_INDEX_TITLE_TEMPLATE ) )
		{
			pContext = new XMLIndexTitleTemplateContext(GetImport(),
														rIndexPropertySet,
														nPrefix, rLocalName);
		}
		else if ( bUseLevelFormats &&
                  IsXMLToken( rLocalName, XML_INDEX_SOURCE_STYLES ) )
		{
			pContext = new XMLIndexTOCStylesContext(GetImport(),
													rIndexPropertySet,
													nPrefix, rLocalName);
		}
		// else: unknown element in text namespace -> ignore
	}
	// else: unknown namespace -> ignore

	// use default context
	if (pContext == NULL)
	{
		pContext = SvXMLImportContext::CreateChildContext(nPrefix, rLocalName,
														  xAttrList);
	}

	return pContext;
}
