/**************************************************************
 *
 * 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 "XMLSectionSourceImportContext.hxx"
#include "XMLSectionImportContext.hxx"
#include <com/sun/star/text/SectionFileLink.hpp>
#include <xmloff/xmlictxt.hxx>
#include <xmloff/xmlimp.hxx>
#include <xmloff/txtimp.hxx>
#include <xmloff/nmspmap.hxx>
#include "xmloff/xmlnmspe.hxx"
#include <xmloff/xmltoken.hxx>
#include <com/sun/star/uno/Reference.h>
#include <com/sun/star/beans/XPropertySet.hpp>


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

using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::text;
using namespace ::xmloff::token;


TYPEINIT1(XMLSectionSourceImportContext, SvXMLImportContext);

XMLSectionSourceImportContext::XMLSectionSourceImportContext(
	SvXMLImport& rImport,
	sal_uInt16 nPrfx,
	const OUString& rLocalName,
	Reference<XPropertySet> & rSectPropSet) :
		SvXMLImportContext(rImport, nPrfx, rLocalName),
		rSectionPropertySet(rSectPropSet)
{
}

XMLSectionSourceImportContext::~XMLSectionSourceImportContext()
{
}

enum XMLSectionSourceToken
{
	XML_TOK_SECTION_XLINK_HREF,
	XML_TOK_SECTION_TEXT_FILTER_NAME,
	XML_TOK_SECTION_TEXT_SECTION_NAME
};

static __FAR_DATA SvXMLTokenMapEntry aSectionSourceTokenMap[] =
{
	{ XML_NAMESPACE_XLINK, XML_HREF, XML_TOK_SECTION_XLINK_HREF },
	{ XML_NAMESPACE_TEXT, XML_FILTER_NAME, XML_TOK_SECTION_TEXT_FILTER_NAME },
	{ XML_NAMESPACE_TEXT, XML_SECTION_NAME,
										XML_TOK_SECTION_TEXT_SECTION_NAME },
	XML_TOKEN_MAP_END
};


void XMLSectionSourceImportContext::StartElement(
	const Reference<XAttributeList> & xAttrList)
{
	SvXMLTokenMap aTokenMap(aSectionSourceTokenMap);
	OUString sURL;
	OUString sFilterName;
	OUString sSectionName;

	sal_Int16 nLength = xAttrList->getLength();
	for(sal_Int16 nAttr = 0; nAttr < nLength; nAttr++)
	{
		OUString sLocalName;
		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
			GetKeyByAttrName( xAttrList->getNameByIndex(nAttr),
							  &sLocalName );

		switch (aTokenMap.Get(nPrefix, sLocalName))
		{
			case XML_TOK_SECTION_XLINK_HREF:
				sURL = xAttrList->getValueByIndex(nAttr);
				break;

			case XML_TOK_SECTION_TEXT_FILTER_NAME:
				sFilterName = xAttrList->getValueByIndex(nAttr);
				break;

			case XML_TOK_SECTION_TEXT_SECTION_NAME:
				sSectionName = xAttrList->getValueByIndex(nAttr);
				break;

			default:
				; // ignore
				break;
		}
	}

	// we only need them once
	const OUString sFileLink(RTL_CONSTASCII_USTRINGPARAM("FileLink"));
	const OUString sLinkRegion(RTL_CONSTASCII_USTRINGPARAM("LinkRegion"));

	Any aAny;
	if ((sURL.getLength() > 0) || (sFilterName.getLength() > 0))
	{
		SectionFileLink aFileLink;
		aFileLink.FileURL = GetImport().GetAbsoluteReference( sURL );
		aFileLink.FilterName = sFilterName;

		aAny <<= aFileLink;
		rSectionPropertySet->setPropertyValue(sFileLink, aAny);
	}

	if (sSectionName.getLength() > 0)
	{
		aAny <<= sSectionName;
		rSectionPropertySet->setPropertyValue(sLinkRegion, aAny);
	}
}

void XMLSectionSourceImportContext::EndElement()
{
	// this space intentionally left blank.
}

SvXMLImportContext* XMLSectionSourceImportContext::CreateChildContext(
	sal_uInt16 nPrefix,
	const OUString& rLocalName,
	const Reference<XAttributeList> & )
{
	// ignore -> default context
	return new SvXMLImportContext(GetImport(), nPrefix, rLocalName);
}
