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

#include <boost/scoped_array.hpp>
#include <boost/tuple/tuple.hpp>

#include <tools/solar.h>
#include <tools/debug.hxx>
#ifndef _SVSTDARR_STRINGSDTOR_DECL
#define _SVSTDARR_STRINGSDTOR
#include <svl/svstdarr.hxx>
#endif
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/beans/PropertyValue.hpp>
#include <com/sun/star/container/XEnumerationAccess.hpp>
#include <com/sun/star/container/XNameContainer.hpp>
#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
#include <com/sun/star/text/XTextCursor.hpp>
#include <com/sun/star/text/XChapterNumberingSupplier.hpp>
#include <com/sun/star/text/XTextFramesSupplier.hpp>
#include <com/sun/star/text/XTextGraphicObjectsSupplier.hpp>
#include <com/sun/star/text/XTextEmbeddedObjectsSupplier.hpp>
#include <com/sun/star/text/TextContentAnchorType.hpp>
#include <com/sun/star/text/XTextFrame.hpp>
#include <com/sun/star/text/XFormField.hpp>
#include <com/sun/star/drawing/XShapes.hpp>
#include <com/sun/star/util/DateTime.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/ucb/XAnyCompareFactory.hpp>
#include <com/sun/star/container/XNamed.hpp>
#include <xmloff/xmltoken.hxx>
#include "xmloff/xmlnmspe.hxx"
#include <xmloff/txtstyli.hxx>
#include <xmloff/families.hxx>
#include <xmloff/xmlnumfi.hxx>
#include <xmloff/xmlnumi.hxx>
#include <xmloff/xmlictxt.hxx>
#include <xmloff/xmlimppr.hxx>

#include "txtparai.hxx"
#include <xmloff/txtimp.hxx>
#include <xmloff/txtprmap.hxx>
#include "xmloff/txtimppr.hxx"
#include <xmloff/xmlimp.hxx>
#include "txtvfldi.hxx"
#include "xmloff/i18nmap.hxx"
#include "XMLTextListItemContext.hxx"
#include "XMLTextListBlockContext.hxx"
#include "XMLTextFrameContext.hxx"
#include "XMLPropertyBackpatcher.hxx"
#include "XMLTextFrameHyperlinkContext.hxx"
#include "XMLSectionImportContext.hxx"
#include "XMLIndexTOCContext.hxx"
#include <xmloff/XMLFontStylesContext.hxx>
#include <xmloff/ProgressBarHelper.hxx>
#include <xmloff/nmspmap.hxx>
#include <xmloff/XMLEventsImportContext.hxx>
#include "XMLTrackedChangesImportContext.hxx"
#include "XMLChangeImportContext.hxx"
#include "XMLAutoMarkFileContext.hxx"

#include "XMLCalculationSettingsContext.hxx"
#include <xmloff/formsimp.hxx>
#include "XMLNumberStylesImport.hxx"
#include <com/sun/star/beans/XPropertyState.hpp>

#include <txtlists.hxx>
#include <xmloff/odffields.hxx>
#include <comphelper/stlunosequence.hxx>

using ::rtl::OUString;
using ::rtl::OUStringBuffer;
using ::com::sun::star::ucb::XAnyCompare;

using namespace ::std;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::text;
using namespace ::com::sun::star::frame;
using namespace ::com::sun::star::style;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::drawing;
using namespace ::com::sun::star::xml::sax;
using namespace ::com::sun::star::lang;
using namespace ::xmloff::token;
using ::com::sun::star::util::DateTime;
using namespace ::com::sun::star::ucb;
using namespace ::com::sun::star;
using ::comphelper::UStringLess;



static __FAR_DATA SvXMLTokenMapEntry aTextElemTokenMap[] =
{
	{ XML_NAMESPACE_TEXT, XML_P, 				XML_TOK_TEXT_P				},
	{ XML_NAMESPACE_TEXT, XML_H, 				XML_TOK_TEXT_H				},
	{ XML_NAMESPACE_TEXT, XML_LIST, 			XML_TOK_TEXT_LIST			},
	{ XML_NAMESPACE_DRAW, XML_FRAME, 			XML_TOK_TEXT_FRAME_PAGE 	},
	{ XML_NAMESPACE_DRAW, XML_A, 				XML_TOK_DRAW_A_PAGE },
	{ XML_NAMESPACE_TABLE,XML_TABLE,			XML_TOK_TABLE_TABLE 		},
//	{ XML_NAMESPACE_TABLE,XML_SUB_TABLE,		XML_TOK_TABLE_SUBTABLE 		},
	{ XML_NAMESPACE_TEXT, XML_VARIABLE_DECLS,	XML_TOK_TEXT_VARFIELD_DECLS },
	{ XML_NAMESPACE_TEXT, XML_USER_FIELD_DECLS, XML_TOK_TEXT_USERFIELD_DECLS },
	{ XML_NAMESPACE_TEXT, XML_SEQUENCE_DECLS,	XML_TOK_TEXT_SEQUENCE_DECLS },
	{ XML_NAMESPACE_TEXT, XML_DDE_CONNECTION_DECLS, XML_TOK_TEXT_DDE_DECLS },
	{ XML_NAMESPACE_TEXT, XML_SECTION,			XML_TOK_TEXT_SECTION },
	{ XML_NAMESPACE_TEXT, XML_TABLE_OF_CONTENT, XML_TOK_TEXT_TOC },
	{ XML_NAMESPACE_TEXT, XML_OBJECT_INDEX, 	XML_TOK_TEXT_OBJECT_INDEX },
	{ XML_NAMESPACE_TEXT, XML_TABLE_INDEX,		XML_TOK_TEXT_TABLE_INDEX },
	{ XML_NAMESPACE_TEXT, XML_ILLUSTRATION_INDEX, XML_TOK_TEXT_ILLUSTRATION_INDEX },
	{ XML_NAMESPACE_TEXT, XML_USER_INDEX,		XML_TOK_TEXT_USER_INDEX },
	{ XML_NAMESPACE_TEXT, XML_ALPHABETICAL_INDEX, XML_TOK_TEXT_ALPHABETICAL_INDEX },
	{ XML_NAMESPACE_TEXT, XML_BIBLIOGRAPHY,     XML_TOK_TEXT_BIBLIOGRAPHY_INDEX },
	{ XML_NAMESPACE_TEXT, XML_INDEX_TITLE,		XML_TOK_TEXT_INDEX_TITLE },
	{ XML_NAMESPACE_TEXT, XML_TRACKED_CHANGES,  XML_TOK_TEXT_TRACKED_CHANGES },
	{ XML_NAMESPACE_TEXT, XML_CHANGE_START,	    XML_TOK_TEXT_CHANGE_START },
	{ XML_NAMESPACE_TEXT, XML_CHANGE_END, 		XML_TOK_TEXT_CHANGE_END },
	{ XML_NAMESPACE_TEXT, XML_CHANGE, 			XML_TOK_TEXT_CHANGE },
	{ XML_NAMESPACE_OFFICE, XML_FORMS,			XML_TOK_TEXT_FORMS },
	{ XML_NAMESPACE_TABLE, XML_CALCULATION_SETTINGS,	XML_TOK_TEXT_CALCULATION_SETTINGS },
	{ XML_NAMESPACE_TEXT, XML_ALPHABETICAL_INDEX_AUTO_MARK_FILE, XML_TOK_TEXT_AUTOMARK },
	// --> FLR #i52127#
	{ XML_NAMESPACE_TEXT, XML_NUMBERED_PARAGRAPH, XML_TOK_TEXT_NUMBERED_PARAGRAPH	},
	// <--

	XML_TOKEN_MAP_END
};

static __FAR_DATA SvXMLTokenMapEntry aTextPElemTokenMap[] =
{
	{ XML_NAMESPACE_TEXT, XML_SPAN, XML_TOK_TEXT_SPAN },
	{ XML_NAMESPACE_TEXT, XML_TAB, XML_TOK_TEXT_TAB_STOP },
	{ XML_NAMESPACE_TEXT, XML_LINE_BREAK, XML_TOK_TEXT_LINE_BREAK },
	{ XML_NAMESPACE_TEXT, XML_SOFT_PAGE_BREAK, XML_TOK_TEXT_SOFT_PAGE_BREAK },
	{ XML_NAMESPACE_TEXT, XML_S, XML_TOK_TEXT_S },
	{ XML_NAMESPACE_TEXT, XML_A, XML_TOK_TEXT_HYPERLINK },
	{ XML_NAMESPACE_TEXT, XML_RUBY, XML_TOK_TEXT_RUBY },

	{ XML_NAMESPACE_TEXT, XML_NOTE, XML_TOK_TEXT_NOTE },
	{ XML_NAMESPACE_TEXT, XML_BOOKMARK, XML_TOK_TEXT_BOOKMARK },
	{ XML_NAMESPACE_TEXT, XML_BOOKMARK_START, XML_TOK_TEXT_BOOKMARK_START },
	{ XML_NAMESPACE_TEXT, XML_BOOKMARK_END, XML_TOK_TEXT_BOOKMARK_END },
	{ XML_NAMESPACE_TEXT, XML_REFERENCE_MARK, XML_TOK_TEXT_REFERENCE },
	{ XML_NAMESPACE_TEXT, XML_REFERENCE_MARK_START,
	  XML_TOK_TEXT_REFERENCE_START },
	{ XML_NAMESPACE_TEXT, XML_REFERENCE_MARK_END,
	  XML_TOK_TEXT_REFERENCE_END },

	{ XML_NAMESPACE_DRAW, XML_FRAME, XML_TOK_TEXT_FRAME },
	{ XML_NAMESPACE_DRAW, XML_A, 				XML_TOK_DRAW_A },

	// index marks
	{ XML_NAMESPACE_TEXT, XML_TOC_MARK, XML_TOK_TEXT_TOC_MARK },
	{ XML_NAMESPACE_TEXT, XML_TOC_MARK_START, XML_TOK_TEXT_TOC_MARK_START },
	{ XML_NAMESPACE_TEXT, XML_TOC_MARK_END, XML_TOK_TEXT_TOC_MARK_END },
	{ XML_NAMESPACE_TEXT, XML_USER_INDEX_MARK, XML_TOK_TEXT_USER_INDEX_MARK },
	{ XML_NAMESPACE_TEXT, XML_USER_INDEX_MARK_START,
	  XML_TOK_TEXT_USER_INDEX_MARK_START },
	{ XML_NAMESPACE_TEXT, XML_USER_INDEX_MARK_END,
	  XML_TOK_TEXT_USER_INDEX_MARK_END },
	{ XML_NAMESPACE_TEXT, XML_ALPHABETICAL_INDEX_MARK,
	  XML_TOK_TEXT_ALPHA_INDEX_MARK },
	{ XML_NAMESPACE_TEXT, XML_ALPHABETICAL_INDEX_MARK_START,
	  XML_TOK_TEXT_ALPHA_INDEX_MARK_START },
	{ XML_NAMESPACE_TEXT, XML_ALPHABETICAL_INDEX_MARK_END,
	  XML_TOK_TEXT_ALPHA_INDEX_MARK_END },

	// sender fields
	{ XML_NAMESPACE_TEXT, XML_SENDER_FIRSTNAME,XML_TOK_TEXT_SENDER_FIRSTNAME},
	{ XML_NAMESPACE_TEXT, XML_SENDER_LASTNAME, XML_TOK_TEXT_SENDER_LASTNAME },
	{ XML_NAMESPACE_TEXT, XML_SENDER_INITIALS, XML_TOK_TEXT_SENDER_INITIALS },
	{ XML_NAMESPACE_TEXT, XML_SENDER_TITLE, XML_TOK_TEXT_SENDER_TITLE },
	{ XML_NAMESPACE_TEXT, XML_SENDER_POSITION, XML_TOK_TEXT_SENDER_POSITION },
	{ XML_NAMESPACE_TEXT, XML_SENDER_EMAIL, XML_TOK_TEXT_SENDER_EMAIL },
	{ XML_NAMESPACE_TEXT, XML_SENDER_PHONE_PRIVATE, XML_TOK_TEXT_SENDER_PHONE_PRIVATE },
	{ XML_NAMESPACE_TEXT, XML_SENDER_FAX, XML_TOK_TEXT_SENDER_FAX },
	{ XML_NAMESPACE_TEXT, XML_SENDER_COMPANY, XML_TOK_TEXT_SENDER_COMPANY },
	{ XML_NAMESPACE_TEXT, XML_SENDER_PHONE_WORK, XML_TOK_TEXT_SENDER_PHONE_WORK },
	{ XML_NAMESPACE_TEXT, XML_SENDER_STREET, XML_TOK_TEXT_SENDER_STREET },
	{ XML_NAMESPACE_TEXT, XML_SENDER_CITY, XML_TOK_TEXT_SENDER_CITY },
	{ XML_NAMESPACE_TEXT, XML_SENDER_POSTAL_CODE, XML_TOK_TEXT_SENDER_POSTAL_CODE },
	{ XML_NAMESPACE_TEXT, XML_SENDER_COUNTRY, XML_TOK_TEXT_SENDER_COUNTRY },
	{ XML_NAMESPACE_TEXT, XML_SENDER_STATE_OR_PROVINCE,
	  XML_TOK_TEXT_SENDER_STATE_OR_PROVINCE },

	// misc. document fields
	{ XML_NAMESPACE_TEXT, XML_AUTHOR_NAME, XML_TOK_TEXT_AUTHOR_NAME },
	{ XML_NAMESPACE_TEXT, XML_AUTHOR_INITIALS, XML_TOK_TEXT_AUTHOR_INITIALS },
	{ XML_NAMESPACE_TEXT, XML_DATE, XML_TOK_TEXT_DATE },
	{ XML_NAMESPACE_TEXT, XML_TIME, XML_TOK_TEXT_TIME },
	{ XML_NAMESPACE_TEXT, XML_PAGE_NUMBER, XML_TOK_TEXT_PAGE_NUMBER },
	{ XML_NAMESPACE_TEXT, XML_PAGE_CONTINUATION_STRING,
	  XML_TOK_TEXT_PAGE_CONTINUATION_STRING },

	// variable fields
	{ XML_NAMESPACE_TEXT, XML_VARIABLE_SET, XML_TOK_TEXT_VARIABLE_SET },
	{ XML_NAMESPACE_TEXT, XML_VARIABLE_GET, XML_TOK_TEXT_VARIABLE_GET },
	{ XML_NAMESPACE_TEXT, XML_VARIABLE_INPUT, XML_TOK_TEXT_VARIABLE_INPUT },
	{ XML_NAMESPACE_TEXT, XML_USER_FIELD_GET, XML_TOK_TEXT_USER_FIELD_GET },
	{ XML_NAMESPACE_TEXT, XML_USER_FIELD_INPUT,XML_TOK_TEXT_USER_FIELD_INPUT},
	{ XML_NAMESPACE_TEXT, XML_SEQUENCE, XML_TOK_TEXT_SEQUENCE },
	{ XML_NAMESPACE_TEXT, XML_EXPRESSION, XML_TOK_TEXT_EXPRESSION },
	{ XML_NAMESPACE_TEXT, XML_TEXT_INPUT, XML_TOK_TEXT_TEXT_INPUT },

	// database fields
	{ XML_NAMESPACE_TEXT, XML_DATABASE_DISPLAY,
	  XML_TOK_TEXT_DATABASE_DISPLAY },
	{ XML_NAMESPACE_TEXT, XML_DATABASE_NEXT,
	  XML_TOK_TEXT_DATABASE_NEXT },
	{ XML_NAMESPACE_TEXT, XML_DATABASE_ROW_SELECT,
	  XML_TOK_TEXT_DATABASE_SELECT },
	{ XML_NAMESPACE_TEXT, XML_DATABASE_ROW_NUMBER,
	  XML_TOK_TEXT_DATABASE_ROW_NUMBER },
	{ XML_NAMESPACE_TEXT, XML_DATABASE_NAME, XML_TOK_TEXT_DATABASE_NAME },

	// docinfo fields
	{ XML_NAMESPACE_TEXT, XML_INITIAL_CREATOR,
	  XML_TOK_TEXT_DOCUMENT_CREATION_AUTHOR },
	{ XML_NAMESPACE_TEXT, XML_DESCRIPTION, XML_TOK_TEXT_DOCUMENT_DESCRIPTION},
	{ XML_NAMESPACE_TEXT, XML_PRINTED_BY, XML_TOK_TEXT_DOCUMENT_PRINT_AUTHOR},
	{ XML_NAMESPACE_TEXT, XML_TITLE, XML_TOK_TEXT_DOCUMENT_TITLE },
	{ XML_NAMESPACE_TEXT, XML_SUBJECT, XML_TOK_TEXT_DOCUMENT_SUBJECT },
	{ XML_NAMESPACE_TEXT, XML_KEYWORDS, XML_TOK_TEXT_DOCUMENT_KEYWORDS },
	{ XML_NAMESPACE_TEXT, XML_CREATOR, XML_TOK_TEXT_DOCUMENT_SAVE_AUTHOR },
	{ XML_NAMESPACE_TEXT, XML_EDITING_CYCLES,
	  XML_TOK_TEXT_DOCUMENT_REVISION },
	{ XML_NAMESPACE_TEXT, XML_CREATION_DATE,
	  XML_TOK_TEXT_DOCUMENT_CREATION_DATE },
	{ XML_NAMESPACE_TEXT, XML_CREATION_TIME,
	  XML_TOK_TEXT_DOCUMENT_CREATION_TIME },
	{ XML_NAMESPACE_TEXT, XML_PRINT_DATE, XML_TOK_TEXT_DOCUMENT_PRINT_DATE },
	{ XML_NAMESPACE_TEXT, XML_PRINT_TIME, XML_TOK_TEXT_DOCUMENT_PRINT_TIME },
	{ XML_NAMESPACE_TEXT, XML_MODIFICATION_DATE,
	  XML_TOK_TEXT_DOCUMENT_SAVE_DATE },
	{ XML_NAMESPACE_TEXT, XML_MODIFICATION_TIME,
	  XML_TOK_TEXT_DOCUMENT_SAVE_TIME },
	{ XML_NAMESPACE_TEXT, XML_EDITING_DURATION,
	  XML_TOK_TEXT_DOCUMENT_EDIT_DURATION },
	{ XML_NAMESPACE_TEXT, XML_USER_DEFINED,
	  XML_TOK_TEXT_DOCUMENT_USER_DEFINED },

	// misc fields
	{ XML_NAMESPACE_TEXT, XML_PLACEHOLDER, XML_TOK_TEXT_PLACEHOLDER },
	{ XML_NAMESPACE_TEXT, XML_HIDDEN_TEXT, XML_TOK_TEXT_HIDDEN_TEXT },
	{ XML_NAMESPACE_TEXT, XML_HIDDEN_PARAGRAPH, XML_TOK_TEXT_HIDDEN_PARAGRAPH },
	{ XML_NAMESPACE_TEXT, XML_CONDITIONAL_TEXT, XML_TOK_TEXT_CONDITIONAL_TEXT },
	{ XML_NAMESPACE_TEXT, XML_FILE_NAME, XML_TOK_TEXT_FILENAME },
	{ XML_NAMESPACE_TEXT, XML_CHAPTER,	XML_TOK_TEXT_CHAPTER },
	{ XML_NAMESPACE_TEXT, XML_TEMPLATE_NAME, XML_TOK_TEXT_TEMPLATENAME },
	{ XML_NAMESPACE_TEXT, XML_PARAGRAPH_COUNT, XML_TOK_TEXT_PARAGRAPH_COUNT },
	{ XML_NAMESPACE_TEXT, XML_WORD_COUNT, XML_TOK_TEXT_WORD_COUNT },
	{ XML_NAMESPACE_TEXT, XML_TABLE_COUNT, XML_TOK_TEXT_TABLE_COUNT },
	{ XML_NAMESPACE_TEXT, XML_CHARACTER_COUNT, XML_TOK_TEXT_CHARACTER_COUNT },
	{ XML_NAMESPACE_TEXT, XML_IMAGE_COUNT, XML_TOK_TEXT_IMAGE_COUNT },
	{ XML_NAMESPACE_TEXT, XML_OBJECT_COUNT, XML_TOK_TEXT_OBJECT_COUNT },
	{ XML_NAMESPACE_TEXT, XML_PAGE_COUNT, XML_TOK_TEXT_PAGE_COUNT },
	{ XML_NAMESPACE_TEXT, XML_PAGE_VARIABLE_GET, XML_TOK_TEXT_GET_PAGE_VAR },
	{ XML_NAMESPACE_TEXT, XML_PAGE_VARIABLE_SET, XML_TOK_TEXT_SET_PAGE_VAR },
	{ XML_NAMESPACE_TEXT, XML_EXECUTE_MACRO, XML_TOK_TEXT_MACRO },
	{ XML_NAMESPACE_TEXT, XML_DDE_CONNECTION, XML_TOK_TEXT_DDE },
	{ XML_NAMESPACE_TEXT, XML_REFERENCE_REF, XML_TOK_TEXT_REFERENCE_REF },
	{ XML_NAMESPACE_TEXT, XML_BOOKMARK_REF, XML_TOK_TEXT_BOOKMARK_REF },
	{ XML_NAMESPACE_TEXT, XML_SEQUENCE_REF, XML_TOK_TEXT_SEQUENCE_REF },
	{ XML_NAMESPACE_TEXT, XML_NOTE_REF, XML_TOK_TEXT_NOTE_REF },
	{ XML_NAMESPACE_TEXT, XML_BIBLIOGRAPHY_MARK, XML_TOK_TEXT_BIBLIOGRAPHY_MARK },
	{ XML_NAMESPACE_OFFICE, XML_ANNOTATION, XML_TOK_TEXT_ANNOTATION },
    { XML_NAMESPACE_OFFICE, XML_ANNOTATION_END, XML_TOK_TEXT_ANNOTATION_END },
    { XML_NAMESPACE_TEXT, XML_SCRIPT, XML_TOK_TEXT_SCRIPT },
    { XML_NAMESPACE_TEXT, XML_TABLE_FORMULA, XML_TOK_TEXT_TABLE_FORMULA },
    { XML_NAMESPACE_TEXT, XML_DROPDOWN, XML_TOK_TEXT_DROPDOWN },

	// Calc fields
	{ XML_NAMESPACE_TEXT, XML_SHEET_NAME, XML_TOK_TEXT_SHEET_NAME },

	// draw fields
	{ XML_NAMESPACE_TEXT, XML_MEASURE,	XML_TOK_TEXT_MEASURE },

    // RDF metadata
	{ XML_NAMESPACE_TEXT, XML_META,         XML_TOK_TEXT_META },
	{ XML_NAMESPACE_TEXT, XML_META_FIELD,   XML_TOK_TEXT_META_FIELD },

	// redlining (aka change tracking)
	{ XML_NAMESPACE_TEXT, XML_CHANGE_START, XML_TOK_TEXTP_CHANGE_START },
	{ XML_NAMESPACE_TEXT, XML_CHANGE_END  , XML_TOK_TEXTP_CHANGE_END },
	{ XML_NAMESPACE_TEXT, XML_CHANGE, XML_TOK_TEXTP_CHANGE },

	{ XML_NAMESPACE_PRESENTATION, XML_HEADER, XML_TOK_DRAW_HEADER },
	{ XML_NAMESPACE_PRESENTATION, XML_FOOTER, XML_TOK_DRAW_FOOTER },
	{ XML_NAMESPACE_PRESENTATION, XML_DATE_TIME, XML_TOK_DRAW_DATE_TIME },
	{ XML_NAMESPACE_TEXT, XML_PAGE_CONTINUATION, XML_TOK_TEXT_PAGE_CONTINUATION },

	{ XML_NAMESPACE_FIELD, XML_FIELDMARK, XML_TOK_TEXT_FIELDMARK },
	{ XML_NAMESPACE_FIELD, XML_FIELDMARK_START, XML_TOK_TEXT_FIELDMARK_START },
	{ XML_NAMESPACE_FIELD, XML_FIELDMARK_END, XML_TOK_TEXT_FIELDMARK_END },


	XML_TOKEN_MAP_END
};

