/**************************************************************
 *
 * 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_XMLREDLINEEXPORT_HXX
#define _XMLOFF_XMLREDLINEEXPORT_HXX

#include <rtl/ustrbuf.hxx>
#include <com/sun/star/uno/Reference.h>
#include <com/sun/star/uno/Sequence.h>

#include <list>
#include <map>
#include <set>

class SvXMLExport;
namespace com { namespace sun { namespace star {
	namespace beans { class XPropertySet; }
	namespace beans { struct PropertyValue; }
	namespace text { class XText; }
	namespace text { class XTextContent; }
	namespace text { class XTextSection; }
 } } }
namespace rtl {
	class OUString;
	class OUStringBuffer;
}

// store a list of redline properties
typedef ::std::list<
			::com::sun::star::uno::Reference<
				::com::sun::star::beans::XPropertySet> > ChangesListType;

// store a list of redline properties for each XText
typedef ::std::map<
			::com::sun::star::uno::Reference< ::com::sun::star::text::XText>,
			ChangesListType* > ChangesMapType;


/**
 * This class handles the export of redline portions.
 * It is to be called from XMLTextParagraphExport.
 */
class XMLRedlineExport
{
	const ::rtl::OUString sDelete;
	const ::rtl::OUString sDeletion;
	const ::rtl::OUString sFormat;
	const ::rtl::OUString sFormatChange;
	const ::rtl::OUString sInsert;
	const ::rtl::OUString sInsertion;
	const ::rtl::OUString sIsCollapsed;
	const ::rtl::OUString sIsStart;
	const ::rtl::OUString sRedlineAuthor;
	const ::rtl::OUString sRedlineComment;
	const ::rtl::OUString sRedlineDateTime;
	const ::rtl::OUString sRedlineSuccessorData;
	const ::rtl::OUString sRedlineText;
	const ::rtl::OUString sRedlineType;
	const ::rtl::OUString sStyle;
	const ::rtl::OUString sTextTable;
	const ::rtl::OUString sUnknownChange;
	const ::rtl::OUString sStartRedline;
	const ::rtl::OUString sEndRedline;
	const ::rtl::OUString sRedlineIdentifier;
	const ::rtl::OUString sIsInHeaderFooter;
	const ::rtl::OUString sRedlineProtectionKey;
	const ::rtl::OUString sRecordChanges;
	const ::rtl::OUString sMergeLastPara;

	const ::rtl::OUString sChangePrefix;

	SvXMLExport& rExport;


	// handling of change recording:

	// To support change tracking in headers and footers we need to
	// write these changes separately. To do this, we record the
	// changes for headers and footers. For the main document body, we
	// get the complete list of changes from the document, which
	// should be much more efficient than recording all of those.

	ChangesMapType aChangeMap;				/// map of recorded changes

	/// list of current changes; is NULL or points to member of aChangeMap
	ChangesListType* pCurrentChangesList;


public:
	XMLRedlineExport(SvXMLExport& rExp);

	~XMLRedlineExport();

	/// export a change
	void ExportChange(
		/// PropertySet of RedlinePortion
		const ::com::sun::star::uno::Reference<
					::com::sun::star::beans::XPropertySet> & rPropSet,
		sal_Bool bAutoStyle);

	/// export the list of changes (complete list minus recorded changed)
	void ExportChangesList(sal_Bool bAutoStyles);

	/// export the list of changes (recorded changes for this XText only)
	void ExportChangesList(
		const ::com::sun::star::uno::Reference<
			::com::sun::star::text::XText> & rText,
		sal_Bool bAutoStyles);

	/// set the current XText for which changes should be recorded.
	/// An empty XText means: don't record changes
	void SetCurrentXText(
		const ::com::sun::star::uno::Reference<
			::com::sun::star::text::XText> & rText);

	/// Do not record changes.
	/// Same as SetCurrentXText(Reference<XText>) with empty argument.
	void SetCurrentXText();

	/// export redline marks which start or end at start nodes,
	/// i.e. that include the complete paragraph/table/section
	void ExportStartOrEndRedline(
		const ::com::sun::star::uno::Reference<
					::com::sun::star::beans::XPropertySet> & rPropSet,
		sal_Bool bStart);	/// start or end of text entity (e.g. paragraph)?

	/// convenience method, calls XPropertySet-version of this method
	void ExportStartOrEndRedline(
		/// XTextContent; must also be an XPropertySet
		const ::com::sun::star::uno::Reference<
					::com::sun::star::text::XTextContent> & rContent,
		sal_Bool bStart);

	/// convenience method, calls XPropertySet-version of this method
	void ExportStartOrEndRedline(
		/// XTextSection; must also be an XPropertySet
		const ::com::sun::star::uno::Reference<
					::com::sun::star::text::XTextSection> & rSection,
		sal_Bool bStart);

private:

	/// export the change mark contained in the text body
	void ExportChangeInline(
		/// PropertySet of RedlinePortion
		const ::com::sun::star::uno::Reference<
					::com::sun::star::beans::XPropertySet> & rPropSet);

	/// export the auto styles used in this change
	void ExportChangeAutoStyle(
		/// PropertySet of RedlinePortion
		const ::com::sun::star::uno::Reference<
					::com::sun::star::beans::XPropertySet> & rPropSet);

	/// export the changes list (<text:tracked-changes>)
	void ExportChangesListElements();

	/// export the auto styles needed by the changes list
	void ExportChangesListAutoStyles();

	/// export the changed-region element
	void ExportChangedRegion(
		const ::com::sun::star::uno::Reference<
					::com::sun::star::beans::XPropertySet> & rPropSet);

	/// export an change-info element (from a PropertySet)
	void ExportChangeInfo(
		const ::com::sun::star::uno::Reference<
					::com::sun::star::beans::XPropertySet> & rPropSet);

	/// export an change-info element (from PropertyValues)
	void ExportChangeInfo(
		const ::com::sun::star::uno::Sequence<
					::com::sun::star::beans::PropertyValue> & rValues);

	/// convert the change type from API to XML names
	const ::rtl::OUString ConvertTypeName(const ::rtl::OUString& sApiName);

	/// Get ID string!
	const ::rtl::OUString GetRedlineID(
		const ::com::sun::star::uno::Reference<
					::com::sun::star::beans::XPropertySet> & rPropSet);

    /// write a comment string as sequence of <text:p> elements
    void WriteComment(const ::rtl::OUString& rComment);
};

#endif
