/**************************************************************
 * 
 * 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 "XMLIndexAlphabeticalSourceContext.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 ::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;
using ::xmloff::token::IsXMLToken;
using ::xmloff::token::XML_ALPHABETICAL_INDEX_ENTRY_TEMPLATE;
using ::xmloff::token::XML_OUTLINE_LEVEL;

const sal_Char sAPI_MainEntryCharacterStyleName[] = "MainEntryCharacterStyleName";
const sal_Char sAPI_UseAlphabeticalSeparators[] = "UseAlphabeticalSeparators";
const sal_Char sAPI_UseCombinedEntries[] = "UseCombinedEntries";
const sal_Char sAPI_IsCaseSensitive[] = "IsCaseSensitive";
const sal_Char sAPI_UseKeyAsEntry[] = "UseKeyAsEntry";
const sal_Char sAPI_UseUpperCase[] = "UseUpperCase";
const sal_Char sAPI_UseDash[] = "UseDash";
const sal_Char sAPI_UsePP[] = "UsePP";
const sal_Char sAPI_SortAlgorithm[] = "SortAlgorithm";
const sal_Char sAPI_Locale[] = "Locale";


TYPEINIT1( XMLIndexAlphabeticalSourceContext, XMLIndexSourceBaseContext );

XMLIndexAlphabeticalSourceContext::XMLIndexAlphabeticalSourceContext(
	SvXMLImport& rImport, 
	sal_uInt16 nPrfx,
	const OUString& rLocalName,
	Reference<XPropertySet> & rPropSet)
:	XMLIndexSourceBaseContext(rImport, nPrfx, rLocalName, rPropSet, sal_False)
,	sMainEntryCharacterStyleName(RTL_CONSTASCII_USTRINGPARAM(sAPI_MainEntryCharacterStyleName))
,	sUseAlphabeticalSeparators(RTL_CONSTASCII_USTRINGPARAM(sAPI_UseAlphabeticalSeparators))
,	sUseCombinedEntries(RTL_CONSTASCII_USTRINGPARAM(sAPI_UseCombinedEntries))
,	sIsCaseSensitive(RTL_CONSTASCII_USTRINGPARAM(sAPI_IsCaseSensitive))
,	sUseKeyAsEntry(RTL_CONSTASCII_USTRINGPARAM(sAPI_UseKeyAsEntry))
,	sUseUpperCase(RTL_CONSTASCII_USTRINGPARAM(sAPI_UseUpperCase))
,	sUseDash(RTL_CONSTASCII_USTRINGPARAM(sAPI_UseDash))
,	sUsePP(RTL_CONSTASCII_USTRINGPARAM(sAPI_UsePP))
,	sIsCommaSeparated(RTL_CONSTASCII_USTRINGPARAM("IsCommaSeparated"))
,	sSortAlgorithm(RTL_CONSTASCII_USTRINGPARAM(sAPI_SortAlgorithm))
,	sLocale(RTL_CONSTASCII_USTRINGPARAM(sAPI_Locale))
,	bMainEntryStyleNameOK(sal_False)
,	bSeparators(sal_False)
,	bCombineEntries(sal_True)
,	bCaseSensitive(sal_True)
,	bEntry(sal_False)
,	bUpperCase(sal_False)
,	bCombineDash(sal_False)
,	bCombinePP(sal_True)
,	bCommaSeparated(sal_False)
{
}

XMLIndexAlphabeticalSourceContext::~XMLIndexAlphabeticalSourceContext()
{
}

void XMLIndexAlphabeticalSourceContext::ProcessAttribute(
	enum IndexSourceParamEnum eParam, 
	const OUString& rValue)
{
	sal_Bool bTmp;

	switch (eParam)
	{
		case XML_TOK_INDEXSOURCE_MAIN_ENTRY_STYLE:
			{
				sMainEntryStyleName = rValue;
				OUString sDisplayStyleName = GetImport().GetStyleDisplayName( 
					XML_STYLE_FAMILY_TEXT_TEXT, sMainEntryStyleName );
				const Reference < ::com::sun::star::container::XNameContainer >&
					rStyles = GetImport().GetTextImport()->GetTextStyles();
				bMainEntryStyleNameOK = rStyles.is() && rStyles->hasByName( sDisplayStyleName );
			}
			break;

		case XML_TOK_INDEXSOURCE_IGNORE_CASE:
			if (SvXMLUnitConverter::convertBool(bTmp, rValue))
			{
				bCaseSensitive = !bTmp;
			}
			break;

		case XML_TOK_INDEXSOURCE_SEPARATORS:
			if (SvXMLUnitConverter::convertBool(bTmp, rValue))
			{
				bSeparators = bTmp;
			}
			break;

		case XML_TOK_INDEXSOURCE_COMBINE_ENTRIES:
			if (SvXMLUnitConverter::convertBool(bTmp, rValue))
			{
				bCombineEntries = bTmp;
			}
			break;

		case XML_TOK_INDEXSOURCE_COMBINE_WITH_DASH:
			if (SvXMLUnitConverter::convertBool(bTmp, rValue))
			{
				bCombineDash = bTmp;
			}
			break;
		case XML_TOK_INDEXSOURCE_KEYS_AS_ENTRIES:
			if (SvXMLUnitConverter::convertBool(bTmp, rValue))
			{
				bEntry = bTmp;
			}
			break;

		case XML_TOK_INDEXSOURCE_COMBINE_WITH_PP:
			if (SvXMLUnitConverter::convertBool(bTmp, rValue))
			{
				bCombinePP = bTmp;
			}
			break;

		case XML_TOK_INDEXSOURCE_CAPITALIZE:
			if (SvXMLUnitConverter::convertBool(bTmp, rValue))
			{
				bUpperCase = bTmp;
			}
			break;

		case XML_TOK_INDEXSOURCE_COMMA_SEPARATED:
			if (SvXMLUnitConverter::convertBool(bTmp, rValue))
			{
				bCommaSeparated = bTmp;
			}
			break;

        case XML_TOK_INDEXSOURCE_SORT_ALGORITHM:
            sAlgorithm = rValue;
            break;
        case XML_TOK_INDEXSOURCE_LANGUAGE:
            aLocale.Language = rValue;
            break;
        case XML_TOK_INDEXSOURCE_COUNTRY:
            aLocale.Country = rValue;
            break;

		default:
			XMLIndexSourceBaseContext::ProcessAttribute(eParam, rValue);
			break;
	}
}

void XMLIndexAlphabeticalSourceContext::EndElement()
{

	Any aAny;

	if (bMainEntryStyleNameOK)
	{
		aAny <<= GetImport().GetStyleDisplayName(
							XML_STYLE_FAMILY_TEXT_TEXT, sMainEntryStyleName );
		rIndexPropertySet->setPropertyValue(sMainEntryCharacterStyleName,aAny);
	}

	aAny.setValue(&bSeparators, ::getBooleanCppuType());
	rIndexPropertySet->setPropertyValue(sUseAlphabeticalSeparators, aAny);

	aAny.setValue(&bCombineEntries, ::getBooleanCppuType());
	rIndexPropertySet->setPropertyValue(sUseCombinedEntries, aAny);

	aAny.setValue(&bCaseSensitive, ::getBooleanCppuType());
	rIndexPropertySet->setPropertyValue(sIsCaseSensitive, aAny);

	aAny.setValue(&bEntry, ::getBooleanCppuType());
	rIndexPropertySet->setPropertyValue(sUseKeyAsEntry, aAny);

	aAny.setValue(&bUpperCase, ::getBooleanCppuType());
	rIndexPropertySet->setPropertyValue(sUseUpperCase, aAny);

	aAny.setValue(&bCombineDash, ::getBooleanCppuType());
	rIndexPropertySet->setPropertyValue(sUseDash, aAny);

	aAny.setValue(&bCombinePP, ::getBooleanCppuType());
	rIndexPropertySet->setPropertyValue(sUsePP, aAny);

	aAny.setValue(&bCommaSeparated, ::getBooleanCppuType());
	rIndexPropertySet->setPropertyValue(sIsCommaSeparated, aAny);


    if (sAlgorithm.getLength() > 0)
    {
        aAny <<= sAlgorithm;
        rIndexPropertySet->setPropertyValue(sSortAlgorithm, aAny);
    }

    if ( (aLocale.Language.getLength() > 0) &&
         (aLocale.Country.getLength() > 0)      )
    {
        aAny <<= aLocale;
        rIndexPropertySet->setPropertyValue(sLocale, aAny);
    }

	XMLIndexSourceBaseContext::EndElement();
}

SvXMLImportContext* XMLIndexAlphabeticalSourceContext::CreateChildContext( 
	sal_uInt16 nPrefix,
	const OUString& rLocalName,
	const Reference<XAttributeList> & xAttrList )
{
	if ( (XML_NAMESPACE_TEXT == nPrefix) &&
		 IsXMLToken( rLocalName, XML_ALPHABETICAL_INDEX_ENTRY_TEMPLATE ) )
	{
		return new XMLIndexTemplateContext(GetImport(), rIndexPropertySet, 
										   nPrefix, rLocalName,
										   aLevelNameAlphaMap,
										   XML_OUTLINE_LEVEL,
										   aLevelStylePropNameAlphaMap,
										   aAllowedTokenTypesAlpha);
	}
	else 
	{
		return XMLIndexSourceBaseContext::CreateChildContext(nPrefix, 
															 rLocalName,
															 xAttrList);
	}
}