static __FAR_DATA SvXMLTokenMapEntry aTextPAttrTokenMap[] =
{
	{ XML_NAMESPACE_XML  , XML_ID,			XML_TOK_TEXT_P_XMLID },
	{ XML_NAMESPACE_XHTML, XML_ABOUT,		XML_TOK_TEXT_P_ABOUT },
	{ XML_NAMESPACE_XHTML, XML_PROPERTY,	XML_TOK_TEXT_P_PROPERTY },
	{ XML_NAMESPACE_XHTML, XML_CONTENT,		XML_TOK_TEXT_P_CONTENT },
	{ XML_NAMESPACE_XHTML, XML_DATATYPE,	XML_TOK_TEXT_P_DATATYPE },
    { XML_NAMESPACE_TEXT, XML_ID,           XML_TOK_TEXT_P_TEXTID },
	{ XML_NAMESPACE_TEXT, XML_STYLE_NAME,	XML_TOK_TEXT_P_STYLE_NAME },
	{ XML_NAMESPACE_TEXT, XML_COND_STYLE_NAME,
											XML_TOK_TEXT_P_COND_STYLE_NAME },
	{ XML_NAMESPACE_TEXT, XML_OUTLINE_LEVEL,XML_TOK_TEXT_P_LEVEL },
	{ XML_NAMESPACE_TEXT, XML_IS_LIST_HEADER,XML_TOK_TEXT_P_IS_LIST_HEADER },
	{ XML_NAMESPACE_TEXT, XML_RESTART_NUMBERING,XML_TOK_TEXT_P_RESTART_NUMBERING },
	{ XML_NAMESPACE_TEXT, XML_START_VALUE,XML_TOK_TEXT_P_START_VALUE },
	XML_TOKEN_MAP_END
};

static __FAR_DATA SvXMLTokenMapEntry aTextNumberedParagraphAttrTokenMap[] =
{
	{ XML_NAMESPACE_XML , XML_ID,    XML_TOK_TEXT_NUMBERED_PARAGRAPH_XMLID },
	{ XML_NAMESPACE_TEXT, XML_LIST_ID,
        XML_TOK_TEXT_NUMBERED_PARAGRAPH_LIST_ID },
	{ XML_NAMESPACE_TEXT, XML_LEVEL, XML_TOK_TEXT_NUMBERED_PARAGRAPH_LEVEL },
	{ XML_NAMESPACE_TEXT, XML_STYLE_NAME,
        XML_TOK_TEXT_NUMBERED_PARAGRAPH_STYLE_NAME },
	{ XML_NAMESPACE_TEXT, XML_CONTINUE_NUMBERING,
        XML_TOK_TEXT_NUMBERED_PARAGRAPH_CONTINUE_NUMBERING },
	{ XML_NAMESPACE_TEXT, XML_START_VALUE,
        XML_TOK_TEXT_NUMBERED_PARAGRAPH_START_VALUE },
	XML_TOKEN_MAP_END
};

static __FAR_DATA SvXMLTokenMapEntry aTextListBlockAttrTokenMap[] =
{
	{ XML_NAMESPACE_XML , XML_ID,			XML_TOK_TEXT_LIST_BLOCK_XMLID },
	{ XML_NAMESPACE_TEXT, XML_STYLE_NAME,
			XML_TOK_TEXT_LIST_BLOCK_STYLE_NAME },
	{ XML_NAMESPACE_TEXT, XML_CONTINUE_NUMBERING,
			XML_TOK_TEXT_LIST_BLOCK_CONTINUE_NUMBERING },
    // --> OD 2008-04-22 #refactorlists#
    { XML_NAMESPACE_TEXT, XML_CONTINUE_LIST,
            XML_TOK_TEXT_LIST_BLOCK_CONTINUE_LIST },
    XML_TOKEN_MAP_END
};

static __FAR_DATA SvXMLTokenMapEntry aTextListBlockElemTokenMap[] =
{
	{ XML_NAMESPACE_TEXT, XML_LIST_HEADER, XML_TOK_TEXT_LIST_HEADER },
	{ XML_NAMESPACE_TEXT, XML_LIST_ITEM, 	XML_TOK_TEXT_LIST_ITEM	 },
	XML_TOKEN_MAP_END
};

static __FAR_DATA SvXMLTokenMapEntry aTextFrameAttrTokenMap[] =
{
	{ XML_NAMESPACE_DRAW, XML_STYLE_NAME, XML_TOK_TEXT_FRAME_STYLE_NAME },
	{ XML_NAMESPACE_DRAW, XML_NAME, XML_TOK_TEXT_FRAME_NAME },
	{ XML_NAMESPACE_TEXT, XML_ANCHOR_TYPE, XML_TOK_TEXT_FRAME_ANCHOR_TYPE },
	{ XML_NAMESPACE_TEXT, XML_ANCHOR_PAGE_NUMBER, XML_TOK_TEXT_FRAME_ANCHOR_PAGE_NUMBER },
	{ XML_NAMESPACE_SVG, XML_X, XML_TOK_TEXT_FRAME_X },
	{ XML_NAMESPACE_SVG, XML_Y, XML_TOK_TEXT_FRAME_Y },
	{ XML_NAMESPACE_SVG, XML_WIDTH, XML_TOK_TEXT_FRAME_WIDTH },
	{ XML_NAMESPACE_FO, XML_MIN_WIDTH, XML_TOK_TEXT_FRAME_MIN_WIDTH },
	{ XML_NAMESPACE_STYLE, XML_REL_WIDTH, XML_TOK_TEXT_FRAME_REL_WIDTH },
	{ XML_NAMESPACE_SVG, XML_HEIGHT, XML_TOK_TEXT_FRAME_HEIGHT },
	{ XML_NAMESPACE_FO, XML_MIN_HEIGHT, XML_TOK_TEXT_FRAME_MIN_HEIGHT },
	{ XML_NAMESPACE_STYLE, XML_REL_HEIGHT, XML_TOK_TEXT_FRAME_REL_HEIGHT },
	{ XML_NAMESPACE_DRAW, XML_CHAIN_NEXT_NAME, XML_TOK_TEXT_FRAME_NEXT_CHAIN_NAME },
	{ XML_NAMESPACE_XLINK, XML_HREF, XML_TOK_TEXT_FRAME_HREF },
	{ XML_NAMESPACE_DRAW, XML_NAME, XML_TOK_TEXT_FRAME_FILTER_NAME },
	{ XML_NAMESPACE_DRAW, XML_ZINDEX, XML_TOK_TEXT_FRAME_Z_INDEX },
	{ XML_NAMESPACE_SVG, XML_TRANSFORM, XML_TOK_TEXT_FRAME_TRANSFORM },
	{ XML_NAMESPACE_DRAW, XML_CLASS_ID, XML_TOK_TEXT_FRAME_CLASS_ID },
	{ XML_NAMESPACE_DRAW,  	XML_CODE,       	XML_TOK_TEXT_FRAME_CODE },
	{ XML_NAMESPACE_DRAW,  	XML_OBJECT, 		XML_TOK_TEXT_FRAME_OBJECT },
	{ XML_NAMESPACE_DRAW,  	XML_ARCHIVE, 		XML_TOK_TEXT_FRAME_ARCHIVE },
	{ XML_NAMESPACE_DRAW,   XML_MAY_SCRIPT, 	XML_TOK_TEXT_FRAME_MAY_SCRIPT },
	{ XML_NAMESPACE_DRAW,   XML_MIME_TYPE, 	XML_TOK_TEXT_FRAME_MIME_TYPE },
	{ XML_NAMESPACE_DRAW, XML_APPLET_NAME, XML_TOK_TEXT_FRAME_APPLET_NAME },
	{ XML_NAMESPACE_DRAW, XML_FRAME_NAME, XML_TOK_TEXT_FRAME_FRAME_NAME },
	{ XML_NAMESPACE_DRAW, XML_NOTIFY_ON_UPDATE_OF_RANGES, XML_TOK_TEXT_FRAME_NOTIFY_ON_UPDATE },
	{ XML_NAMESPACE_DRAW, XML_NOTIFY_ON_UPDATE_OF_TABLE, XML_TOK_TEXT_FRAME_NOTIFY_ON_UPDATE },
	XML_TOKEN_MAP_END
};

static __FAR_DATA SvXMLTokenMapEntry aTextContourAttrTokenMap[] =
{
	{ XML_NAMESPACE_SVG, XML_WIDTH, 	XML_TOK_TEXT_CONTOUR_WIDTH		},
	{ XML_NAMESPACE_SVG, XML_HEIGHT,	XML_TOK_TEXT_CONTOUR_HEIGHT		},
	{ XML_NAMESPACE_SVG, XML_VIEWBOX,	XML_TOK_TEXT_CONTOUR_VIEWBOX	},
	{ XML_NAMESPACE_SVG, XML_D,	    	XML_TOK_TEXT_CONTOUR_D			},
	{ XML_NAMESPACE_DRAW,XML_POINTS,	XML_TOK_TEXT_CONTOUR_POINTS		},
	{ XML_NAMESPACE_DRAW,XML_RECREATE_ON_EDIT,	XML_TOK_TEXT_CONTOUR_AUTO	},
	XML_TOKEN_MAP_END
};

static __FAR_DATA SvXMLTokenMapEntry aTextHyperlinkAttrTokenMap[] =
{
	{ XML_NAMESPACE_XLINK, XML_HREF, XML_TOK_TEXT_HYPERLINK_HREF },
	{ XML_NAMESPACE_OFFICE, XML_NAME, XML_TOK_TEXT_HYPERLINK_NAME },
	{ XML_NAMESPACE_XLINK, XML_SHOW, XML_TOK_TEXT_HYPERLINK_SHOW },
	{ XML_NAMESPACE_OFFICE, XML_TARGET_FRAME_NAME, XML_TOK_TEXT_HYPERLINK_TARGET_FRAME },
	{ XML_NAMESPACE_TEXT, XML_STYLE_NAME, XML_TOK_TEXT_HYPERLINK_STYLE_NAME },
	{ XML_NAMESPACE_TEXT, XML_VISITED_STYLE_NAME, XML_TOK_TEXT_HYPERLINK_VIS_STYLE_NAME },
	{ XML_NAMESPACE_OFFICE, XML_SERVER_MAP, XML_TOK_TEXT_HYPERLINK_SERVER_MAP },
	XML_TOKEN_MAP_END
};

static __FAR_DATA SvXMLTokenMapEntry aTextMasterPageElemTokenMap[] =
{
	{ XML_NAMESPACE_STYLE, XML_HEADER, XML_TOK_TEXT_MP_HEADER },
	{ XML_NAMESPACE_STYLE, XML_FOOTER, XML_TOK_TEXT_MP_FOOTER },
	{ XML_NAMESPACE_STYLE, XML_HEADER_LEFT, XML_TOK_TEXT_MP_HEADER_LEFT },
	{ XML_NAMESPACE_STYLE, XML_FOOTER_LEFT, XML_TOK_TEXT_MP_FOOTER_LEFT },

	XML_TOKEN_MAP_END
};

