/**************************************************************
 * 
 * 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 <com/sun/star/animations/TransitionType.hpp>
#include <com/sun/star/ucb/XAnyCompareFactory.hpp>
#include <com/sun/star/container/XIndexReplace.hpp>
#include <com/sun/star/drawing/LineStyle.hpp>
#include <com/sun/star/drawing/LineJoint.hpp>
#include <com/sun/star/drawing/LineCap.hpp>
#include <com/sun/star/drawing/FillStyle.hpp>
#include <com/sun/star/presentation/AnimationSpeed.hpp>
#include <com/sun/star/presentation/FadeEffect.hpp>
#include <com/sun/star/drawing/ConnectorType.hpp>
#include <com/sun/star/drawing/RectanglePoint.hpp>
#include <com/sun/star/drawing/CircleKind.hpp>

#ifndef _COM_SUN_STAR_DRAWING_BitmapMode_HPP_
#include <com/sun/star/drawing/BitmapMode.hpp>
#endif
#include <com/sun/star/text/WritingMode.hpp>
#include <xmloff/EnumPropertyHdl.hxx>
#include <xmloff/NamedBoolPropertyHdl.hxx>
#include <xmloff/WordWrapPropertyHdl.hxx>
#include "numithdl.hxx"
#include "XMLBitmapRepeatOffsetPropertyHandler.hxx"
#include "XMLFillBitmapSizePropertyHandler.hxx"
#include "XMLBitmapLogicalSizePropertyHandler.hxx"
#include <com/sun/star/drawing/TextAnimationKind.hpp>
#include <com/sun/star/drawing/TextAnimationDirection.hpp>
#include <com/sun/star/drawing/TextHorizontalAdjust.hpp>
#include <com/sun/star/drawing/TextVerticalAdjust.hpp>
#include <com/sun/star/drawing/TextFitToSizeType.hpp>
#include <com/sun/star/drawing/MeasureTextHorzPos.hpp>
#include <com/sun/star/drawing/MeasureTextVertPos.hpp>
#include <xmloff/controlpropertyhdl.hxx>
#include <xmloff/xmltoken.hxx>
#include "sdpropls.hxx"
#include "propimp0.hxx"
#include <xmloff/xmlexp.hxx>
#include <xmloff/xmlnmspe.hxx>
#include <com/sun/star/drawing/NormalsKind.hpp>
#include <com/sun/star/drawing/TextureProjectionMode.hpp>
#include <com/sun/star/drawing/TextureKind.hpp>
#include <com/sun/star/drawing/TextureMode.hpp>
#include <xmloff/txtprmap.hxx>
#include "XMLClipPropertyHandler.hxx"
#include "XMLIsPercentagePropertyHandler.hxx"
#include "XMLPercentOrMeasurePropertyHandler.hxx"
#include "animations.hxx"
#include <xmloff/xmluconv.hxx>

#include "sdxmlexp_impl.hxx"

using ::com::sun::star::uno::Any;
using ::com::sun::star::uno::Reference;

using ::rtl::OUString;
using ::rtl::OUStringBuffer;

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

#define _MAP(name,prefix,token,type,context)  { name, sizeof(name)-1, prefix, token, type, context, SvtSaveOptions::ODFVER_010 }
#define _MAPV(name,prefix,token,type,context,version)  { name, sizeof(name)-1, prefix, token, type, context, version }
#define GMAP(name,prefix,token,type,context) _MAP(name,prefix,token,static_cast<sal_Int32>(type|XML_TYPE_PROP_GRAPHIC),context)
#define GMAPV(name,prefix,token,type,context,version) _MAPV(name,prefix,token,static_cast<sal_Int32>(type|XML_TYPE_PROP_GRAPHIC),context,version)
#define DPMAP(name,prefix,token,type,context) _MAP(name,prefix,token,static_cast<sal_Int32>(type|XML_TYPE_PROP_DRAWING_PAGE),context)
#define TMAP(name,prefix,token,type,context) _MAP(name,prefix,token,static_cast<sal_Int32>(type|XML_TYPE_PROP_TEXT),context)
#define PMAP(name,prefix,token,type,context) _MAP(name,prefix,token,type|XML_TYPE_PROP_PARAGRAPH,context)
#define MAP_END() { 0L, 0, 0, XML_EMPTY, 0 ,0, SvtSaveOptions::ODFVER_010}

//////////////////////////////////////////////////////////////////////////////
// entry list for graphic properties

const XMLPropertyMapEntry aXMLSDProperties[] =
{
	// this entry must be first! this is needed for XMLShapeImportHelper::CreateExternalShapePropMapper
	GMAP( "UserDefinedAttributes",			XML_NAMESPACE_TEXT, XML_XMLNS,					XML_TYPE_ATTRIBUTE_CONTAINER | MID_FLAG_SPECIAL_ITEM, 0 ),

	// stroke attributes
	GMAP( "LineStyle",						XML_NAMESPACE_DRAW, XML_STROKE, 				XML_SD_TYPE_STROKE, 0 ),
	GMAP( "LineDashName",					XML_NAMESPACE_DRAW,	XML_STROKE_DASH,			XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT , CTF_DASHNAME ),
	GMAP( "LineWidth",						XML_NAMESPACE_SVG,	XML_STROKE_WIDTH,			XML_TYPE_MEASURE, 0 ),
	GMAP( "LineColor",						XML_NAMESPACE_SVG,	XML_STROKE_COLOR,			XML_TYPE_COLOR, 0 ),
	GMAP( "LineStartName",					XML_NAMESPACE_DRAW,	XML_MARKER_START,			XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_LINESTARTNAME ),
	GMAP( "LineStartWidth",					XML_NAMESPACE_DRAW,	XML_MARKER_START_WIDTH, 	XML_TYPE_MEASURE, 0 ),
	GMAP( "LineStartCenter",			    XML_NAMESPACE_DRAW, XML_MARKER_START_CENTER,	XML_TYPE_BOOL, 0 ),
	GMAP( "LineEndName",				    XML_NAMESPACE_DRAW,	XML_MARKER_END, 			XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_LINEENDNAME ),
	GMAP( "LineEndWidth",					XML_NAMESPACE_DRAW,	XML_MARKER_END_WIDTH,		XML_TYPE_MEASURE, 0 ),
	GMAP( "LineEndCenter",					XML_NAMESPACE_DRAW, XML_MARKER_END_CENTER,		XML_TYPE_BOOL, 0 ),
	GMAP( "LineTransparence",				XML_NAMESPACE_SVG,	XML_STROKE_OPACITY, 		XML_SD_TYPE_OPACITY, 0 ),
	GMAP( "LineJoint",						XML_NAMESPACE_DRAW,	XML_STROKE_LINEJOIN,		XML_SD_TYPE_LINEJOIN, 0 ),
    GMAP( "LineCap",                        XML_NAMESPACE_SVG , XML_STROKE_LINECAP,         XML_SD_TYPE_LINECAP, 0 ),

	// fill attributes
	GMAP( "FillStyle",						XML_NAMESPACE_DRAW,	XML_FILL,					XML_SD_TYPE_FILLSTYLE, 0 ),
	GMAP( "FillColor",						XML_NAMESPACE_DRAW, XML_FILL_COLOR, 			XML_TYPE_COLOR, 0 ),
	GMAP( "FillColor2",						XML_NAMESPACE_DRAW, XML_SECONDARY_FILL_COLOR,	XML_TYPE_COLOR, 0 ),
	GMAP( "FillGradientName",				XML_NAMESPACE_DRAW, XML_FILL_GRADIENT_NAME, 	XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_FILLGRADIENTNAME ),
	GMAP( "FillGradientStepCount",			XML_NAMESPACE_DRAW, XML_GRADIENT_STEP_COUNT,	XML_TYPE_NUMBER16, 0 ),
	GMAP( "FillHatchName",					XML_NAMESPACE_DRAW, XML_FILL_HATCH_NAME,		XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_FILLHATCHNAME ),
	GMAP( "FillBackground",					XML_NAMESPACE_DRAW, XML_FILL_HATCH_SOLID,		XML_TYPE_BOOL, 0 ),
	GMAP( "FillBitmapName",					XML_NAMESPACE_DRAW, XML_FILL_IMAGE_NAME,		XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_FILLBITMAPNAME ),
	GMAP( "FillTransparence",				XML_NAMESPACE_DRAW, XML_OPACITY,			    XML_TYPE_NEG_PERCENT16|MID_FLAG_MULTI_PROPERTY, 0 ),	// exists in SW, too
	GMAP( "FillTransparenceGradientName",	XML_NAMESPACE_DRAW, XML_OPACITY_NAME,		    XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_FILLTRANSNAME ),
	GMAP( "FillBitmapSizeX",			    XML_NAMESPACE_DRAW,	XML_FILL_IMAGE_WIDTH,		XML_SD_TYPE_FILLBITMAPSIZE|MID_FLAG_MULTI_PROPERTY, 0 ),
	GMAP( "FillBitmapLogicalSize",			XML_NAMESPACE_DRAW, XML_FILL_IMAGE_WIDTH,		XML_SD_TYPE_LOGICAL_SIZE|MID_FLAG_MULTI_PROPERTY, 0 ),
	GMAP( "FillBitmapSizeY",			    XML_NAMESPACE_DRAW,	XML_FILL_IMAGE_HEIGHT,		XML_SD_TYPE_FILLBITMAPSIZE|MID_FLAG_MULTI_PROPERTY, 0 ),
	GMAP( "FillBitmapLogicalSize",			XML_NAMESPACE_DRAW, XML_FILL_IMAGE_HEIGHT,		XML_SD_TYPE_LOGICAL_SIZE|MID_FLAG_MULTI_PROPERTY, 0 ),
	GMAP( "FillBitmapMode",					XML_NAMESPACE_STYLE,XML_REPEAT, 				XML_SD_TYPE_BITMAP_MODE|MID_FLAG_MULTI_PROPERTY, 0 ),
	GMAP( "FillBitmapPositionOffsetX",		XML_NAMESPACE_DRAW,	XML_FILL_IMAGE_REF_POINT_X, XML_TYPE_PERCENT, 0 ),
	GMAP( "FillBitmapPositionOffsetY",		XML_NAMESPACE_DRAW,	XML_FILL_IMAGE_REF_POINT_Y, XML_TYPE_PERCENT, 0 ),
	GMAP( "FillBitmapRectanglePoint",		XML_NAMESPACE_DRAW,	XML_FILL_IMAGE_REF_POINT,	XML_SD_TYPE_BITMAP_REFPOINT, 0 ),
	GMAP( "FillBitmapOffsetX",				XML_NAMESPACE_DRAW,	XML_TILE_REPEAT_OFFSET, 	XML_SD_TYPE_BITMAPREPOFFSETX|MID_FLAG_MULTI_PROPERTY, CTF_REPEAT_OFFSET_X ),
	GMAP( "FillBitmapOffsetY",				XML_NAMESPACE_DRAW,	XML_TILE_REPEAT_OFFSET, 	XML_SD_TYPE_BITMAPREPOFFSETY|MID_FLAG_MULTI_PROPERTY, CTF_REPEAT_OFFSET_Y ),

	// text frame attributes
	GMAP( "TextHorizontalAdjust",			XML_NAMESPACE_DRAW,	XML_TEXTAREA_HORIZONTAL_ALIGN,	XML_SD_TYPE_TEXT_ALIGN, 0 ),
	GMAP( "TextVerticalAdjust",				XML_NAMESPACE_DRAW,	XML_TEXTAREA_VERTICAL_ALIGN,	XML_SD_TYPE_VERTICAL_ALIGN, 0 ),
	GMAP( "TextAutoGrowHeight",				XML_NAMESPACE_DRAW,	XML_AUTO_GROW_HEIGHT,		XML_TYPE_BOOL, 0 ),
	GMAP( "TextAutoGrowWidth",				XML_NAMESPACE_DRAW,	XML_AUTO_GROW_WIDTH,		XML_TYPE_BOOL, 0 ),
	GMAP( "TextFitToSize",					XML_NAMESPACE_DRAW,	XML_FIT_TO_SIZE,			XML_SD_TYPE_FITTOSIZE, 0 ),
	GMAP( "TextContourFrame",				XML_NAMESPACE_DRAW,	XML_FIT_TO_CONTOUR, 		XML_TYPE_BOOL, 0 ),
	GMAP( "TextMaximumFrameHeight",			XML_NAMESPACE_FO,	XML_MAX_HEIGHT, 			XML_TYPE_MEASURE, 0 ),
	GMAP( "TextMaximumFrameWidth",			XML_NAMESPACE_FO,	XML_MAX_WIDTH,				XML_TYPE_MEASURE, 0 ),
	GMAP( "TextMinimumFrameHeight",			XML_NAMESPACE_FO,	XML_MIN_HEIGHT, 			XML_TYPE_MEASURE|MID_FLAG_MULTI_PROPERTY, 0 ),	// exists in SW, too
	GMAP( "TextMinimumFrameWidth",			XML_NAMESPACE_FO,	XML_MIN_WIDTH,				XML_TYPE_MEASURE|MID_FLAG_MULTI_PROPERTY, 0 ),
	GMAP( "TextUpperDistance",				XML_NAMESPACE_FO,	XML_PADDING_TOP,			XML_TYPE_MEASURE|MID_FLAG_MULTI_PROPERTY, 0 ),	// exists in SW, too
	GMAP( "TextLowerDistance",				XML_NAMESPACE_FO,	XML_PADDING_BOTTOM, 		XML_TYPE_MEASURE|MID_FLAG_MULTI_PROPERTY, 0 ),	// exists in SW, too
	GMAP( "TextLeftDistance",				XML_NAMESPACE_FO,	XML_PADDING_LEFT,			XML_TYPE_MEASURE|MID_FLAG_MULTI_PROPERTY, 0 ),	// exists in SW, too
	GMAP( "TextRightDistance",				XML_NAMESPACE_FO,	XML_PADDING_RIGHT,			XML_TYPE_MEASURE|MID_FLAG_MULTI_PROPERTY, 0 ),	// exists in SW, too
	PMAP( "TextWritingMode",			    XML_NAMESPACE_STYLE,XML_WRITING_MODE,			XML_SD_TYPE_WRITINGMODE|MID_FLAG_MULTI_PROPERTY, CTF_WRITINGMODE ),
	GMAP( "NumberingRules",					XML_NAMESPACE_TEXT,	XML_LIST_STYLE, 			XML_SD_TYPE_NUMBULLET|MID_FLAG_ELEMENT_ITEM, CTF_NUMBERINGRULES ),
	GMAP( "NumberingRules",					XML_NAMESPACE_TEXT,	XML_LIST_STYLE_NAME,		XML_TYPE_STRING, CTF_SD_NUMBERINGRULES_NAME ),
	GMAP( "TextWordWrap",					XML_NAMESPACE_FO,	XML_WRAP_OPTION,			XML_TYPE_WRAP_OPTION, 0 ),

	// shadow attributes
	GMAP( "Shadow",							XML_NAMESPACE_DRAW,	XML_SHADOW, 				XML_SD_TYPE_SHADOW, 0 ),
	GMAP( "ShadowXDistance",			    	XML_NAMESPACE_DRAW, XML_SHADOW_OFFSET_X,		XML_TYPE_MEASURE, 0 ),
	GMAP( "ShadowYDistance",			    	XML_NAMESPACE_DRAW, XML_SHADOW_OFFSET_Y,		XML_TYPE_MEASURE, 0 ),
	GMAP( "ShadowColor",				    	XML_NAMESPACE_DRAW, XML_SHADOW_COLOR,			XML_TYPE_COLOR, 0 ),
	GMAP( "ShadowTransparence",				XML_NAMESPACE_DRAW, XML_SHADOW_OPACITY,	XML_TYPE_NEG_PERCENT, 0 ),

	// graphic attributes
	GMAP( "GraphicColorMode",				XML_NAMESPACE_DRAW, XML_COLOR_MODE, 			XML_TYPE_COLOR_MODE, 0 ), // exists in SW, too, with same property name
	GMAP( "AdjustLuminance",			    XML_NAMESPACE_DRAW, XML_LUMINANCE,				XML_TYPE_PERCENT16, 0 ), // signed? exists in SW, too, with same property name
	GMAP( "AdjustContrast",					XML_NAMESPACE_DRAW,	XML_CONTRAST,				XML_TYPE_PERCENT16, 0 ), // signed? exists in SW, too, with same property name
	GMAP( "Gamma",							XML_NAMESPACE_DRAW, XML_GAMMA,					XML_TYPE_DOUBLE_PERCENT, 0 ), // signed? exists in SW, too, with same property name
	GMAP( "AdjustRed",						XML_NAMESPACE_DRAW, XML_RED,					XML_TYPE_PERCENT16, 0 ), // signed? exists in SW, too, with same property name
	GMAP( "AdjustGreen",				    XML_NAMESPACE_DRAW, XML_GREEN,					XML_TYPE_PERCENT16, 0 ), // signed? exists in SW, too, with same property name
	GMAP( "AdjustBlue",						XML_NAMESPACE_DRAW, XML_BLUE,					XML_TYPE_PERCENT16, 0 ), // signed? exists in SW, too, with same property name
	GMAPV( "GraphicCrop",				    XML_NAMESPACE_FO,	XML_CLIP,					XML_TYPE_TEXT_CLIP, CTF_TEXT_CLIP, SvtSaveOptions::ODFVER_012 ), // exists in SW, too, with same property name
	GMAP( "GraphicCrop",				    XML_NAMESPACE_FO,	XML_CLIP,					XML_TYPE_TEXT_CLIP11, CTF_TEXT_CLIP11 ), // exists in SW, too, with same property name
	GMAP( "Transparency",					XML_NAMESPACE_DRAW, XML_IMAGE_OPACITY,			XML_TYPE_NEG_PERCENT16|MID_FLAG_MULTI_PROPERTY, 0 ), // exists in SW, too, with same property name // #i25616#
	GMAP( "IsMirrored",						XML_NAMESPACE_STYLE,	XML_MIRROR,				XML_TYPE_SD_MIRROR|MID_FLAG_MULTI_PROPERTY, 0 ),  // exists in SW, too // #i40214#

	// animation text attributes
	TMAP( "TextAnimationKind",				XML_NAMESPACE_STYLE,XML_TEXT_BLINKING,			XML_TYPE_TEXT_ANIMATION_BLINKING, CTF_TEXTANIMATION_BLINKING ),
	GMAP( "TextAnimationKind",				XML_NAMESPACE_TEXT, XML_ANIMATION,				XML_TYPE_TEXT_ANIMATION, CTF_TEXTANIMATION_KIND ),
	GMAP( "TextAnimationDirection",			XML_NAMESPACE_TEXT, XML_ANIMATION_DIRECTION,	XML_TYPE_TEXT_ANIMATION_DIRECTION, 0 ),
	GMAP( "TextAnimationStartInside",		XML_NAMESPACE_TEXT, XML_ANIMATION_START_INSIDE, XML_TYPE_BOOL, 0 ),
	GMAP( "TextAnimationStopInside",	    	XML_NAMESPACE_TEXT, XML_ANIMATION_STOP_INSIDE,	XML_TYPE_BOOL, 0 ),
	GMAP( "TextAnimationCount",				XML_NAMESPACE_TEXT, XML_ANIMATION_REPEAT,		XML_TYPE_NUMBER16, 0 ),
	GMAP( "TextAnimationDelay",				XML_NAMESPACE_TEXT, XML_ANIMATION_DELAY,		XML_TYPE_DURATION16_MS, 0 ),
	GMAP( "TextAnimationAmount",		    	XML_NAMESPACE_TEXT, XML_ANIMATION_STEPS,		XML_TYPE_TEXT_ANIMATION_STEPS, 0 ),

	// connector attributes
	GMAP( "EdgeNode1HorzDist",				XML_NAMESPACE_DRAW, XML_START_LINE_SPACING_HORIZONTAL,	XML_TYPE_MEASURE, 0 ),
	GMAP( "EdgeNode1VertDist",				XML_NAMESPACE_DRAW, XML_START_LINE_SPACING_VERTICAL,	XML_TYPE_MEASURE, 0 ),
	GMAP( "EdgeNode2HorzDist",				XML_NAMESPACE_DRAW, XML_END_LINE_SPACING_HORIZONTAL,	XML_TYPE_MEASURE, 0 ),
	GMAP( "EdgeNode2VertDist",				XML_NAMESPACE_DRAW, XML_END_LINE_SPACING_VERTICAL,		XML_TYPE_MEASURE, 0 ),

	// measure attributes
	GMAP( "MeasureLineDistance",		    	XML_NAMESPACE_DRAW, XML_LINE_DISTANCE,			XML_TYPE_MEASURE, 0 ),
	GMAP( "MeasureHelpLineOverhang",	    	XML_NAMESPACE_DRAW, XML_GUIDE_OVERHANG, 		XML_TYPE_MEASURE, 0 ),
	GMAP( "MeasureHelpLineDistance",	    	XML_NAMESPACE_DRAW, XML_GUIDE_DISTANCE, 		XML_TYPE_MEASURE, 0 ),
	GMAP( "MeasureHelpLine1Length",			XML_NAMESPACE_DRAW, XML_START_GUIDE,			XML_TYPE_MEASURE, 0 ),
	GMAP( "MeasureHelpLine2Length",			XML_NAMESPACE_DRAW, XML_END_GUIDE,				XML_TYPE_MEASURE, 0 ),
	GMAP( "MeasureTextHorizontalPosition",	XML_NAMESPACE_DRAW, XML_MEASURE_ALIGN,			XML_SD_TYPE_MEASURE_HALIGN, 0 ),
	GMAP( "MeasureTextVerticalPosition", 	XML_NAMESPACE_DRAW, XML_MEASURE_VERTICAL_ALIGN, XML_SD_TYPE_MEASURE_VALIGN, 0 ),
	GMAP( "MeasureUnit",				    	XML_NAMESPACE_DRAW, XML_UNIT,					XML_SD_TYPE_MEASURE_UNIT, 0 ),
	GMAP( "MeasureShowUnit",			    	XML_NAMESPACE_DRAW, XML_SHOW_UNIT,				XML_TYPE_BOOL, 0 ),
	GMAP( "MeasureBelowReferenceEdge",		XML_NAMESPACE_DRAW, XML_PLACING,				XML_SD_TYPE_MEASURE_PLACING, 0 ),
	GMAP( "MeasureTextRotate90",		    	XML_NAMESPACE_DRAW, XML_PARALLEL,				XML_TYPE_BOOL, 0 ),
	GMAP( "MeasureDecimalPlaces",			XML_NAMESPACE_DRAW, XML_DECIMAL_PLACES,			XML_TYPE_NUMBER16, 0 ),

	// 3D geometry attributes
	GMAP( "D3DHorizontalSegments",			XML_NAMESPACE_DR3D, XML_HORIZONTAL_SEGMENTS,	XML_TYPE_NUMBER, 0 ),
	GMAP( "D3DVerticalSegments",		    	XML_NAMESPACE_DR3D, XML_VERTICAL_SEGMENTS,		XML_TYPE_NUMBER, 0 ),
	GMAP( "D3DPercentDiagonal",				XML_NAMESPACE_DR3D, XML_EDGE_ROUNDING,			XML_TYPE_PERCENT, 0 ),
	GMAP( "D3DBackscale",					XML_NAMESPACE_DR3D, XML_BACK_SCALE, 			XML_TYPE_PERCENT, 0 ),
	GMAP( "D3DEndAngle",				    	XML_NAMESPACE_DR3D, XML_END_ANGLE,				XML_TYPE_NUMBER, 0 ),
	GMAP( "D3DDepth",						XML_NAMESPACE_DR3D, XML_DEPTH,					XML_TYPE_MEASURE, 0 ),
	GMAP( "D3DDoubleSided",					XML_NAMESPACE_DR3D, XML_BACKFACE_CULLING,		XML_SD_TYPE_BACKFACE_CULLING, 0 ),

	// #107245# New 3D properties which are possible for lathe and extrude 3d objects
	GMAP( "D3DCloseFront",		    		XML_NAMESPACE_DR3D, XML_CLOSE_FRONT,			XML_TYPE_BOOL, 0 ),
	GMAP( "D3DCloseBack",		    		XML_NAMESPACE_DR3D, XML_CLOSE_BACK,				XML_TYPE_BOOL, 0 ),

	// 3D lighting attributes
	GMAP( "D3DNormalsKind",					XML_NAMESPACE_DR3D, XML_NORMALS_KIND,			XML_SD_TYPE_NORMALS_KIND, 0 ),
	GMAP( "D3DNormalsInvert",				XML_NAMESPACE_DR3D, XML_NORMALS_DIRECTION,		XML_SD_TYPE_NORMALS_DIRECTION, 0 ),

	// 3D texture attributes
	GMAP( "D3DTextureProjectionX",			XML_NAMESPACE_DR3D, XML_TEX_GENERATION_MODE_X,	XML_SD_TYPE_TEX_GENERATION_MODE_X, 0 ),
	GMAP( "D3DTextureProjectionY",			XML_NAMESPACE_DR3D, XML_TEX_GENERATION_MODE_Y,	XML_SD_TYPE_TEX_GENERATION_MODE_Y, 0 ),
	GMAP( "D3DTextureKind",					XML_NAMESPACE_DR3D, XML_TEX_KIND,				XML_SD_TYPE_TEX_KIND, 0 ),
	GMAP( "D3DTextureMode",					XML_NAMESPACE_DR3D, XML_TEX_MODE,				XML_SD_TYPE_TEX_MODE, 0 ),
	GMAP( "D3DTextureFilter",				XML_NAMESPACE_DR3D, XML_TEX_FILTER, 			XML_SD_TYPE_BACKFACE_CULLING, 0 ),

	// 3D material attributes
	GMAP( "D3DMaterialColor",				XML_NAMESPACE_DR3D, XML_DIFFUSE_COLOR,			XML_TYPE_COLOR, 0 ),
	GMAP( "D3DMaterialEmission",		    	XML_NAMESPACE_DR3D, XML_EMISSIVE_COLOR, 		XML_TYPE_COLOR, 0 ),
	GMAP( "D3DMaterialSpecular",		    	XML_NAMESPACE_DR3D, XML_SPECULAR_COLOR, 		XML_TYPE_COLOR, 0 ),
	GMAP( "D3DMaterialSpecularIntensity",	XML_NAMESPACE_DR3D, XML_SHININESS,				XML_TYPE_PERCENT, 0 ),

	// 3D shadow attributes
	GMAP( "D3DShadow3D",				    	XML_NAMESPACE_DR3D, XML_SHADOW, 				XML_SD_TYPE_SHADOW, 0 ),

	// #FontWork# attributes
	GMAP( "FontWorkStyle",					XML_NAMESPACE_DRAW, XML_FONTWORK_STYLE,				XML_SD_TYPE_FONTWORK_STYLE,	CTF_FONTWORK_STYLE	),
	GMAP( "FontWorkAdjust",					XML_NAMESPACE_DRAW, XML_FONTWORK_ADJUST,				XML_SD_TYPE_FONTWORK_ADJUST,CTF_FONTWORK_ADJUST	),
	GMAP( "FontWorkDistance",				XML_NAMESPACE_DRAW, XML_FONTWORK_DISTANCE,				XML_TYPE_MEASURE,			CTF_FONTWORK_DISTANCE	),
	GMAP( "FontWorkStart",					XML_NAMESPACE_DRAW, XML_FONTWORK_START, 				XML_TYPE_MEASURE,			CTF_FONTWORK_START	),
	GMAP( "FontWorkMirror",					XML_NAMESPACE_DRAW, XML_FONTWORK_MIRROR,				XML_TYPE_BOOL,				CTF_FONTWORK_MIRROR	),
	GMAP( "FontWorkOutline",			    	XML_NAMESPACE_DRAW, XML_FONTWORK_OUTLINE,				XML_TYPE_BOOL,				CTF_FONTWORK_OUTLINE	),
	GMAP( "FontWorkShadow",					XML_NAMESPACE_DRAW, XML_FONTWORK_SHADOW,				XML_SD_TYPE_FONTWORK_SHADOW,CTF_FONTWORK_SHADOW	),
	GMAP( "FontWorkShadowColor",		    	XML_NAMESPACE_DRAW, XML_FONTWORK_SHADOW_COLOR,			XML_TYPE_COLOR,				CTF_FONTWORK_SHADOWCOLOR	),
	GMAP( "FontWorkShadowOffsetX",			XML_NAMESPACE_DRAW, XML_FONTWORK_SHADOW_OFFSET_X,		XML_TYPE_MEASURE,			CTF_FONTWORK_SHADOWOFFSETX	),
	GMAP( "FontWorkShadowOffsetY",			XML_NAMESPACE_DRAW, XML_FONTWORK_SHADOW_OFFSET_Y,		XML_TYPE_MEASURE,			CTF_FONTWORK_SHADOWOFFSETY	),
	GMAP( "FontWorkForm",					XML_NAMESPACE_DRAW, XML_FONTWORK_FORM,					XML_SD_TYPE_FONTWORK_FORM,	CTF_FONTWORK_FORM	),
	GMAP( "FontWorkHideForm",				XML_NAMESPACE_DRAW, XML_FONTWORK_HIDE_FORM,			    XML_TYPE_BOOL,				CTF_FONTWORK_HIDEFORM	),
	GMAP( "FontWorkShadowTransparence",		XML_NAMESPACE_DRAW, XML_FONTWORK_SHADOW_TRANSPARENCE,	XML_TYPE_PERCENT,			CTF_FONTWORK_SHADOWTRANSPARENCE	),

	// control attributes (border exists one mor time for the text additions of shapes)
    GMAP( "ControlSymbolColor",             XML_NAMESPACE_DRAW, XML_SYMBOL_COLOR,           XML_TYPE_COLOR, 0 ),
	GMAP( "ControlBackground",				XML_NAMESPACE_FO,	XML_BACKGROUND_COLOR,		XML_TYPE_COLOR|MID_FLAG_MULTI_PROPERTY, 0 ),
	GMAP( "ControlBorder",					XML_NAMESPACE_FO,	XML_BORDER, 				XML_SD_TYPE_CONTROL_BORDER|MID_FLAG_MULTI_PROPERTY|MID_FLAG_MERGE_ATTRIBUTE, 0 ),
	GMAP( "ControlBorderColor",				XML_NAMESPACE_FO,	XML_BORDER, 			    XML_SD_TYPE_CONTROL_BORDER_COLOR|MID_FLAG_MULTI_PROPERTY|MID_FLAG_MERGE_ATTRIBUTE, 0 ),
	GMAP( "ControlDataStyle",				XML_NAMESPACE_STYLE,XML_DATA_STYLE_NAME,		XML_TYPE_STRING|MID_FLAG_NO_PROPERTY_EXPORT|MID_FLAG_SPECIAL_ITEM, CTF_SD_CONTROL_SHAPE_DATA_STYLE ),
	GMAP( "ControlTextEmphasis",			XML_NAMESPACE_STYLE,XML_TEXT_EMPHASIZE, 		XML_TYPE_CONTROL_TEXT_EMPHASIZE, 0 ),
	GMAP( "ImageScaleMode",			        XML_NAMESPACE_STYLE,XML_REPEAT,                 XML_SD_TYPE_IMAGE_SCALE_MODE|MID_FLAG_MULTI_PROPERTY, 0 ),
	GMAP( "ControlWritingMode",             XML_NAMESPACE_STYLE,XML_WRITING_MODE, 		    XML_TYPE_TEXT_WRITING_MODE_WITH_DEFAULT|MID_FLAG_MULTI_PROPERTY, CTF_CONTROLWRITINGMODE ),

	// special entries for floating frames
	GMAP( "FrameIsAutoScroll",			XML_NAMESPACE_DRAW,	XML_FRAME_DISPLAY_SCROLLBAR,	XML_TYPE_BOOL|MID_FLAG_MULTI_PROPERTY,				CTF_FRAME_DISPLAY_SCROLLBAR ),
	GMAP( "FrameIsBorder",				XML_NAMESPACE_DRAW,	XML_FRAME_DISPLAY_BORDER,		XML_TYPE_BOOL|MID_FLAG_MULTI_PROPERTY,				CTF_FRAME_DISPLAY_BORDER ),
	GMAP( "FrameMarginWidth",			XML_NAMESPACE_DRAW,	XML_FRAME_MARGIN_HORIZONTAL,	XML_TYPE_MEASURE_PX|MID_FLAG_MULTI_PROPERTY,		CTF_FRAME_MARGIN_HORI ),
	GMAP( "FrameMarginHeight",			XML_NAMESPACE_DRAW,	XML_FRAME_MARGIN_VERTICAL,		XML_TYPE_MEASURE_PX|MID_FLAG_MULTI_PROPERTY,		CTF_FRAME_MARGIN_VERT ),
	GMAP( "VisibleArea",				XML_NAMESPACE_DRAW,	XML_VISIBLE_AREA_LEFT,			XML_TYPE_RECTANGLE_LEFT|MID_FLAG_MERGE_PROPERTY|MID_FLAG_MULTI_PROPERTY|MID_FLAG_NO_PROPERTY,	CTF_SD_OLE_VIS_AREA_IMPORT_LEFT ),
	GMAP( "VisibleArea",				XML_NAMESPACE_DRAW,	XML_VISIBLE_AREA_TOP,			XML_TYPE_RECTANGLE_TOP|MID_FLAG_MERGE_PROPERTY|MID_FLAG_MULTI_PROPERTY|MID_FLAG_NO_PROPERTY,	CTF_SD_OLE_VIS_AREA_IMPORT_TOP ),
	GMAP( "VisibleArea",				XML_NAMESPACE_DRAW,	XML_VISIBLE_AREA_WIDTH, 		XML_TYPE_RECTANGLE_WIDTH|MID_FLAG_MERGE_PROPERTY|MID_FLAG_MULTI_PROPERTY|MID_FLAG_NO_PROPERTY,	CTF_SD_OLE_VIS_AREA_IMPORT_WIDTH ),
	GMAP( "VisibleArea",				XML_NAMESPACE_DRAW,	XML_VISIBLE_AREA_HEIGHT,		XML_TYPE_RECTANGLE_HEIGHT|MID_FLAG_MERGE_PROPERTY|MID_FLAG_MULTI_PROPERTY|MID_FLAG_NO_PROPERTY,	CTF_SD_OLE_VIS_AREA_IMPORT_HEIGHT ),
	GMAP( "IsInternal",					XML_NAMESPACE_DRAW, XML__EMPTY,     				XML_TYPE_BUILDIN_CMP_ONLY,							CTF_SD_OLE_ISINTERNAL ),
	GMAP( "IsInternal",					XML_NAMESPACE_DRAW,	XML_VISIBLE_AREA_LEFT,			XML_TYPE_RECTANGLE_LEFT|MID_FLAG_MERGE_PROPERTY|MID_FLAG_MULTI_PROPERTY|MID_FLAG_NO_PROPERTY_IMPORT,	CTF_SD_OLE_VIS_AREA_EXPORT_LEFT ),
	GMAP( "IsInternal",					XML_NAMESPACE_DRAW,	XML_VISIBLE_AREA_TOP,			XML_TYPE_RECTANGLE_TOP|MID_FLAG_MERGE_PROPERTY|MID_FLAG_MULTI_PROPERTY|MID_FLAG_NO_PROPERTY_IMPORT,		CTF_SD_OLE_VIS_AREA_EXPORT_TOP ),
	GMAP( "IsInternal",					XML_NAMESPACE_DRAW,	XML_VISIBLE_AREA_WIDTH, 		XML_TYPE_RECTANGLE_WIDTH|MID_FLAG_MERGE_PROPERTY|MID_FLAG_MULTI_PROPERTY|MID_FLAG_NO_PROPERTY_IMPORT,	CTF_SD_OLE_VIS_AREA_EXPORT_WIDTH ),
	GMAP( "IsInternal",					XML_NAMESPACE_DRAW,	XML_VISIBLE_AREA_HEIGHT,		XML_TYPE_RECTANGLE_HEIGHT|MID_FLAG_MERGE_PROPERTY|MID_FLAG_MULTI_PROPERTY|MID_FLAG_NO_PROPERTY_IMPORT,	CTF_SD_OLE_VIS_AREA_EXPORT_HEIGHT ),

	GMAP( "Aspect",						XML_NAMESPACE_DRAW, XML_DRAW_ASPECT,   				XML_TYPE_TEXT_DRAW_ASPECT|MID_FLAG_MULTI_PROPERTY,	CTF_SD_OLE_ASPECT ),

	// caption properties
	GMAP( "CaptionType",			    	XML_NAMESPACE_DRAW, XML_CAPTION_TYPE,				XML_SD_TYPE_CAPTION_TYPE, 0 ),
	GMAP( "CaptionIsFixedAngle",	    	XML_NAMESPACE_DRAW, XML_CAPTION_ANGLE_TYPE, 		XML_SD_TYPE_CAPTION_ANGLE_TYPE,	0 ),
	GMAP( "CaptionAngle",				XML_NAMESPACE_DRAW, XML_CAPTION_ANGLE,				XML_TYPE_NUMBER, 0 ),
	GMAP( "CaptionGap",					XML_NAMESPACE_DRAW,	XML_CAPTION_GAP,				XML_TYPE_MEASURE, 0 ),
	GMAP( "CaptionEscapeDirection",		XML_NAMESPACE_DRAW, XML_CAPTION_ESCAPE_DIRECTION,	XML_SD_TYPE_CAPTION_ESC_DIR, 0 ),
	GMAP( "CaptionIsEscapeRelative",	XML_NAMESPACE_DRAW,	XML_CAPTION_ESCAPE, 			XML_SD_TYPE_CAPTION_IS_ESC_REL|MID_FLAG_MULTI_PROPERTY, CTF_CAPTION_ISESCREL ),
	GMAP( "CaptionEscapeRelative",		XML_NAMESPACE_DRAW, XML_CAPTION_ESCAPE, 			XML_SD_TYPE_CAPTION_ESC_REL|MID_FLAG_MULTI_PROPERTY, CTF_CAPTION_ESCREL ),
	GMAP( "CaptionEscapeAbsolute",		XML_NAMESPACE_DRAW, XML_CAPTION_ESCAPE, 			XML_SD_TYPE_CAPTION_ESC_ABS|MID_FLAG_MULTI_PROPERTY, CTF_CAPTION_ESCABS ),
	GMAP( "CaptionLineLength",			XML_NAMESPACE_DRAW, XML_CAPTION_LINE_LENGTH,		XML_TYPE_MEASURE, 0 ),
	GMAP( "CaptionIsFitLineLength",		XML_NAMESPACE_DRAW, XML_CAPTION_FIT_LINE_LENGTH,	XML_TYPE_BOOL, 0 ),

	// misc object properties
	GMAP( "MoveProtect",			    	XML_NAMESPACE_STYLE, XML_PROTECT,				XML_SD_TYPE_MOVE_PROTECT|MID_FLAG_MULTI_PROPERTY|MID_FLAG_MERGE_ATTRIBUTE, CTF_SD_MOVE_PROTECT ),
	GMAP( "SizeProtect",			    	XML_NAMESPACE_STYLE, XML_PROTECT,				XML_SD_TYPE_SIZE_PROTECT|MID_FLAG_MULTI_PROPERTY|MID_FLAG_MERGE_ATTRIBUTE, CTF_SD_SIZE_PROTECT ),
	MAP_END()
};

//////////////////////////////////////////////////////////////////////////////
// entry list for presentation page properties

const XMLPropertyMapEntry aXMLSDPresPageProps[] =
{
	DPMAP( "UserDefinedAttributes",		XML_NAMESPACE_TEXT, XML_XMLNS,					XML_TYPE_ATTRIBUTE_CONTAINER | MID_FLAG_SPECIAL_ITEM, 0 ),

	DPMAP( "Change",						XML_NAMESPACE_PRESENTATION, XML_TRANSITION_TYPE,	XML_SD_TYPE_PRESPAGE_TYPE, CTF_PAGE_TRANS_TYPE ),
	DPMAP( "Effect",						XML_NAMESPACE_PRESENTATION, XML_TRANSITION_STYLE,   XML_SD_TYPE_PRESPAGE_STYLE, CTF_PAGE_TRANS_STYLE ),
	DPMAP( "Speed",						XML_NAMESPACE_PRESENTATION, XML_TRANSITION_SPEED,   XML_SD_TYPE_PRESPAGE_SPEED, CTF_PAGE_TRANS_SPEED ),
	DPMAP( "Duration",					XML_NAMESPACE_PRESENTATION, XML_DURATION,		    XML_SD_TYPE_PRESPAGE_DURATION, CTF_PAGE_TRANS_DURATION ),
	DPMAP( "Visible",					XML_NAMESPACE_PRESENTATION, XML_VISIBILITY,		    XML_SD_TYPE_PRESPAGE_VISIBILITY, CTF_PAGE_VISIBLE ),
	DPMAP( "Sound",						XML_NAMESPACE_PRESENTATION, XML_SOUND,			    XML_TYPE_STRING|MID_FLAG_ELEMENT_ITEM, CTF_PAGE_SOUND_URL ),
	DPMAP( "BackgroundFullSize",			XML_NAMESPACE_DRAW,			XML_BACKGROUND_SIZE,	XML_SD_TYPE_PRESPAGE_BACKSIZE, CTF_PAGE_BACKSIZE ),

	DPMAP( "IsBackgroundVisible",		XML_NAMESPACE_PRESENTATION,	XML_BACKGROUND_VISIBLE, XML_TYPE_BOOL, 0 ),
	DPMAP( "IsBackgroundObjectsVisible",	XML_NAMESPACE_PRESENTATION,	XML_BACKGROUND_OBJECTS_VISIBLE, XML_TYPE_BOOL, 0 ),

	DPMAP( "FillStyle",					XML_NAMESPACE_DRAW,	XML_FILL,					XML_SD_TYPE_FILLSTYLE, 0 ),
	DPMAP( "FillColor",					XML_NAMESPACE_DRAW, XML_FILL_COLOR, 			XML_TYPE_COLOR, 0 ),
	DPMAP( "FillGradientName",			XML_NAMESPACE_DRAW, XML_FILL_GRADIENT_NAME, 	XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_FILLGRADIENTNAME ),
	DPMAP( "FillGradientStepCount",		XML_NAMESPACE_DRAW, XML_GRADIENT_STEP_COUNT,	XML_TYPE_NUMBER, 0 ),
	DPMAP( "FillHatchName",				XML_NAMESPACE_DRAW, XML_FILL_HATCH_NAME,		XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_FILLHATCHNAME ),
	GMAP( "FillBackground",					XML_NAMESPACE_DRAW, XML_FILL_HATCH_SOLID,		XML_TYPE_BOOL, 0 ),
	DPMAP( "FillBitmapName",				XML_NAMESPACE_DRAW, XML_FILL_IMAGE_NAME,	XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_FILLBITMAPNAME ),
	DPMAP( "FillTransparenceGradientName",	XML_NAMESPACE_DRAW, XML_OPACITY_NAME,		XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_FILLTRANSNAME ),
	DPMAP( "FillBitmapSizeX",			XML_NAMESPACE_DRAW,	XML_FILL_IMAGE_WIDTH,		XML_SD_TYPE_FILLBITMAPSIZE|MID_FLAG_MULTI_PROPERTY, 0 ),
	DPMAP( "FillBitmapLogicalSize",		XML_NAMESPACE_DRAW, XML_FILL_IMAGE_WIDTH,		XML_SD_TYPE_LOGICAL_SIZE|MID_FLAG_MULTI_PROPERTY, 0 ),
	DPMAP( "FillBitmapSizeY",			XML_NAMESPACE_DRAW,	XML_FILL_IMAGE_HEIGHT,		XML_SD_TYPE_FILLBITMAPSIZE|MID_FLAG_MULTI_PROPERTY, 0 ),
	DPMAP( "FillBitmapLogicalSize",		XML_NAMESPACE_DRAW, XML_FILL_IMAGE_HEIGHT,		XML_SD_TYPE_LOGICAL_SIZE|MID_FLAG_MULTI_PROPERTY, 0 ),
	DPMAP( "FillBitmapMode",			XML_NAMESPACE_STYLE,XML_REPEAT, 				XML_SD_TYPE_BITMAP_MODE, 0 ),
	DPMAP( "FillBitmapPositionOffsetX",	XML_NAMESPACE_DRAW,	XML_FILL_IMAGE_REF_POINT_X, XML_TYPE_PERCENT, 0 ),
	DPMAP( "FillBitmapPositionOffsetY",	XML_NAMESPACE_DRAW,	XML_FILL_IMAGE_REF_POINT_Y, XML_TYPE_PERCENT, 0 ),
	DPMAP( "FillBitmapRectanglePoint",	XML_NAMESPACE_DRAW,	XML_FILL_IMAGE_REF_POINT,	XML_SD_TYPE_BITMAP_REFPOINT, 0 ),
	DPMAP( "FillBitmapOffsetX",			XML_NAMESPACE_DRAW,	XML_TILE_REPEAT_OFFSET,	    XML_SD_TYPE_BITMAPREPOFFSETX|MID_FLAG_MULTI_PROPERTY, CTF_REPEAT_OFFSET_X ),
	DPMAP( "FillBitmapOffsetY",			XML_NAMESPACE_DRAW,	XML_TILE_REPEAT_OFFSET,	XML_SD_TYPE_BITMAPREPOFFSETY|MID_FLAG_MULTI_PROPERTY, CTF_REPEAT_OFFSET_Y ),

	DPMAP( "IsHeaderVisible",			XML_NAMESPACE_PRESENTATION, XML_DISPLAY_HEADER,			XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE, CTF_HEADER_VISIBLE ),
	DPMAP( "IsFooterVisible",			XML_NAMESPACE_PRESENTATION, XML_DISPLAY_FOOTER,			XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE, CTF_FOOTER_VISIBLE ),
	DPMAP( "IsPageNumberVisible",		XML_NAMESPACE_PRESENTATION, XML_DISPLAY_PAGE_NUMBER,	XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE, CTF_PAGE_NUMBER_VISIBLE ),
	DPMAP( "IsDateTimeVisible",			XML_NAMESPACE_PRESENTATION, XML_DISPLAY_DATE_TIME,		XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE, CTF_DATE_TIME_VISIBLE ),

	DPMAP( "TransitionType",			XML_NAMESPACE_SMIL, XML_TYPE,					XML_SD_TYPE_TRANSITION_TYPE, CTF_PAGE_TRANSITION_TYPE ),
	DPMAP( "TransitionSubtype",			XML_NAMESPACE_SMIL, XML_SUBTYPE,				XML_SD_TYPE_TRANSTIION_SUBTYPE, CTF_PAGE_TRANSITION_SUBTYPE ),
	DPMAP( "TransitionDirection",		XML_NAMESPACE_SMIL, XML_DIRECTION,				XML_SD_TYPE_TRANSTIION_DIRECTION, CTF_PAGE_TRANSITION_DIRECTION ),
	DPMAP( "TransitionFadeColor",		XML_NAMESPACE_SMIL, XML_FADECOLOR,				XML_TYPE_COLOR, CTF_PAGE_TRANSITION_FADECOLOR ),
	MAP_END()
};

const XMLPropertyMapEntry aXMLSDPresPageProps_onlyHeadersFooter[] =
{
	DPMAP( "IsHeaderVisible",				XML_NAMESPACE_PRESENTATION, XML_DISPLAY_HEADER,			XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE, CTF_HEADER_VISIBLE ),
	DPMAP( "IsFooterVisible",				XML_NAMESPACE_PRESENTATION, XML_DISPLAY_FOOTER,			XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE, CTF_FOOTER_VISIBLE ),
	DPMAP( "IsPageNumberVisible",			XML_NAMESPACE_PRESENTATION, XML_DISPLAY_PAGE_NUMBER,	XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE, CTF_PAGE_NUMBER_VISIBLE ),
	DPMAP( "IsDateTimeVisible",				XML_NAMESPACE_PRESENTATION, XML_DISPLAY_DATE_TIME,		XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE, CTF_DATE_TIME_VISIBLE ),

	MAP_END()
};

/** contains the attribute to property mapping for a drawing layer table 
	WARNING: if attributes are added, SdXMLTableShapeContext::processAttribute needs to be updated!
*/
const XMLPropertyMapEntry aXMLTableShapeAttributes[] =
{
	_MAP( "UseFirstRowStyle",		XML_NAMESPACE_TABLE, XML_USE_FIRST_ROW_STYLES, XML_TYPE_BOOL, 0 ),
	_MAP( "UseLastRowStyle",		XML_NAMESPACE_TABLE, XML_USE_LAST_ROW_STYLES, XML_TYPE_BOOL, 0 ),
	_MAP( "UseFirstColumnStyle",	XML_NAMESPACE_TABLE, XML_USE_FIRST_COLUMN_STYLES, XML_TYPE_BOOL, 0 ),
	_MAP( "UseLastColumnStyle",		XML_NAMESPACE_TABLE, XML_USE_LAST_COLUMN_STYLES, XML_TYPE_BOOL, 0 ),
	_MAP( "UseBandingRowStyle",		XML_NAMESPACE_TABLE, XML_USE_BANDING_ROWS_STYLES, XML_TYPE_BOOL, 0 ),
	_MAP( "UseBandingColumnStyle",	XML_NAMESPACE_TABLE, XML_USE_BANDING_COLUMNS_STYLES, XML_TYPE_BOOL, 0 ),
	MAP_END()
};

