/**************************************************************
 * 
 * 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_XMLPROPERTYBACKPATCHER_HXX
#define _XMLOFF_XMLPROPERTYBACKPATCHER_HXX

#ifndef __SGI_STL_MAP
#include <map>
#endif

#ifndef __SGI_STL_VECTOR
#include <vector>
#endif
#include <comphelper/stl_types.hxx>

namespace rtl { class OUString; }
namespace com { namespace sun { namespace star { 
	namespace beans { class XPropertySet; }
	namespace uno { template<class A> class Reference; }
} } }


/** This class maintains an OUString->sal_Int16 mapping for cases in
 * which an XPropertySet needs to be filled with values that are not
 * yet known.
 *
 * A good example for appropriate use are footnotes and references to
 * footnoes. Internally, the StarOffice API numbers footnotes, and
 * references to footnotes refer to that internal numbering. In the
 * XML file format, these numbers are replaced with name strings. Now
 * if during import of a document a reference to a footnote is
 * encountered, two things can happen: 1) The footnote already
 * appeared in the document. In this case the name is already known
 * and the proper ID can be requested from the footnote. 2) The
 * footnote will appear later in the document. In this case the ID is
 * not yet known, and the reference-ID property of the reference
 * cannot be determined. Hence, the reference has to be stored and the
 * ID needs to bet set later, when the footnote is eventually found in
 * the document.
 *
 * This class simplifies this process: If the footnote is found,
 * ResolveId with the XML name and the ID is called. When a reference
 * is encountered, SetProperty gets called with the reference's
 * XPropertySet and the XML name. All remaining tasks are handled by
 * the class.
 */
template <class A>
class XMLPropertyBackpatcher
{

	/// name of property that gets set or backpatched
 	::rtl::OUString sPropertyName;	

	/// should a default value be set for unresolved properties
	sal_Bool bDefaultHandling;

	/// should the sPreservePropertyName be preserved
	sal_Bool bPreserveProperty;

	/// name of the property to preserve
	::rtl::OUString sPreservePropertyName;

	/// default value for unresolved properties (if bDefaultHandling)
	A aDefault;

	/// backpatch list type
	typedef ::std::vector< 
				::com::sun::star::uno::Reference<
					::com::sun::star::beans::XPropertySet> > BackpatchListType;

	/* use void* instead of BackpatchListType to avoid linker problems
       with long typenames. The real typename (commented out) contains
       >1200 chars. */

	/// backpatch list for unresolved IDs
	//::std::map<const ::rtl::OUString, BackpatchListType*> aBackpatchListMap;
	::std::map<const ::rtl::OUString, void*, ::comphelper::UStringLess> aBackpatchListMap;

	/// mapping of names -> IDs
	::std::map<const ::rtl::OUString, A, ::comphelper::UStringLess> aIDMap;

public:
	
	XMLPropertyBackpatcher(
		const ::rtl::OUString& sPropertyName);

	XMLPropertyBackpatcher(
		const ::rtl::OUString& sPropertyName, 
		const ::rtl::OUString& sPreservePropertyName,
		sal_Bool bDefault,
		A aDef);

	XMLPropertyBackpatcher(
		const sal_Char* pPropertyName);

	XMLPropertyBackpatcher(
		const sal_Char* pPropertyName,
		const sal_Char* pPreservePropertyName,
		sal_Bool bDefault,
		A aDef);

	~XMLPropertyBackpatcher();

	/// resolve a known ID.
	/// Call this as soon as the value for a particular name is known.
	void ResolveId(
		const ::rtl::OUString& sName,
		A aValue);

	/// Set property with the proper value for this name. If the value
	/// is not yet known, store the XPropertySet in the backpatch list.
	/// Use this whenever the value should be set, even if it is not yet known.
	/// const version
	void SetProperty(
		const ::com::sun::star::uno::Reference<
				::com::sun::star::beans::XPropertySet> & xPropSet,
		const ::rtl::OUString& sName);

	/// non-const version of SetProperty
	void SetProperty(
		::com::sun::star::uno::Reference<
				::com::sun::star::beans::XPropertySet> & xPropSet,
		const ::rtl::OUString& sName);

	/// set default (if bDefaultHandling) for unresolved names
	/// called by destructor
	void SetDefault();

};

#endif