static __FAR_DATA SvXMLTokenMapEntry aTextFieldAttrTokenMap[] =
{
    { XML_NAMESPACE_TEXT, XML_FIXED, XML_TOK_TEXTFIELD_FIXED },
    { XML_NAMESPACE_TEXT, XML_DESCRIPTION,  XML_TOK_TEXTFIELD_DESCRIPTION },
    { XML_NAMESPACE_TEXT, XML_HELP, XML_TOK_TEXTFIELD_HELP },
    { XML_NAMESPACE_TEXT, XML_HINT, XML_TOK_TEXTFIELD_HINT },
    { XML_NAMESPACE_TEXT, XML_PLACEHOLDER_TYPE,
                XML_TOK_TEXTFIELD_PLACEHOLDER_TYPE },
    { XML_NAMESPACE_TEXT, XML_NAME, XML_TOK_TEXTFIELD_NAME },
    { XML_NAMESPACE_TEXT, XML_FORMULA, XML_TOK_TEXTFIELD_FORMULA },
    { XML_NAMESPACE_STYLE, XML_NUM_FORMAT, XML_TOK_TEXTFIELD_NUM_FORMAT },
    { XML_NAMESPACE_STYLE, XML_NUM_LETTER_SYNC,
                XML_TOK_TEXTFIELD_NUM_LETTER_SYNC },
    { XML_NAMESPACE_TEXT, XML_DISPLAY_FORMULA,
                XML_TOK_TEXTFIELD_DISPLAY_FORMULA },
    { XML_NAMESPACE_TEXT, XML_VALUE_TYPE, XML_TOK_TEXTFIELD_VALUE_TYPE }, // #i32362#: src680m48++ saves text:value-type
    { XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_TOK_TEXTFIELD_VALUE_TYPE },
    { XML_NAMESPACE_TEXT, XML_VALUE, XML_TOK_TEXTFIELD_VALUE },
    { XML_NAMESPACE_OFFICE, XML_VALUE, XML_TOK_TEXTFIELD_VALUE },
    { XML_NAMESPACE_TEXT, XML_STRING_VALUE, XML_TOK_TEXTFIELD_STRING_VALUE },
    { XML_NAMESPACE_OFFICE, XML_STRING_VALUE, XML_TOK_TEXTFIELD_STRING_VALUE },
    { XML_NAMESPACE_TEXT, XML_DATE_VALUE, XML_TOK_TEXTFIELD_DATE_VALUE },
    { XML_NAMESPACE_OFFICE, XML_DATE_VALUE, XML_TOK_TEXTFIELD_DATE_VALUE },
    { XML_NAMESPACE_TEXT, XML_TIME_VALUE, XML_TOK_TEXTFIELD_TIME_VALUE },
    { XML_NAMESPACE_OFFICE, XML_TIME_VALUE, XML_TOK_TEXTFIELD_TIME_VALUE },
    { XML_NAMESPACE_OFFICE, XML_BOOLEAN_VALUE, XML_TOK_TEXTFIELD_BOOL_VALUE},
    { XML_NAMESPACE_OFFICE, XML_CURRENCY, XML_TOK_TEXTFIELD_CURRENCY},
    { XML_NAMESPACE_STYLE, XML_DATA_STYLE_NAME,
                XML_TOK_TEXTFIELD_DATA_STYLE_NAME },
    { XML_NAMESPACE_TEXT, XML_DISPLAY_OUTLINE_LEVEL,
                XML_TOK_TEXTFIELD_NUMBERING_LEVEL },
    { XML_NAMESPACE_TEXT, XML_SEPARATION_CHARACTER,
                XML_TOK_TEXTFIELD_NUMBERING_SEPARATOR },
    { XML_NAMESPACE_TEXT, XML_DISPLAY, XML_TOK_TEXTFIELD_DISPLAY },
    { XML_NAMESPACE_TEXT, XML_TIME_ADJUST, XML_TOK_TEXTFIELD_TIME_ADJUST },
    { XML_NAMESPACE_TEXT, XML_DATE_ADJUST, XML_TOK_TEXTFIELD_DATE_ADJUST },
    { XML_NAMESPACE_TEXT, XML_PAGE_ADJUST, XML_TOK_TEXTFIELD_PAGE_ADJUST },
    { XML_NAMESPACE_TEXT, XML_SELECT_PAGE, XML_TOK_TEXTFIELD_SELECT_PAGE },
    { XML_NAMESPACE_TEXT, XML_DATABASE_NAME, XML_TOK_TEXTFIELD_DATABASE_NAME},
    { XML_NAMESPACE_TEXT, XML_TABLE_NAME, XML_TOK_TEXTFIELD_TABLE_NAME },
    { XML_NAMESPACE_TEXT, XML_COLUMN_NAME, XML_TOK_TEXTFIELD_COLUMN_NAME },
    { XML_NAMESPACE_TEXT, XML_ROW_NUMBER, XML_TOK_TEXTFIELD_ROW_NUMBER },
    { XML_NAMESPACE_TEXT, XML_CONDITION, XML_TOK_TEXTFIELD_CONDITION },
    { XML_NAMESPACE_TEXT, XML_STRING_VALUE_IF_TRUE,
                XML_TOK_TEXTFIELD_STRING_VALUE_IF_TRUE },
    { XML_NAMESPACE_TEXT, XML_STRING_VALUE_IF_FALSE,
                XML_TOK_TEXTFIELD_STRING_VALUE_IF_FALSE },
    { XML_NAMESPACE_TEXT, XML_EDITING_CYCLES, XML_TOK_TEXTFIELD_REVISION },
    { XML_NAMESPACE_TEXT, XML_OUTLINE_LEVEL, XML_TOK_TEXTFIELD_OUTLINE_LEVEL},
    { XML_NAMESPACE_TEXT, XML_ACTIVE, XML_TOK_TEXTFIELD_ACTIVE },
    { XML_NAMESPACE_TEXT, XML_NOTE_CLASS, XML_TOK_TEXTFIELD_NOTE_CLASS },
    { XML_NAMESPACE_TEXT, XML_REFERENCE_FORMAT,
                XML_TOK_TEXTFIELD_REFERENCE_FORMAT },
    { XML_NAMESPACE_TEXT, XML_REF_NAME, XML_TOK_TEXTFIELD_REF_NAME },
    { XML_NAMESPACE_TEXT, XML_CONNECTION_NAME,
      XML_TOK_TEXTFIELD_CONNECTION_NAME },
    { XML_NAMESPACE_XLINK, XML_HREF, XML_TOK_TEXTFIELD_HREF },
    { XML_NAMESPACE_OFFICE, XML_TARGET_FRAME_NAME,
      XML_TOK_TEXTFIELD_TARGET_FRAME },
    { XML_NAMESPACE_TEXT, XML_ANNOTATION, XML_TOK_TEXTFIELD_ANNOTATION },
    { XML_NAMESPACE_SCRIPT, XML_LANGUAGE, XML_TOK_TEXTFIELD_LANGUAGE },
    { XML_NAMESPACE_TEXT, XML_KIND, XML_TOK_TEXTFIELD_MEASURE_KIND },
    { XML_NAMESPACE_TEXT, XML_IS_HIDDEN, XML_TOK_TEXTFIELD_IS_HIDDEN },
    { XML_NAMESPACE_TEXT, XML_CURRENT_VALUE,
                XML_TOK_TEXTFIELD_CURRENT_VALUE },
    { XML_NAMESPACE_TEXT, XML_TABLE_TYPE, XML_TOK_TEXTFIELD_TABLE_TYPE },
    { XML_NAMESPACE_OFFICE, XML_NAME, XML_TOK_TEXT_NAME },

    XML_TOKEN_MAP_END
};


// maximum allowed length of combined characters field
#define MAX_COMBINED_CHARACTERS 6

struct SAL_DLLPRIVATE XMLTextImportHelper::Impl
    : private ::boost::noncopyable
{
    ::std::auto_ptr<SvXMLTokenMap> m_pTextElemTokenMap;
    ::std::auto_ptr<SvXMLTokenMap> m_pTextPElemTokenMap;
    ::std::auto_ptr<SvXMLTokenMap> m_pTextPAttrTokenMap;
    ::std::auto_ptr<SvXMLTokenMap> m_pTextFieldAttrTokenMap;
    ::std::auto_ptr<SvXMLTokenMap> m_pTextNumberedParagraphAttrTokenMap;
    ::std::auto_ptr<SvXMLTokenMap> m_pTextListBlockAttrTokenMap;
    ::std::auto_ptr<SvXMLTokenMap> m_pTextListBlockElemTokenMap;
    ::std::auto_ptr<SvXMLTokenMap> m_pTextFrameAttrTokenMap;
    ::std::auto_ptr<SvXMLTokenMap> m_pTextContourAttrTokenMap;
    ::std::auto_ptr<SvXMLTokenMap> m_pTextHyperlinkAttrTokenMap;
    ::std::auto_ptr<SvXMLTokenMap> m_pTextMasterPageElemTokenMap;
    ::std::auto_ptr<SvStringsDtor> m_pPrevFrmNames;
    ::std::auto_ptr<SvStringsDtor> m_pNextFrmNames;

    // --> OD 2008-04-25 #refactorlists#
    ::std::auto_ptr<XMLTextListsHelper> m_pTextListsHelper;
    // <--

    SvXMLImportContextRef m_xAutoStyles;
    SvXMLImportContextRef m_xFontDecls;

    XMLSectionList_Impl m_SectionList;

    UniReference< SvXMLImportPropertyMapper > m_xParaImpPrMap;
    UniReference< SvXMLImportPropertyMapper > m_xTextImpPrMap;
    UniReference< SvXMLImportPropertyMapper > m_xFrameImpPrMap;
    UniReference< SvXMLImportPropertyMapper > m_xSectionImpPrMap;
    UniReference< SvXMLImportPropertyMapper > m_xRubyImpPrMap;

    ::std::auto_ptr<SvI18NMap> m_pRenameMap;
    // --> OD 2006-10-12 #i69629# - change and extend data structure:
    // - data structure contains candidates of paragraph styles, which
    //   will be assigned to the outline style
    // - data structure contains more than one candidate for each list level
    //   of the outline style
    ::boost::scoped_array< ::std::vector< ::rtl::OUString > >
        m_pOutlineStylesCandidates;
    // <--

    // start range, xml:id, RDFa stuff
    typedef ::boost::tuple<
        uno::Reference<text::XTextRange>, ::rtl::OUString,
        ::boost::shared_ptr< ::xmloff::ParsedRDFaAttributes > >
            BookmarkMapEntry_t;
    /// start ranges for open bookmarks
    ::std::map< ::rtl::OUString, BookmarkMapEntry_t,
                ::comphelper::UStringLess> m_BookmarkStartRanges;

    typedef ::std::vector< ::rtl::OUString > BookmarkVector_t;
    BookmarkVector_t m_BookmarkVector;

    /// name of the last 'open' redline that started between paragraphs
    ::rtl::OUString m_sOpenRedlineIdentifier;

    uno::Reference<text::XText> m_xText;
    uno::Reference<text::XTextCursor> m_xCursor;
    uno::Reference<text::XTextRange> m_xCursorAsRange;
    uno::Reference<container::XNameContainer> m_xParaStyles;
    uno::Reference<container::XNameContainer> m_xTextStyles;
    uno::Reference<container::XNameContainer> m_xNumStyles;
    uno::Reference<container::XNameContainer> m_xFrameStyles;
    uno::Reference<container::XNameContainer> m_xPageStyles;
    uno::Reference<container::XIndexReplace> m_xChapterNumbering;
    uno::Reference<container::XNameAccess> m_xTextFrames;
    uno::Reference<container::XNameAccess> m_xGraphics;
    uno::Reference<container::XNameAccess> m_xObjects;
    uno::Reference<lang::XMultiServiceFactory> m_xServiceFactory;

    SvXMLImport & m_rSvXMLImport;

    bool m_bInsertMode : 1;
    bool m_bStylesOnlyMode : 1;
    bool m_bBlockMode : 1;
    bool m_bProgress : 1;
    bool m_bOrganizerMode : 1;
    bool m_bBodyContentStarted : 1;

    // #107848#
    // One more flag to remember if we are inside a deleted redline section
    bool m_bInsideDeleteContext : 1;

    typedef ::std::pair< ::rtl::OUString, ::rtl::OUString> field_name_type_t;
    typedef ::std::pair< ::rtl::OUString, ::rtl::OUString > field_param_t;
    typedef ::std::vector< field_param_t > field_params_t;
    typedef ::std::pair< field_name_type_t, field_params_t > field_stack_item_t;
    typedef ::std::stack< field_stack_item_t > field_stack_t;

    field_stack_t m_FieldStack;

    ::rtl::OUString m_sCellParaStyleDefault;

    Impl(       uno::Reference<frame::XModel> const& rModel,
                SvXMLImport & rImport,
                bool const bInsertMode, bool const bStylesOnlyMode,
                bool const bProgress, bool const bBlockMode,
                bool const bOrganizerMode)
        :   m_pTextElemTokenMap( 0 )
        ,   m_pTextPElemTokenMap( 0 )
        ,   m_pTextPAttrTokenMap( 0 )
        ,   m_pTextFieldAttrTokenMap( 0 )
        ,   m_pTextNumberedParagraphAttrTokenMap( 0 )
        ,   m_pTextListBlockAttrTokenMap( 0 )
        ,   m_pTextListBlockElemTokenMap( 0 )
        ,   m_pTextFrameAttrTokenMap( 0 )
        ,   m_pTextContourAttrTokenMap( 0 )
        ,   m_pTextHyperlinkAttrTokenMap( 0 )
        ,   m_pTextMasterPageElemTokenMap( 0 )
        ,   m_pPrevFrmNames( 0 )
        ,   m_pNextFrmNames( 0 )
        // --> OD 2008-04-25 #refactorlists#
        ,   m_pTextListsHelper( new XMLTextListsHelper() )
        // <--
        ,   m_pRenameMap( 0 )
        // --> OD 2006-10-12 #i69629#
        ,   m_pOutlineStylesCandidates( 0 )
        // <--
        ,   m_xServiceFactory( rModel, UNO_QUERY )
        ,   m_rSvXMLImport( rImport )
        ,   m_bInsertMode( bInsertMode )
        ,   m_bStylesOnlyMode( bStylesOnlyMode )
        ,   m_bBlockMode( bBlockMode )
        ,   m_bProgress( bProgress )
        ,   m_bOrganizerMode( bOrganizerMode )
        ,   m_bBodyContentStarted( true )
            // #107848# Initialize inside_deleted_section flag correctly
        ,   m_bInsideDeleteContext( false )
    {
    }

    void InitOutlineStylesCandidates()
    {
        if (!m_pOutlineStylesCandidates)
        {
            size_t const size(m_xChapterNumbering->getCount());
            m_pOutlineStylesCandidates.reset(
                new ::std::vector< ::rtl::OUString >[size] );
        }
    }

};


uno::Reference< text::XText > & XMLTextImportHelper::GetText()
{
    return m_pImpl->m_xText;
}

uno::Reference< text::XTextCursor > & XMLTextImportHelper::GetCursor()
{
    return m_pImpl->m_xCursor;
}

uno::Reference< text::XTextRange > & XMLTextImportHelper::GetCursorAsRange()
{
    return m_pImpl->m_xCursorAsRange;
}

bool XMLTextImportHelper::IsInsertMode() const
{
    return m_pImpl->m_bInsertMode;
}

bool XMLTextImportHelper::IsStylesOnlyMode() const
{
    return m_pImpl->m_bStylesOnlyMode;
}

bool XMLTextImportHelper::IsBlockMode() const
{
    return m_pImpl->m_bBlockMode;
}

bool XMLTextImportHelper::IsOrganizerMode() const
{
    return m_pImpl->m_bOrganizerMode;
}

bool XMLTextImportHelper::IsProgress() const
{
    return m_pImpl->m_bProgress;
}

XMLSectionList_Impl & XMLTextImportHelper::GetSectionList()
{
    return m_pImpl->m_SectionList;
}

uno::Reference<container::XNameContainer> const&
XMLTextImportHelper::GetParaStyles() const
{
    return m_pImpl->m_xParaStyles;
}

uno::Reference<container::XNameContainer> const&
XMLTextImportHelper::GetTextStyles() const
{
    return m_pImpl->m_xTextStyles;
}

uno::Reference<container::XNameContainer> const&
XMLTextImportHelper::GetNumberingStyles() const
{
    return m_pImpl->m_xNumStyles;
}

uno::Reference<container::XNameContainer> const&
XMLTextImportHelper::GetFrameStyles() const
{
    return m_pImpl->m_xFrameStyles;
}

uno::Reference<container::XNameContainer> const&
XMLTextImportHelper::GetPageStyles() const
{
    return m_pImpl->m_xPageStyles;
}

uno::Reference<container::XIndexReplace> const&
XMLTextImportHelper::GetChapterNumbering() const
{
    return m_pImpl->m_xChapterNumbering;
}

UniReference< SvXMLImportPropertyMapper > const&
XMLTextImportHelper::GetParaImportPropertySetMapper() const
{
    return m_pImpl->m_xParaImpPrMap;
}

UniReference< SvXMLImportPropertyMapper > const&
XMLTextImportHelper::GetTextImportPropertySetMapper() const
{
    return m_pImpl->m_xTextImpPrMap;
}

UniReference< SvXMLImportPropertyMapper > const&
XMLTextImportHelper::GetFrameImportPropertySetMapper() const
{
    return m_pImpl->m_xFrameImpPrMap;
}

UniReference< SvXMLImportPropertyMapper > const&
XMLTextImportHelper::GetSectionImportPropertySetMapper() const
{
    return m_pImpl->m_xSectionImpPrMap;
}

UniReference< SvXMLImportPropertyMapper > const&
XMLTextImportHelper::GetRubyImportPropertySetMapper() const
{
    return m_pImpl->m_xRubyImpPrMap;
}