//////////////////////////////////////////////////////////////////////////////
// implementation of factory for own graphic properties

SvXMLEnumMapEntry aXML_LineStyle_EnumMap[] =
{
	{ XML_NONE, 	drawing::LineStyle_NONE },
	{ XML_SOLID,	drawing::LineStyle_SOLID },
	{ XML_DASH,	    drawing::LineStyle_DASH },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry aXML_LineJoint_EnumMap[] =
{
	{ XML_NONE,	    drawing::LineJoint_NONE },
	{ XML_MITER,	drawing::LineJoint_MITER },
	{ XML_ROUND,	drawing::LineJoint_ROUND },
	{ XML_BEVEL,	drawing::LineJoint_BEVEL },
	{ XML_MIDDLE,	drawing::LineJoint_MIDDLE },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry aXML_LineCap_EnumMap[] =
{
    { XML_BUTT, drawing::LineCap_BUTT },
    { XML_ROUND, drawing::LineCap_ROUND },
    { XML_GRADIENTSTYLE_SQUARE, drawing::LineCap_SQUARE }, // use XML_GRADIENTSTYLE_SQUARE as XML_SQUARE, is defined as "square" already
    { XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry aXML_FillStyle_EnumMap[] =
{
	{ XML_NONE,	    drawing::FillStyle_NONE },
	{ XML_SOLID,	drawing::FillStyle_SOLID },
	{ XML_BITMAP,	drawing::FillStyle_BITMAP },
	{ XML_GRADIENT, drawing::FillStyle_GRADIENT },
	{ XML_HATCH,	drawing::FillStyle_HATCH },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry aXML_PresChange_EnumMap[] =
{
	{ XML_MANUAL,			0 },
	{ XML_AUTOMATIC,		1 },
	{ XML_SEMI_AUTOMATIC,	2 },
	{ XML_TOKEN_INVALID,					0 }
};

SvXMLEnumMapEntry aXML_TransSpeed_EnumMap[] =
{
	{ XML_FAST,     presentation::AnimationSpeed_FAST },
	{ XML_MEDIUM,	presentation::AnimationSpeed_MEDIUM },
	{ XML_SLOW,	    presentation::AnimationSpeed_SLOW },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry aXML_FadeEffect_EnumMap[] =
{
	{ XML_NONE,				    presentation::FadeEffect_NONE },
	{ XML_FADE_FROM_LEFT,		presentation::FadeEffect_FADE_FROM_LEFT },
	{ XML_FADE_FROM_TOP,		presentation::FadeEffect_FADE_FROM_TOP },
	{ XML_FADE_FROM_RIGHT,		presentation::FadeEffect_FADE_FROM_RIGHT },
	{ XML_FADE_FROM_BOTTOM, 	presentation::FadeEffect_FADE_FROM_BOTTOM },
	{ XML_FADE_TO_CENTER,		presentation::FadeEffect_FADE_TO_CENTER },
	{ XML_FADE_FROM_CENTER,	    presentation::FadeEffect_FADE_FROM_CENTER },
	{ XML_MOVE_FROM_LEFT,		presentation::FadeEffect_MOVE_FROM_LEFT },
	{ XML_MOVE_FROM_TOP,		presentation::FadeEffect_MOVE_FROM_TOP },
	{ XML_MOVE_FROM_RIGHT,		presentation::FadeEffect_MOVE_FROM_RIGHT },
    { XML_MOVE_FROM_BOTTOM,	    presentation::FadeEffect_MOVE_FROM_BOTTOM },
	{ XML_ROLL_FROM_TOP,		presentation::FadeEffect_ROLL_FROM_TOP },
	{ XML_ROLL_FROM_LEFT,		presentation::FadeEffect_ROLL_FROM_LEFT },
	{ XML_ROLL_FROM_RIGHT,		presentation::FadeEffect_ROLL_FROM_RIGHT },
	{ XML_ROLL_FROM_BOTTOM,	    presentation::FadeEffect_ROLL_FROM_BOTTOM },
	{ XML_VERTICAL_STRIPES,	    presentation::FadeEffect_VERTICAL_STRIPES },
    { XML_HORIZONTAL_STRIPES,	presentation::FadeEffect_HORIZONTAL_STRIPES },
	{ XML_CLOCKWISE,			presentation::FadeEffect_CLOCKWISE },
	{ XML_COUNTERCLOCKWISE,	    presentation::FadeEffect_COUNTERCLOCKWISE },
	{ XML_FADE_FROM_UPPERLEFT,	presentation::FadeEffect_FADE_FROM_UPPERLEFT },
	{ XML_FADE_FROM_UPPERRIGHT,	presentation::FadeEffect_FADE_FROM_UPPERRIGHT },
	{ XML_FADE_FROM_LOWERLEFT,	presentation::FadeEffect_FADE_FROM_LOWERLEFT },
	{ XML_FADE_FROM_LOWERRIGHT,	presentation::FadeEffect_FADE_FROM_LOWERRIGHT },
	{ XML_CLOSE_VERTICAL,		presentation::FadeEffect_CLOSE_VERTICAL },
	{ XML_CLOSE_HORIZONTAL, 	presentation::FadeEffect_CLOSE_HORIZONTAL },
	{ XML_OPEN_VERTICAL,		presentation::FadeEffect_OPEN_VERTICAL },
	{ XML_OPEN_HORIZONTAL,		presentation::FadeEffect_OPEN_HORIZONTAL },
	{ XML_SPIRALIN_LEFT,		presentation::FadeEffect_SPIRALIN_LEFT },
	{ XML_SPIRALIN_RIGHT,		presentation::FadeEffect_SPIRALIN_RIGHT },
	{ XML_SPIRALOUT_LEFT,		presentation::FadeEffect_SPIRALOUT_LEFT },
	{ XML_SPIRALOUT_RIGHT,		presentation::FadeEffect_SPIRALOUT_RIGHT },
	{ XML_DISSOLVE, 			presentation::FadeEffect_DISSOLVE },
	{ XML_WAVYLINE_FROM_LEFT,	presentation::FadeEffect_WAVYLINE_FROM_LEFT },
	{ XML_WAVYLINE_FROM_TOP,	presentation::FadeEffect_WAVYLINE_FROM_TOP },
	{ XML_WAVYLINE_FROM_RIGHT,	presentation::FadeEffect_WAVYLINE_FROM_RIGHT },
	{ XML_WAVYLINE_FROM_BOTTOM,	presentation::FadeEffect_WAVYLINE_FROM_BOTTOM },
	{ XML_RANDOM,				presentation::FadeEffect_RANDOM },
	{ XML_STRETCH_FROM_LEFT,	presentation::FadeEffect_STRETCH_FROM_LEFT },
	{ XML_STRETCH_FROM_TOP, 	presentation::FadeEffect_STRETCH_FROM_TOP },
	{ XML_STRETCH_FROM_RIGHT,	presentation::FadeEffect_STRETCH_FROM_RIGHT },
	{ XML_STRETCH_FROM_BOTTOM,	presentation::FadeEffect_STRETCH_FROM_BOTTOM },
	{ XML_VERTICAL_LINES,		presentation::FadeEffect_VERTICAL_LINES },
	{ XML_HORIZONTAL_LINES, 	presentation::FadeEffect_HORIZONTAL_LINES },
    { XML_MOVE_FROM_UPPERLEFT,	presentation::FadeEffect_MOVE_FROM_UPPERLEFT },
    { XML_MOVE_FROM_UPPERRIGHT,	presentation::FadeEffect_MOVE_FROM_UPPERRIGHT },
    { XML_MOVE_FROM_LOWERRIGHT,	presentation::FadeEffect_MOVE_FROM_LOWERRIGHT },
    { XML_MOVE_FROM_LOWERLEFT,	presentation::FadeEffect_MOVE_FROM_LOWERLEFT },
    { XML_UNCOVER_TO_LEFT,		presentation::FadeEffect_UNCOVER_TO_LEFT },
    { XML_UNCOVER_TO_UPPERLEFT,	presentation::FadeEffect_UNCOVER_TO_UPPERLEFT },
    { XML_UNCOVER_TO_TOP,		presentation::FadeEffect_UNCOVER_TO_TOP },
    { XML_UNCOVER_TO_UPPERRIGHT,presentation::FadeEffect_UNCOVER_TO_UPPERRIGHT },
    { XML_UNCOVER_TO_RIGHT,		presentation::FadeEffect_UNCOVER_TO_RIGHT },
    { XML_UNCOVER_TO_LOWERRIGHT,presentation::FadeEffect_UNCOVER_TO_LOWERRIGHT },
    { XML_UNCOVER_TO_BOTTOM,	presentation::FadeEffect_UNCOVER_TO_BOTTOM },
    { XML_UNCOVER_TO_LOWERLEFT,	presentation::FadeEffect_UNCOVER_TO_LOWERLEFT },
    { XML_VERTICAL_CHECKERBOARD,presentation::FadeEffect_VERTICAL_CHECKERBOARD },
    { XML_HORIZONTAL_CHECKERBOARD,presentation::FadeEffect_HORIZONTAL_CHECKERBOARD },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry	aXML_ConnectionKind_EnumMap[] =
{
    { XML_STANDARD,	    drawing::ConnectorType_STANDARD },
    { XML_CURVE,		drawing::ConnectorType_CURVE },
    { XML_LINE,		    drawing::ConnectorType_LINE },
    { XML_LINES,		drawing::ConnectorType_LINES },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry	aXML_BitmapMode_EnumMap[] =
{
	{ XML_REPEAT,					drawing::BitmapMode_REPEAT },
	{ XML_STRETCH,					drawing::BitmapMode_STRETCH },
	{ XML_BACKGROUND_NO_REPEAT, 	drawing::BitmapMode_NO_REPEAT },
	{ XML_TOKEN_INVALID, 0 }
};

//////////////////////////////////////////////////////////////////////////////
// 3D EnumMaps

SvXMLEnumMapEntry  aXML_NormalsKind_EnumMap[] =
{
	{ XML_OBJECT,		drawing::NormalsKind_SPECIFIC },
    { XML_FLAT,		    drawing::NormalsKind_FLAT },
    { XML_SPHERE,		drawing::NormalsKind_SPHERE },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry  aXML_TexGenerationX_EnumMap[] =
{
    { XML_OBJECT,		drawing::TextureProjectionMode_OBJECTSPECIFIC },
    { XML_PARALLEL,	    drawing::TextureProjectionMode_PARALLEL },
    { XML_SPHERE,		drawing::TextureProjectionMode_SPHERE },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry  aXML_TexGenerationY_EnumMap[] =
{
    { XML_OBJECT,		drawing::TextureProjectionMode_OBJECTSPECIFIC },
    { XML_PARALLEL,	    drawing::TextureProjectionMode_PARALLEL },
    { XML_SPHERE,		drawing::TextureProjectionMode_SPHERE },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry  aXML_TexKind_EnumMap[] =
{
    { XML_LUMINANCE,	drawing::TextureKind_LUMINANCE },
//    { XML_INTENSITY,	drawing::TextureKind_INTENSITY },
    { XML_COLOR,		drawing::TextureKind_COLOR },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry  aXML_TexMode_EnumMap[] =
{
    { XML_REPLACE,		drawing::TextureMode_REPLACE },
    { XML_MODULATE,	    drawing::TextureMode_MODULATE },
    { XML_BLEND,		drawing::TextureMode_BLEND },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry aXML_RefPoint_EnumMap[] =
{
    { XML_TOP_LEFT,	    drawing::RectanglePoint_LEFT_TOP },
    { XML_TOP,			drawing::RectanglePoint_MIDDLE_TOP },
    { XML_TOP_RIGHT,	drawing::RectanglePoint_RIGHT_TOP },
    { XML_LEFT,		    drawing::RectanglePoint_LEFT_MIDDLE },
    { XML_CENTER,		drawing::RectanglePoint_MIDDLE_MIDDLE },
    { XML_RIGHT,		drawing::RectanglePoint_RIGHT_MIDDLE },
    { XML_BOTTOM_LEFT,	drawing::RectanglePoint_LEFT_BOTTOM },
    { XML_BOTTOM,		drawing::RectanglePoint_MIDDLE_BOTTOM },
    { XML_BOTTOM_RIGHT, drawing::RectanglePoint_RIGHT_BOTTOM },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry aXML_CircleKind_EnumMap[] =
{
	{ XML_FULL,		    drawing::CircleKind_FULL },
	{ XML_SECTION,		drawing::CircleKind_SECTION },
	{ XML_CUT,			drawing::CircleKind_CUT },
	{ XML_ARC,			drawing::CircleKind_ARC },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry aXML_WritingMode_EnumMap[] =
{
	{ XML_TB_RL,		text::WritingMode_TB_RL },
	{ XML_LR_TB,		text::WritingMode_LR_TB },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_TextAnimation_Enum[] =
{
	{ XML_NONE, 		drawing::TextAnimationKind_NONE	},
	{ XML_BLINKING,	    drawing::TextAnimationKind_BLINK },	// will be filtered
	{ XML_SCROLL,		drawing::TextAnimationKind_SCROLL },
	{ XML_ALTERNATE,	drawing::TextAnimationKind_ALTERNATE },
	{ XML_SLIDE,		drawing::TextAnimationKind_SLIDE },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_TextAnimation_Blinking_Enum[] =
{
	{ XML_FALSE,		drawing::TextAnimationKind_NONE	},
	{ XML_TRUE, 		drawing::TextAnimationKind_BLINK },
	{ XML_FALSE,		drawing::TextAnimationKind_SCROLL },
	{ XML_FALSE,		drawing::TextAnimationKind_ALTERNATE },
	{ XML_FALSE,		drawing::TextAnimationKind_SLIDE },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_TextAnimationDirection_Enum[] =
{
	{ XML_LEFT,	    	drawing::TextAnimationDirection_LEFT },
	{ XML_RIGHT,		drawing::TextAnimationDirection_RIGHT },	// will be filtered
	{ XML_UP,			drawing::TextAnimationDirection_UP },
	{ XML_DOWN, 		drawing::TextAnimationDirection_DOWN },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_TextAlign_Enum[] =
{
	{ XML_LEFT,		    drawing::TextHorizontalAdjust_LEFT },
	{ XML_CENTER,		drawing::TextHorizontalAdjust_CENTER },
	{ XML_RIGHT,		drawing::TextHorizontalAdjust_RIGHT },
	{ XML_JUSTIFY,		drawing::TextHorizontalAdjust_BLOCK },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_VerticalAlign_Enum[] =
{
	{ XML_TOP,			drawing::TextVerticalAdjust_TOP },
	{ XML_MIDDLE,		drawing::TextVerticalAdjust_CENTER },
	{ XML_BOTTOM,		drawing::TextVerticalAdjust_BOTTOM },
	{ XML_JUSTIFY,		drawing::TextVerticalAdjust_BLOCK },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_FitToSize_Enum[] =
{
	{ XML_FALSE,		drawing::TextFitToSizeType_NONE },
	{ XML_TRUE, 		drawing::TextFitToSizeType_PROPORTIONAL },
	{ XML_TRUE,	    	drawing::TextFitToSizeType_ALLLINES },
	{ XML_TRUE,		    drawing::TextFitToSizeType_RESIZEATTR },
	{ XML_TOKEN_INVALID, 0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_MeasureUnit_Enum[] =
{
	{ XML_AUTOMATIC,	0 },
	{ XML_UNIT_MM,		1 },
	{ XML_UNIT_CM,		2 },
	{ XML_UNIT_M,		3 },
	{ XML_UNIT_KM,		4 },
	{ XML_UNIT_PT,		6 },
	{ XML_UNIT_PC,		7 },
	{ XML_UNIT_INCH,	8 },
    { XML_UNIT_FOOT,	9 },
	{ XML_UNIT_MILES,	10 },
	{ XML_TOKEN_INVALID,0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_Measure_HAlign_Enum[] =
{
	{ XML_AUTOMATIC,		drawing::MeasureTextHorzPos_AUTO },
	{ XML_LEFT_OUTSIDE, 	drawing::MeasureTextHorzPos_LEFTOUTSIDE },
	{ XML_INSIDE,			drawing::MeasureTextHorzPos_INSIDE },
	{ XML_RIGHT_OUTSIDE,	drawing::MeasureTextHorzPos_RIGHTOUTSIDE},
	{ XML_TOKEN_INVALID,0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_Measure_VAlign_Enum[] =
{
    { XML_AUTOMATIC,	drawing::MeasureTextVertPos_AUTO },
    { XML_ABOVE,		drawing::MeasureTextVertPos_EAST },
    { XML_BELOW,		drawing::MeasureTextVertPos_WEST },
    { XML_CENTER,		drawing::MeasureTextVertPos_CENTERED },
	{ XML_TOKEN_INVALID,0 }
};

// #FontWork#
SvXMLEnumMapEntry __READONLY_DATA pXML_Fontwork_Style_Enum[] =
{
	{ XML_ROTATE,		0 }, //XFT_ROTATE,
	{ XML_UPRIGHT,		1 }, //XFT_UPRIGHT,
	{ XML_SLANT_X,		2 }, //XFT_SLANTX,
	{ XML_SLANT_Y,		3 }, //XFT_SLANTY,
	{ XML_NONE, 		4 }, //XFT_NONE
	{ XML_TOKEN_INVALID,0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_Fontwork_Adjust_Enum[] =
{
	{ XML_LEFT, 		0 }, //XFT_LEFT,
	{ XML_RIGHT,		1 }, //XFT_RIGHT,
	{ XML_AUTOSIZE,	    2 }, //XFT_AUTOSIZE,
	{ XML_CENTER,		3 }, //XFT_CENTER
	{ XML_TOKEN_INVALID,0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_Fontwork_Shadow_Enum[] =
{
	{ XML_NORMAL,		0 }, //XFTSHADOW_NORMAL,
	{ XML_SLANT,		1 }, //XFTSHADOW_SLANT,
	{ XML_NONE, 		2 }, //XFTSHADOW_NONE
	{ XML_TOKEN_INVALID,0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_Fontwork_Form_Enum[] =
{
	{ XML_NONE,			    0 }, //XFTFORM_NONE,
	{ XML_TOPCIRCLE,		1 }, //XFTFORM_TOPCIRC,
	{ XML_BOTTOMCIRCLE, 	2 }, //XFTFORM_BOTCIRC,
	{ XML_LEFTCIRCLE,		3 }, //XFTFORM_LFTCIRC,
	{ XML_RIGHTCIRCLE,		4 }, //XFTFORM_RGTCIRC,
	{ XML_TOPARC,			5 }, //XFTFORM_TOPARC,
	{ XML_BOTTOMARC,		6 }, //XFTFORM_BOTARC,
	{ XML_LEFTARC,			7 }, //XFTFORM_LFTARC,
	{ XML_RIGHTARC, 		8 }, //XFTFORM_RGTARC,
	{ XML_BUTTON1,			9 }, //XFTFORM_BUTTON1,
	{ XML_BUTTON2,			10 }, //XFTFORM_BUTTON2,
	{ XML_BUTTON3,			11 }, //XFTFORM_BUTTON3,
	{ XML_BUTTON4,			12 }, //XFTFORM_BUTTON4
	{ XML_TOKEN_INVALID,0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_Caption_Esc_Dir_Enum[] =
{
	{ XML_HORIZONTAL,		0 }, //SDRCAPT_ESCHORIZONTAL,
	{ XML_VERTICAL,		    1 }, //SDRCAPT_ESCVERTICAL,
	{ XML_AUTO,			    2 }, //SDRCAPT_ESCBESTFIT,
	{ XML_TOKEN_INVALID,0 }
};

SvXMLEnumMapEntry __READONLY_DATA pXML_Caption_Type_Enum[] =
{
	{ XML_STRAIGHT_LINE,			0 }, //SDRCAPT_TYPE1,
	{ XML_ANGLED_LINE,				1 }, //SDRCAPT_TYPE2,
	{ XML_ANGLED_CONNECTOR_LINE,	2 }, //SDRCAPT_TYPE3,
	{ XML_TOKEN_INVALID,0 }
};

//////////////////////////////////////////////////////////////////////////////

class XMLCaptionEscapeRelative : public XMLPropertyHandler
{
public:
	virtual sal_Bool importXML(
			const ::rtl::OUString& rStrImpValue,
			::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& rUnitConverter ) const;
	virtual sal_Bool exportXML(
			::rtl::OUString& rStrExpValue,
			const ::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& rUnitConverter ) const;
};

sal_Bool XMLCaptionEscapeRelative::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
{
	sal_Int32 nValue;

	if( !SvXMLUnitConverter::convertPercent( nValue, rStrImpValue ) )
		return sal_False;

	nValue *= 100;
	rValue <<= nValue;
	return sal_True;
}

sal_Bool XMLCaptionEscapeRelative::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
{
	sal_Int32 nValue = 0;
	if( !(rValue >>= nValue ) )
		return sal_False;

	nValue /= 100;
  	OUStringBuffer aOut;
 	SvXMLUnitConverter::convertPercent( aOut, nValue );
	rStrExpValue = aOut.makeStringAndClear();
	return sal_True;
}

//////////////////////////////////////////////////////////////////////////////

class XMLMoveSizeProtectHdl : public XMLPropertyHandler
{
public:
	XMLMoveSizeProtectHdl( sal_Int32 nType ) : mnType( nType ) {}

	virtual sal_Bool importXML(
			const ::rtl::OUString& rStrImpValue,
			::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& rUnitConverter ) const;
	virtual sal_Bool exportXML(
			::rtl::OUString& rStrExpValue,
			const ::com::sun::star::uno::Any& rValue,
			const SvXMLUnitConverter& rUnitConverter ) const;
private:
	const sal_Int32 mnType;
};

sal_Bool XMLMoveSizeProtectHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
{
	const sal_Bool bValue = rStrImpValue.indexOf( GetXMLToken( mnType == XML_SD_TYPE_MOVE_PROTECT ? XML_POSITION : XML_SIZE ) ) != -1;
	rValue <<= bValue;
	return sal_True;
}

sal_Bool XMLMoveSizeProtectHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
{
	sal_Bool bValue = sal_Bool();
	if( !(rValue >>= bValue ) )
		return sal_False;

	if( bValue )
	{
		if( rStrExpValue.getLength() )
			rStrExpValue += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " " ) );

		rStrExpValue += GetXMLToken( mnType == XML_SD_TYPE_MOVE_PROTECT ? XML_POSITION : XML_SIZE );
	}

	return sal_True;
}


//////////////////////////////////////////////////////////////////////////////

class XMLSdHeaderFooterVisibilityTypeHdl : public XMLPropertyHandler
{
public:
	virtual ~XMLSdHeaderFooterVisibilityTypeHdl();

	virtual sal_Bool importXML( const ::rtl::OUString& rStrImpValue, ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const;
	virtual sal_Bool exportXML( ::rtl::OUString& rStrExpValue, const ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const;
};

XMLSdHeaderFooterVisibilityTypeHdl::~XMLSdHeaderFooterVisibilityTypeHdl()
{
}

sal_Bool XMLSdHeaderFooterVisibilityTypeHdl::importXML(
		const ::rtl::OUString& rStrImpValue,
		::com::sun::star::uno::Any& rValue,
		const SvXMLUnitConverter& ) const
{
	// #i38644#
	// attributes with this type where saved with VISIBLE|HIDDEN prior
	// to src680m67. So we have to import that correctly
	const sal_Bool bBool = IsXMLToken(rStrImpValue, XML_TRUE) || IsXMLToken(rStrImpValue, XML_VISIBLE);
	rValue <<= bBool;
    return bBool || IsXMLToken(rStrImpValue, XML_FALSE) || IsXMLToken(rStrImpValue, XML_HIDDEN);
}

sal_Bool XMLSdHeaderFooterVisibilityTypeHdl::exportXML(
		OUString& rStrExpValue,
		const Any& rValue,
		const SvXMLUnitConverter& ) const
{
	sal_Bool bRet = sal_False;
  	OUStringBuffer aOut;
	sal_Bool bValue = sal_Bool();

	if (rValue >>= bValue)
	{
		SvXMLUnitConverter::convertBool( aOut, bValue );
		rStrExpValue = aOut.makeStringAndClear();

		bRet = sal_True;
	}

	return bRet;
}


//////////////////////////////////////////////////////////////////////////////

XMLSdPropHdlFactory::XMLSdPropHdlFactory( uno::Reference< frame::XModel > xModel, SvXMLImport& rImport )
: mxModel( xModel ), mpExport(0), mpImport( &rImport )
{
}

XMLSdPropHdlFactory::XMLSdPropHdlFactory( uno::Reference< frame::XModel > xModel, SvXMLExport& rExport )
: mxModel( xModel ), mpExport( &rExport ), mpImport(0)
{
}

XMLSdPropHdlFactory::~XMLSdPropHdlFactory()
{
}

const XMLPropertyHandler* XMLSdPropHdlFactory::GetPropertyHandler( sal_Int32 nType ) const
{
	const XMLPropertyHandler* pHdl = XMLPropertyHandlerFactory::GetPropertyHandler( nType );
	if(!pHdl)
	{
		switch(nType)
		{
			case XML_SD_TYPE_STROKE :
			{
				pHdl = new XMLEnumPropertyHdl( aXML_LineStyle_EnumMap, ::getCppuType((const drawing::LineStyle*)0) );
				break;
			}
			case XML_SD_TYPE_LINEJOIN :
			{
				pHdl = new XMLEnumPropertyHdl( aXML_LineJoint_EnumMap, ::getCppuType((const drawing::LineJoint*)0) );
				break;
			}
            case XML_SD_TYPE_LINECAP :
            {
                pHdl = new XMLEnumPropertyHdl( aXML_LineCap_EnumMap, ::getCppuType((const drawing::LineCap*)0) );
                break;
            }
			case XML_SD_TYPE_FILLSTYLE :
			{
				pHdl = new XMLEnumPropertyHdl( aXML_FillStyle_EnumMap, ::getCppuType((const drawing::FillStyle*)0) );
				break;
			}
			case XML_SD_TYPE_PRESPAGE_TYPE :
			{
				pHdl = new XMLEnumPropertyHdl( aXML_PresChange_EnumMap, ::getCppuType((const sal_Int32*)0) );
				break;
			}
			case XML_SD_TYPE_SHADOW :
			{
				pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_VISIBLE), GetXMLToken(XML_HIDDEN) );
				break;
			}
			case XML_TYPE_SD_MIRROR:
			{
				pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_HORIZONTAL), GetXMLToken(XML_NONE) );
				break;
			}
			case XML_SD_TYPE_PRESPAGE_STYLE :
			{
				pHdl = new XMLEnumPropertyHdl( aXML_FadeEffect_EnumMap, ::getCppuType((const presentation::FadeEffect*)0) );
				break;
			}
			case XML_SD_TYPE_PRESPAGE_SPEED :
			{
				pHdl = new XMLEnumPropertyHdl( aXML_TransSpeed_EnumMap, ::getCppuType((const presentation::AnimationSpeed*)0) );
				break;
			}
			case XML_SD_TYPE_PRESPAGE_DURATION :
			{
				pHdl = new XMLDurationPropertyHdl();
				break;
			}
			case XML_SD_TYPE_TEXT_CROSSEDOUT :
			{
				pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_SOLID), GetXMLToken(XML_NONE) );
				break;
			}
			case XML_SD_TYPE_OPACITY :
			{
				pHdl = new XMLOpacityPropertyHdl(mpImport);
				break;
			}
			case XML_SD_TYPE_WRITINGMODE :
			{
				pHdl = new XMLEnumPropertyHdl( aXML_WritingMode_EnumMap, ::getCppuType((const text::WritingMode*)0) );
				break;
			}
			case XML_SD_TYPE_PRESPAGE_VISIBILITY :
			{
				pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_VISIBLE), GetXMLToken(XML_HIDDEN) );
				break;
			}
			case XML_SD_TYPE_PRESPAGE_BACKSIZE:
			{
				pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_FULL), GetXMLToken(XML_BORDER) );
				break;
			}

			//////////////////////////////////////////////////////////////////
			// 3D Properties

			case XML_SD_TYPE_BACKFACE_CULLING:
			{
				// #87922# DoubleSided -> BackfaceCulling
				// This sal_Bool needs to be flipped, DoubleSided sal_True -> NO Backface culling
				// and vice versa.
				pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_DISABLED), GetXMLToken(XML_ENABLED) );
				break;
			}

			case XML_SD_TYPE_NORMALS_KIND:
			{
				pHdl = new XMLEnumPropertyHdl( aXML_NormalsKind_EnumMap, ::getCppuType((const drawing::NormalsKind*)0) );
				break;
			}
			case XML_SD_TYPE_NORMALS_DIRECTION:
			{
				pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_NORMAL), GetXMLToken(XML_INVERSE) );
				break;
			}
			case XML_SD_TYPE_TEX_GENERATION_MODE_X:
			{
				pHdl = new XMLEnumPropertyHdl( aXML_TexGenerationX_EnumMap, ::getCppuType((const drawing::TextureProjectionMode*)0) );
				break;
			}
			case XML_SD_TYPE_TEX_GENERATION_MODE_Y:
			{
				pHdl = new XMLEnumPropertyHdl( aXML_TexGenerationY_EnumMap, ::getCppuType((const drawing::TextureProjectionMode*)0) );
				break;
			}
			case XML_SD_TYPE_TEX_KIND:
			{
				pHdl = new XMLEnumPropertyHdl( aXML_TexKind_EnumMap, ::getCppuType((const drawing::TextureKind*)0) );
				break;
			}
			case XML_SD_TYPE_TEX_MODE:
			{
				pHdl = new XMLEnumPropertyHdl( aXML_TexMode_EnumMap, ::getCppuType((const drawing::TextureMode*)0) );
				break;
			}
			case XML_SD_TYPE_NUMBULLET:
			{
				uno::Reference<ucb::XAnyCompareFactory> xCompareFac( mxModel, uno::UNO_QUERY );
				uno::Reference<ucb::XAnyCompare> xCompare;
				if( xCompareFac.is() )
					xCompare = xCompareFac->createAnyCompareByName( OUString( RTL_CONSTASCII_USTRINGPARAM( "NumberingRules" ) ) );

				pHdl = new XMLNumRulePropHdl( xCompare );
				break;
			}
			case XML_SD_TYPE_BITMAP_MODE:
			{
				pHdl = new XMLEnumPropertyHdl( aXML_BitmapMode_EnumMap, getCppuType((const drawing::BitmapMode*)0) );
				break;
			}
			case XML_SD_TYPE_BITMAPREPOFFSETX:
			case XML_SD_TYPE_BITMAPREPOFFSETY:
			{
				pHdl = new XMLBitmapRepeatOffsetPropertyHandler( nType == XML_SD_TYPE_BITMAPREPOFFSETX );
				break;
			}
			case XML_SD_TYPE_FILLBITMAPSIZE:
			{
				pHdl = new XMLFillBitmapSizePropertyHandler();
				break;
			}
			case XML_SD_TYPE_LOGICAL_SIZE:
			{
				pHdl = new XMLBitmapLogicalSizePropertyHandler();
				break;
			}
			case XML_SD_TYPE_BITMAP_REFPOINT:
			{
				pHdl = new XMLEnumPropertyHdl( aXML_RefPoint_EnumMap, getCppuType((const ::com::sun::star::drawing::RectanglePoint*)0) );
				break;
			}
			case XML_TYPE_TEXT_ANIMATION:
				pHdl = new XMLEnumPropertyHdl( pXML_TextAnimation_Enum, ::getCppuType((const com::sun::star::drawing::TextAnimationKind*)0) );
				break;
			case XML_TYPE_TEXT_ANIMATION_BLINKING:
				pHdl = new XMLEnumPropertyHdl( pXML_TextAnimation_Blinking_Enum, ::getCppuType((const com::sun::star::drawing::TextAnimationKind*)0) );
				break;
			case XML_TYPE_TEXT_ANIMATION_DIRECTION:
				pHdl = new XMLEnumPropertyHdl( pXML_TextAnimationDirection_Enum, ::getCppuType((const com::sun::star::drawing::TextAnimationDirection*)0) );
				break;
			case XML_TYPE_TEXT_ANIMATION_STEPS:
				pHdl = new XMLTextAnimationStepPropertyHdl;
				break;
			case XML_SD_TYPE_TEXT_ALIGN:
				pHdl = new XMLEnumPropertyHdl( pXML_TextAlign_Enum, ::getCppuType((const com::sun::star::drawing::TextHorizontalAdjust*)0) );
				break;
			case XML_SD_TYPE_VERTICAL_ALIGN:
				pHdl = new XMLEnumPropertyHdl( pXML_VerticalAlign_Enum, ::getCppuType((const com::sun::star::drawing::TextVerticalAdjust*)0) );
				break;
			case XML_SD_TYPE_FITTOSIZE:
				pHdl = new XMLEnumPropertyHdl( pXML_FitToSize_Enum, ::getCppuType((const com::sun::star::drawing::TextFitToSizeType*)0) );
				break;
			case XML_SD_TYPE_MEASURE_UNIT:
				pHdl = new XMLEnumPropertyHdl( pXML_MeasureUnit_Enum, ::getCppuType((const sal_Int32*)0) );
				break;
			case XML_SD_TYPE_MEASURE_HALIGN:
				pHdl = new XMLEnumPropertyHdl( pXML_Measure_HAlign_Enum, ::getCppuType((const com::sun::star::drawing::MeasureTextHorzPos*)0) );
				break;
			case XML_SD_TYPE_MEASURE_VALIGN:
				pHdl = new XMLEnumPropertyHdl( pXML_Measure_VAlign_Enum, ::getCppuType((const com::sun::star::drawing::MeasureTextVertPos*)0) );
				break;
			case XML_SD_TYPE_MEASURE_PLACING:
				{
					pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_BELOW), GetXMLToken(XML_ABOVE) );
				}
				break;
			case XML_TYPE_TEXT_CLIP11:
				pHdl = new XMLClipPropertyHandler( sal_True );
				break;
			case XML_TYPE_TEXT_CLIP:
				pHdl = new XMLClipPropertyHandler( sal_False );
				break;

			// #FontWork#
			case XML_SD_TYPE_FONTWORK_STYLE		:
				pHdl = new XMLEnumPropertyHdl( pXML_Fontwork_Style_Enum , ::getCppuType((const sal_Int32*)0));
				break;
			case XML_SD_TYPE_FONTWORK_ADJUST		:
				pHdl = new XMLEnumPropertyHdl( pXML_Fontwork_Adjust_Enum , ::getCppuType((const sal_Int32*)0));
				break;
			case XML_SD_TYPE_FONTWORK_SHADOW		:
				pHdl = new XMLEnumPropertyHdl( pXML_Fontwork_Shadow_Enum , ::getCppuType((const sal_Int32*)0));
				break;
			case XML_SD_TYPE_FONTWORK_FORM		:
				pHdl = new XMLEnumPropertyHdl( pXML_Fontwork_Form_Enum , ::getCppuType((const sal_Int32*)0));
				break;

			case XML_SD_TYPE_CONTROL_BORDER:
                pHdl = new ::xmloff::OControlBorderHandler( ::xmloff::OControlBorderHandler::STYLE );
				break;
			case XML_SD_TYPE_CONTROL_BORDER_COLOR:
                pHdl = new ::xmloff::OControlBorderHandler( ::xmloff::OControlBorderHandler::COLOR );
				break;
            case XML_SD_TYPE_IMAGE_SCALE_MODE:
                pHdl = new ::xmloff::ImageScaleModeHandler;
                break;
			case XML_TYPE_CONTROL_TEXT_EMPHASIZE:
				pHdl = new ::xmloff::OControlTextEmphasisHandler;
				break;

			case XML_SD_TYPE_CAPTION_ANGLE_TYPE:
			{
				pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_FIXED), GetXMLToken(XML_FREE) );
				break;
			}
			case XML_SD_TYPE_CAPTION_IS_ESC_REL:
				pHdl = new XMLIsPercentagePropertyHandler();
				break;
			case XML_SD_TYPE_CAPTION_ESC_REL:
				pHdl = new XMLCaptionEscapeRelative();
				break;
			case XML_SD_TYPE_CAPTION_ESC_ABS:
				pHdl = new XMLPercentOrMeasurePropertyHandler( sal_False );
				break;
			case XML_SD_TYPE_CAPTION_ESC_DIR:
				pHdl = new XMLEnumPropertyHdl( pXML_Caption_Esc_Dir_Enum , ::getCppuType((const sal_Int32*)0));
				break;
			case XML_SD_TYPE_CAPTION_TYPE:
				pHdl = new XMLEnumPropertyHdl( pXML_Caption_Type_Enum , ::getCppuType((const sal_Int32*)0));
				break;
			case XML_SD_TYPE_DATETIMEUPDATE:
				pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_FIXED), GetXMLToken(XML_VARIABLE) );
				break;
			case XML_SD_TYPE_DATETIME_FORMAT:
				pHdl = new XMLDateTimeFormatHdl( mpExport );
				break;
			case XML_SD_TYPE_TRANSITION_TYPE:
				pHdl = new XMLEnumPropertyHdl( xmloff::getAnimationsEnumMap(xmloff::Animations_EnumMap_TransitionType) , ::getCppuType((const sal_Int16*)0));
				break;
			case XML_SD_TYPE_TRANSTIION_SUBTYPE:
				pHdl = new XMLEnumPropertyHdl( xmloff::getAnimationsEnumMap(xmloff::Animations_EnumMap_TransitionSubType) , ::getCppuType((const sal_Int16*)0));
				break;
			case XML_SD_TYPE_TRANSTIION_DIRECTION:
				pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_FORWARD), GetXMLToken(XML_REVERSE) );
				break;
			case XML_TYPE_WRAP_OPTION:
				pHdl = new XMLWordWrapPropertyHdl( mpImport );
				break;

			case XML_SD_TYPE_MOVE_PROTECT:
			case XML_SD_TYPE_SIZE_PROTECT:
				pHdl = new XMLMoveSizeProtectHdl( nType );
				break;
			case XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE:
				pHdl = new XMLSdHeaderFooterVisibilityTypeHdl();
				break;
		}

		if(pHdl)
			PutHdlCache(nType, pHdl);
	}

	return pHdl;
}

//////////////////////////////////////////////////////////////////////////////

XMLShapePropertySetMapper::XMLShapePropertySetMapper(const UniReference< XMLPropertyHandlerFactory >& rFactoryRef)
: XMLPropertySetMapper( aXMLSDProperties, rFactoryRef )
{
}

XMLShapePropertySetMapper::XMLShapePropertySetMapper(const UniReference< XMLPropertyHandlerFactory >& rFactoryRef, sal_uInt16 nOffset)
: XMLPropertySetMapper( &aXMLSDProperties[nOffset], rFactoryRef )
{
}

XMLShapePropertySetMapper::~XMLShapePropertySetMapper()
{
}

// ----------------------------------------

XMLShapeExportPropertyMapper::XMLShapeExportPropertyMapper( const UniReference< XMLPropertySetMapper >& rMapper, XMLTextListAutoStylePool *pListAutoPool, SvXMLExport& rExport )
: SvXMLExportPropertyMapper( rMapper )
, mpListAutoPool( pListAutoPool )
, mrExport( rExport )
, maNumRuleExp( rExport )
, mbIsInAutoStyles( sal_True )
, msCDATA( GetXMLToken(XML_CDATA))
, msTrue( GetXMLToken(XML_TRUE))
, msFalse( GetXMLToken(XML_FALSE))
{
}

XMLShapeExportPropertyMapper::~XMLShapeExportPropertyMapper()
{
}

void XMLShapeExportPropertyMapper::ContextFilter(
	std::vector< XMLPropertyState >& rProperties,
	uno::Reference< beans::XPropertySet > rPropSet ) const
{
	XMLPropertyState* pRepeatOffsetX = NULL;
	XMLPropertyState* pRepeatOffsetY = NULL;
	XMLPropertyState* pTextAnimationBlinking = NULL;
	XMLPropertyState* pTextAnimationKind = NULL;

	// #FontWork#
	XMLPropertyState* pFontWorkStyle = NULL;
	XMLPropertyState* pFontWorkAdjust = NULL;
	XMLPropertyState* pFontWorkDistance = NULL;
	XMLPropertyState* pFontWorkStart = NULL;
	XMLPropertyState* pFontWorkMirror = NULL;
	XMLPropertyState* pFontWorkOutline = NULL;
	XMLPropertyState* pFontWorkShadow = NULL;
	XMLPropertyState* pFontWorkShadowColor = NULL;
	XMLPropertyState* pFontWorkShadowOffsetx = NULL;
	XMLPropertyState* pFontWorkShadowOffsety = NULL;
	XMLPropertyState* pFontWorkForm = NULL;
	XMLPropertyState* pFontWorkHideform = NULL;
	XMLPropertyState* pFontWorkShadowTransparence = NULL;

	// OLE
	XMLPropertyState* pOLEVisAreaLeft = NULL;
	XMLPropertyState* pOLEVisAreaTop = NULL;
	XMLPropertyState* pOLEVisAreaWidth = NULL;
	XMLPropertyState* pOLEVisAreaHeight = NULL;
	XMLPropertyState* pOLEIsInternal = NULL;

	// caption
	XMLPropertyState* pCaptionIsEscRel = NULL;
	XMLPropertyState* pCaptionEscRel = NULL;
	XMLPropertyState* pCaptionEscAbs = NULL;

	// filter fo:clip
	XMLPropertyState* pClip11State = NULL;
	XMLPropertyState* pClipState = NULL;

    XMLPropertyState* pShapeWritingMode = NULL;
    XMLPropertyState* pTextWritingMode = NULL;
    XMLPropertyState* pControlWritingMode = NULL;

	// filter properties
	for( std::vector< XMLPropertyState >::iterator aIter = rProperties.begin();
		 aIter != rProperties.end();
		 ++aIter )
	{
        	XMLPropertyState *property = &(*aIter);
		if( property->mnIndex == -1 )
			continue;

		// find properties with context
		// to prevent writing this property set mnIndex member to -1
		switch( getPropertySetMapper()->GetEntryContextId( property->mnIndex ))
		{
			case CTF_NUMBERINGRULES:
				{
					if( mbIsInAutoStyles )
						property->mnIndex = -1;
				}
				break;
			case CTF_SD_NUMBERINGRULES_NAME:
				{
					// this property is not exported in the style:properties element
					// because its an XIndexAccess and not a string.
					// This will be handled in SvXMLAutoStylePoolP::exportStyleAttributes
					// This is suboptimal
					if( !mbIsInAutoStyles )
						property->mnIndex = -1;
				}
				break;
			case CTF_WRITINGMODE:
				{
				    pShapeWritingMode = property;				
					text::WritingMode eWritingMode;
					if( property->maValue >>= eWritingMode )
					{
						if( text::WritingMode_LR_TB == eWritingMode )
						{
							property->mnIndex = -1;
                            pShapeWritingMode = 0;
                        }
					}
				}
				break;
			case CTF_CONTROLWRITINGMODE:
			    pControlWritingMode = property;
			    break;
			case CTF_TEXTWRITINGMODE:
			    pTextWritingMode = property;
			    break;
			case CTF_REPEAT_OFFSET_X:
				pRepeatOffsetX = property;
				break;

			case CTF_REPEAT_OFFSET_Y:
				pRepeatOffsetY = property;
				break;

			case CTF_DASHNAME:
			case CTF_FILLGRADIENTNAME:
			case CTF_FILLHATCHNAME:
			case CTF_FILLBITMAPNAME:
                {
                    OUString aStr;
                    if( (property->maValue >>= aStr) && 0 == aStr.getLength() )
                        property->mnIndex = -1;
                }
				break;
			case CTF_TEXTANIMATION_BLINKING:
				pTextAnimationBlinking = property;
				break;
			case CTF_TEXTANIMATION_KIND:
				pTextAnimationKind = property;
				break;

			// #FontWork#
			case CTF_FONTWORK_STYLE:				pFontWorkStyle = property;				break;
			case CTF_FONTWORK_ADJUST:				pFontWorkAdjust = property;				break;
			case CTF_FONTWORK_DISTANCE:				pFontWorkDistance = property;			break;
			case CTF_FONTWORK_START:				pFontWorkStart = property;				break;
			case CTF_FONTWORK_MIRROR:				pFontWorkMirror = property;				break;
			case CTF_FONTWORK_OUTLINE:				pFontWorkOutline = property;			break;
			case CTF_FONTWORK_SHADOW:				pFontWorkShadow = property;				break;
			case CTF_FONTWORK_SHADOWCOLOR:			pFontWorkShadowColor = property;		break;
			case CTF_FONTWORK_SHADOWOFFSETX:		pFontWorkShadowOffsetx = property;		break;
			case CTF_FONTWORK_SHADOWOFFSETY:		pFontWorkShadowOffsety = property;		break;
			case CTF_FONTWORK_FORM:					pFontWorkForm = property;				break;
			case CTF_FONTWORK_HIDEFORM:				pFontWorkHideform = property;			break;
			case CTF_FONTWORK_SHADOWTRANSPARENCE:	pFontWorkShadowTransparence = property;	break;

			// OLE
			case CTF_SD_OLE_VIS_AREA_EXPORT_LEFT:			pOLEVisAreaLeft = property;		break;
			case CTF_SD_OLE_VIS_AREA_EXPORT_TOP:			pOLEVisAreaTop = property;		break;
			case CTF_SD_OLE_VIS_AREA_EXPORT_WIDTH:			pOLEVisAreaWidth = property;	break;
			case CTF_SD_OLE_VIS_AREA_EXPORT_HEIGHT:		pOLEVisAreaHeight = property;	break;
			case CTF_SD_OLE_ISINTERNAL:				pOLEIsInternal = property;		break;

			case CTF_FRAME_DISPLAY_SCROLLBAR:
				{
					if( !property->maValue.hasValue() )
						property->mnIndex = -1;
				}
				break;
			case CTF_FRAME_MARGIN_HORI:
			case CTF_FRAME_MARGIN_VERT:
				{
					sal_Int32 nValue = 0;
					if( (property->maValue >>= nValue) && (nValue < 0) )
						property->mnIndex = -1;
				}
				break;

			case CTF_SD_MOVE_PROTECT:
				{
					sal_Bool bProtected = sal_Bool();
					if( (property->maValue >>= bProtected) && !bProtected )
						property->mnIndex = -1;
				}
				break;
			case CTF_SD_SIZE_PROTECT:
				{
					sal_Bool bProtected = sal_Bool();
					if( (property->maValue >>= bProtected) && !bProtected )
						property->mnIndex = -1;
				}
				break;
			case CTF_CAPTION_ISESCREL:				pCaptionIsEscRel = property;	break;
			case CTF_CAPTION_ESCREL:				pCaptionEscRel = property;		break;
			case CTF_CAPTION_ESCABS:				pCaptionEscAbs = property;		break;
        	case CTF_TEXT_CLIP11:    		pClip11State = property; break;
        	case CTF_TEXT_CLIP:    			pClipState = property; break;
		}
	}

    // check for duplicate writing mode
    if( pShapeWritingMode && (pTextWritingMode || pControlWritingMode) )
    {
        if( pTextWritingMode )
            pTextWritingMode->mnIndex = -1;
        if( pControlWritingMode )
            pControlWritingMode->mnIndex = -1;                       
    }
    else if( pTextWritingMode && pControlWritingMode )
    {
        pControlWritingMode->mnIndex = -1;
    }

	// do not export visual area for internal ole objects
	if( pOLEIsInternal )
	{
		sal_Bool bInternal = sal_Bool();
		if( (pOLEIsInternal->maValue >>= bInternal) && !bInternal )
		{
			try
			{
				const OUString sVisibleArea( RTL_CONSTASCII_USTRINGPARAM("VisibleArea") );
				awt::Rectangle aRect;
				if( rPropSet->getPropertyValue( sVisibleArea ) >>= aRect )
				{
					if( pOLEVisAreaLeft )
					{
						pOLEVisAreaLeft->mnIndex = getPropertySetMapper()->FindEntryIndex( CTF_SD_OLE_VIS_AREA_IMPORT_LEFT );
						pOLEVisAreaLeft->maValue <<= aRect;
					}
					if( pOLEVisAreaTop )
					{
						pOLEVisAreaTop->mnIndex = getPropertySetMapper()->FindEntryIndex( CTF_SD_OLE_VIS_AREA_IMPORT_TOP );
						pOLEVisAreaTop->maValue <<=  aRect;
					}
					if( pOLEVisAreaWidth )
					{
						pOLEVisAreaWidth->mnIndex = getPropertySetMapper()->FindEntryIndex( CTF_SD_OLE_VIS_AREA_IMPORT_WIDTH );
						pOLEVisAreaWidth->maValue <<= aRect;
					}
					if( pOLEVisAreaHeight )
					{
						pOLEVisAreaHeight->mnIndex = getPropertySetMapper()->FindEntryIndex( CTF_SD_OLE_VIS_AREA_IMPORT_HEIGHT );
						pOLEVisAreaHeight->maValue <<= aRect;
					}
				}
			}
			catch( uno::Exception& )
			{
			}
		}
		else
		{
			if( pOLEVisAreaLeft )	pOLEVisAreaLeft->mnIndex = -1;
			if( pOLEVisAreaTop )	pOLEVisAreaTop->mnIndex = -1;
			if( pOLEVisAreaWidth )	pOLEVisAreaWidth->mnIndex = -1;
			if( pOLEVisAreaHeight )	pOLEVisAreaHeight->mnIndex = -1;
		}

		pOLEIsInternal->mnIndex = -1;
	}

	if( pTextAnimationBlinking && pTextAnimationKind )
	{
		drawing::TextAnimationKind eKind;
		if( (pTextAnimationKind->maValue >>= eKind) && eKind != drawing::TextAnimationKind_BLINK )
		{
			pTextAnimationBlinking->mnIndex = -1;
		}
		else
		{
			pTextAnimationKind->mnIndex = -1;
		}
	}

	if( pRepeatOffsetX && pRepeatOffsetY )
	{
		sal_Int32 nOffset = 0;
		if( ( pRepeatOffsetX->maValue >>= nOffset ) && ( nOffset == 0 ) )
			pRepeatOffsetX->mnIndex = -1;
		else
			pRepeatOffsetY->mnIndex = -1;
	}

	if(pFontWorkStyle)
	{
		// #FontWork#
		sal_Int32 nStyle = 0;

		if(pFontWorkStyle->maValue >>= nStyle)
		{
			if(/*XFT_NONE*/4 == nStyle)
			{
				pFontWorkStyle->mnIndex = -1;
				if(pFontWorkAdjust)
					pFontWorkAdjust->mnIndex = -1;
				if(pFontWorkDistance)
					pFontWorkDistance->mnIndex = -1;
				if(pFontWorkStart)
					pFontWorkStart->mnIndex = -1;
				if(pFontWorkMirror)
					pFontWorkMirror->mnIndex = -1;
				if(pFontWorkOutline)
					pFontWorkOutline->mnIndex = -1;
				if(pFontWorkShadow)
					pFontWorkShadow->mnIndex = -1;
				if(pFontWorkShadowColor)
					pFontWorkShadowColor->mnIndex = -1;
				if(pFontWorkShadowOffsetx)
					pFontWorkShadowOffsetx->mnIndex = -1;
				if(pFontWorkShadowOffsety)
					pFontWorkShadowOffsety->mnIndex = -1;
				if(pFontWorkForm)
					pFontWorkForm->mnIndex = -1;
				if(pFontWorkHideform)
					pFontWorkHideform->mnIndex = -1;
				if(pFontWorkShadowTransparence)
					pFontWorkShadowTransparence->mnIndex = -1;
			}
		}
	}

	if( pCaptionIsEscRel )
	{
		sal_Bool bIsRel = false;
		pCaptionIsEscRel->maValue >>= bIsRel;

		if( bIsRel )
		{
			if( pCaptionEscAbs )
				pCaptionEscAbs->mnIndex = -1;
		}
		else
		{
			if( pCaptionEscRel )
				pCaptionEscRel->mnIndex = -1;
		}

		pCaptionIsEscRel->mnIndex = -1;
	}

	if( pClipState != NULL && pClip11State != NULL  )
		pClip11State->mnIndex = -1;

	SvXMLExportPropertyMapper::ContextFilter(rProperties, rPropSet);
}

void XMLShapeExportPropertyMapper::handleSpecialItem(
		SvXMLAttributeList& rAttrList,
		const XMLPropertyState& rProperty,
		const SvXMLUnitConverter& rUnitConverter,
		const SvXMLNamespaceMap& rNamespaceMap,
		const ::std::vector< XMLPropertyState > *pProperties,
		sal_uInt32 nIdx ) const
{
	switch( getPropertySetMapper()->GetEntryContextId( rProperty.mnIndex ) )
	{
		case CTF_SD_CONTROL_SHAPE_DATA_STYLE:
			// not to be handled by the base class
			break;

		default:
			SvXMLExportPropertyMapper::handleSpecialItem( rAttrList, rProperty, rUnitConverter, rNamespaceMap, pProperties, nIdx );
			break;
	}
}

void XMLShapeExportPropertyMapper::handleElementItem(
    SvXMLExport& rExport,
	const XMLPropertyState& rProperty,
    sal_uInt16 nFlags,
	const ::std::vector< XMLPropertyState > *pProperties,
	sal_uInt32 nIdx) const
{
	switch( getPropertySetMapper()->GetEntryContextId( rProperty.mnIndex ) )
	{
		case CTF_NUMBERINGRULES:
			{
				// only export list-styles as elements in styles section
				if( !mbIsInAutoStyles )
				{
					uno::Reference< container::XIndexReplace > xNumRule( rProperty.maValue, uno::UNO_QUERY );
					if( xNumRule.is() )
						const_cast<XMLShapeExportPropertyMapper*>(this)->maNumRuleExp.exportNumberingRule( maStyleName, xNumRule );
				}
			}
			break;
		default:
			SvXMLExportPropertyMapper::handleElementItem( rExport, rProperty, nFlags, pProperties, nIdx );
			break;
	}
}

//////////////////////////////////////////////////////////////////////////////

XMLPagePropertySetMapper::XMLPagePropertySetMapper(const UniReference< XMLPropertyHandlerFactory >& rFactoryRef)
: XMLPropertySetMapper( aXMLSDPresPageProps, rFactoryRef )
{
}

XMLPagePropertySetMapper::~XMLPagePropertySetMapper()
{
}

// ----------------------------------------

XMLPageExportPropertyMapper::XMLPageExportPropertyMapper( const UniReference< XMLPropertySetMapper >& rMapper, SvXMLExport& rExport ) :
		SvXMLExportPropertyMapper( rMapper ),
		mrExport( rExport ),
		msCDATA( GetXMLToken(XML_CDATA))
{
}

XMLPageExportPropertyMapper::~XMLPageExportPropertyMapper()
{
}

void XMLPageExportPropertyMapper::ContextFilter(
	std::vector< XMLPropertyState >& rProperties,
	uno::Reference< beans::XPropertySet > rPropSet ) const
{
	XMLPropertyState* pRepeatOffsetX = NULL;
	XMLPropertyState* pRepeatOffsetY = NULL;
	XMLPropertyState* pTransType = NULL;
	XMLPropertyState* pTransDuration = NULL;
	XMLPropertyState* pDateTimeUpdate = NULL;
	XMLPropertyState* pDateTimeFormat = NULL;
	XMLPropertyState* pTransitionFadeColor = NULL;

	sal_Int16 nTransitionType = 0;

	// filter properties
	for( std::vector< XMLPropertyState >::iterator aIter = rProperties.begin();
		 aIter != rProperties.end();
		 ++aIter )
	{
        XMLPropertyState *property = &(*aIter);
		if( property->mnIndex == -1 )
			continue;

		// find properties with context
		// to prevent writing this property set mnIndex member to -1
		switch( getPropertySetMapper()->GetEntryContextId( property->mnIndex ))
		{

			case CTF_REPEAT_OFFSET_X:
				pRepeatOffsetX = property;
				break;

			case CTF_REPEAT_OFFSET_Y:
				pRepeatOffsetY = property;
				break;
			case CTF_PAGE_TRANS_TYPE:
				pTransType = property;
				break;
			case CTF_PAGE_TRANS_STYLE:
				if( mrExport.getExportFlags() & EXPORT_OASIS )
					(*property).mnIndex = -1;
				break;
			case CTF_PAGE_TRANSITION_TYPE:
				{
					if( ((mrExport.getExportFlags() & EXPORT_OASIS) == 0) ||
						(((*property).maValue >>= nTransitionType) && (nTransitionType == 0)) )
							(*property).mnIndex = -1;
				}
				break;
			case CTF_PAGE_TRANSITION_SUBTYPE:
				{
					sal_Int16 nTransitionSubtype = sal_Int16();
					if( ((mrExport.getExportFlags() & EXPORT_OASIS) == 0) ||
						(((*property).maValue >>= nTransitionSubtype) && (nTransitionSubtype == 0)) )
							(*property).mnIndex = -1;

				}
				break;
			case CTF_PAGE_TRANSITION_DIRECTION:
				{
					sal_Bool bDirection = sal_Bool();
					if( ((mrExport.getExportFlags() & EXPORT_OASIS) == 0) ||
						(((*property).maValue >>= bDirection) && bDirection) )
							(*property).mnIndex = -1;
				}
				break;
			case CTF_PAGE_TRANSITION_FADECOLOR:
				if( ((mrExport.getExportFlags() & EXPORT_OASIS) == 0) )
					(*property).mnIndex = -1;
				else
					pTransitionFadeColor = property;
				break;
			case CTF_PAGE_TRANS_SPEED:
				{
					presentation::AnimationSpeed aEnum;
					if( ((*property).maValue >>= aEnum) && aEnum == presentation::AnimationSpeed_MEDIUM )
						(*property).mnIndex = -1;
				}
				break;
			case CTF_PAGE_VISIBLE:
//			case CTF_HEADER_VISIBLE:
//			case CTF_FOOTER_VISIBLE:
//			case CTF_PAGE_NUMBER_VISIBLE:
//			case CTF_DATE_TIME_VISIBLE:
				{
					sal_Bool bVisible = false;
					(*property).maValue >>= bVisible;
					if( bVisible )
						(*property).mnIndex = -1;
				}
				break;
			case CTF_PAGE_TRANS_DURATION:
				pTransDuration = property;
				break;
			case CTF_HEADER_TEXT:
			case CTF_FOOTER_TEXT:
			case CTF_DATE_TIME_TEXT:
				{
					OUString aValue;
					(*property).maValue >>= aValue;
					if( aValue.getLength() == 0 )
						(*property).mnIndex = -1;
				}
				break;

			case CTF_DATE_TIME_UPDATE:
				pDateTimeUpdate = property;
				break;

			case CTF_DATE_TIME_FORMAT:
                pDateTimeFormat = property;
				break;
		}
	}

	if( pTransitionFadeColor && nTransitionType != ::com::sun::star::animations::TransitionType::FADE )
		pTransitionFadeColor->mnIndex = -1;

	if( pDateTimeFormat && pDateTimeUpdate )
	{
		sal_Bool bIsFixed = false;
		pDateTimeUpdate->maValue >>= bIsFixed;
		if( bIsFixed )
			pDateTimeFormat->mnIndex = -1;
	}

	if( pRepeatOffsetX && pRepeatOffsetY )
	{
		sal_Int32 nOffset = 0;
		if( ( pRepeatOffsetX->maValue >>= nOffset ) && ( nOffset == 0 ) )
			pRepeatOffsetX->mnIndex = -1;
		else
			pRepeatOffsetY->mnIndex = -1;
	}

	if( pTransType && pTransDuration )
	{
		sal_Int32 nChange = 0;
		pTransType->maValue >>= nChange;

		// only export duration for automatic
		if( nChange != 1 )
			pTransDuration->mnIndex = -1;

		// do not export default transition change
		if( nChange == 0 )
			pTransType->mnIndex = -1;
	}

	SvXMLExportPropertyMapper::ContextFilter(rProperties, rPropSet);
}

void XMLPageExportPropertyMapper::handleElementItem(
    SvXMLExport& rExport,
	const XMLPropertyState& rProperty,
    sal_uInt16 nFlags,
	const ::std::vector< XMLPropertyState > *pProperties,
	sal_uInt32 nIdx) const
{
	switch( getPropertySetMapper()->GetEntryContextId( rProperty.mnIndex ) )
	{
		case CTF_PAGE_SOUND_URL:
			{
				OUString aSoundURL;
				if( (rProperty.maValue >>= aSoundURL) && aSoundURL.getLength() != 0 )
				{
					mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, mrExport.GetRelativeReference(aSoundURL) );
					mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
					mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_NEW );
					mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONREQUEST );
					SvXMLElementExport aElem( mrExport, XML_NAMESPACE_PRESENTATION, XML_SOUND, sal_True, sal_True );
				}
			}
			break;
		default:
			SvXMLExportPropertyMapper::handleElementItem( rExport, rProperty, nFlags, pProperties, nIdx );
			break;
	}
}