void XMLTextImportHelper::SetInsideDeleteContext(bool const bNew)
{
    m_pImpl->m_bInsideDeleteContext = bNew;
}

bool XMLTextImportHelper::IsInsideDeleteContext() const
{
    return m_pImpl->m_bInsideDeleteContext;
}

SvXMLImport & XMLTextImportHelper::GetXMLImport()
{
    return m_pImpl->m_rSvXMLImport;
}

XMLTextListsHelper & XMLTextImportHelper::GetTextListHelper()
{
    return *m_pImpl->m_pTextListsHelper;
}

const SvXMLTokenMap& XMLTextImportHelper::GetTextElemTokenMap()
{
    if (!m_pImpl->m_pTextElemTokenMap.get())
    {
        m_pImpl->m_pTextElemTokenMap.reset(
            new SvXMLTokenMap( aTextElemTokenMap ));
    }
    return *m_pImpl->m_pTextElemTokenMap;
}

const SvXMLTokenMap& XMLTextImportHelper::GetTextPElemTokenMap()
{
    if (!m_pImpl->m_pTextPElemTokenMap.get())
    {
        m_pImpl->m_pTextPElemTokenMap.reset(
            new SvXMLTokenMap( aTextPElemTokenMap ));
    }
    return *m_pImpl->m_pTextPElemTokenMap;
}

const SvXMLTokenMap& XMLTextImportHelper::GetTextPAttrTokenMap()
{
    if (!m_pImpl->m_pTextPAttrTokenMap.get())
    {
        m_pImpl->m_pTextPAttrTokenMap.reset(
            new SvXMLTokenMap( aTextPAttrTokenMap ));
    }
    return *m_pImpl->m_pTextPAttrTokenMap;
}

const SvXMLTokenMap& XMLTextImportHelper::GetTextFrameAttrTokenMap()
{
    if (!m_pImpl->m_pTextFrameAttrTokenMap.get())
    {
        m_pImpl->m_pTextFrameAttrTokenMap.reset(
            new SvXMLTokenMap( aTextFrameAttrTokenMap ));
    }
    return *m_pImpl->m_pTextFrameAttrTokenMap;
}

const SvXMLTokenMap& XMLTextImportHelper::GetTextContourAttrTokenMap()
{
    if (!m_pImpl->m_pTextContourAttrTokenMap.get())
    {
        m_pImpl->m_pTextContourAttrTokenMap.reset(
            new SvXMLTokenMap( aTextContourAttrTokenMap ));
    }
    return *m_pImpl->m_pTextContourAttrTokenMap;
}

const SvXMLTokenMap& XMLTextImportHelper::GetTextHyperlinkAttrTokenMap()
{
    if (!m_pImpl->m_pTextHyperlinkAttrTokenMap.get())
    {
        m_pImpl->m_pTextHyperlinkAttrTokenMap.reset(
            new SvXMLTokenMap( aTextHyperlinkAttrTokenMap ));
    }
    return *m_pImpl->m_pTextHyperlinkAttrTokenMap;
}

const SvXMLTokenMap& XMLTextImportHelper::GetTextMasterPageElemTokenMap()
{
    if (!m_pImpl->m_pTextMasterPageElemTokenMap.get())
    {
        m_pImpl->m_pTextMasterPageElemTokenMap.reset(
            new SvXMLTokenMap( aTextMasterPageElemTokenMap ));
    }
    return *m_pImpl->m_pTextMasterPageElemTokenMap;
}

const SvXMLTokenMap& XMLTextImportHelper::GetTextFieldAttrTokenMap()
{
    if (!m_pImpl->m_pTextFieldAttrTokenMap.get())
    {
        m_pImpl->m_pTextFieldAttrTokenMap.reset(
            new SvXMLTokenMap( aTextFieldAttrTokenMap ));
    }
    return *m_pImpl->m_pTextFieldAttrTokenMap;
}


namespace
{
    class FieldParamImporter
    {
        public:
            typedef pair<OUString,OUString> field_param_t;
            typedef vector<field_param_t> field_params_t;
            FieldParamImporter(const field_params_t* const pInParams, Reference<XNameContainer> xOutParams)
                : m_pInParams(pInParams)
                , m_xOutParams(xOutParams)
            { };
            void Import();

        private:
            const field_params_t* const m_pInParams;
            Reference<XNameContainer> m_xOutParams;
    };

    void FieldParamImporter::Import()
    {
        ::std::vector<OUString> vListEntries;
        ::std::map<OUString, Any> vOutParams;
        for(field_params_t::const_iterator pCurrent = m_pInParams->begin();
            pCurrent != m_pInParams->end();
            ++pCurrent)
        {
            if(pCurrent->first.equalsAscii(ODF_FORMDROPDOWN_RESULT))
            {
                // sal_Int32
                vOutParams[pCurrent->first] = makeAny(pCurrent->second.toInt32());
            }
            else if(pCurrent->first.equalsAscii(ODF_FORMCHECKBOX_RESULT))
            {
                // bool
                vOutParams[pCurrent->first] = makeAny(pCurrent->second.toBoolean());
            }
            else if(pCurrent->first.equalsAscii(ODF_FORMDROPDOWN_LISTENTRY))
            {
                // sequence
                vListEntries.push_back(pCurrent->second);
            }
            else
                vOutParams[pCurrent->first] = makeAny(pCurrent->second);
        }
        if(!vListEntries.empty())
        {
            Sequence<OUString> vListEntriesSeq(vListEntries.size());
            copy(vListEntries.begin(), vListEntries.end(), ::comphelper::stl_begin(vListEntriesSeq));
            vOutParams[OUString::createFromAscii(ODF_FORMDROPDOWN_LISTENTRY)] = makeAny(vListEntriesSeq);
        }
        for(::std::map<OUString, Any>::const_iterator pCurrent = vOutParams.begin();
            pCurrent != vOutParams.end();
            ++pCurrent)
        {
            try
            {
                m_xOutParams->insertByName(pCurrent->first, pCurrent->second);
            }
            catch(ElementExistException)
            { }
        }
    }
}

XMLTextImportHelper::XMLTextImportHelper(
        uno::Reference<frame::XModel> const& rModel,
        SvXMLImport& rImport,
        bool const bInsertMode, bool const bStylesOnlyMode,
        bool const bProgress, bool const bBlockMode,
        bool const bOrganizerMode)
    : m_pImpl( new Impl(rModel, rImport, bInsertMode, bStylesOnlyMode,
                    bProgress, bBlockMode, bOrganizerMode) )
    , m_pBackpatcherImpl( MakeBackpatcherImpl() )
{
    static ::rtl::OUString s_PropNameDefaultListId(
        RTL_CONSTASCII_USTRINGPARAM("DefaultListId"));

	Reference< XChapterNumberingSupplier > xCNSupplier( rModel, UNO_QUERY );

	if( xCNSupplier.is() )
    {
        m_pImpl->m_xChapterNumbering = xCNSupplier->getChapterNumberingRules();
        // --> OD 2008-05-15 #refactorlists#
        if (m_pImpl->m_xChapterNumbering.is())
        {
            Reference< XPropertySet > const xNumRuleProps(
                m_pImpl->m_xChapterNumbering, UNO_QUERY);
            if ( xNumRuleProps.is() )
            {
                Reference< XPropertySetInfo > xNumRulePropSetInfo(
                                            xNumRuleProps->getPropertySetInfo());
                if (xNumRulePropSetInfo.is() &&
                    xNumRulePropSetInfo->hasPropertyByName(
                         s_PropNameDefaultListId))
                {
                    ::rtl::OUString sListId;
                    xNumRuleProps->getPropertyValue(s_PropNameDefaultListId)
                        >>= sListId;
                    DBG_ASSERT( sListId.getLength() != 0,
                                "no default list id found at chapter numbering rules instance. Serious defect -> please inform OD." );
                    if ( sListId.getLength() )
                    {
                        Reference< XNamed > const xChapterNumNamed(
                            m_pImpl->m_xChapterNumbering, UNO_QUERY);
                        if ( xChapterNumNamed.is() )
                        {
                            m_pImpl->m_pTextListsHelper->KeepListAsProcessed(
                                                    sListId,
                                                    xChapterNumNamed->getName(),
                                                    ::rtl::OUString() );
                        }
                    }
                }
            }
        }
        // <--
    }

	Reference< XStyleFamiliesSupplier > xFamiliesSupp( rModel, UNO_QUERY );
//	DBG_ASSERT( xFamiliesSupp.is(), "no chapter numbering supplier" ); for clipboard there may be documents without styles

	if( xFamiliesSupp.is() )
	{
		Reference< XNameAccess > xFamilies(xFamiliesSupp->getStyleFamilies());

		const OUString aParaStyles(RTL_CONSTASCII_USTRINGPARAM("ParagraphStyles"));
		if( xFamilies->hasByName( aParaStyles ) )
        {
            m_pImpl->m_xParaStyles.set(xFamilies->getByName(aParaStyles),
                UNO_QUERY);
        }

		const OUString aCharStyles(RTL_CONSTASCII_USTRINGPARAM("CharacterStyles"));
		if( xFamilies->hasByName( aCharStyles ) )
        {
            m_pImpl->m_xTextStyles.set(xFamilies->getByName(aCharStyles),
                UNO_QUERY);
        }

		const OUString aNumStyles(RTL_CONSTASCII_USTRINGPARAM("NumberingStyles"));
		if( xFamilies->hasByName( aNumStyles ) )
        {
            m_pImpl->m_xNumStyles.set(xFamilies->getByName(aNumStyles),
                UNO_QUERY);
        }

		const OUString aFrameStyles(RTL_CONSTASCII_USTRINGPARAM("FrameStyles"));
		if( xFamilies->hasByName( aFrameStyles ) )
        {
            m_pImpl->m_xFrameStyles.set(xFamilies->getByName(aFrameStyles),
                UNO_QUERY);
        }

		const OUString aPageStyles(RTL_CONSTASCII_USTRINGPARAM("PageStyles"));
		if( xFamilies->hasByName( aPageStyles ) )
        {
            m_pImpl->m_xPageStyles.set(xFamilies->getByName(aPageStyles),
                UNO_QUERY);
        }
    }

	Reference < XTextFramesSupplier > xTFS( rModel, UNO_QUERY );
	if( xTFS.is() )
    {
        m_pImpl->m_xTextFrames.set(xTFS->getTextFrames());
    }

	Reference < XTextGraphicObjectsSupplier > xTGOS( rModel, UNO_QUERY );
	if( xTGOS.is() )
    {
        m_pImpl->m_xGraphics.set(xTGOS->getGraphicObjects());
    }

	Reference < XTextEmbeddedObjectsSupplier > xTEOS( rModel, UNO_QUERY );
	if( xTEOS.is() )
    {
        m_pImpl->m_xObjects.set(xTEOS->getEmbeddedObjects());
    }

	XMLPropertySetMapper *pPropMapper =
			new XMLTextPropertySetMapper( TEXT_PROP_MAP_PARA );
    m_pImpl->m_xParaImpPrMap =
        new XMLTextImportPropertyMapper( pPropMapper, rImport );

	pPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_TEXT );
    m_pImpl->m_xTextImpPrMap =
        new XMLTextImportPropertyMapper( pPropMapper, rImport );

	pPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_FRAME );
    m_pImpl->m_xFrameImpPrMap =
        new XMLTextImportPropertyMapper( pPropMapper, rImport );

	pPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_SECTION );
    m_pImpl->m_xSectionImpPrMap =
        new XMLTextImportPropertyMapper( pPropMapper, rImport );

	pPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_RUBY );
    m_pImpl->m_xRubyImpPrMap =
        new SvXMLImportPropertyMapper( pPropMapper, rImport );
}

XMLTextImportHelper::~XMLTextImportHelper()
{
}

SvXMLImportPropertyMapper *XMLTextImportHelper::CreateShapeExtPropMapper(SvXMLImport& rImport)
{
	XMLPropertySetMapper *pPropMapper =
		new XMLTextPropertySetMapper( TEXT_PROP_MAP_FRAME );
	return new XMLTextImportPropertyMapper( pPropMapper, rImport,
                   const_cast<XMLFontStylesContext*>(rImport.GetFontDecls()) );
}

SvXMLImportPropertyMapper *XMLTextImportHelper::CreateCharExtPropMapper(SvXMLImport& rImport, XMLFontStylesContext *pFontDecls)
{
	XMLPropertySetMapper *pPropMapper =
		new XMLTextPropertySetMapper( TEXT_PROP_MAP_TEXT );
	if (!pFontDecls)
		pFontDecls = const_cast<XMLFontStylesContext*>(rImport.GetFontDecls());
	return new XMLTextImportPropertyMapper( pPropMapper, rImport, pFontDecls );
}

SvXMLImportPropertyMapper *XMLTextImportHelper::CreateParaExtPropMapper(SvXMLImport& rImport, XMLFontStylesContext *pFontDecls)
{
	XMLPropertySetMapper *pPropMapper =
		new XMLTextPropertySetMapper( TEXT_PROP_MAP_SHAPE_PARA );
	if (!pFontDecls)
		pFontDecls = const_cast<XMLFontStylesContext*>(rImport.GetFontDecls());
	return new XMLTextImportPropertyMapper( pPropMapper, rImport, pFontDecls );
}

SvXMLImportPropertyMapper *XMLTextImportHelper::CreateParaDefaultExtPropMapper(SvXMLImport& rImport, XMLFontStylesContext* pFontDecls)
{
	if (!pFontDecls)
		pFontDecls = const_cast<XMLFontStylesContext*>(rImport.GetFontDecls());

	XMLPropertySetMapper* pPropMapper =
		new XMLTextPropertySetMapper( TEXT_PROP_MAP_SHAPE_PARA );
    SvXMLImportPropertyMapper* pImportMapper = new XMLTextImportPropertyMapper( pPropMapper, rImport, pFontDecls );

	pPropMapper =
		new XMLTextPropertySetMapper( TEXT_PROP_MAP_TEXT_ADDITIONAL_DEFAULTS );
    pImportMapper->ChainImportMapper( new XMLTextImportPropertyMapper( pPropMapper, rImport, pFontDecls ) );

	return pImportMapper;
}

SvXMLImportPropertyMapper*
    XMLTextImportHelper::CreateTableDefaultExtPropMapper(
        SvXMLImport& rImport,
        XMLFontStylesContext* )
{
	XMLPropertySetMapper *pPropMapper =
		new XMLTextPropertySetMapper( TEXT_PROP_MAP_TABLE_DEFAULTS );
	return new SvXMLImportPropertyMapper( pPropMapper, rImport );
}

SvXMLImportPropertyMapper*
    XMLTextImportHelper::CreateTableRowDefaultExtPropMapper(
        SvXMLImport& rImport,
        XMLFontStylesContext* )
{
	XMLPropertySetMapper *pPropMapper =
		new XMLTextPropertySetMapper( TEXT_PROP_MAP_TABLE_ROW_DEFAULTS );
	return new SvXMLImportPropertyMapper( pPropMapper, rImport );
}

void XMLTextImportHelper::SetCursor( const Reference < XTextCursor > & rCursor )
{
    m_pImpl->m_xCursor.set(rCursor);
    m_pImpl->m_xText.set(rCursor->getText());
    m_pImpl->m_xCursorAsRange.set( rCursor, UNO_QUERY );
}

void XMLTextImportHelper::ResetCursor()
{
    m_pImpl->m_xCursor.set(0);
    m_pImpl->m_xText.set(0);
    m_pImpl->m_xCursorAsRange.set(0);
}


sal_Bool XMLTextImportHelper::HasFrameByName( const OUString& rName ) const
{
    return (m_pImpl->m_xTextFrames.is() &&
            m_pImpl->m_xTextFrames->hasByName(rName))
        || (m_pImpl->m_xGraphics.is() &&
            m_pImpl->m_xGraphics->hasByName(rName))
        || (m_pImpl->m_xObjects.is() &&
            m_pImpl->m_xObjects->hasByName(rName));
}

void XMLTextImportHelper::InsertString( const OUString& rChars )
{
    DBG_ASSERT(m_pImpl->m_xText.is(), "no text");
    DBG_ASSERT(m_pImpl->m_xCursorAsRange.is(), "no range");
    if (m_pImpl->m_xText.is())
    {
        m_pImpl->m_xText->insertString(m_pImpl->m_xCursorAsRange,
            rChars, sal_False);
    }
}

void XMLTextImportHelper::InsertString( const OUString& rChars,
									 	sal_Bool& rIgnoreLeadingSpace )
{
    DBG_ASSERT(m_pImpl->m_xText.is(), "no text");
    DBG_ASSERT(m_pImpl->m_xCursorAsRange.is(), "no range");
    if (m_pImpl->m_xText.is())
    {
		sal_Int32 nLen = rChars.getLength();
		OUStringBuffer sChars( nLen );

		for( sal_Int32 i=0; i < nLen; i++ )
		{
			sal_Unicode c = rChars[i];
			switch( c )
			{
				case 0x20:
				case 0x09:
				case 0x0a:
				case 0x0d:
					if( !rIgnoreLeadingSpace )
						sChars.append( (sal_Unicode)0x20 );
					rIgnoreLeadingSpace = sal_True;
					break;
				default:
					rIgnoreLeadingSpace = sal_False;
					sChars.append( c );
					break;
			}
		}
        m_pImpl->m_xText->insertString(m_pImpl->m_xCursorAsRange,
            sChars.makeStringAndClear(), sal_False);
    }
}

void XMLTextImportHelper::InsertControlCharacter( sal_Int16 nControl )
{
    DBG_ASSERT(m_pImpl->m_xText.is(), "no text");
    DBG_ASSERT(m_pImpl->m_xCursorAsRange.is(), "no range");
    if (m_pImpl->m_xText.is())
    {
        m_pImpl->m_xText->insertControlCharacter(
            m_pImpl->m_xCursorAsRange, nControl, sal_False);
    }
}

void XMLTextImportHelper::InsertTextContent(
	Reference < XTextContent > & xContent )
{
    DBG_ASSERT(m_pImpl->m_xText.is(), "no text");
    DBG_ASSERT(m_pImpl->m_xCursorAsRange.is(), "no range");
    if (m_pImpl->m_xText.is())
    {
        m_pImpl->m_xText->insertTextContent(
            m_pImpl->m_xCursorAsRange, xContent, sal_False);
    }
}

void XMLTextImportHelper::DeleteParagraph()
{
    DBG_ASSERT(m_pImpl->m_xText.is(), "no text");
    DBG_ASSERT(m_pImpl->m_xCursor.is(), "no cursor");
    DBG_ASSERT(m_pImpl->m_xCursorAsRange.is(), "no range");

	sal_Bool bDelete = sal_True;
    Reference < XEnumerationAccess > const xEnumAccess(
        m_pImpl->m_xCursor, UNO_QUERY);
	if( xEnumAccess.is() )
	{
		Reference < XEnumeration > xEnum(xEnumAccess->createEnumeration());
		DBG_ASSERT( xEnum->hasMoreElements(), "empty text enumeration" );
		if( xEnum->hasMoreElements() )
		{
			Reference < XComponent > xComp( xEnum->nextElement(), UNO_QUERY );
			DBG_ASSERT( xComp.is(), "got no component" );
			if( xComp.is() )
			{
				xComp->dispose();
				bDelete = sal_False;
			}
		}
	}
	if( bDelete )
	{
        if (m_pImpl->m_xCursor->goLeft( 1, sal_True ))
        {
			OUString sEmpty;
            m_pImpl->m_xText->insertString(m_pImpl->m_xCursorAsRange,
                    sEmpty, sal_True);
        }
    }
}

OUString XMLTextImportHelper::ConvertStarFonts( const OUString& rChars,
												const OUString& rStyleName,
												sal_uInt8& rFlags,
											 	sal_Bool bPara,
												SvXMLImport& rImport ) const
{
	OUStringBuffer sChars( rChars );
	sal_Bool bConverted = sal_False;
	for( sal_Int32 j=0; j<rChars.getLength(); j++ )
	{
		sal_Unicode c = rChars[j];
		if( c >= 0xf000 && c <= 0xf0ff )
		{
			if( (rFlags & CONV_STAR_FONT_FLAGS_VALID) == 0 )
			{
				XMLTextStyleContext *pStyle = 0;
				sal_uInt16 nFamily = bPara ? XML_STYLE_FAMILY_TEXT_PARAGRAPH
										   : XML_STYLE_FAMILY_TEXT_TEXT;
                if (rStyleName.getLength() && m_pImpl->m_xAutoStyles.Is())
                {
                    const SvXMLStyleContext* pTempStyle =
                        ((SvXMLStylesContext *)&m_pImpl->m_xAutoStyles)->
								FindStyleChildContext( nFamily, rStyleName,
													   sal_True );
					pStyle = PTR_CAST( XMLTextStyleContext,pTempStyle);
				}

				if( pStyle )
				{
					sal_Int32 nCount = pStyle->_GetProperties().size();
					if( nCount )
					{
						UniReference < SvXMLImportPropertyMapper > xImpPrMap =
                            ((SvXMLStylesContext *)&m_pImpl->m_xAutoStyles)
                                ->GetImportPropertyMapper(nFamily);
						if( xImpPrMap.is() )
						{
							UniReference<XMLPropertySetMapper> rPropMapper =
								xImpPrMap->getPropertySetMapper();
							for( sal_Int32 i=0; i < nCount; i++ )
							{
								const XMLPropertyState& rProp = pStyle->_GetProperties()[i];
								sal_Int32 nIdx = rProp.mnIndex;
								sal_uInt32 nContextId = rPropMapper->GetEntryContextId(nIdx);
								if( CTF_FONTFAMILYNAME == nContextId )
								{
									rFlags &= ~(CONV_FROM_STAR_BATS|CONV_FROM_STAR_MATH);
									OUString sFontName;
									rProp.maValue >>= sFontName;
									OUString sStarBats( RTL_CONSTASCII_USTRINGPARAM("StarBats" ) );
									OUString sStarMath( RTL_CONSTASCII_USTRINGPARAM("StarMath" ) );
									if( sFontName.equalsIgnoreAsciiCase( sStarBats  ) )
										rFlags |= CONV_FROM_STAR_BATS;
									else if( sFontName.equalsIgnoreAsciiCase( sStarMath ) )
										rFlags |= CONV_FROM_STAR_MATH;
									break;
								}
							}
						}
					}

				}

				rFlags |= CONV_STAR_FONT_FLAGS_VALID;
			}
			if( (rFlags & CONV_FROM_STAR_BATS ) != 0 )
			{
				sChars.setCharAt( j, rImport.ConvStarBatsCharToStarSymbol( c ) );
				bConverted = sal_True;
			}
			else if( (rFlags & CONV_FROM_STAR_MATH ) != 0 )
			{
				sChars.setCharAt( j, rImport.ConvStarMathCharToStarSymbol( c ) );
				bConverted = sal_True;
			}
		}
	}

	return bConverted ? sChars.makeStringAndClear() : rChars;
}

// --> OD 2006-10-12 #i69629#
// helper method to determine, if a paragraph style has a list style (inclusive
// an empty one) inherits a list style (inclusive an empty one) from one of its parents
// --> OD 2007-01-29 #i73973#
// apply special case, that found list style equals the chapter numbering, also
// to the found list styles of the parent styles.
sal_Bool lcl_HasListStyle( OUString sStyleName,
                           const Reference < XNameContainer >& xParaStyles,
                           SvXMLImport& rImport,
                           const OUString& sNumberingStyleName,
                           const OUString& sOutlineStyleName )
{
    sal_Bool bRet( sal_False );

    if ( !xParaStyles->hasByName( sStyleName ) )
    {
        // error case
        return sal_True;
    }

    Reference< XPropertyState > xPropState( xParaStyles->getByName( sStyleName ),
                                            UNO_QUERY );
    if ( !xPropState.is() )
    {
        // error case
        return sal_False;
    }

    if ( xPropState->getPropertyState( sNumberingStyleName ) == PropertyState_DIRECT_VALUE )
    {
        // list style found
        bRet = sal_True;
        // special case: the set list style equals the chapter numbering
        Reference< XPropertySet > xPropSet( xPropState, UNO_QUERY );
        if ( xPropSet.is() )
        {
            OUString sListStyle;
            xPropSet->getPropertyValue( sNumberingStyleName ) >>= sListStyle;
            if ( sListStyle.getLength() != 0 &&
                 sListStyle == sOutlineStyleName )
            {
                bRet = sal_False;
            }
        }
    }
    else
    {
        // --> OD 2007-12-07 #i77708#
        sal_Int32 nUPD( 0 );
        sal_Int32 nBuild( 0 );
        // --> OD 2008-03-19 #i86058#
//        rImport.getBuildIds( nUPD, nBuild );
        const bool bBuildIdFound = rImport.getBuildIds( nUPD, nBuild );
        // <--
        // <--
        // search list style at parent
        Reference<XStyle> xStyle( xPropState, UNO_QUERY );
        while ( xStyle.is() )
        {
            OUString aParentStyle( xStyle->getParentStyle() );
            if ( aParentStyle.getLength() > 0 )
            {
                aParentStyle =
                    rImport.GetStyleDisplayName( XML_STYLE_FAMILY_TEXT_PARAGRAPH,
                                                 aParentStyle );
            }
            if ( aParentStyle.getLength() == 0 ||
                 !xParaStyles->hasByName( aParentStyle ) )
            {
                // no list style found
                break;
            }
            else
            {
                xPropState = Reference< XPropertyState >(
                                    xParaStyles->getByName( aParentStyle ),
                                    UNO_QUERY );
                if ( !xPropState.is() )
                {
                    // error case
                    return sal_True;
                }
                if ( xPropState->getPropertyState( sNumberingStyleName ) == PropertyState_DIRECT_VALUE )
                {
                    // list style found
                    bRet = sal_True;
                    // --> OD 2007-01-29 #i73973#
                    // special case: the found list style equals the chapter numbering
                    Reference< XPropertySet > xPropSet( xPropState, UNO_QUERY );
                    if ( xPropSet.is() )
                    {
                        OUString sListStyle;
                        xPropSet->getPropertyValue( sNumberingStyleName ) >>= sListStyle;
                        if ( sListStyle.getLength() != 0 &&
                             sListStyle == sOutlineStyleName )
                        {
                            bRet = sal_False;
                        }
                        // --> OD 2007-12-07 #i77708#
                        // special handling for text documents from OOo version prior OOo 2.4
                        // --> OD 2008-03-19 #i86058#
                        // check explicitly on certain versions and on import of
                        // text documents in OpenOffice.org file format
                        else if ( sListStyle.getLength() == 0 &&
                                  ( rImport.IsTextDocInOOoFileFormat() ||
                                    ( bBuildIdFound &&
                                      ( ( nUPD == 641 ) || ( nUPD == 645 ) || // prior OOo 2.0
                                        ( nUPD == 680 && nBuild <= 9238 ) ) ) ) ) // OOo 2.0 - OOo 2.3.1
                        {
                            bRet = sal_False;
                        }
                        // <--
                    }
                    // <--
                    break;
                }
                else
                {
                    // search list style at parent
                    xStyle = Reference<XStyle>( xPropState, UNO_QUERY );
                }
            }
        }
    }

    return bRet;
}
// <--
OUString XMLTextImportHelper::SetStyleAndAttrs(
		SvXMLImport& rImport,
		const Reference < XTextCursor >& rCursor,
		const OUString& rStyleName,
		sal_Bool bPara,
        sal_Bool bOutlineLevelAttrFound,
        sal_Int8 nOutlineLevel,
        // --> OD 2007-08-17 #i80724#
        sal_Bool bSetListAttrs )
        // <--
{
    static ::rtl::OUString s_ParaStyleName(
        RTL_CONSTASCII_USTRINGPARAM("ParaStyleName"));
    static ::rtl::OUString s_CharStyleName(
        RTL_CONSTASCII_USTRINGPARAM("CharStyleName"));
    static ::rtl::OUString s_NumberingRules(
        RTL_CONSTASCII_USTRINGPARAM("NumberingRules"));
    static ::rtl::OUString s_NumberingIsNumber(
        RTL_CONSTASCII_USTRINGPARAM("NumberingIsNumber"));
    static ::rtl::OUString s_NumberingLevel(
        RTL_CONSTASCII_USTRINGPARAM("NumberingLevel"));
    static ::rtl::OUString s_ParaIsNumberingRestart(
        RTL_CONSTASCII_USTRINGPARAM("ParaIsNumberingRestart"));
    static ::rtl::OUString s_NumberingStartValue(
        RTL_CONSTASCII_USTRINGPARAM("NumberingStartValue"));
    static ::rtl::OUString s_PropNameListId(
        RTL_CONSTASCII_USTRINGPARAM("ListId"));
    static ::rtl::OUString s_PageDescName(
        RTL_CONSTASCII_USTRINGPARAM("PageDescName"));
    static ::rtl::OUString s_ServiceCombinedCharacters(
        RTL_CONSTASCII_USTRINGPARAM(
            "com.sun.star.text.TextField.CombinedCharacters"));
    static ::rtl::OUString s_Content(RTL_CONSTASCII_USTRINGPARAM("Content"));
    static ::rtl::OUString s_OutlineLevel(
        RTL_CONSTASCII_USTRINGPARAM("OutlineLevel"));
    static ::rtl::OUString s_NumberingStyleName(
            RTL_CONSTASCII_USTRINGPARAM("NumberingStyleName"));

    const sal_uInt16 nFamily = bPara ? XML_STYLE_FAMILY_TEXT_PARAGRAPH
                                     : XML_STYLE_FAMILY_TEXT_TEXT;
	XMLTextStyleContext *pStyle = 0;
	OUString sStyleName( rStyleName );
    if (sStyleName.getLength() && m_pImpl->m_xAutoStyles.Is())
    {
        const SvXMLStyleContext* pTempStyle =
            ((SvXMLStylesContext *)&m_pImpl->m_xAutoStyles)->
					FindStyleChildContext( nFamily, sStyleName, sal_True );
		pStyle = PTR_CAST( XMLTextStyleContext,pTempStyle);
	}
	if( pStyle )
        sStyleName = pStyle->GetParentName();

	Reference < XPropertySet > xPropSet( rCursor, UNO_QUERY );
	Reference< XPropertySetInfo > xPropSetInfo(
		xPropSet->getPropertySetInfo());

	// style
	if( sStyleName.getLength() )
	{
        sStyleName = rImport.GetStyleDisplayName( nFamily, sStyleName );
        const String& rPropName = (bPara) ? s_ParaStyleName : s_CharStyleName;
		const Reference < XNameContainer > & rStyles = (bPara)
            ? m_pImpl->m_xParaStyles
            : m_pImpl->m_xTextStyles;
		if( rStyles.is() &&
			xPropSetInfo->hasPropertyByName( rPropName ) &&
			rStyles->hasByName( sStyleName ) )
		{
            xPropSet->setPropertyValue( rPropName, makeAny(sStyleName) );
		}
		else
			sStyleName = OUString();
	}

    // --> OD 2008-09-10 #i70748#
    // The outline level needs to be only applied as list level, if the heading
    // is not inside a list and if it by default applies the outline style.
    bool bApplyOutlineLevelAsListLevel( false );
    // --> OD 2007-08-17 #i80724#
    if (bSetListAttrs && bPara
        && xPropSetInfo->hasPropertyByName( s_NumberingRules))
    // <--
	{
		// Set numbering rules
        Reference< XIndexReplace > const xNumRules(
                xPropSet->getPropertyValue(s_NumberingRules), UNO_QUERY);

        XMLTextListBlockContext * pListBlock(0);
        XMLTextListItemContext  * pListItem(0);
        XMLNumberedParaContext  * pNumberedParagraph(0);
        GetTextListHelper().ListContextTop(
            pListBlock, pListItem, pNumberedParagraph);

        OSL_ENSURE(!(pListBlock && pNumberedParagraph), "XMLTextImportHelper::"
            "SetStyleAndAttrs: both list and numbered-paragraph???");

        Reference < XIndexReplace > xNewNumRules;
        sal_Int8 nLevel(-1);
        ::rtl::OUString sListId;
        sal_Int16 nStartValue(-1);
        bool bNumberingIsNumber(true);

        if (pListBlock) {

			if (!pListItem) {
                bNumberingIsNumber = false; // list-header
            }
            // --> OD 2008-05-08 #refactorlists#
            // consider text:style-override property of <text:list-item>
            xNewNumRules.set(
                (pListItem != 0 && pListItem->HasNumRulesOverride())
                    ? pListItem->GetNumRulesOverride()
                    : pListBlock->GetNumRules() );
            // <--
			nLevel = static_cast<sal_Int8>(pListBlock->GetLevel());

			if ( pListItem && pListItem->HasStartValue() ) {
               nStartValue = pListItem->GetStartValue();
            }

            // --> OD 2008-08-15 #i92811#
            sListId = m_pImpl->m_pTextListsHelper->GetListIdForListBlock(
                            *pListBlock);
            // <--
        }
        else if (pNumberedParagraph)
        {
            xNewNumRules.set(pNumberedParagraph->GetNumRules());
			nLevel = static_cast<sal_Int8>(pNumberedParagraph->GetLevel());
            sListId = pNumberedParagraph->GetListId();
            nStartValue = pNumberedParagraph->GetStartValue();
        }


        if (pListBlock || pNumberedParagraph)
		{
            // --> OD 2009-08-24 #i101349#
            // Assure that list style of automatic paragraph style is applied at paragraph.
            sal_Bool bApplyNumRules = pStyle && pStyle->IsListStyleSet();
            if ( !bApplyNumRules )
            {
                sal_Bool bSameNumRules = xNewNumRules == xNumRules;
                if( !bSameNumRules && xNewNumRules.is() && xNumRules.is() )
                {
                    // If the interface pointers are different then this does
                    // not mean that the num rules are different. Further tests
                    // are required then. However, if only one num rule is
                    // set, no tests are required of course.
                    Reference< XNamed > xNewNamed( xNewNumRules, UNO_QUERY );
                    Reference< XNamed > xNamed( xNumRules, UNO_QUERY );
                    if( xNewNamed.is() && xNamed.is() )
                    {
                        bSameNumRules = xNewNamed->getName() == xNamed->getName();
                    }
                    else
                    {
                        Reference< XAnyCompare > xNumRuleCompare( xNumRules, UNO_QUERY );
                        if( xNumRuleCompare.is() )
                        {
                            bSameNumRules = (xNumRuleCompare->compare( Any(xNumRules), Any(xNewNumRules) ) == 0);
                        }
                    }
                }
                bApplyNumRules = !bSameNumRules;
            }

            if ( bApplyNumRules )
            // <--
			{
                // #102607# This may except when xNewNumRules contains
                // a Writer-NumRule-Implementation bug gets applied to
                // a shape. Since this may occur inside a document
                // (e.g. when edited), this must be handled
                // gracefully.
                try
                {
                    xPropSet->setPropertyValue(
                        s_NumberingRules, makeAny(xNewNumRules) );
                }
                catch( Exception e )
                {
                    ; // I would really like to use a warning here,
                      // but I can't access the XMLErrorHandler from
                      // here.
                }
			}

            if (!bNumberingIsNumber &&
                xPropSetInfo->hasPropertyByName(s_NumberingIsNumber))
            {
                xPropSet->setPropertyValue(s_NumberingIsNumber, Any(sal_False));
            }

            xPropSet->setPropertyValue( s_NumberingLevel, Any(nLevel) );

            if( pListBlock && pListBlock->IsRestartNumbering() )
			{
				// TODO: property missing
                if (xPropSetInfo->hasPropertyByName(s_ParaIsNumberingRestart))
                {
					sal_Bool bTmp = sal_True;
                    xPropSet->setPropertyValue(s_ParaIsNumberingRestart,
                                               makeAny(bTmp) );
				}
				pListBlock->ResetRestartNumbering();
			}

			if ( 0 <= nStartValue &&
                xPropSetInfo->hasPropertyByName(s_NumberingStartValue))
            {
                xPropSet->setPropertyValue(s_NumberingStartValue,
                                           makeAny(nStartValue));
            }

            // --> OD 2008-04-23 #refactorlists#
            if (xPropSetInfo->hasPropertyByName(s_PropNameListId))
            {
                if (sListId.getLength()) {
                    xPropSet->setPropertyValue(s_PropNameListId,
                        makeAny(sListId) );
                }
            }
            // <--

			GetTextListHelper().SetListItem( (XMLTextListItemContext *)0 );
		}
		else
		{
			// If the paragraph is not in a list but its style, remove it from
			// the list.
            // --> OD 2005-10-25 #126347# - do not remove it, if the list
            // of the style is the chapter numbering rule.
            if( xNumRules.is() )
			{
                bool bRemove( true );
                // --> OD 2008-12-17 #i70748# - special handling for document from OOo 2.x
                sal_Int32 nUPD( 0 );
                sal_Int32 nBuild( 0 );
                const bool bBuildIdFound = rImport.getBuildIds( nUPD, nBuild );
                DBG_ASSERT( ( bBuildIdFound && nUPD == 680 ) ||
                            !pStyle ||
                            !pStyle->IsListStyleSet() ||
                            pStyle->GetListStyle().getLength() == 0,
                            "automatic paragraph style with list style name, but paragraph not in list???" );
                if ( ( bBuildIdFound && nUPD == 680 ) ||
                     !pStyle || !pStyle->IsListStyleSet() )
                {
                    if (m_pImpl->m_xChapterNumbering.is())
                    {
                        Reference< XNamed > xNumNamed( xNumRules, UNO_QUERY );
                        Reference< XNamed > const xChapterNumNamed (
                            m_pImpl->m_xChapterNumbering, UNO_QUERY);
                        if ( xNumNamed.is() && xChapterNumNamed.is() &&
                             xNumNamed->getName() == xChapterNumNamed->getName() )
                        {
                            bRemove = false;
                            // --> OD 2008-09-10 #i70748#
                            bApplyOutlineLevelAsListLevel = true;
                            // <--
                        }
                    }
                }
                // <--
                if ( bRemove )
                {
                    xPropSet->setPropertyValue( s_NumberingRules, Any() );
                }
			}
            // <--
		}
	}

	// hard paragraph properties
	if( pStyle )
	{
		pStyle->FillPropertySet( xPropSet );
		if( bPara && pStyle->HasMasterPageName() &&
            xPropSetInfo->hasPropertyByName(s_PageDescName))
		{
			OUString sDisplayName(
				rImport.GetStyleDisplayName(
								XML_STYLE_FAMILY_MASTER_PAGE,
								pStyle->GetMasterPageName()) );
			if( !sDisplayName.getLength() ||
                (m_pImpl->m_xPageStyles.is() &&
                 m_pImpl->m_xPageStyles->hasByName( sDisplayName)))
            {
                xPropSet->setPropertyValue(s_PageDescName,
                        makeAny(sDisplayName));
            }
        }
		if( bPara && pStyle->GetDropCapStyleName().getLength() &&
            m_pImpl->m_xTextStyles.is())
        {
			OUString sDisplayName(
				rImport.GetStyleDisplayName(
								XML_STYLE_FAMILY_TEXT_TEXT,
								pStyle->GetDropCapStyleName()) );
            if (m_pImpl->m_xTextStyles->hasByName(sDisplayName) &&
				xPropSetInfo->hasPropertyByName( sDisplayName ) )
			{
				xPropSet->setPropertyValue( pStyle->sDropCapCharStyleName, makeAny(sDisplayName) );
			}
		}

		// combined characters special treatment
		if (!bPara && pStyle->HasCombinedCharactersLetter())
		{
			// insert combined characters text field
            if (m_pImpl->m_xServiceFactory.is())
            {
                uno::Reference<beans::XPropertySet> const xTmp(
                    m_pImpl->m_xServiceFactory->createInstance(
                        s_ServiceCombinedCharacters), UNO_QUERY);
				if( xTmp.is() )
				{
					// fix cursor if larger than possible for
					// combined characters field
					if (rCursor->getString().getLength() >
							MAX_COMBINED_CHARACTERS)
					{
						rCursor->gotoRange(rCursor->getStart(), sal_False);
						rCursor->goRight(MAX_COMBINED_CHARACTERS, sal_True);
					}

					// set field value (the combined character string)
                    xTmp->setPropertyValue(s_Content,
                        makeAny(rCursor->getString()));

					// insert the field over it's original text
					Reference<XTextRange> xRange(rCursor, UNO_QUERY);
					Reference<XTextContent> xTextContent(xTmp, UNO_QUERY);
                    if (m_pImpl->m_xText.is() && xRange.is())
                    {
						// #i107225# the combined characters need to be inserted first
                        // the selected text has to be removed afterwards
                        m_pImpl->m_xText->insertTextContent( xRange->getStart(), xTextContent, sal_True );

                        if( xRange->getString().getLength() )
                        {
                            try
                            {
                                uno::Reference< text::XTextCursor > xCrsr = xRange->getText()->createTextCursorByRange( xRange->getStart() );
                                xCrsr->goLeft( 1, true );
                                uno::Reference< beans::XPropertySet> xCrsrProperties( xCrsr, uno::UNO_QUERY_THROW );
                                //the hard properties of the removed text need to be applied to the combined characters field
                                pStyle->FillPropertySet( xCrsrProperties );
                                xCrsr->collapseToEnd();
                                xCrsr->gotoRange( xRange->getEnd(), true );
                                xCrsr->setString( ::rtl::OUString() );
                            }
                            catch( const uno::Exception& rEx )
                            {
                                (void)rEx;
                            }
                        }
                    }
                }
            }
        }
    }

    // outline level; set after list style has been set
    // --> OD 2005-08-25 #i53198#
    // Complete re-worked and corrected:
    // - set outline level at paragraph
    // - set numbering level at paragraph, if none is already set
    // - assure that style is marked as an outline style for the corresponding
    //   outline level.
    // - DO NOT set type of numbering rule to outline.
    // - DO NOT set numbering rule directly at the paragraph.

    // --> OD 2008-12-09 #i70748#
    // Some minor rework and adjust access to paragraph styles
    if ( bPara )
    {
        // --> OD 2009-08-18 #i103817#
        sal_Int16 nCurrentOutlineLevelInheritedFromParagraphStyle = 0;
        const bool bHasOutlineLevelProp(
            xPropSetInfo->hasPropertyByName(s_OutlineLevel));
        if ( bHasOutlineLevelProp )
        {
            xPropSet->getPropertyValue(s_OutlineLevel)
                >>= nCurrentOutlineLevelInheritedFromParagraphStyle;
        }
        // <--
        //if ( bPara && nOutlineLevel != -1 )   //#outline level,removed by zhaojianwei
        if ( nOutlineLevel > 0 )       //add by zhaojianwei
        {
            //#outline level,removed by zhaojianwei
            if ( bHasOutlineLevelProp )
            {
                // In case that the value equals the value of its paragraph style
                // attribute outline level, the paragraph attribute value is left unset
                if ( nCurrentOutlineLevelInheritedFromParagraphStyle != nOutlineLevel )
                {
                    xPropSet->setPropertyValue( s_OutlineLevel,
                        makeAny( static_cast<sal_Int16>(nOutlineLevel) ) );
                }
            }//<-end,zhaojianwei

            // --> OD 2008-09-10 #i70748#
            if ( bApplyOutlineLevelAsListLevel )
            {
                sal_Int16 nNumLevel = -1;
                xPropSet->getPropertyValue( s_NumberingLevel ) >>= nNumLevel;
                if ( nNumLevel == -1 ||
                     nNumLevel != (nOutlineLevel - 1) )
                {
                    xPropSet->setPropertyValue( s_NumberingLevel,
                            makeAny( static_cast<sal_Int8>(nOutlineLevel - 1) ) );
                }
            }
            // <--
            // --> OD 2006-10-13 #i69629# - correction:
            // - for text document from version OOo 2.0.4/SO 8 PU4 and earlier
            //   the paragraph style of a heading should be assigned to the
            //   corresponding list level of the outline style.
            // - for other text documents the paragraph style of a heading is only
            //   a candidate for an assignment to the list level of the outline
            //   style, if it has no direct list style property and (if exists) the
            //   automatic paragraph style has also no direct list style set.
            if (m_pImpl->m_xParaStyles->hasByName(sStyleName))
            {
                bool bOutlineStyleCandidate( false );

                sal_Int32 nUPD( 0 );
                sal_Int32 nBuild( 0 );
                // --> OD 2007-12-19 #152540#
                const bool bBuildIdFound = rImport.getBuildIds( nUPD, nBuild );
                // --> OD 2007-07-25 #i73509#
                // --> OD 2008-03-19 #i86058# - check explicitly on certain versions
                if ( rImport.IsTextDocInOOoFileFormat() ||
                     ( bBuildIdFound &&
                       ( nUPD == 645 || nUPD == 641 ) ) )
                {
                    bOutlineStyleCandidate = true;
                }
                else if ( nUPD == 680 && nBuild <= 9073 ) /* BuildId of OOo 2.0.4/SO8 PU4 */
                {
                    bOutlineStyleCandidate = bOutlineLevelAttrFound;
                }
                // <--
//                else
//                {
//                    Reference< XPropertyState > xStylePropState(
//                                    xParaStyles->getByName( sStyleName ), UNO_QUERY );
//                    if ( xStylePropState.is() &&
//                         xStylePropState->getPropertyState( sNumberingStyleName ) == PropertyState_DIRECT_VALUE )
//                    {
//                        bOutlineStyleCandidate = false;
//                    }
//                    // --> OD 2007-01-11 #i73361#
//                    // The automatic paragraph style doesn't have to be considered.
//    //                else if ( pStyle && /* automatic paragraph style */
//    //                          pStyle->IsListStyleSet() )
//    //                {
//    //                    bOutlineStyleCandidate = false;
//    //                }
//                    // <--
//                    else
//                    {
//                        bOutlineStyleCandidate = true;
//                    }
//                  }

                if ( bOutlineStyleCandidate )
                {
                    AddOutlineStyleCandidate( nOutlineLevel, sStyleName );
                }
                // --> OD 2009-08-18 #i103817#
                // Assure that heading applies the outline style
                if ( ( !pStyle || !pStyle->IsListStyleSet() ) &&
                     !bOutlineStyleCandidate &&
                     m_pImpl->m_xChapterNumbering.is())
                {
                    OUString sEmptyStr;
                    if ( !lcl_HasListStyle( sStyleName,
                                    m_pImpl->m_xParaStyles, GetXMLImport(),
                                    s_NumberingStyleName,
                                    sEmptyStr ) )
                    {
                        // heading not in a list --> apply outline style
                        xPropSet->setPropertyValue( s_NumberingRules,
                            makeAny(m_pImpl->m_xChapterNumbering) );
                        xPropSet->setPropertyValue( s_NumberingLevel,
                            makeAny(static_cast<sal_Int8>(nOutlineLevel - 1)));
                    }
                }
                // <--
            }
            // <--
        }
        //-> #outlinelevel added by zhaojianwei
        //handle for text:p,if the paragraphstyle outlinelevel is set to[1~10]
        else if( bHasOutlineLevelProp )
        {
            if ( nCurrentOutlineLevelInheritedFromParagraphStyle != 0 )
            {
                sal_Int16 nZero = 0;
                xPropSet->setPropertyValue(s_OutlineLevel,
                    makeAny( static_cast<sal_Int16>(nZero) ));
            }
        }//<-end,zhaojianwei
    }
	// <--

	return sStyleName;
}

void XMLTextImportHelper::FindOutlineStyleName( ::rtl::OUString& rStyleName,
                                                sal_Int8 nOutlineLevel )
{
    static ::rtl::OUString s_HeadingStyleName(
        RTL_CONSTASCII_USTRINGPARAM("HeadingStyleName"));

    // style name empty?
    if( rStyleName.getLength() == 0 )
    {
        // Empty? Then we need o do stuff. Let's do error checking first.
        if (m_pImpl->m_xChapterNumbering.is() &&
            ( nOutlineLevel > 0 ) &&
            (nOutlineLevel <= m_pImpl->m_xChapterNumbering->getCount()))
        {
            nOutlineLevel--;   // for the remainder, the level's are 0-based

            // empty style name: look-up previously used name

            // if we don't have a previously used name, we'll use the default
            m_pImpl->InitOutlineStylesCandidates();
            if (m_pImpl->m_pOutlineStylesCandidates[nOutlineLevel].empty())
            {
                // no other name used previously? Then use default

                // iterate over property value sequence to find the style name
                Sequence<PropertyValue> aProperties;
                m_pImpl->m_xChapterNumbering->getByIndex( nOutlineLevel )
                    >>= aProperties;
                for( sal_Int32 i = 0; i < aProperties.getLength(); i++ )
                {
                    if (aProperties[i].Name == s_HeadingStyleName)
                    {
                        rtl::OUString aOutlineStyle;
                        aProperties[i].Value >>= aOutlineStyle;
                        m_pImpl->m_pOutlineStylesCandidates[nOutlineLevel]
                            .push_back( aOutlineStyle );
                        break;  // early out, if we found it!.
                    }
                }
            }

            // finally, we'll use the previously used style name for this
            // format (or the default we've just put into that style)
            // --> OD 2006-11-06 #i71249# - take last added one
            rStyleName =
                m_pImpl->m_pOutlineStylesCandidates[nOutlineLevel].back();
            // <--
        }
        // else: nothing we can do, so we'll leave it empty
    }
    // else: we already had a style name, so we let it pass.
}

void XMLTextImportHelper::AddOutlineStyleCandidate( const sal_Int8 nOutlineLevel,
                                                    const OUString& rStyleName )
{
    if (rStyleName.getLength()
        && m_pImpl->m_xChapterNumbering.is()
        && (nOutlineLevel > 0)
        && (nOutlineLevel <= m_pImpl->m_xChapterNumbering->getCount()))
    {
        m_pImpl->InitOutlineStylesCandidates();
        m_pImpl->m_pOutlineStylesCandidates[nOutlineLevel-1].push_back(
            rStyleName);
    }
}

void XMLTextImportHelper::SetOutlineStyles( sal_Bool bSetEmptyLevels )
{
    static ::rtl::OUString s_NumberingStyleName(
            RTL_CONSTASCII_USTRINGPARAM("NumberingStyleName"));
    static ::rtl::OUString s_HeadingStyleName(
        RTL_CONSTASCII_USTRINGPARAM("HeadingStyleName"));

    if (( bool(m_pImpl->m_pOutlineStylesCandidates) || bSetEmptyLevels) &&
         m_pImpl->m_xChapterNumbering.is() &&
         !IsInsertMode())
    {
        bool bChooseLastOne( false );
        {
            if ( GetXMLImport().IsTextDocInOOoFileFormat() )
            {
                bChooseLastOne = true;
            }
            else
            {
                sal_Int32 nUPD( 0 );
                sal_Int32 nBuild( 0 );
                if ( GetXMLImport().getBuildIds( nUPD, nBuild ) )
                {
                    // check explicitly on certain versions
                    bChooseLastOne = ( nUPD == 641 ) || ( nUPD == 645 ) ||  // prior OOo 2.0
                                     ( nUPD == 680 && nBuild <= 9073 ); // OOo 2.0 - OOo 2.0.4
                }
            }
        }

        OUString sOutlineStyleName;
        {
            Reference<XPropertySet> xChapterNumRule(
                m_pImpl->m_xChapterNumbering, UNO_QUERY);
            const OUString sName(RTL_CONSTASCII_USTRINGPARAM("Name"));
            xChapterNumRule->getPropertyValue(sName) >>= sOutlineStyleName;
        }

        const sal_Int32 nCount = m_pImpl->m_xChapterNumbering->getCount();
        // --> OD 2009-11-13 #i106218#
        // First collect all paragraph styles chosen for assignment to each
        // list level of the outline style, then perform the intrinsic assignment.
        // Reason: The assignment of a certain paragraph style to a list level
        //         of the outline style causes side effects on the children
        //         paragraph styles in Writer.
        ::std::vector<OUString> sChosenStyles(nCount);
        // <--
        for( sal_Int32 i=0; i < nCount; ++i )
		{
            if ( bSetEmptyLevels ||
                 (m_pImpl->m_pOutlineStylesCandidates &&
                  !m_pImpl->m_pOutlineStylesCandidates[i].empty()))
			{
                // determine, which candidate is one to be assigned to the list
                // level of the outline style
                if (m_pImpl->m_pOutlineStylesCandidates &&
                    !m_pImpl->m_pOutlineStylesCandidates[i].empty())
                {
                    if ( bChooseLastOne )
                    {
                        sChosenStyles[i] =
                        m_pImpl->m_pOutlineStylesCandidates[i].back();
                    }
                    else
                    {
                        for (sal_uInt32 j = 0;
                            j < m_pImpl->m_pOutlineStylesCandidates[i].size();
                            ++j)
                        {
                            if (!lcl_HasListStyle(
                                    m_pImpl->m_pOutlineStylesCandidates[i][j],
                                    m_pImpl->m_xParaStyles,
                                    GetXMLImport(),
                                    s_NumberingStyleName,
                                    sOutlineStyleName))
                            {
                                sChosenStyles[i] =
                                    m_pImpl->m_pOutlineStylesCandidates[i][j];
                                break;
                            }
                        }
                    }
                }
            }
		}
        // --> OD 2009-11-13 #i106218#
        Sequence < PropertyValue > aProps( 1 );
        PropertyValue *pProps = aProps.getArray();
        pProps->Name = s_HeadingStyleName;
        for ( sal_Int32 i = 0; i < nCount; ++i )
        {
            // --> OD 2009-12-11 #i107610#
            if ( bSetEmptyLevels ||
                 sChosenStyles[i].getLength() > 0 )
            // <--
            {
                pProps->Value <<= sChosenStyles[i];
                m_pImpl->m_xChapterNumbering->replaceByIndex(i,
                        makeAny( aProps ));
            }
        }
        // <--
    }
}

void XMLTextImportHelper::SetHyperlink(
	SvXMLImport& rImport,
	const Reference < XTextCursor >& rCursor,
	const OUString& rHRef,
	const OUString& rName,
	const OUString& rTargetFrameName,
	const OUString& rStyleName,
	const OUString& rVisitedStyleName,
	XMLEventsImportContext* pEvents)
{
    static ::rtl::OUString s_HyperLinkURL(
        RTL_CONSTASCII_USTRINGPARAM("HyperLinkURL"));
    static ::rtl::OUString s_HyperLinkName(
        RTL_CONSTASCII_USTRINGPARAM("HyperLinkName"));
    static ::rtl::OUString s_HyperLinkTarget(
        RTL_CONSTASCII_USTRINGPARAM("HyperLinkTarget"));
    static ::rtl::OUString s_UnvisitedCharStyleName(
        RTL_CONSTASCII_USTRINGPARAM("UnvisitedCharStyleName"));
    static ::rtl::OUString s_VisitedCharStyleName(
        RTL_CONSTASCII_USTRINGPARAM("VisitedCharStyleName"));
    static ::rtl::OUString s_HyperLinkEvents(
        RTL_CONSTASCII_USTRINGPARAM("HyperLinkEvents"));

	Reference < XPropertySet > xPropSet( rCursor, UNO_QUERY );
	Reference < XPropertySetInfo > xPropSetInfo(
		xPropSet->getPropertySetInfo());
    if (!xPropSetInfo.is() || !xPropSetInfo->hasPropertyByName(s_HyperLinkURL))
		return;

    xPropSet->setPropertyValue(s_HyperLinkURL, makeAny(rHRef));

    if (xPropSetInfo->hasPropertyByName(s_HyperLinkName))
    {
        xPropSet->setPropertyValue(s_HyperLinkName, makeAny(rName));
    }

    if (xPropSetInfo->hasPropertyByName(s_HyperLinkTarget))
    {
        xPropSet->setPropertyValue(s_HyperLinkTarget,
            makeAny(rTargetFrameName));
    }

	if ( (pEvents != NULL) &&
        xPropSetInfo->hasPropertyByName(s_HyperLinkEvents))
	{
		// The API treats events at hyperlinks differently from most
		// other properties: You have to set a name replace with the
		// events in it. The easiest way to to this is to 1) get
		// events, 2) set new ones, and 3) then put events back.
        uno::Reference<XNameReplace> const xReplace(
            xPropSet->getPropertyValue(s_HyperLinkEvents), UNO_QUERY);
		if (xReplace.is())
		{
			// set events
			pEvents->SetEvents(xReplace);

			// put events
            xPropSet->setPropertyValue(s_HyperLinkEvents, makeAny(xReplace));
        }
    }

    if (m_pImpl->m_xTextStyles.is())
    {
		OUString sDisplayName(
			rImport.GetStyleDisplayName(
							XML_STYLE_FAMILY_TEXT_TEXT, rStyleName ) );
		if( sDisplayName.getLength() &&
            xPropSetInfo->hasPropertyByName(s_UnvisitedCharStyleName) &&
            m_pImpl->m_xTextStyles->hasByName(sDisplayName))
        {
            xPropSet->setPropertyValue(s_UnvisitedCharStyleName,
                makeAny(sDisplayName));
        }

		sDisplayName =
			rImport.GetStyleDisplayName(
							XML_STYLE_FAMILY_TEXT_TEXT, rVisitedStyleName );
		if( sDisplayName.getLength() &&
            xPropSetInfo->hasPropertyByName(s_VisitedCharStyleName) &&
            m_pImpl->m_xTextStyles->hasByName(sDisplayName))
        {
            xPropSet->setPropertyValue(s_VisitedCharStyleName,
                makeAny(sDisplayName));
        }
    }
}

void XMLTextImportHelper::SetRuby(
	SvXMLImport& rImport,
	const Reference < XTextCursor >& rCursor,
	const OUString& rStyleName,
	const OUString& rTextStyleName,
	const OUString& rText )
{
	Reference<XPropertySet> xPropSet(rCursor, UNO_QUERY);

	OUString sRubyText(RTL_CONSTASCII_USTRINGPARAM("RubyText"));
	OUString sRubyCharStyleName(RTL_CONSTASCII_USTRINGPARAM("RubyCharStyleName"));

	// if we have one Ruby property, we assume all of them are present
	if (xPropSet.is() &&
		xPropSet->getPropertySetInfo()->hasPropertyByName( sRubyText ))
	{
		// the ruby text
		xPropSet->setPropertyValue(sRubyText, makeAny(rText));

		// the ruby style (ruby-adjust)
		XMLPropStyleContext *pStyle = 0;
        if (rStyleName.getLength() && m_pImpl->m_xAutoStyles.Is())
        {
            const SvXMLStyleContext* pTempStyle =
                ((SvXMLStylesContext *)&m_pImpl->m_xAutoStyles)->
				FindStyleChildContext( XML_STYLE_FAMILY_TEXT_RUBY,
									   rStyleName, sal_True );
			pStyle = PTR_CAST(XMLPropStyleContext,pTempStyle);

			if (NULL != pStyle)
				pStyle->FillPropertySet( xPropSet );
		}

		// the ruby text character style
        if (m_pImpl->m_xTextStyles.is())
        {
			OUString sDisplayName(
				rImport.GetStyleDisplayName(
							XML_STYLE_FAMILY_TEXT_TEXT, rTextStyleName ) );
			if( (sDisplayName.getLength() > 0) &&
//				xPropSetInfo->hasPropertyByName( sRubyCharStyleName ) &&
                m_pImpl->m_xTextStyles->hasByName( sDisplayName ))
            {
				xPropSet->setPropertyValue(sRubyCharStyleName, makeAny(sDisplayName));
			}
		}
	}
}

void XMLTextImportHelper::SetAutoStyles( SvXMLStylesContext *pStyles )
{
    m_pImpl->m_xAutoStyles = pStyles;
}

void XMLTextImportHelper::SetFontDecls( XMLFontStylesContext *pFontDecls )
{
    m_pImpl->m_xFontDecls = pFontDecls;
    ((XMLTextImportPropertyMapper *)m_pImpl->m_xParaImpPrMap.get())
		->SetFontDecls( pFontDecls );
    ((XMLTextImportPropertyMapper *)m_pImpl->m_xTextImpPrMap.get())
		->SetFontDecls( pFontDecls );
}

const XMLFontStylesContext *XMLTextImportHelper::GetFontDecls() const
{
    return (XMLFontStylesContext *)&m_pImpl->m_xFontDecls;
}

sal_Bool XMLTextImportHelper::HasDrawNameAttribute(
		const Reference< XAttributeList > & xAttrList,
		SvXMLNamespaceMap& rNamespaceMap )
{
	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
	for( sal_Int16 i=0; i < nAttrCount; i++ )
	{
		const OUString& rAttrName = xAttrList->getNameByIndex( i );

		OUString aLocalName;
		sal_uInt16 nPrefix =
			rNamespaceMap.GetKeyByAttrName( rAttrName, &aLocalName );
		if( XML_NAMESPACE_DRAW == nPrefix &&
			IsXMLToken( aLocalName, XML_NAME ) )
		{
			return xAttrList->getValueByIndex(i).getLength() != 0;
		}
	}

	return sal_False;
}

SvXMLImportContext *XMLTextImportHelper::CreateTextChildContext(
		SvXMLImport& rImport,
		sal_uInt16 nPrefix, const OUString& rLocalName,
		const Reference< XAttributeList > & xAttrList,
	    XMLTextType eType )
{
	SvXMLImportContext *pContext = 0;

	const SvXMLTokenMap& rTokenMap = GetTextElemTokenMap();
	sal_Bool bHeading = sal_False;
	sal_Bool bContent = sal_True;
	sal_uInt16 nToken = rTokenMap.Get( nPrefix, rLocalName );
	switch( nToken )
	{
	case XML_TOK_TEXT_H:
		bHeading = sal_True;
	case XML_TOK_TEXT_P:
		pContext = new XMLParaContext( rImport,
									   nPrefix, rLocalName,
									   xAttrList, bHeading );
        if (m_pImpl->m_bProgress && XML_TEXT_TYPE_SHAPE != eType)
		{
			rImport.GetProgressBarHelper()->Increment();
		}
		break;
    case XML_TOK_TEXT_NUMBERED_PARAGRAPH:
        pContext = new XMLNumberedParaContext(
                        rImport, nPrefix, rLocalName, xAttrList );
		break;
	case XML_TOK_TEXT_LIST:
		pContext = new XMLTextListBlockContext( rImport, *this,
												nPrefix, rLocalName,
											    xAttrList );
		break;
	case XML_TOK_TABLE_TABLE:
		if( XML_TEXT_TYPE_BODY == eType ||
			XML_TEXT_TYPE_TEXTBOX == eType ||
		 	XML_TEXT_TYPE_SECTION == eType ||
			XML_TEXT_TYPE_HEADER_FOOTER == eType ||
            XML_TEXT_TYPE_CHANGED_REGION == eType ||
            XML_TEXT_TYPE_CELL == eType )
			pContext = CreateTableChildContext( rImport, nPrefix, rLocalName,
												xAttrList );
		break;
	case XML_TOK_TEXT_SEQUENCE_DECLS:
        if ((XML_TEXT_TYPE_BODY == eType && m_pImpl->m_bBodyContentStarted) ||
			XML_TEXT_TYPE_HEADER_FOOTER == eType )
		{
			pContext = new XMLVariableDeclsImportContext(
				rImport, *this,	nPrefix, rLocalName, VarTypeSequence);
			bContent = sal_False;
		}
		break;

	case XML_TOK_TEXT_VARFIELD_DECLS:
        if ((XML_TEXT_TYPE_BODY == eType && m_pImpl->m_bBodyContentStarted) ||
			XML_TEXT_TYPE_HEADER_FOOTER == eType )
		{
			pContext = new XMLVariableDeclsImportContext(
				rImport, *this, nPrefix, rLocalName, VarTypeSimple);
			bContent = sal_False;
		}
		break;

	case XML_TOK_TEXT_USERFIELD_DECLS:
        if ((XML_TEXT_TYPE_BODY == eType && m_pImpl->m_bBodyContentStarted)||
			XML_TEXT_TYPE_HEADER_FOOTER == eType )
		{
			pContext = new XMLVariableDeclsImportContext(
				rImport, *this, nPrefix, rLocalName, VarTypeUserField);
			bContent = sal_False;
		}
		break;

	case XML_TOK_TEXT_DDE_DECLS:
        if ((XML_TEXT_TYPE_BODY == eType && m_pImpl->m_bBodyContentStarted) ||
			XML_TEXT_TYPE_HEADER_FOOTER == eType )
		{
			pContext = new XMLDdeFieldDeclsImportContext(
				rImport, nPrefix, rLocalName);
			bContent = sal_False;
		}
		break;

	case XML_TOK_TEXT_FRAME_PAGE:
        if ((XML_TEXT_TYPE_BODY == eType && m_pImpl->m_bBodyContentStarted) ||
			XML_TEXT_TYPE_TEXTBOX == eType ||
			XML_TEXT_TYPE_CHANGED_REGION == eType )
		{
			TextContentAnchorType eAnchorType =
				XML_TEXT_TYPE_TEXTBOX == eType ? TextContentAnchorType_AT_FRAME
											   : TextContentAnchorType_AT_PAGE;
			pContext = new XMLTextFrameContext( rImport, nPrefix,
												rLocalName, xAttrList,
												eAnchorType );
			bContent = sal_False;
		}
		break;

	case XML_TOK_DRAW_A_PAGE:
        if ((XML_TEXT_TYPE_BODY == eType && m_pImpl->m_bBodyContentStarted) ||
			XML_TEXT_TYPE_TEXTBOX == eType ||
		 	XML_TEXT_TYPE_CHANGED_REGION == eType)
		{
			TextContentAnchorType eAnchorType =
				XML_TEXT_TYPE_TEXTBOX == eType ? TextContentAnchorType_AT_FRAME
											   : TextContentAnchorType_AT_PAGE;
			pContext = new XMLTextFrameHyperlinkContext( rImport, nPrefix,
												rLocalName, xAttrList,
												eAnchorType );
			bContent = sal_False;
		}
		break;

	case XML_TOK_TEXT_INDEX_TITLE:
	case XML_TOK_TEXT_SECTION:
#ifndef SVX_LIGHT
		pContext = new XMLSectionImportContext( rImport, nPrefix, rLocalName );
#else
		// create default context to skip content
		pContext = new SvXMLImportContext( rImport, nPrefix, rLocalName );
#endif // #ifndef SVX_LIGHT
		break;

	case XML_TOK_TEXT_TOC:
	case XML_TOK_TEXT_OBJECT_INDEX:
	case XML_TOK_TEXT_TABLE_INDEX:
	case XML_TOK_TEXT_ILLUSTRATION_INDEX:
	case XML_TOK_TEXT_USER_INDEX:
	case XML_TOK_TEXT_ALPHABETICAL_INDEX:
	case XML_TOK_TEXT_BIBLIOGRAPHY_INDEX:
#ifndef SVX_LIGHT
		if( XML_TEXT_TYPE_SHAPE != eType )
			pContext = new XMLIndexTOCContext( rImport, nPrefix, rLocalName );
#else
		// create default context to skip content
		pContext = new SvXMLImportContext( rImport, nPrefix, rLocalName );
#endif // #ifndef SVX_LIGHT
		break;

	case XML_TOK_TEXT_TRACKED_CHANGES:
#ifndef SVX_LIGHT
		pContext = new XMLTrackedChangesImportContext( rImport, nPrefix,
													   rLocalName);
#else
		// create default context to skip content
		pContext = new SvXMLImportContext( rImport, nPrefix, rLocalName );
#endif // #ifndef SVX_LIGHT
		bContent = sal_False;
		break;

	case XML_TOK_TEXT_CHANGE:
	case XML_TOK_TEXT_CHANGE_START:
	case XML_TOK_TEXT_CHANGE_END:
		pContext = new XMLChangeImportContext(
			rImport, nPrefix, rLocalName,
			(XML_TOK_TEXT_CHANGE_END != nToken),
			(XML_TOK_TEXT_CHANGE_START != nToken),
			sal_True);
		break;

	case XML_TOK_TEXT_FORMS:
#ifndef SVX_LIGHT
		pContext = rImport.GetFormImport()->createOfficeFormsContext(rImport, nPrefix, rLocalName);
#else
		// create default context to skip content
		pContext = new SvXMLImportContext( rImport, nPrefix, rLocalName );
#endif // #ifndef SVX_LIGHT
		bContent = sal_False;
		break;

	case XML_TOK_TEXT_AUTOMARK:
		if( XML_TEXT_TYPE_BODY == eType )
		{
			pContext = new XMLAutoMarkFileContext(rImport, nPrefix,rLocalName);
		}
		bContent = sal_False;
		break;

	case XML_TOK_TEXT_CALCULATION_SETTINGS:
#ifndef SVX_LIGHT
		pContext = new XMLCalculationSettingsContext ( rImport, nPrefix, rLocalName, xAttrList);
#else
		// create default context to skip content
		pContext = new SvXMLImportContext( rImport, nPrefix, rLocalName );
#endif // #ifndef SVX_LIGHT
		bContent = sal_False;
	break;

	default:
        if ((XML_TEXT_TYPE_BODY == eType && m_pImpl->m_bBodyContentStarted) ||
			XML_TEXT_TYPE_TEXTBOX == eType ||
		 	XML_TEXT_TYPE_CHANGED_REGION == eType )
		{
			Reference < XShapes > xShapes;
			pContext = rImport.GetShapeImport()->CreateGroupChildContext(
					rImport, nPrefix, rLocalName, xAttrList, xShapes );
			bContent = sal_False;
		}
	}

//	if( !pContext )
//		pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );

	// handle open redlines
	if ( (XML_TOK_TEXT_CHANGE != nToken) &&
		 (XML_TOK_TEXT_CHANGE_END != nToken) &&
		 (XML_TOK_TEXT_CHANGE_START != nToken) )
	{
//		ResetOpenRedlineId();
	}

	if( XML_TEXT_TYPE_BODY == eType && bContent )
    {
        m_pImpl->m_bBodyContentStarted = sal_False;
    }

	return pContext;
}

SvXMLImportContext *XMLTextImportHelper::CreateTableChildContext(
		SvXMLImport&,
		sal_uInt16 /*nPrefix*/, const OUString& /*rLocalName*/,
		const Reference< XAttributeList > & )
{
	return 0;
}

/// get data style key for use with NumberFormat property
sal_Int32 XMLTextImportHelper::GetDataStyleKey(const OUString& sStyleName,
                                               sal_Bool* pIsSystemLanguage )
{
    const SvXMLStyleContext* pStyle =
        ((SvXMLStylesContext *)&m_pImpl->m_xAutoStyles)->
				  FindStyleChildContext( XML_STYLE_FAMILY_DATA_STYLE,
											  sStyleName, sal_True );

	// get appropriate context


	// first check if its a impress and draw only number format
	// this is needed since its also a SvXMLNumFormatContext,
	// that was needed to support them for controls in impress/draw also
	SdXMLNumberFormatImportContext* pSdNumStyle = PTR_CAST( SdXMLNumberFormatImportContext, pStyle );
	if( pSdNumStyle )
	{
		return pSdNumStyle->GetDrawKey();
	}
	else
	{
		SvXMLNumFormatContext* pNumStyle = PTR_CAST( SvXMLNumFormatContext, pStyle );
		if( pNumStyle )
		{
			if( pIsSystemLanguage != NULL )
	            *pIsSystemLanguage = pNumStyle->IsSystemLanguage();

			// return key
			return pNumStyle->GetKey();
		}
	}
	return -1;
}

const SvxXMLListStyleContext *XMLTextImportHelper::FindAutoListStyle( const OUString& rName ) const
{
	const SvxXMLListStyleContext *pStyle = 0;
    if (m_pImpl->m_xAutoStyles.Is())
    {
        const SvXMLStyleContext* pTempStyle =
            ((SvXMLStylesContext *)&m_pImpl->m_xAutoStyles)->
					FindStyleChildContext( XML_STYLE_FAMILY_TEXT_LIST, rName,
										   sal_True );
		pStyle = PTR_CAST( SvxXMLListStyleContext ,pTempStyle);
	}

	return pStyle;
}

XMLPropStyleContext *XMLTextImportHelper::FindAutoFrameStyle( const OUString& rName ) const
{
	XMLPropStyleContext *pStyle = 0;
    if (m_pImpl->m_xAutoStyles.Is())
    {
        const SvXMLStyleContext* pTempStyle =
            ((SvXMLStylesContext *)&m_pImpl->m_xAutoStyles)->
					FindStyleChildContext( XML_STYLE_FAMILY_SD_GRAPHICS_ID, rName,
										   sal_True );
		pStyle = PTR_CAST( XMLPropStyleContext ,pTempStyle);
	}

	return pStyle;
}

XMLPropStyleContext* XMLTextImportHelper::FindSectionStyle(
	const OUString& rName ) const
{
	XMLPropStyleContext* pStyle = NULL;
    if (m_pImpl->m_xAutoStyles.Is())
    {
        const SvXMLStyleContext* pTempStyle =
            ((SvXMLStylesContext *)&m_pImpl->m_xAutoStyles)->
						   FindStyleChildContext(
							   XML_STYLE_FAMILY_TEXT_SECTION,
							   rName, sal_True );
		pStyle = PTR_CAST( XMLPropStyleContext,pTempStyle);
	}

	return pStyle;
}

XMLPropStyleContext* XMLTextImportHelper::FindPageMaster(
	const OUString& rName ) const
{
	XMLPropStyleContext* pStyle = NULL;
    if (m_pImpl->m_xAutoStyles.Is())
    {
        const SvXMLStyleContext* pTempStyle =
            ((SvXMLStylesContext *)&m_pImpl->m_xAutoStyles)->
						   FindStyleChildContext(
							   XML_STYLE_FAMILY_PAGE_MASTER,
							   rName, sal_True );
		pStyle = PTR_CAST( XMLPropStyleContext,pTempStyle);
	}

	return pStyle;
}


void XMLTextImportHelper::PushListContext(XMLTextListBlockContext *i_pListBlock)
{
    GetTextListHelper().PushListContext(i_pListBlock);
}

void XMLTextImportHelper::PopListContext()
{
    GetTextListHelper().PopListContext();
}


const SvXMLTokenMap& XMLTextImportHelper::GetTextNumberedParagraphAttrTokenMap()
{
    if (!m_pImpl->m_pTextNumberedParagraphAttrTokenMap.get())
    {
        m_pImpl->m_pTextNumberedParagraphAttrTokenMap.reset(
			new SvXMLTokenMap( aTextNumberedParagraphAttrTokenMap ) );
    }
    return *m_pImpl->m_pTextNumberedParagraphAttrTokenMap;
}

const SvXMLTokenMap& XMLTextImportHelper::GetTextListBlockAttrTokenMap()
{
    if (!m_pImpl->m_pTextListBlockAttrTokenMap.get())
    {
        m_pImpl->m_pTextListBlockAttrTokenMap.reset(
			new SvXMLTokenMap( aTextListBlockAttrTokenMap ) );
    }
    return *m_pImpl->m_pTextListBlockAttrTokenMap;
}

const SvXMLTokenMap& XMLTextImportHelper::GetTextListBlockElemTokenMap()
{
    if (!m_pImpl->m_pTextListBlockElemTokenMap.get())
    {
        m_pImpl->m_pTextListBlockElemTokenMap.reset(
			new SvXMLTokenMap( aTextListBlockElemTokenMap ) );
    }
    return *m_pImpl->m_pTextListBlockElemTokenMap;
}

SvI18NMap& XMLTextImportHelper::GetRenameMap()
{
    if (!m_pImpl->m_pRenameMap.get())
    {
        m_pImpl->m_pRenameMap.reset( new SvI18NMap() );
    }
    return *m_pImpl->m_pRenameMap;
}

void XMLTextImportHelper::InsertBookmarkStartRange(
	const OUString sName,
	const Reference<XTextRange> & rRange,
    OUString const& i_rXmlId,
    ::boost::shared_ptr< ::xmloff::ParsedRDFaAttributes > & i_rpRDFaAttributes)
{
    m_pImpl->m_BookmarkStartRanges[sName] =
        ::boost::make_tuple(rRange, i_rXmlId, i_rpRDFaAttributes);
    m_pImpl->m_BookmarkVector.push_back(sName);
}

sal_Bool XMLTextImportHelper::FindAndRemoveBookmarkStartRange(
	const OUString sName,
	Reference<XTextRange> & o_rRange,
    OUString & o_rXmlId,
    ::boost::shared_ptr< ::xmloff::ParsedRDFaAttributes > & o_rpRDFaAttributes)
{
    if (m_pImpl->m_BookmarkStartRanges.count(sName))
    {
        Impl::BookmarkMapEntry_t & rEntry =
            (*m_pImpl->m_BookmarkStartRanges.find(sName)).second;
        o_rRange.set(rEntry.get<0>());
        o_rXmlId = rEntry.get<1>();
        o_rpRDFaAttributes = rEntry.get<2>();
        m_pImpl->m_BookmarkStartRanges.erase(sName);
        Impl::BookmarkVector_t::iterator it(m_pImpl->m_BookmarkVector.begin());
        while (it != m_pImpl->m_BookmarkVector.end() && it->compareTo(sName)!=0)
        {
			it++;
        }
        if (it!=m_pImpl->m_BookmarkVector.end()) {
            m_pImpl->m_BookmarkVector.erase(it);
        }
		return sal_True;
	}
	else
	{
		return sal_False;
	}
}

::rtl::OUString XMLTextImportHelper::FindActiveBookmarkName()
{
    if (!m_pImpl->m_BookmarkVector.empty()) {
        return m_pImpl->m_BookmarkVector.back();
	} else return ::rtl::OUString(); // return the empty string on error...
}

::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > XMLTextImportHelper::GetRangeFor(::rtl::OUString &sName)
{
    return m_pImpl->m_BookmarkStartRanges[sName].get<0>();
}


void XMLTextImportHelper::pushFieldCtx( ::rtl::OUString name, ::rtl::OUString type )
{
    m_pImpl->m_FieldStack.push(Impl::field_stack_item_t(
        Impl::field_name_type_t(name, type), Impl::field_params_t()));
}

void XMLTextImportHelper::popFieldCtx()
{
    m_pImpl->m_FieldStack.pop();
}

void XMLTextImportHelper::addFieldParam( ::rtl::OUString name, ::rtl::OUString value )
{
    DBG_ASSERT(!m_pImpl->m_FieldStack.empty(),
        "stack is empty: not good! Do a pushFieldCtx before...");
    if (!m_pImpl->m_FieldStack.empty()) {
        Impl::field_stack_item_t & FieldStackItem(m_pImpl->m_FieldStack.top());
        FieldStackItem.second.push_back(Impl::field_param_t( name, value ));
    }
}
::rtl::OUString XMLTextImportHelper::getCurrentFieldName()
{
    DBG_ASSERT(!m_pImpl->m_FieldStack.empty(),
        "stack is empty: not good! Do a pushFieldCtx before...");
    if (!m_pImpl->m_FieldStack.empty()) {
        return m_pImpl->m_FieldStack.top().first.first;
	} else  return ::rtl::OUString();
}

::rtl::OUString XMLTextImportHelper::getCurrentFieldType()
{
    DBG_ASSERT(!m_pImpl->m_FieldStack.empty(),
        "stack is empty: not good! Do a pushFieldCtx before...");
    if (!m_pImpl->m_FieldStack.empty()) {
        return m_pImpl->m_FieldStack.top().first.second;
	} else  return ::rtl::OUString();
}

bool XMLTextImportHelper::hasCurrentFieldCtx()
{
	return !m_pImpl->m_FieldStack.empty();
}

void XMLTextImportHelper::setCurrentFieldParamsTo(::com::sun::star::uno::Reference< ::com::sun::star::text::XFormField> &xFormField)
{
    DBG_ASSERT(!m_pImpl->m_FieldStack.empty(),
        "stack is empty: not good! Do a pushFieldCtx before...");
    if (!m_pImpl->m_FieldStack.empty() && xFormField.is())
    {
        FieldParamImporter(&m_pImpl->m_FieldStack.top().second,
            xFormField->getParameters()).Import();
	}
}


void XMLTextImportHelper::ConnectFrameChains(
		const OUString& rFrmName,
		const OUString& rNextFrmName,
		const Reference < XPropertySet >& rFrmPropSet )
{
    static ::rtl::OUString s_ChainNextName(
        RTL_CONSTASCII_USTRINGPARAM("ChainNextName"));
    static ::rtl::OUString s_ChainPrevName(
        RTL_CONSTASCII_USTRINGPARAM("ChainPrevName"));

	if( !rFrmName.getLength() )
		return;

	if( rNextFrmName.getLength() )
	{
		OUString sNextFrmName(GetRenameMap().Get( XML_TEXT_RENAME_TYPE_FRAME,
													rNextFrmName ));
        if (m_pImpl->m_xTextFrames.is()
            && m_pImpl->m_xTextFrames->hasByName(sNextFrmName))
        {
            rFrmPropSet->setPropertyValue(s_ChainNextName,
                makeAny(sNextFrmName));
        }
		else
        {
            if (!m_pImpl->m_pPrevFrmNames.get())
            {
                m_pImpl->m_pPrevFrmNames.reset( new SvStringsDtor );
                m_pImpl->m_pNextFrmNames.reset( new SvStringsDtor );
            }
            m_pImpl->m_pPrevFrmNames->Insert( new String( rFrmName ),
                   m_pImpl->m_pPrevFrmNames->Count() );
            m_pImpl->m_pNextFrmNames->Insert( new String( sNextFrmName ),
                   m_pImpl->m_pNextFrmNames->Count() );
        }
    }
    if (m_pImpl->m_pPrevFrmNames.get() && m_pImpl->m_pPrevFrmNames->Count())
    {
        sal_uInt16 nCount = m_pImpl->m_pPrevFrmNames->Count();
		for( sal_uInt16 i=0; i<nCount; i++ )
		{
            String *pNext = (*m_pImpl->m_pNextFrmNames)[i];
			if( OUString(*pNext) == rFrmName )
			{
				// The previuous frame must exist, because it existing than
				// inserting the entry
                String *pPrev = (*m_pImpl->m_pPrevFrmNames)[i];

                rFrmPropSet->setPropertyValue(s_ChainPrevName,
                    makeAny(OUString( *pPrev )));

                m_pImpl->m_pPrevFrmNames->Remove( i, 1 );
                m_pImpl->m_pNextFrmNames->Remove( i, 1 );
				delete pPrev;
				delete pNext;

				// There cannot be more than one previous frames
				break;
			}
		}
	}
}

sal_Bool XMLTextImportHelper::IsInFrame() const
{
    static ::rtl::OUString s_TextFrame(
        RTL_CONSTASCII_USTRINGPARAM("TextFrame"));

	sal_Bool bIsInFrame = sal_False;

	// are we currently in a text frame? yes, if the cursor has a
	// TextFrame property and it's non-NULL
	Reference<XPropertySet> xPropSet(((XMLTextImportHelper *)this)->GetCursor(), UNO_QUERY);
	if (xPropSet.is())
	{
        if (xPropSet->getPropertySetInfo()->hasPropertyByName(s_TextFrame))
        {
            uno::Reference<XTextFrame> const xFrame(
                xPropSet->getPropertyValue(s_TextFrame), UNO_QUERY);

			if (xFrame.is())
			{
				bIsInFrame = sal_True;
			}
		}
	}

	return bIsInFrame;
}

sal_Bool XMLTextImportHelper::IsInHeaderFooter() const
{
	return sal_False;
}

Reference< XPropertySet> XMLTextImportHelper::createAndInsertOLEObject(
										SvXMLImport&,
										const OUString& /*rHRef*/,
										const OUString& /*rStyleName*/,
										const OUString& /*rTblName*/,
										sal_Int32 /*nWidth*/, sal_Int32 /*nHeight*/ )
{
	Reference< XPropertySet> xPropSet;
	return xPropSet;
}

Reference< XPropertySet> XMLTextImportHelper::createAndInsertOOoLink(
										SvXMLImport&,
										const OUString& /*rHRef*/,
										const OUString& /*rStyleName*/,
										const OUString& /*rTblName*/,
										sal_Int32 /*nWidth*/, sal_Int32 /*nHeight*/ )
{
	Reference< XPropertySet> xPropSet;
	return xPropSet;
}

Reference< XPropertySet> XMLTextImportHelper::createAndInsertApplet(
										const OUString& /*rCode*/,
									  	const OUString& /*rName*/,
									  	sal_Bool /*bMayScript*/,
									  	const OUString& /*rHRef*/,
										sal_Int32 /*nWidth*/, sal_Int32 /*nHeight*/ )
{
	Reference< XPropertySet> xPropSet;
	return xPropSet;
}
Reference< XPropertySet> XMLTextImportHelper::createAndInsertPlugin(
									  	const OUString& /*rMimeType*/,
									  	const OUString& /*rHRef*/,
										sal_Int32 /*nWidth*/, sal_Int32 /*nHeight*/ )
{
	Reference< XPropertySet> xPropSet;
	return xPropSet;
}
Reference< XPropertySet> XMLTextImportHelper::createAndInsertFloatingFrame(
									  	const OUString& /*rName*/,
									  	const OUString& /*rHRef*/,
									  	const OUString& /*rStyleName*/,
										sal_Int32 /*nWidth*/, sal_Int32 /*nHeight*/ )
{
	Reference< XPropertySet> xPropSet;
	return xPropSet;
}

void XMLTextImportHelper::endAppletOrPlugin(
        const Reference < XPropertySet> &,
        std::map < const rtl::OUString, rtl::OUString, UStringLess > &)
{
}
// redline helper: dummy implementation to be overridden in sw/filter/xml
void XMLTextImportHelper::RedlineAdd(
	const OUString& /*rType*/,
	const OUString& /*rId*/,
	const OUString& /*rAuthor*/,
	const OUString& /*rComment*/,
	const DateTime& /*rDateTime*/,
    sal_Bool /*bMergeLastPara*/)
{
	// dummy implementation: do nothing
}

Reference<XTextCursor> XMLTextImportHelper::RedlineCreateText(
	Reference<XTextCursor> & /*rOldCursor*/,
	const OUString& /*rId*/)
{
	// dummy implementation: do nothing
	Reference<XTextCursor> xRet;
	return xRet;
}

void XMLTextImportHelper::RedlineSetCursor(
	const OUString& /*rId*/,
	sal_Bool /*bStart*/,
	sal_Bool /*bIsOutsideOfParagraph*/)
{
	// dummy implementation: do nothing
}

void XMLTextImportHelper::RedlineAdjustStartNodeCursor(sal_Bool)
{
	// dummy implementation: do nothing
}

void XMLTextImportHelper::SetShowChanges( sal_Bool )
{
	// dummy implementation: do nothing
}

void XMLTextImportHelper::SetRecordChanges( sal_Bool )
{
	// dummy implementation: do nothing
}
void XMLTextImportHelper::SetChangesProtectionKey(const Sequence<sal_Int8> &)
{
	// dummy implementation: do nothing
}


OUString XMLTextImportHelper::GetOpenRedlineId()
{
    return m_pImpl->m_sOpenRedlineIdentifier;
}

void XMLTextImportHelper::SetOpenRedlineId( ::rtl::OUString& rId)
{
    m_pImpl->m_sOpenRedlineIdentifier = rId;
}

void XMLTextImportHelper::ResetOpenRedlineId()
{
	OUString sEmpty;
	SetOpenRedlineId(sEmpty);
}

void
XMLTextImportHelper::SetCellParaStyleDefault(::rtl::OUString const& rNewValue)
{
    m_pImpl->m_sCellParaStyleDefault = rNewValue;
}

::rtl::OUString const& XMLTextImportHelper::GetCellParaStyleDefault()
{
    return m_pImpl->m_sCellParaStyleDefault;
}
