xref: /core/xmloff/source/draw/sdpropls.cxx (revision 6e5cdd9d)
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <com/sun/star/animations/TransitionType.hpp>
21 #include <com/sun/star/ucb/XAnyCompareFactory.hpp>
22 #include <com/sun/star/container/XIndexReplace.hpp>
23 #include <com/sun/star/drawing/LineStyle.hpp>
24 #include <com/sun/star/drawing/LineJoint.hpp>
25 #include <com/sun/star/drawing/LineCap.hpp>
26 #include <com/sun/star/presentation/AnimationSpeed.hpp>
27 #include <com/sun/star/presentation/FadeEffect.hpp>
28 
29 #include <com/sun/star/text/WritingMode.hpp>
30 #include <com/sun/star/text/WritingMode2.hpp>
31 #include <xmloff/EnumPropertyHdl.hxx>
32 #include <xmloff/NamedBoolPropertyHdl.hxx>
33 #include <xmloff/WordWrapPropertyHdl.hxx>
34 #include <enummaps.hxx>
35 #include "numithdl.hxx"
36 #include <XMLBitmapRepeatOffsetPropertyHandler.hxx>
37 #include <XMLFillBitmapSizePropertyHandler.hxx>
38 #include <XMLBitmapLogicalSizePropertyHandler.hxx>
39 #include <com/sun/star/drawing/TextAnimationKind.hpp>
40 #include <com/sun/star/drawing/TextAnimationDirection.hpp>
41 #include <com/sun/star/drawing/TextHorizontalAdjust.hpp>
42 #include <com/sun/star/drawing/TextVerticalAdjust.hpp>
43 #include <com/sun/star/drawing/TextFitToSizeType.hpp>
44 #include <com/sun/star/drawing/MeasureTextHorzPos.hpp>
45 #include <com/sun/star/drawing/MeasureTextVertPos.hpp>
46 #include <xmloff/controlpropertyhdl.hxx>
47 #include <xmloff/xmltoken.hxx>
48 #include "sdpropls.hxx"
49 #include <propimp0.hxx>
50 #include <xmloff/xmlexp.hxx>
51 #include <xmloff/xmlnmspe.hxx>
52 #include <com/sun/star/drawing/NormalsKind.hpp>
53 #include <com/sun/star/drawing/TextureProjectionMode.hpp>
54 #include <com/sun/star/drawing/TextureKind.hpp>
55 #include <com/sun/star/drawing/TextureMode.hpp>
56 #include <com/sun/star/beans/XPropertySet.hpp>
57 #include <xmloff/txtprmap.hxx>
58 #include <XMLClipPropertyHandler.hxx>
59 #include <XMLIsPercentagePropertyHandler.hxx>
60 #include <XMLPercentOrMeasurePropertyHandler.hxx>
61 #include <animations.hxx>
62 #include <sax/tools/converter.hxx>
63 #include <xmlsdtypes.hxx>
64 
65 #include "sdxmlexp_impl.hxx"
66 
67 using ::com::sun::star::uno::Any;
68 
69 using namespace ::com::sun::star;
70 using namespace ::xmloff::token;
71 
72 #define MAP_(name,prefix,token,type,context)  { name, sizeof(name)-1, prefix, token, type, context, SvtSaveOptions::ODFVER_010, false }
73 #define MAPV_(name,prefix,token,type,context,version)  { name, sizeof(name)-1, prefix, token, type, context, version, false }
74 #define GMAP(name,prefix,token,type,context) MAP_(name,prefix,token,type|XML_TYPE_PROP_GRAPHIC,context)
75 #define GMAP_D(name,prefix,token,type,context) MAP_(name,prefix,token,type|XML_TYPE_PROP_GRAPHIC|MID_FLAG_DEFAULT_ITEM_EXPORT,context)
76 #define GMAPV(name,prefix,token,type,context,version) MAPV_(name,prefix,token,type|XML_TYPE_PROP_GRAPHIC,context,version)
77 #define DPMAP(name,prefix,token,type,context) MAP_(name,prefix,token,type|XML_TYPE_PROP_DRAWING_PAGE,context)
78 #define TMAP(name,prefix,token,type,context) MAP_(name,prefix,token,type|XML_TYPE_PROP_TEXT,context)
79 #define PMAP(name,prefix,token,type,context) MAP_(name,prefix,token,type|XML_TYPE_PROP_PARAGRAPH,context)
80 #define MAP_END() { nullptr, 0, 0, XML_EMPTY, 0 ,0, SvtSaveOptions::ODFVER_010, false }
81 
82 // entry list for graphic properties
83 
84 const XMLPropertyMapEntry aXMLSDProperties[] =
85 {
86     // this entry must be first! this is needed for XMLShapeImportHelper::CreateExternalShapePropMapper
87 
88     // ^^^though CreateExternalShapePropMapper is gone now, hmm^^^
89     GMAP( "UserDefinedAttributes",          XML_NAMESPACE_TEXT, XML_XMLNS,                  XML_TYPE_ATTRIBUTE_CONTAINER | MID_FLAG_SPECIAL_ITEM, 0 ),
90 
91     // stroke attributes
92     GMAP( "LineStyle",                      XML_NAMESPACE_DRAW, XML_STROKE,                 XML_SD_TYPE_STROKE, 0 ),
93     GMAP( "LineDashName",                   XML_NAMESPACE_DRAW, XML_STROKE_DASH,            XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT , CTF_DASHNAME ),
94     GMAP( "LineWidth",                      XML_NAMESPACE_SVG,  XML_STROKE_WIDTH,           XML_TYPE_MEASURE, 0 ),
95     GMAP_D("LineColor",                     XML_NAMESPACE_SVG,  XML_STROKE_COLOR,           XML_TYPE_COLOR, 0),
96     GMAP( "LineStartName",                  XML_NAMESPACE_DRAW, XML_MARKER_START,           XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_LINESTARTNAME ),
97     GMAP( "LineStartWidth",                 XML_NAMESPACE_DRAW, XML_MARKER_START_WIDTH,     XML_TYPE_MEASURE, 0 ),
98     GMAP( "LineStartCenter",                XML_NAMESPACE_DRAW, XML_MARKER_START_CENTER,    XML_TYPE_BOOL, 0 ),
99     GMAP( "LineEndName",                    XML_NAMESPACE_DRAW, XML_MARKER_END,             XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_LINEENDNAME ),
100     GMAP( "LineEndWidth",                   XML_NAMESPACE_DRAW, XML_MARKER_END_WIDTH,       XML_TYPE_MEASURE, 0 ),
101     GMAP( "LineEndCenter",                  XML_NAMESPACE_DRAW, XML_MARKER_END_CENTER,      XML_TYPE_BOOL, 0 ),
102     GMAP( "LineTransparence",               XML_NAMESPACE_SVG,  XML_STROKE_OPACITY,         XML_SD_TYPE_OPACITY, 0 ),
103     GMAP( "LineJoint",                      XML_NAMESPACE_DRAW, XML_STROKE_LINEJOIN,        XML_SD_TYPE_LINEJOIN, 0 ),
104     GMAP( "LineCap",                        XML_NAMESPACE_SVG , XML_STROKE_LINECAP,         XML_SD_TYPE_LINECAP, 0 ),
105 
106     // fill attributes
107     GMAP( "FillStyle",                      XML_NAMESPACE_DRAW, XML_FILL,                   XML_SD_TYPE_FILLSTYLE, CTF_FILLSTYLE ),
108     GMAP_D("FillColor",                     XML_NAMESPACE_DRAW, XML_FILL_COLOR,             XML_TYPE_COLOR, CTF_FILLCOLOR ),
109     GMAP_D("FillColor2",                    XML_NAMESPACE_DRAW, XML_SECONDARY_FILL_COLOR,   XML_TYPE_COLOR, 0),
110     GMAP( "FillGradientName",               XML_NAMESPACE_DRAW, XML_FILL_GRADIENT_NAME,     XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_FILLGRADIENTNAME ),
111     GMAP( "FillGradientStepCount",          XML_NAMESPACE_DRAW, XML_GRADIENT_STEP_COUNT,    XML_TYPE_NUMBER16, 0 ),
112     GMAP( "FillHatchName",                  XML_NAMESPACE_DRAW, XML_FILL_HATCH_NAME,        XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_FILLHATCHNAME ),
113     GMAP( "FillBackground",                 XML_NAMESPACE_DRAW, XML_FILL_HATCH_SOLID,       XML_TYPE_BOOL, 0 ),
114     GMAP( "FillBitmapName",                 XML_NAMESPACE_DRAW, XML_FILL_IMAGE_NAME,        XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_FILLBITMAPNAME ),
115     GMAP( "FillTransparence",               XML_NAMESPACE_DRAW, XML_OPACITY,                XML_TYPE_NEG_PERCENT16|MID_FLAG_MULTI_PROPERTY, 0 ),    // exists in SW, too
116     GMAP( "FillTransparenceGradientName",   XML_NAMESPACE_DRAW, XML_OPACITY_NAME,           XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_FILLTRANSNAME ),
117     GMAP( "FillBitmapSizeX",                XML_NAMESPACE_DRAW, XML_FILL_IMAGE_WIDTH,       XML_SD_TYPE_FILLBITMAPSIZE|MID_FLAG_MULTI_PROPERTY, 0 ),
118     GMAP( "FillBitmapLogicalSize",          XML_NAMESPACE_DRAW, XML_FILL_IMAGE_WIDTH,       XML_SD_TYPE_LOGICAL_SIZE|MID_FLAG_MULTI_PROPERTY, 0 ),
119     GMAP( "FillBitmapSizeY",                XML_NAMESPACE_DRAW, XML_FILL_IMAGE_HEIGHT,      XML_SD_TYPE_FILLBITMAPSIZE|MID_FLAG_MULTI_PROPERTY, 0 ),
120     GMAP( "FillBitmapLogicalSize",          XML_NAMESPACE_DRAW, XML_FILL_IMAGE_HEIGHT,      XML_SD_TYPE_LOGICAL_SIZE|MID_FLAG_MULTI_PROPERTY, 0 ),
121     GMAP( "FillBitmapMode",                 XML_NAMESPACE_STYLE,XML_REPEAT,                 XML_SD_TYPE_BITMAP_MODE|MID_FLAG_MULTI_PROPERTY, 0 ),
122     GMAP( "FillBitmapPositionOffsetX",      XML_NAMESPACE_DRAW, XML_FILL_IMAGE_REF_POINT_X, XML_TYPE_PERCENT, 0 ),
123     GMAP( "FillBitmapPositionOffsetY",      XML_NAMESPACE_DRAW, XML_FILL_IMAGE_REF_POINT_Y, XML_TYPE_PERCENT, 0 ),
124     GMAP( "FillBitmapRectanglePoint",       XML_NAMESPACE_DRAW, XML_FILL_IMAGE_REF_POINT,   XML_SD_TYPE_BITMAP_REFPOINT, 0 ),
125     GMAP( "FillBitmapOffsetX",              XML_NAMESPACE_DRAW, XML_TILE_REPEAT_OFFSET,     XML_SD_TYPE_BITMAPREPOFFSETX|MID_FLAG_MULTI_PROPERTY, CTF_REPEAT_OFFSET_X ),
126     GMAP( "FillBitmapOffsetY",              XML_NAMESPACE_DRAW, XML_TILE_REPEAT_OFFSET,     XML_SD_TYPE_BITMAPREPOFFSETY|MID_FLAG_MULTI_PROPERTY, CTF_REPEAT_OFFSET_Y ),
127 
128     // text frame attributes
129     GMAP( "TextHorizontalAdjust",           XML_NAMESPACE_DRAW, XML_TEXTAREA_HORIZONTAL_ALIGN,  XML_SD_TYPE_TEXT_ALIGN, 0 ),
130     GMAP( "TextVerticalAdjust",             XML_NAMESPACE_DRAW, XML_TEXTAREA_VERTICAL_ALIGN,    XML_SD_TYPE_VERTICAL_ALIGN, 0 ),
131     GMAP( "TextAutoGrowHeight",             XML_NAMESPACE_DRAW, XML_AUTO_GROW_HEIGHT,       XML_TYPE_BOOL, 0 ),
132     GMAP( "TextAutoGrowWidth",              XML_NAMESPACE_DRAW, XML_AUTO_GROW_WIDTH,        XML_TYPE_BOOL, 0 ),
133     GMAP( "TextFitToSize",                  XML_NAMESPACE_DRAW, XML_FIT_TO_SIZE,            XML_SD_TYPE_FITTOSIZE|MID_FLAG_MERGE_PROPERTY, 0),
134     GMAPV( "TextFitToSize",                 XML_NAMESPACE_STYLE, XML_SHRINK_TO_FIT,         XML_SD_TYPE_FITTOSIZE_AUTOFIT|MID_FLAG_MERGE_PROPERTY, 0, SvtSaveOptions::ODFVER_012 ),
135     GMAP( "TextContourFrame",               XML_NAMESPACE_DRAW, XML_FIT_TO_CONTOUR,         XML_TYPE_BOOL, 0 ),
136     GMAP( "TextMaximumFrameHeight",         XML_NAMESPACE_FO,   XML_MAX_HEIGHT,             XML_TYPE_MEASURE, 0 ),
137     GMAP( "TextMaximumFrameWidth",          XML_NAMESPACE_FO,   XML_MAX_WIDTH,              XML_TYPE_MEASURE, 0 ),
138     GMAP( "TextMinimumFrameHeight",         XML_NAMESPACE_FO,   XML_MIN_HEIGHT,             XML_TYPE_MEASURE|MID_FLAG_MULTI_PROPERTY, 0 ),  // exists in SW, too
139     GMAP( "TextMinimumFrameWidth",          XML_NAMESPACE_FO,   XML_MIN_WIDTH,              XML_TYPE_MEASURE|MID_FLAG_MULTI_PROPERTY, 0 ),
140     GMAP( "TextUpperDistance",              XML_NAMESPACE_FO,   XML_PADDING_TOP,            XML_TYPE_MEASURE|MID_FLAG_MULTI_PROPERTY, 0 ),  // exists in SW, too
141     GMAP( "TextLowerDistance",              XML_NAMESPACE_FO,   XML_PADDING_BOTTOM,         XML_TYPE_MEASURE|MID_FLAG_MULTI_PROPERTY, 0 ),  // exists in SW, too
142     GMAP( "TextLeftDistance",               XML_NAMESPACE_FO,   XML_PADDING_LEFT,           XML_TYPE_MEASURE|MID_FLAG_MULTI_PROPERTY, 0 ),  // exists in SW, too
143     GMAP( "TextRightDistance",              XML_NAMESPACE_FO,   XML_PADDING_RIGHT,          XML_TYPE_MEASURE|MID_FLAG_MULTI_PROPERTY, 0 ),  // exists in SW, too
144     PMAP( "TextWritingMode",                XML_NAMESPACE_STYLE,XML_WRITING_MODE,           XML_SD_TYPE_WRITINGMODE|MID_FLAG_MULTI_PROPERTY, CTF_WRITINGMODE ),
145     GMAP( "NumberingRules",                 XML_NAMESPACE_TEXT, XML_LIST_STYLE,             XML_SD_TYPE_NUMBULLET|MID_FLAG_ELEMENT_ITEM, CTF_NUMBERINGRULES ),
146     GMAP( "NumberingRules",                 XML_NAMESPACE_TEXT, XML_LIST_STYLE_NAME,        XML_TYPE_STRING, CTF_SD_NUMBERINGRULES_NAME ),
147     GMAP( "TextWordWrap",                   XML_NAMESPACE_FO,   XML_WRAP_OPTION,            XML_TYPE_WRAP_OPTION, 0 ),
148     GMAP( "TextChainNextName",              XML_NAMESPACE_DRAW,   XML_CHAIN_NEXT_NAME,      XML_TYPE_STRING, 0 ),
149 
150     // shadow attributes
151     GMAP( "Shadow",                         XML_NAMESPACE_DRAW, XML_SHADOW,                 XML_SD_TYPE_SHADOW, 0 ),
152     GMAP( "ShadowXDistance",                    XML_NAMESPACE_DRAW, XML_SHADOW_OFFSET_X,        XML_TYPE_MEASURE, 0 ),
153     GMAP( "ShadowYDistance",                    XML_NAMESPACE_DRAW, XML_SHADOW_OFFSET_Y,        XML_TYPE_MEASURE, 0 ),
154     GMAP( "ShadowColor",                        XML_NAMESPACE_DRAW, XML_SHADOW_COLOR,           XML_TYPE_COLOR, 0 ),
155     GMAP( "ShadowTransparence",             XML_NAMESPACE_DRAW, XML_SHADOW_OPACITY, XML_TYPE_NEG_PERCENT, 0 ),
156 
157     // graphic attributes
158     GMAP( "GraphicColorMode",               XML_NAMESPACE_DRAW, XML_COLOR_MODE,             XML_TYPE_COLOR_MODE, 0 ), // exists in SW, too, with same property name
159     GMAP( "AdjustLuminance",                XML_NAMESPACE_DRAW, XML_LUMINANCE,              XML_TYPE_PERCENT16, 0 ), // signed? exists in SW, too, with same property name
160     GMAP( "AdjustContrast",                 XML_NAMESPACE_DRAW, XML_CONTRAST,               XML_TYPE_PERCENT16, 0 ), // signed? exists in SW, too, with same property name
161     GMAP( "Gamma",                          XML_NAMESPACE_DRAW, XML_GAMMA,                  XML_TYPE_DOUBLE_PERCENT, 0 ), // signed? exists in SW, too, with same property name
162     GMAP( "AdjustRed",                      XML_NAMESPACE_DRAW, XML_RED,                    XML_TYPE_PERCENT16, 0 ), // signed? exists in SW, too, with same property name
163     GMAP( "AdjustGreen",                    XML_NAMESPACE_DRAW, XML_GREEN,                  XML_TYPE_PERCENT16, 0 ), // signed? exists in SW, too, with same property name
164     GMAP( "AdjustBlue",                     XML_NAMESPACE_DRAW, XML_BLUE,                   XML_TYPE_PERCENT16, 0 ), // signed? exists in SW, too, with same property name
165     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
166     GMAP( "GraphicCrop",                    XML_NAMESPACE_FO,   XML_CLIP,                   XML_TYPE_TEXT_CLIP11, CTF_TEXT_CLIP11 ), // exists in SW, too, with same property name
167     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#
168     GMAP( "IsMirrored",                     XML_NAMESPACE_STYLE,    XML_MIRROR,             XML_TYPE_SD_MIRROR|MID_FLAG_MULTI_PROPERTY, 0 ),  // exists in SW, too // #i40214#
169 
170     // animation text attributes
171     TMAP( "TextAnimationKind",              XML_NAMESPACE_STYLE,XML_TEXT_BLINKING,          XML_TYPE_TEXT_ANIMATION_BLINKING, CTF_TEXTANIMATION_BLINKING ),
172     GMAP( "TextAnimationKind",              XML_NAMESPACE_TEXT, XML_ANIMATION,              XML_TYPE_TEXT_ANIMATION, CTF_TEXTANIMATION_KIND ),
173     GMAP( "TextAnimationDirection",         XML_NAMESPACE_TEXT, XML_ANIMATION_DIRECTION,    XML_TYPE_TEXT_ANIMATION_DIRECTION, 0 ),
174     GMAP( "TextAnimationStartInside",       XML_NAMESPACE_TEXT, XML_ANIMATION_START_INSIDE, XML_TYPE_BOOL, 0 ),
175     GMAP( "TextAnimationStopInside",            XML_NAMESPACE_TEXT, XML_ANIMATION_STOP_INSIDE,  XML_TYPE_BOOL, 0 ),
176     GMAP( "TextAnimationCount",             XML_NAMESPACE_TEXT, XML_ANIMATION_REPEAT,       XML_TYPE_NUMBER16, 0 ),
177     GMAP( "TextAnimationDelay",             XML_NAMESPACE_TEXT, XML_ANIMATION_DELAY,        XML_TYPE_DURATION16_MS, 0 ),
178     GMAP( "TextAnimationAmount",                XML_NAMESPACE_TEXT, XML_ANIMATION_STEPS,        XML_TYPE_TEXT_ANIMATION_STEPS, 0 ),
179 
180     // connector attributes
181     GMAP( "EdgeNode1HorzDist",              XML_NAMESPACE_DRAW, XML_START_LINE_SPACING_HORIZONTAL,  XML_TYPE_MEASURE, 0 ),
182     GMAP( "EdgeNode1VertDist",              XML_NAMESPACE_DRAW, XML_START_LINE_SPACING_VERTICAL,    XML_TYPE_MEASURE, 0 ),
183     GMAP( "EdgeNode2HorzDist",              XML_NAMESPACE_DRAW, XML_END_LINE_SPACING_HORIZONTAL,    XML_TYPE_MEASURE, 0 ),
184     GMAP( "EdgeNode2VertDist",              XML_NAMESPACE_DRAW, XML_END_LINE_SPACING_VERTICAL,      XML_TYPE_MEASURE, 0 ),
185 
186     // measure attributes
187     GMAP( "MeasureLineDistance",                XML_NAMESPACE_DRAW, XML_LINE_DISTANCE,          XML_TYPE_MEASURE, 0 ),
188     GMAP( "MeasureHelpLineOverhang",            XML_NAMESPACE_DRAW, XML_GUIDE_OVERHANG,         XML_TYPE_MEASURE, 0 ),
189     GMAP( "MeasureHelpLineDistance",            XML_NAMESPACE_DRAW, XML_GUIDE_DISTANCE,         XML_TYPE_MEASURE, 0 ),
190     GMAP( "MeasureHelpLine1Length",         XML_NAMESPACE_DRAW, XML_START_GUIDE,            XML_TYPE_MEASURE, 0 ),
191     GMAP( "MeasureHelpLine2Length",         XML_NAMESPACE_DRAW, XML_END_GUIDE,              XML_TYPE_MEASURE, 0 ),
192     GMAP( "MeasureTextHorizontalPosition",  XML_NAMESPACE_DRAW, XML_MEASURE_ALIGN,          XML_SD_TYPE_MEASURE_HALIGN, 0 ),
193     GMAP( "MeasureTextVerticalPosition",    XML_NAMESPACE_DRAW, XML_MEASURE_VERTICAL_ALIGN, XML_SD_TYPE_MEASURE_VALIGN, 0 ),
194     GMAP( "MeasureUnit",                        XML_NAMESPACE_DRAW, XML_UNIT,                   XML_SD_TYPE_MEASURE_UNIT, 0 ),
195     GMAP( "MeasureShowUnit",                    XML_NAMESPACE_DRAW, XML_SHOW_UNIT,              XML_TYPE_BOOL, 0 ),
196     GMAP( "MeasureBelowReferenceEdge",      XML_NAMESPACE_DRAW, XML_PLACING,                XML_SD_TYPE_MEASURE_PLACING, 0 ),
197     GMAP( "MeasureTextRotate90",                XML_NAMESPACE_DRAW, XML_PARALLEL,               XML_TYPE_BOOL, 0 ),
198     GMAP( "MeasureDecimalPlaces",           XML_NAMESPACE_DRAW, XML_DECIMAL_PLACES,         XML_TYPE_NUMBER16, 0 ),
199 
200     // 3D geometry attributes
201     GMAP( "D3DHorizontalSegments",          XML_NAMESPACE_DR3D, XML_HORIZONTAL_SEGMENTS,    XML_TYPE_NUMBER, 0 ),
202     GMAP( "D3DVerticalSegments",                XML_NAMESPACE_DR3D, XML_VERTICAL_SEGMENTS,      XML_TYPE_NUMBER, 0 ),
203     GMAP( "D3DPercentDiagonal",             XML_NAMESPACE_DR3D, XML_EDGE_ROUNDING,          XML_TYPE_PERCENT, 0 ),
204     GMAP( "D3DBackscale",                   XML_NAMESPACE_DR3D, XML_BACK_SCALE,             XML_TYPE_PERCENT, 0 ),
205     GMAP( "D3DEndAngle",                        XML_NAMESPACE_DR3D, XML_END_ANGLE,              XML_TYPE_NUMBER, 0 ),
206     GMAP( "D3DDepth",                       XML_NAMESPACE_DR3D, XML_DEPTH,                  XML_TYPE_MEASURE, 0 ),
207     GMAP( "D3DDoubleSided",                 XML_NAMESPACE_DR3D, XML_BACKFACE_CULLING,       XML_SD_TYPE_BACKFACE_CULLING, 0 ),
208 
209     // #107245# New 3D properties which are possible for lathe and extrude 3d objects
210     GMAP( "D3DCloseFront",                  XML_NAMESPACE_DR3D, XML_CLOSE_FRONT,            XML_TYPE_BOOL, 0 ),
211     GMAP( "D3DCloseBack",                   XML_NAMESPACE_DR3D, XML_CLOSE_BACK,             XML_TYPE_BOOL, 0 ),
212 
213     // 3D lighting attributes
214     GMAP( "D3DNormalsKind",                 XML_NAMESPACE_DR3D, XML_NORMALS_KIND,           XML_SD_TYPE_NORMALS_KIND, 0 ),
215     GMAP( "D3DNormalsInvert",               XML_NAMESPACE_DR3D, XML_NORMALS_DIRECTION,      XML_SD_TYPE_NORMALS_DIRECTION, 0 ),
216 
217     // 3D texture attributes
218     GMAP( "D3DTextureProjectionX",          XML_NAMESPACE_DR3D, XML_TEX_GENERATION_MODE_X,  XML_SD_TYPE_TEX_GENERATION_MODE_X, 0 ),
219     GMAP( "D3DTextureProjectionY",          XML_NAMESPACE_DR3D, XML_TEX_GENERATION_MODE_Y,  XML_SD_TYPE_TEX_GENERATION_MODE_Y, 0 ),
220     GMAP( "D3DTextureKind",                 XML_NAMESPACE_DR3D, XML_TEX_KIND,               XML_SD_TYPE_TEX_KIND, 0 ),
221     GMAP( "D3DTextureMode",                 XML_NAMESPACE_DR3D, XML_TEX_MODE,               XML_SD_TYPE_TEX_MODE, 0 ),
222     GMAP( "D3DTextureFilter",               XML_NAMESPACE_DR3D, XML_TEX_FILTER,             XML_SD_TYPE_BACKFACE_CULLING, 0 ),
223 
224     // 3D material attributes
225     GMAP( "D3DMaterialColor",               XML_NAMESPACE_DR3D, XML_DIFFUSE_COLOR,          XML_TYPE_COLOR, 0 ),
226     GMAP( "D3DMaterialEmission",                XML_NAMESPACE_DR3D, XML_EMISSIVE_COLOR,         XML_TYPE_COLOR, 0 ),
227     GMAP( "D3DMaterialSpecular",                XML_NAMESPACE_DR3D, XML_SPECULAR_COLOR,         XML_TYPE_COLOR, 0 ),
228     GMAP( "D3DMaterialSpecularIntensity",   XML_NAMESPACE_DR3D, XML_SHININESS,              XML_TYPE_PERCENT, 0 ),
229 
230     // 3D shadow attributes
231     GMAP( "D3DShadow3D",                        XML_NAMESPACE_DR3D, XML_SHADOW,                 XML_SD_TYPE_SHADOW, 0 ),
232 
233     // #FontWork# attributes
234     GMAP( "FontWorkStyle",                  XML_NAMESPACE_DRAW, XML_FONTWORK_STYLE,             XML_SD_TYPE_FONTWORK_STYLE, CTF_FONTWORK_STYLE  ),
235     GMAP( "FontWorkAdjust",                 XML_NAMESPACE_DRAW, XML_FONTWORK_ADJUST,                XML_SD_TYPE_FONTWORK_ADJUST,CTF_FONTWORK_ADJUST ),
236     GMAP( "FontWorkDistance",               XML_NAMESPACE_DRAW, XML_FONTWORK_DISTANCE,              XML_TYPE_MEASURE,           CTF_FONTWORK_DISTANCE   ),
237     GMAP( "FontWorkStart",                  XML_NAMESPACE_DRAW, XML_FONTWORK_START,                 XML_TYPE_MEASURE,           CTF_FONTWORK_START  ),
238     GMAP( "FontWorkMirror",                 XML_NAMESPACE_DRAW, XML_FONTWORK_MIRROR,                XML_TYPE_BOOL,              CTF_FONTWORK_MIRROR ),
239     GMAP( "FontWorkOutline",                    XML_NAMESPACE_DRAW, XML_FONTWORK_OUTLINE,               XML_TYPE_BOOL,              CTF_FONTWORK_OUTLINE    ),
240     GMAP( "FontWorkShadow",                 XML_NAMESPACE_DRAW, XML_FONTWORK_SHADOW,                XML_SD_TYPE_FONTWORK_SHADOW,CTF_FONTWORK_SHADOW ),
241     GMAP( "FontWorkShadowColor",                XML_NAMESPACE_DRAW, XML_FONTWORK_SHADOW_COLOR,          XML_TYPE_COLOR,             CTF_FONTWORK_SHADOWCOLOR    ),
242     GMAP( "FontWorkShadowOffsetX",          XML_NAMESPACE_DRAW, XML_FONTWORK_SHADOW_OFFSET_X,       XML_TYPE_MEASURE,           CTF_FONTWORK_SHADOWOFFSETX  ),
243     GMAP( "FontWorkShadowOffsetY",          XML_NAMESPACE_DRAW, XML_FONTWORK_SHADOW_OFFSET_Y,       XML_TYPE_MEASURE,           CTF_FONTWORK_SHADOWOFFSETY  ),
244     GMAP( "FontWorkForm",                   XML_NAMESPACE_DRAW, XML_FONTWORK_FORM,                  XML_SD_TYPE_FONTWORK_FORM,  CTF_FONTWORK_FORM   ),
245     GMAP( "FontWorkHideForm",               XML_NAMESPACE_DRAW, XML_FONTWORK_HIDE_FORM,             XML_TYPE_BOOL,              CTF_FONTWORK_HIDEFORM   ),
246     GMAP( "FontWorkShadowTransparence",     XML_NAMESPACE_DRAW, XML_FONTWORK_SHADOW_TRANSPARENCE,   XML_TYPE_PERCENT,           CTF_FONTWORK_SHADOWTRANSPARENCE ),
247 
248     // #FontWork# attributes
249     GMAP( "FontWorkStyle",                  XML_NAMESPACE_DRAW_EXT, XML_FONTWORK_STYLE,                 XML_SD_TYPE_FONTWORK_STYLE | MID_FLAG_ELEMENT_ITEM_EXPORT, CTF_FONTWORK_STYLE  ),
250     GMAP( "FontWorkAdjust",                 XML_NAMESPACE_DRAW_EXT, XML_FONTWORK_ADJUST,                XML_SD_TYPE_FONTWORK_ADJUST | MID_FLAG_ELEMENT_ITEM_EXPORT,CTF_FONTWORK_ADJUST ),
251     GMAP( "FontWorkDistance",               XML_NAMESPACE_DRAW_EXT, XML_FONTWORK_DISTANCE,              XML_TYPE_MEASURE | MID_FLAG_ELEMENT_ITEM_EXPORT,           CTF_FONTWORK_DISTANCE   ),
252     GMAP( "FontWorkStart",                  XML_NAMESPACE_DRAW_EXT, XML_FONTWORK_START,                 XML_TYPE_MEASURE | MID_FLAG_ELEMENT_ITEM_EXPORT,           CTF_FONTWORK_START  ),
253     GMAP( "FontWorkMirror",                 XML_NAMESPACE_DRAW_EXT, XML_FONTWORK_MIRROR,                XML_TYPE_BOOL | MID_FLAG_ELEMENT_ITEM_EXPORT,              CTF_FONTWORK_MIRROR ),
254     GMAP( "FontWorkOutline",                XML_NAMESPACE_DRAW_EXT, XML_FONTWORK_OUTLINE,               XML_TYPE_BOOL | MID_FLAG_ELEMENT_ITEM_EXPORT,              CTF_FONTWORK_OUTLINE    ),
255     GMAP( "FontWorkShadow",                 XML_NAMESPACE_DRAW_EXT, XML_FONTWORK_SHADOW,                XML_SD_TYPE_FONTWORK_SHADOW | MID_FLAG_ELEMENT_ITEM_EXPORT,CTF_FONTWORK_SHADOW ),
256     GMAP( "FontWorkShadowColor",            XML_NAMESPACE_DRAW_EXT, XML_FONTWORK_SHADOW_COLOR,          XML_TYPE_COLOR | MID_FLAG_ELEMENT_ITEM_EXPORT,             CTF_FONTWORK_SHADOWCOLOR    ),
257     GMAP( "FontWorkShadowOffsetX",          XML_NAMESPACE_DRAW_EXT, XML_FONTWORK_SHADOW_OFFSET_X,       XML_TYPE_MEASURE | MID_FLAG_ELEMENT_ITEM_EXPORT,           CTF_FONTWORK_SHADOWOFFSETX  ),
258     GMAP( "FontWorkShadowOffsetY",          XML_NAMESPACE_DRAW_EXT, XML_FONTWORK_SHADOW_OFFSET_Y,       XML_TYPE_MEASURE | MID_FLAG_ELEMENT_ITEM_EXPORT,           CTF_FONTWORK_SHADOWOFFSETY  ),
259     GMAP( "FontWorkForm",                   XML_NAMESPACE_DRAW_EXT, XML_FONTWORK_FORM,                  XML_SD_TYPE_FONTWORK_FORM | MID_FLAG_ELEMENT_ITEM_EXPORT,  CTF_FONTWORK_FORM   ),
260     GMAP( "FontWorkHideForm",               XML_NAMESPACE_DRAW_EXT, XML_FONTWORK_HIDE_FORM,             XML_TYPE_BOOL | MID_FLAG_ELEMENT_ITEM_EXPORT,              CTF_FONTWORK_HIDEFORM   ),
261     GMAP( "FontWorkShadowTransparence",     XML_NAMESPACE_DRAW_EXT, XML_FONTWORK_SHADOW_TRANSPARENCE,   XML_TYPE_PERCENT | MID_FLAG_ELEMENT_ITEM_EXPORT,           CTF_FONTWORK_SHADOWTRANSPARENCE ),
262 
263     // control attributes (border exists one more time for the text additions of shapes)
264     GMAP( "ControlSymbolColor",             XML_NAMESPACE_DRAW, XML_SYMBOL_COLOR,           XML_TYPE_COLOR, 0 ),
265     GMAP( "ControlBackground",              XML_NAMESPACE_FO,   XML_BACKGROUND_COLOR,       XML_TYPE_COLOR|MID_FLAG_MULTI_PROPERTY, 0 ),
266     GMAP( "ControlBorder",                  XML_NAMESPACE_FO,   XML_BORDER,                 XML_SD_TYPE_CONTROL_BORDER|MID_FLAG_MULTI_PROPERTY|MID_FLAG_MERGE_ATTRIBUTE, 0 ),
267     GMAP( "ControlBorderColor",             XML_NAMESPACE_FO,   XML_BORDER,                 XML_SD_TYPE_CONTROL_BORDER_COLOR|MID_FLAG_MULTI_PROPERTY|MID_FLAG_MERGE_ATTRIBUTE, 0 ),
268     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 ),
269     GMAP( "ControlTextEmphasis",            XML_NAMESPACE_STYLE,XML_TEXT_EMPHASIZE,         XML_TYPE_CONTROL_TEXT_EMPHASIZE, 0 ),
270     GMAP( "ImageScaleMode",                 XML_NAMESPACE_STYLE,XML_REPEAT,                 XML_SD_TYPE_IMAGE_SCALE_MODE|MID_FLAG_MULTI_PROPERTY, 0 ),
271     GMAP( "ControlWritingMode",             XML_NAMESPACE_STYLE,XML_WRITING_MODE,           XML_TYPE_TEXT_WRITING_MODE_WITH_DEFAULT|MID_FLAG_MULTI_PROPERTY, CTF_CONTROLWRITINGMODE ),
272 
273     // special entries for floating frames
274     GMAP( "FrameIsAutoScroll",          XML_NAMESPACE_DRAW, XML_FRAME_DISPLAY_SCROLLBAR,    XML_TYPE_BOOL|MID_FLAG_MULTI_PROPERTY,              CTF_FRAME_DISPLAY_SCROLLBAR ),
275     GMAP( "FrameIsBorder",              XML_NAMESPACE_DRAW, XML_FRAME_DISPLAY_BORDER,       XML_TYPE_BOOL|MID_FLAG_MULTI_PROPERTY,              CTF_FRAME_DISPLAY_BORDER ),
276     GMAP( "FrameMarginWidth",           XML_NAMESPACE_DRAW, XML_FRAME_MARGIN_HORIZONTAL,    XML_TYPE_MEASURE_PX|MID_FLAG_MULTI_PROPERTY,        CTF_FRAME_MARGIN_HORI ),
277     GMAP( "FrameMarginHeight",          XML_NAMESPACE_DRAW, XML_FRAME_MARGIN_VERTICAL,      XML_TYPE_MEASURE_PX|MID_FLAG_MULTI_PROPERTY,        CTF_FRAME_MARGIN_VERT ),
278     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 ),
279     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 ),
280     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 ),
281     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 ),
282     GMAP( "IsInternal",                 XML_NAMESPACE_DRAW, XML__EMPTY,                     XML_TYPE_BUILDIN_CMP_ONLY,                          CTF_SD_OLE_ISINTERNAL ),
283     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 ),
284     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 ),
285     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 ),
286     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 ),
287 
288     GMAP( "Aspect",                     XML_NAMESPACE_DRAW, XML_DRAW_ASPECT,                XML_TYPE_TEXT_DRAW_ASPECT|MID_FLAG_MULTI_PROPERTY,  CTF_SD_OLE_ASPECT ),
289 
290     // caption properties
291     GMAP( "CaptionType",                    XML_NAMESPACE_DRAW, XML_CAPTION_TYPE,               XML_SD_TYPE_CAPTION_TYPE, 0 ),
292     GMAP( "CaptionIsFixedAngle",            XML_NAMESPACE_DRAW, XML_CAPTION_ANGLE_TYPE,         XML_SD_TYPE_CAPTION_ANGLE_TYPE, 0 ),
293     GMAP( "CaptionAngle",               XML_NAMESPACE_DRAW, XML_CAPTION_ANGLE,              XML_TYPE_NUMBER, 0 ),
294     GMAP( "CaptionGap",                 XML_NAMESPACE_DRAW, XML_CAPTION_GAP,                XML_TYPE_MEASURE, 0 ),
295     GMAP( "CaptionEscapeDirection",     XML_NAMESPACE_DRAW, XML_CAPTION_ESCAPE_DIRECTION,   XML_SD_TYPE_CAPTION_ESC_DIR, 0 ),
296     GMAP( "CaptionIsEscapeRelative",    XML_NAMESPACE_DRAW, XML_CAPTION_ESCAPE,             XML_SD_TYPE_CAPTION_IS_ESC_REL|MID_FLAG_MULTI_PROPERTY, CTF_CAPTION_ISESCREL ),
297     GMAP( "CaptionEscapeRelative",      XML_NAMESPACE_DRAW, XML_CAPTION_ESCAPE,             XML_SD_TYPE_CAPTION_ESC_REL|MID_FLAG_MULTI_PROPERTY, CTF_CAPTION_ESCREL ),
298     GMAP( "CaptionEscapeAbsolute",      XML_NAMESPACE_DRAW, XML_CAPTION_ESCAPE,             XML_SD_TYPE_CAPTION_ESC_ABS|MID_FLAG_MULTI_PROPERTY, CTF_CAPTION_ESCABS ),
299     GMAP( "CaptionLineLength",          XML_NAMESPACE_DRAW, XML_CAPTION_LINE_LENGTH,        XML_TYPE_MEASURE, 0 ),
300     GMAP( "CaptionIsFitLineLength",     XML_NAMESPACE_DRAW, XML_CAPTION_FIT_LINE_LENGTH,    XML_TYPE_BOOL, 0 ),
301 
302     // misc object properties
303     GMAP( "MoveProtect",                    XML_NAMESPACE_STYLE, XML_PROTECT,               XML_SD_TYPE_MOVE_PROTECT|MID_FLAG_MULTI_PROPERTY|MID_FLAG_MERGE_ATTRIBUTE, CTF_SD_MOVE_PROTECT ),
304     GMAP( "SizeProtect",                    XML_NAMESPACE_STYLE, XML_PROTECT,               XML_SD_TYPE_SIZE_PROTECT|MID_FLAG_MULTI_PROPERTY|MID_FLAG_MERGE_ATTRIBUTE, CTF_SD_SIZE_PROTECT ),
305 
306     MAP_END()
307 };
308 
309 // entry list for presentation page properties
310 
311 const XMLPropertyMapEntry aXMLSDPresPageProps[] =
312 {
313     DPMAP( "UserDefinedAttributes",     XML_NAMESPACE_TEXT, XML_XMLNS,                  XML_TYPE_ATTRIBUTE_CONTAINER | MID_FLAG_SPECIAL_ITEM, 0 ),
314 
315     DPMAP( "Change",                        XML_NAMESPACE_PRESENTATION, XML_TRANSITION_TYPE,    XML_SD_TYPE_PRESPAGE_TYPE, CTF_PAGE_TRANS_TYPE ),
316     DPMAP( "Effect",                        XML_NAMESPACE_PRESENTATION, XML_TRANSITION_STYLE,   XML_SD_TYPE_PRESPAGE_STYLE, CTF_PAGE_TRANS_STYLE ),
317     DPMAP( "Speed",                     XML_NAMESPACE_PRESENTATION, XML_TRANSITION_SPEED,   XML_SD_TYPE_PRESPAGE_SPEED, CTF_PAGE_TRANS_SPEED ),
318     DPMAP( "HighResDuration",           XML_NAMESPACE_PRESENTATION, XML_DURATION,           XML_SD_TYPE_PRESPAGE_DURATION, CTF_PAGE_TRANS_DURATION ),
319     DPMAP( "Visible",                   XML_NAMESPACE_PRESENTATION, XML_VISIBILITY,         XML_SD_TYPE_PRESPAGE_VISIBILITY, CTF_PAGE_VISIBLE ),
320     DPMAP( "Sound",                     XML_NAMESPACE_PRESENTATION, XML_SOUND,              XML_TYPE_STRING|MID_FLAG_ELEMENT_ITEM, CTF_PAGE_SOUND_URL ),
321     DPMAP( "BackgroundFullSize",            XML_NAMESPACE_DRAW,         XML_BACKGROUND_SIZE,    XML_SD_TYPE_PRESPAGE_BACKSIZE, CTF_PAGE_BACKSIZE ),
322 
323     DPMAP( "IsBackgroundVisible",       XML_NAMESPACE_PRESENTATION, XML_BACKGROUND_VISIBLE, XML_TYPE_BOOL, 0 ),
324     DPMAP( "IsBackgroundObjectsVisible",    XML_NAMESPACE_PRESENTATION, XML_BACKGROUND_OBJECTS_VISIBLE, XML_TYPE_BOOL, 0 ),
325 
326     DPMAP( "FillStyle",                 XML_NAMESPACE_DRAW, XML_FILL,                   XML_SD_TYPE_FILLSTYLE, 0 ),
327     DPMAP( "FillColor",                 XML_NAMESPACE_DRAW, XML_FILL_COLOR,             XML_TYPE_COLOR, 0 ),
328     DPMAP( "FillGradientName",          XML_NAMESPACE_DRAW, XML_FILL_GRADIENT_NAME,     XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_FILLGRADIENTNAME ),
329     DPMAP( "FillGradientStepCount",     XML_NAMESPACE_DRAW, XML_GRADIENT_STEP_COUNT,    XML_TYPE_NUMBER, 0 ),
330     DPMAP( "FillHatchName",             XML_NAMESPACE_DRAW, XML_FILL_HATCH_NAME,        XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_FILLHATCHNAME ),
331     GMAP( "FillBackground",                 XML_NAMESPACE_DRAW, XML_FILL_HATCH_SOLID,       XML_TYPE_BOOL, 0 ),
332     DPMAP( "FillBitmapName",                XML_NAMESPACE_DRAW, XML_FILL_IMAGE_NAME,    XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_FILLBITMAPNAME ),
333     DPMAP( "FillTransparence",              XML_NAMESPACE_DRAW, XML_OPACITY,           XML_TYPE_NEG_PERCENT|MID_FLAG_MULTI_PROPERTY,  0 ),
334     DPMAP( "FillTransparenceGradientName",  XML_NAMESPACE_DRAW, XML_OPACITY_NAME,       XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_FILLTRANSNAME ),
335     DPMAP( "FillBitmapSizeX",           XML_NAMESPACE_DRAW, XML_FILL_IMAGE_WIDTH,       XML_SD_TYPE_FILLBITMAPSIZE|MID_FLAG_MULTI_PROPERTY, 0 ),
336     DPMAP( "FillBitmapLogicalSize",     XML_NAMESPACE_DRAW, XML_FILL_IMAGE_WIDTH,       XML_SD_TYPE_LOGICAL_SIZE|MID_FLAG_MULTI_PROPERTY, 0 ),
337     DPMAP( "FillBitmapSizeY",           XML_NAMESPACE_DRAW, XML_FILL_IMAGE_HEIGHT,      XML_SD_TYPE_FILLBITMAPSIZE|MID_FLAG_MULTI_PROPERTY, 0 ),
338     DPMAP( "FillBitmapLogicalSize",     XML_NAMESPACE_DRAW, XML_FILL_IMAGE_HEIGHT,      XML_SD_TYPE_LOGICAL_SIZE|MID_FLAG_MULTI_PROPERTY, 0 ),
339     DPMAP( "FillBitmapMode",            XML_NAMESPACE_STYLE,XML_REPEAT,                 XML_SD_TYPE_BITMAP_MODE, 0 ),
340     DPMAP( "FillBitmapPositionOffsetX", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_REF_POINT_X, XML_TYPE_PERCENT, 0 ),
341     DPMAP( "FillBitmapPositionOffsetY", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_REF_POINT_Y, XML_TYPE_PERCENT, 0 ),
342     DPMAP( "FillBitmapRectanglePoint",  XML_NAMESPACE_DRAW, XML_FILL_IMAGE_REF_POINT,   XML_SD_TYPE_BITMAP_REFPOINT, 0 ),
343     DPMAP( "FillBitmapOffsetX",         XML_NAMESPACE_DRAW, XML_TILE_REPEAT_OFFSET,     XML_SD_TYPE_BITMAPREPOFFSETX|MID_FLAG_MULTI_PROPERTY, CTF_REPEAT_OFFSET_X ),
344     DPMAP( "FillBitmapOffsetY",         XML_NAMESPACE_DRAW, XML_TILE_REPEAT_OFFSET, XML_SD_TYPE_BITMAPREPOFFSETY|MID_FLAG_MULTI_PROPERTY, CTF_REPEAT_OFFSET_Y ),
345 
346     DPMAP( "IsHeaderVisible",           XML_NAMESPACE_PRESENTATION, XML_DISPLAY_HEADER,         XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE, CTF_HEADER_VISIBLE ),
347     DPMAP( "IsFooterVisible",           XML_NAMESPACE_PRESENTATION, XML_DISPLAY_FOOTER,         XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE, CTF_FOOTER_VISIBLE ),
348     DPMAP( "IsPageNumberVisible",       XML_NAMESPACE_PRESENTATION, XML_DISPLAY_PAGE_NUMBER,    XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE, CTF_PAGE_NUMBER_VISIBLE ),
349     DPMAP( "IsDateTimeVisible",         XML_NAMESPACE_PRESENTATION, XML_DISPLAY_DATE_TIME,      XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE, CTF_DATE_TIME_VISIBLE ),
350 
351     DPMAP( "TransitionType",            XML_NAMESPACE_SMIL, XML_TYPE,                   XML_SD_TYPE_TRANSITION_TYPE, CTF_PAGE_TRANSITION_TYPE ),
352     DPMAP( "TransitionSubtype",         XML_NAMESPACE_SMIL, XML_SUBTYPE,                XML_SD_TYPE_TRANSTIION_SUBTYPE, CTF_PAGE_TRANSITION_SUBTYPE ),
353     DPMAP( "TransitionDirection",       XML_NAMESPACE_SMIL, XML_DIRECTION,              XML_SD_TYPE_TRANSTIION_DIRECTION, CTF_PAGE_TRANSITION_DIRECTION ),
354     DPMAP( "TransitionFadeColor",       XML_NAMESPACE_SMIL, XML_FADECOLOR,              XML_TYPE_COLOR, CTF_PAGE_TRANSITION_FADECOLOR ),
355     MAP_END()
356 };
357 
358 const XMLPropertyMapEntry aXMLSDPresPageProps_onlyHeadersFooter[] =
359 {
360     DPMAP( "IsHeaderVisible",               XML_NAMESPACE_PRESENTATION, XML_DISPLAY_HEADER,         XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE, CTF_HEADER_VISIBLE ),
361     DPMAP( "IsFooterVisible",               XML_NAMESPACE_PRESENTATION, XML_DISPLAY_FOOTER,         XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE, CTF_FOOTER_VISIBLE ),
362     DPMAP( "IsPageNumberVisible",           XML_NAMESPACE_PRESENTATION, XML_DISPLAY_PAGE_NUMBER,    XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE, CTF_PAGE_NUMBER_VISIBLE ),
363     DPMAP( "IsDateTimeVisible",             XML_NAMESPACE_PRESENTATION, XML_DISPLAY_DATE_TIME,      XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE, CTF_DATE_TIME_VISIBLE ),
364 
365     MAP_END()
366 };
367 
368 /** contains the attribute to property mapping for a drawing layer table
369     WARNING: if attributes are added, SdXMLTableShapeContext::processAttribute needs to be updated!
370 */
371 const XMLPropertyMapEntry aXMLTableShapeAttributes[] =
372 {
373     MAP_( "UseFirstRowStyle",       XML_NAMESPACE_TABLE, XML_USE_FIRST_ROW_STYLES, XML_TYPE_BOOL, 0 ),
374     MAP_( "UseLastRowStyle",        XML_NAMESPACE_TABLE, XML_USE_LAST_ROW_STYLES, XML_TYPE_BOOL, 0 ),
375     MAP_( "UseFirstColumnStyle",    XML_NAMESPACE_TABLE, XML_USE_FIRST_COLUMN_STYLES, XML_TYPE_BOOL, 0 ),
376     MAP_( "UseLastColumnStyle",     XML_NAMESPACE_TABLE, XML_USE_LAST_COLUMN_STYLES, XML_TYPE_BOOL, 0 ),
377     MAP_( "UseBandingRowStyle",     XML_NAMESPACE_TABLE, XML_USE_BANDING_ROWS_STYLES, XML_TYPE_BOOL, 0 ),
378     MAP_( "UseBandingColumnStyle",  XML_NAMESPACE_TABLE, XML_USE_BANDING_COLUMNS_STYLES, XML_TYPE_BOOL, 0 ),
379     MAP_END()
380 };
381 
382 // implementation of factory for own graphic properties
383 
384 static SvXMLEnumMapEntry<drawing::LineStyle> const aXML_LineStyle_EnumMap[] =
385 {
386     { XML_NONE,     drawing::LineStyle_NONE },
387     { XML_SOLID,    drawing::LineStyle_SOLID },
388     { XML_DASH,     drawing::LineStyle_DASH },
389     { XML_TOKEN_INVALID, drawing::LineStyle(0) }
390 };
391 
392 static SvXMLEnumMapEntry<drawing::LineJoint> const aXML_LineJoint_EnumMap[] =
393 {
394     { XML_NONE,     drawing::LineJoint_NONE },
395     { XML_MITER,    drawing::LineJoint_MITER },
396     { XML_ROUND,    drawing::LineJoint_ROUND },
397     { XML_BEVEL,    drawing::LineJoint_BEVEL },
398     { XML_MIDDLE,   drawing::LineJoint_MIDDLE },
399     { XML_TOKEN_INVALID, drawing::LineJoint(0) }
400 };
401 
402 static SvXMLEnumMapEntry<drawing::LineCap> const aXML_LineCap_EnumMap[] =
403 {
404     { XML_BUTT, drawing::LineCap_BUTT },
405     { XML_ROUND, drawing::LineCap_ROUND },
406     // use XML_GRADIENTSTYLE_SQUARE as XML_SQUARE, is defined as "square" already
407     { XML_GRADIENTSTYLE_SQUARE, drawing::LineCap_SQUARE },
408     { XML_TOKEN_INVALID, drawing::LineCap(0) }
409 };
410 
411 SvXMLEnumMapEntry<drawing::FillStyle> const aXML_FillStyle_EnumMap[] =
412 {
413     { XML_NONE,     drawing::FillStyle_NONE },
414     { XML_SOLID,    drawing::FillStyle_SOLID },
415     { XML_BITMAP,   drawing::FillStyle_BITMAP },
416     { XML_GRADIENT, drawing::FillStyle_GRADIENT },
417     { XML_HATCH,    drawing::FillStyle_HATCH },
418     { XML_TOKEN_INVALID, drawing::FillStyle(0) }
419 };
420 
421 static SvXMLEnumMapEntry<sal_Int32> const aXML_PresChange_EnumMap[] =
422 {
423     { XML_MANUAL,           0 },
424     { XML_AUTOMATIC,        1 },
425     { XML_SEMI_AUTOMATIC,   2 },
426     { XML_TOKEN_INVALID,    0 }
427 };
428 
429 static SvXMLEnumMapEntry<presentation::AnimationSpeed> const aXML_TransSpeed_EnumMap[] =
430 {
431     { XML_FAST,     presentation::AnimationSpeed_FAST },
432     { XML_MEDIUM,   presentation::AnimationSpeed_MEDIUM },
433     { XML_SLOW,     presentation::AnimationSpeed_SLOW },
434     { XML_TOKEN_INVALID, presentation::AnimationSpeed(0) }
435 };
436 
437 static SvXMLEnumMapEntry<presentation::FadeEffect> const aXML_FadeEffect_EnumMap[] =
438 {
439     { XML_NONE,                 presentation::FadeEffect_NONE },
440     { XML_FADE_FROM_LEFT,       presentation::FadeEffect_FADE_FROM_LEFT },
441     { XML_FADE_FROM_TOP,        presentation::FadeEffect_FADE_FROM_TOP },
442     { XML_FADE_FROM_RIGHT,      presentation::FadeEffect_FADE_FROM_RIGHT },
443     { XML_FADE_FROM_BOTTOM,     presentation::FadeEffect_FADE_FROM_BOTTOM },
444     { XML_FADE_TO_CENTER,       presentation::FadeEffect_FADE_TO_CENTER },
445     { XML_FADE_FROM_CENTER,     presentation::FadeEffect_FADE_FROM_CENTER },
446     { XML_MOVE_FROM_LEFT,       presentation::FadeEffect_MOVE_FROM_LEFT },
447     { XML_MOVE_FROM_TOP,        presentation::FadeEffect_MOVE_FROM_TOP },
448     { XML_MOVE_FROM_RIGHT,      presentation::FadeEffect_MOVE_FROM_RIGHT },
449     { XML_MOVE_FROM_BOTTOM,     presentation::FadeEffect_MOVE_FROM_BOTTOM },
450     { XML_ROLL_FROM_TOP,        presentation::FadeEffect_ROLL_FROM_TOP },
451     { XML_ROLL_FROM_LEFT,       presentation::FadeEffect_ROLL_FROM_LEFT },
452     { XML_ROLL_FROM_RIGHT,      presentation::FadeEffect_ROLL_FROM_RIGHT },
453     { XML_ROLL_FROM_BOTTOM,     presentation::FadeEffect_ROLL_FROM_BOTTOM },
454     { XML_VERTICAL_STRIPES,     presentation::FadeEffect_VERTICAL_STRIPES },
455     { XML_HORIZONTAL_STRIPES,   presentation::FadeEffect_HORIZONTAL_STRIPES },
456     { XML_CLOCKWISE,            presentation::FadeEffect_CLOCKWISE },
457     { XML_COUNTERCLOCKWISE,     presentation::FadeEffect_COUNTERCLOCKWISE },
458     { XML_FADE_FROM_UPPERLEFT,  presentation::FadeEffect_FADE_FROM_UPPERLEFT },
459     { XML_FADE_FROM_UPPERRIGHT, presentation::FadeEffect_FADE_FROM_UPPERRIGHT },
460     { XML_FADE_FROM_LOWERLEFT,  presentation::FadeEffect_FADE_FROM_LOWERLEFT },
461     { XML_FADE_FROM_LOWERRIGHT, presentation::FadeEffect_FADE_FROM_LOWERRIGHT },
462     { XML_CLOSE_VERTICAL,       presentation::FadeEffect_CLOSE_VERTICAL },
463     { XML_CLOSE_HORIZONTAL,     presentation::FadeEffect_CLOSE_HORIZONTAL },
464     { XML_OPEN_VERTICAL,        presentation::FadeEffect_OPEN_VERTICAL },
465     { XML_OPEN_HORIZONTAL,      presentation::FadeEffect_OPEN_HORIZONTAL },
466     { XML_SPIRALIN_LEFT,        presentation::FadeEffect_SPIRALIN_LEFT },
467     { XML_SPIRALIN_RIGHT,       presentation::FadeEffect_SPIRALIN_RIGHT },
468     { XML_SPIRALOUT_LEFT,       presentation::FadeEffect_SPIRALOUT_LEFT },
469     { XML_SPIRALOUT_RIGHT,      presentation::FadeEffect_SPIRALOUT_RIGHT },
470     { XML_DISSOLVE,             presentation::FadeEffect_DISSOLVE },
471     { XML_WAVYLINE_FROM_LEFT,   presentation::FadeEffect_WAVYLINE_FROM_LEFT },
472     { XML_WAVYLINE_FROM_TOP,    presentation::FadeEffect_WAVYLINE_FROM_TOP },
473     { XML_WAVYLINE_FROM_RIGHT,  presentation::FadeEffect_WAVYLINE_FROM_RIGHT },
474     { XML_WAVYLINE_FROM_BOTTOM, presentation::FadeEffect_WAVYLINE_FROM_BOTTOM },
475     { XML_RANDOM,               presentation::FadeEffect_RANDOM },
476     { XML_STRETCH_FROM_LEFT,    presentation::FadeEffect_STRETCH_FROM_LEFT },
477     { XML_STRETCH_FROM_TOP,     presentation::FadeEffect_STRETCH_FROM_TOP },
478     { XML_STRETCH_FROM_RIGHT,   presentation::FadeEffect_STRETCH_FROM_RIGHT },
479     { XML_STRETCH_FROM_BOTTOM,  presentation::FadeEffect_STRETCH_FROM_BOTTOM },
480     { XML_VERTICAL_LINES,       presentation::FadeEffect_VERTICAL_LINES },
481     { XML_HORIZONTAL_LINES,     presentation::FadeEffect_HORIZONTAL_LINES },
482     { XML_MOVE_FROM_UPPERLEFT,  presentation::FadeEffect_MOVE_FROM_UPPERLEFT },
483     { XML_MOVE_FROM_UPPERRIGHT, presentation::FadeEffect_MOVE_FROM_UPPERRIGHT },
484     { XML_MOVE_FROM_LOWERRIGHT, presentation::FadeEffect_MOVE_FROM_LOWERRIGHT },
485     { XML_MOVE_FROM_LOWERLEFT,  presentation::FadeEffect_MOVE_FROM_LOWERLEFT },
486     { XML_UNCOVER_TO_LEFT,      presentation::FadeEffect_UNCOVER_TO_LEFT },
487     { XML_UNCOVER_TO_UPPERLEFT, presentation::FadeEffect_UNCOVER_TO_UPPERLEFT },
488     { XML_UNCOVER_TO_TOP,       presentation::FadeEffect_UNCOVER_TO_TOP },
489     { XML_UNCOVER_TO_UPPERRIGHT,presentation::FadeEffect_UNCOVER_TO_UPPERRIGHT },
490     { XML_UNCOVER_TO_RIGHT,     presentation::FadeEffect_UNCOVER_TO_RIGHT },
491     { XML_UNCOVER_TO_LOWERRIGHT,presentation::FadeEffect_UNCOVER_TO_LOWERRIGHT },
492     { XML_UNCOVER_TO_BOTTOM,    presentation::FadeEffect_UNCOVER_TO_BOTTOM },
493     { XML_UNCOVER_TO_LOWERLEFT, presentation::FadeEffect_UNCOVER_TO_LOWERLEFT },
494     { XML_VERTICAL_CHECKERBOARD,presentation::FadeEffect_VERTICAL_CHECKERBOARD },
495     { XML_HORIZONTAL_CHECKERBOARD,presentation::FadeEffect_HORIZONTAL_CHECKERBOARD },
496     { XML_TOKEN_INVALID, presentation::FadeEffect(0) }
497 };
498 
499 SvXMLEnumMapEntry<drawing::ConnectorType> const aXML_ConnectionKind_EnumMap[] =
500 {
501     { XML_STANDARD,     drawing::ConnectorType_STANDARD },
502     { XML_CURVE,        drawing::ConnectorType_CURVE },
503     { XML_LINE,         drawing::ConnectorType_LINE },
504     { XML_LINES,        drawing::ConnectorType_LINES },
505     { XML_TOKEN_INVALID, drawing::ConnectorType(0) }
506 };
507 
508 SvXMLEnumMapEntry<drawing::BitmapMode> const aXML_BitmapMode_EnumMap[] =
509 {
510     { XML_REPEAT,                   drawing::BitmapMode_REPEAT },
511     { XML_STRETCH,                  drawing::BitmapMode_STRETCH },
512     { XML_BACKGROUND_NO_REPEAT,     drawing::BitmapMode_NO_REPEAT },
513     { XML_TOKEN_INVALID, drawing::BitmapMode(0) }
514 };
515 
516 // 3D EnumMaps
517 
518 static SvXMLEnumMapEntry<drawing::NormalsKind> const  aXML_NormalsKind_EnumMap[] =
519 {
520     { XML_OBJECT,       drawing::NormalsKind_SPECIFIC },
521     { XML_FLAT,         drawing::NormalsKind_FLAT },
522     { XML_SPHERE,       drawing::NormalsKind_SPHERE },
523     { XML_TOKEN_INVALID, drawing::NormalsKind(0) }
524 };
525 
526 static SvXMLEnumMapEntry<drawing::TextureProjectionMode> const  aXML_TexGenerationX_EnumMap[] =
527 {
528     { XML_OBJECT,       drawing::TextureProjectionMode_OBJECTSPECIFIC },
529     { XML_PARALLEL,     drawing::TextureProjectionMode_PARALLEL },
530     { XML_SPHERE,       drawing::TextureProjectionMode_SPHERE },
531     { XML_TOKEN_INVALID, drawing::TextureProjectionMode(0) }
532 };
533 
534 static SvXMLEnumMapEntry<drawing::TextureProjectionMode> const  aXML_TexGenerationY_EnumMap[] =
535 {
536     { XML_OBJECT,       drawing::TextureProjectionMode_OBJECTSPECIFIC },
537     { XML_PARALLEL,     drawing::TextureProjectionMode_PARALLEL },
538     { XML_SPHERE,       drawing::TextureProjectionMode_SPHERE },
539     { XML_TOKEN_INVALID, drawing::TextureProjectionMode(0) }
540 };
541 
542 static SvXMLEnumMapEntry<drawing::TextureKind> const  aXML_TexKind_EnumMap[] =
543 {
544     { XML_LUMINANCE,    drawing::TextureKind_LUMINANCE },
545     { XML_COLOR,        drawing::TextureKind_COLOR },
546     { XML_TOKEN_INVALID, drawing::TextureKind(0) }
547 };
548 
549 static SvXMLEnumMapEntry<drawing::TextureMode> const  aXML_TexMode_EnumMap[] =
550 {
551     { XML_REPLACE,      drawing::TextureMode_REPLACE },
552     { XML_MODULATE,     drawing::TextureMode_MODULATE },
553     { XML_BLEND,        drawing::TextureMode_BLEND },
554     { XML_TOKEN_INVALID, drawing::TextureMode(0) }
555 };
556 
557 SvXMLEnumMapEntry<drawing::RectanglePoint> const aXML_RefPoint_EnumMap[] =
558 {
559     { XML_TOP_LEFT,     drawing::RectanglePoint_LEFT_TOP },
560     { XML_TOP,          drawing::RectanglePoint_MIDDLE_TOP },
561     { XML_TOP_RIGHT,    drawing::RectanglePoint_RIGHT_TOP },
562     { XML_LEFT,         drawing::RectanglePoint_LEFT_MIDDLE },
563     { XML_CENTER,       drawing::RectanglePoint_MIDDLE_MIDDLE },
564     { XML_RIGHT,        drawing::RectanglePoint_RIGHT_MIDDLE },
565     { XML_BOTTOM_LEFT,  drawing::RectanglePoint_LEFT_BOTTOM },
566     { XML_BOTTOM,       drawing::RectanglePoint_MIDDLE_BOTTOM },
567     { XML_BOTTOM_RIGHT, drawing::RectanglePoint_RIGHT_BOTTOM },
568     { XML_TOKEN_INVALID, drawing::RectanglePoint(0) }
569 };
570 
571 SvXMLEnumMapEntry<drawing::CircleKind> const aXML_CircleKind_EnumMap[] =
572 {
573     { XML_FULL,         drawing::CircleKind_FULL },
574     { XML_SECTION,      drawing::CircleKind_SECTION },
575     { XML_CUT,          drawing::CircleKind_CUT },
576     { XML_ARC,          drawing::CircleKind_ARC },
577     { XML_TOKEN_INVALID, drawing::CircleKind(0) }
578 };
579 
580 static SvXMLEnumMapEntry<text::WritingMode> const aXML_WritingMode_EnumMap[] =
581 {
582     { XML_TB_RL,        text::WritingMode_TB_RL },
583     { XML_LR_TB,        text::WritingMode_LR_TB },
584     { XML_TOKEN_INVALID, text::WritingMode(0) }
585 };
586 
587 static SvXMLEnumMapEntry<drawing::TextAnimationKind> const pXML_TextAnimation_Enum[] =
588 {
589     { XML_NONE,         drawing::TextAnimationKind_NONE },
590     { XML_BLINKING,     drawing::TextAnimationKind_BLINK }, // will be filtered
591     { XML_SCROLL,       drawing::TextAnimationKind_SCROLL },
592     { XML_ALTERNATE,    drawing::TextAnimationKind_ALTERNATE },
593     { XML_SLIDE,        drawing::TextAnimationKind_SLIDE },
594     { XML_TOKEN_INVALID, drawing::TextAnimationKind(0) }
595 };
596 
597 static SvXMLEnumMapEntry<drawing::TextAnimationKind> const pXML_TextAnimation_Blinking_Enum[] =
598 {
599     { XML_FALSE,        drawing::TextAnimationKind_NONE },
600     { XML_TRUE,         drawing::TextAnimationKind_BLINK },
601     { XML_FALSE,        drawing::TextAnimationKind_SCROLL },
602     { XML_FALSE,        drawing::TextAnimationKind_ALTERNATE },
603     { XML_FALSE,        drawing::TextAnimationKind_SLIDE },
604     { XML_TOKEN_INVALID, drawing::TextAnimationKind(0) }
605 };
606 
607 static SvXMLEnumMapEntry<drawing::TextAnimationDirection> const pXML_TextAnimationDirection_Enum[] =
608 {
609     { XML_LEFT,         drawing::TextAnimationDirection_LEFT },
610     { XML_RIGHT,        drawing::TextAnimationDirection_RIGHT },    // will be filtered
611     { XML_UP,           drawing::TextAnimationDirection_UP },
612     { XML_DOWN,         drawing::TextAnimationDirection_DOWN },
613     { XML_TOKEN_INVALID, drawing::TextAnimationDirection(0) }
614 };
615 
616 static SvXMLEnumMapEntry<drawing::TextHorizontalAdjust> const pXML_TextAlign_Enum[] =
617 {
618     { XML_LEFT,         drawing::TextHorizontalAdjust_LEFT },
619     { XML_CENTER,       drawing::TextHorizontalAdjust_CENTER },
620     { XML_RIGHT,        drawing::TextHorizontalAdjust_RIGHT },
621     { XML_JUSTIFY,      drawing::TextHorizontalAdjust_BLOCK },
622     { XML_TOKEN_INVALID, drawing::TextHorizontalAdjust(0) }
623 };
624 
625 static SvXMLEnumMapEntry<drawing::TextVerticalAdjust> const pXML_VerticalAlign_Enum[] =
626 {
627     { XML_TOP,          drawing::TextVerticalAdjust_TOP },
628     { XML_MIDDLE,       drawing::TextVerticalAdjust_CENTER },
629     { XML_BOTTOM,       drawing::TextVerticalAdjust_BOTTOM },
630     { XML_JUSTIFY,      drawing::TextVerticalAdjust_BLOCK },
631     { XML_TOKEN_INVALID, drawing::TextVerticalAdjust(0) }
632 };
633 
634 // note: PROPORTIONAL and ALLLINES are the same thing now!
635 static SvXMLEnumMapEntry<drawing::TextFitToSizeType> const pXML_FitToSize_Enum_Odf12[] =
636 {
637     { XML_FALSE,        drawing::TextFitToSizeType_NONE },
638     { XML_TRUE,         drawing::TextFitToSizeType_PROPORTIONAL },
639     { XML_TRUE,         drawing::TextFitToSizeType_ALLLINES },
640     { XML_FALSE,        drawing::TextFitToSizeType_AUTOFIT },
641     { XML_TOKEN_INVALID, drawing::TextFitToSizeType(0) }
642 };
643 
644 static SvXMLEnumMapEntry<drawing::TextFitToSizeType> const pXML_FitToSize_Enum[] =
645 {
646     { XML_FALSE,        drawing::TextFitToSizeType_NONE },
647     { XML_TRUE,         drawing::TextFitToSizeType_PROPORTIONAL },
648     { XML_ALL,          drawing::TextFitToSizeType_ALLLINES },
649     { XML_SHRINK_TO_FIT,drawing::TextFitToSizeType_AUTOFIT },
650     { XML_TOKEN_INVALID, drawing::TextFitToSizeType(0) }
651 };
652 
653 static SvXMLEnumMapEntry<drawing::TextFitToSizeType> const pXML_ShrinkToFit_Enum[] =
654 {
655     { XML_FALSE,        drawing::TextFitToSizeType_NONE },
656     { XML_FALSE,        drawing::TextFitToSizeType_PROPORTIONAL },
657     { XML_FALSE,        drawing::TextFitToSizeType_ALLLINES },
658     { XML_TRUE,         drawing::TextFitToSizeType_AUTOFIT },
659     { XML_TOKEN_INVALID, drawing::TextFitToSizeType(0) }
660 };
661 
662 static SvXMLEnumMapEntry<sal_Int32> const pXML_MeasureUnit_Enum[] =
663 {
664     { XML_AUTOMATIC,    0 },
665     { XML_UNIT_MM,      1 },
666     { XML_UNIT_CM,      2 },
667     { XML_UNIT_M,       3 },
668     { XML_UNIT_KM,      4 },
669     { XML_UNIT_PT,      6 },
670     { XML_UNIT_PC,      7 },
671     { XML_UNIT_INCH,    8 },
672     { XML_UNIT_FOOT,    9 },
673     { XML_UNIT_MILES,   10 },
674     { XML_TOKEN_INVALID,0 }
675 };
676 
677 static SvXMLEnumMapEntry<drawing::MeasureTextHorzPos> const pXML_Measure_HAlign_Enum[] =
678 {
679     { XML_AUTOMATIC,        drawing::MeasureTextHorzPos_AUTO },
680     { XML_LEFT_OUTSIDE,     drawing::MeasureTextHorzPos_LEFTOUTSIDE },
681     { XML_INSIDE,           drawing::MeasureTextHorzPos_INSIDE },
682     { XML_RIGHT_OUTSIDE,    drawing::MeasureTextHorzPos_RIGHTOUTSIDE},
683     { XML_TOKEN_INVALID, drawing::MeasureTextHorzPos(0) }
684 };
685 
686 static SvXMLEnumMapEntry<drawing::MeasureTextVertPos> const pXML_Measure_VAlign_Enum[] =
687 {
688     { XML_AUTOMATIC,    drawing::MeasureTextVertPos_AUTO },
689     { XML_ABOVE,        drawing::MeasureTextVertPos_EAST },
690     { XML_BELOW,        drawing::MeasureTextVertPos_WEST },
691     { XML_CENTER,       drawing::MeasureTextVertPos_CENTERED },
692     { XML_TOKEN_INVALID, drawing::MeasureTextVertPos(0) }
693 };
694 
695 // #FontWork#
696 static SvXMLEnumMapEntry<sal_Int32> const pXML_Fontwork_Style_Enum[] =
697 {
698     { XML_ROTATE,       0 }, //XFormTextStyle::Rotate,
699     { XML_UPRIGHT,      1 }, //XFormTextStyle::Upright,
700     { XML_SLANT_X,      2 }, //XFormTextStyle::SlantX,
701     { XML_SLANT_Y,      3 }, //XFormTextStyle::SlantY,
702     { XML_NONE,         4 }, //XFormTextStyle::NONE
703     { XML_TOKEN_INVALID,0 }
704 };
705 
706 static SvXMLEnumMapEntry<sal_Int32> const pXML_Fontwork_Adjust_Enum[] =
707 {
708     { XML_LEFT,         0 }, //XFormTextAdjust::Left,
709     { XML_RIGHT,        1 }, //XFormTextAdjust::Right,
710     { XML_AUTOSIZE,     2 }, //XFormTextAdjust::AutoSize,
711     { XML_CENTER,       3 }, //XFormTextAdjust::Center
712     { XML_TOKEN_INVALID,0 }
713 };
714 
715 static SvXMLEnumMapEntry<sal_Int32> const pXML_Fontwork_Shadow_Enum[] =
716 {
717     { XML_NORMAL,       0 }, //XFormTextShadow::Normal,
718     { XML_SLANT,        1 }, //XFormTextShadow::Slant,
719     { XML_NONE,         2 }, //XFormTextShadow::NONE
720     { XML_TOKEN_INVALID,0 }
721 };
722 
723 static SvXMLEnumMapEntry<sal_Int32> const pXML_Fontwork_Form_Enum[] =
724 {
725     { XML_NONE,             0 }, //XFTFORM_NONE,
726     { XML_TOPCIRCLE,        1 }, //XFTFORM_TOPCIRC,
727     { XML_BOTTOMCIRCLE,     2 }, //XFTFORM_BOTCIRC,
728     { XML_LEFTCIRCLE,       3 }, //XFTFORM_LFTCIRC,
729     { XML_RIGHTCIRCLE,      4 }, //XFTFORM_RGTCIRC,
730     { XML_TOPARC,           5 }, //XFTFORM_TOPARC,
731     { XML_BOTTOMARC,        6 }, //XFTFORM_BOTARC,
732     { XML_LEFTARC,          7 }, //XFTFORM_LFTARC,
733     { XML_RIGHTARC,         8 }, //XFTFORM_RGTARC,
734     { XML_BUTTON1,          9 }, //XFTFORM_BUTTON1,
735     { XML_BUTTON2,          10 }, //XFTFORM_BUTTON2,
736     { XML_BUTTON3,          11 }, //XFTFORM_BUTTON3,
737     { XML_BUTTON4,          12 }, //XFTFORM_BUTTON4
738     { XML_TOKEN_INVALID,0 }
739 };
740 
741 static SvXMLEnumMapEntry<sal_Int32> const pXML_Caption_Esc_Dir_Enum[] =
742 {
743     { XML_HORIZONTAL,       0 }, //SdrCaptionEscDir::Horizontal,
744     { XML_VERTICAL,         1 }, //SdrCaptionEscDir::Vertical,
745     { XML_AUTO,             2 }, //SdrCaptionEscDir::BestFit,
746     { XML_TOKEN_INVALID,0 }
747 };
748 
749 static SvXMLEnumMapEntry<sal_Int32> const pXML_Caption_Type_Enum[] =
750 {
751     { XML_STRAIGHT_LINE,            0 }, //SdrCaptionType::Type1,
752     { XML_ANGLED_LINE,              1 }, //SdrCaptionType::Type2,
753     { XML_ANGLED_CONNECTOR_LINE,    2 }, //SdrCaptionType::Type3,
754     { XML_TOKEN_INVALID,0 }
755 };
756 
757 class XMLCaptionEscapeRelative : public XMLPropertyHandler
758 {
759 public:
760     virtual bool importXML(
761             const OUString& rStrImpValue,
762             css::uno::Any& rValue,
763             const SvXMLUnitConverter& rUnitConverter ) const override;
764     virtual bool exportXML(
765             OUString& rStrExpValue,
766             const css::uno::Any& rValue,
767             const SvXMLUnitConverter& rUnitConverter ) const override;
768 };
769 
770 bool XMLCaptionEscapeRelative::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
771 {
772     sal_Int32 nValue;
773 
774     if (!::sax::Converter::convertPercent( nValue, rStrImpValue ))
775         return false;
776 
777     nValue *= 100;
778     rValue <<= nValue;
779     return true;
780 }
781 
782 bool XMLCaptionEscapeRelative::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
783 {
784     sal_Int32 nValue = 0;
785     if( !(rValue >>= nValue ) )
786         return false;
787 
788     nValue /= 100;
789     OUStringBuffer aOut;
790     ::sax::Converter::convertPercent( aOut, nValue );
791     rStrExpValue = aOut.makeStringAndClear();
792     return true;
793 }
794 
795 class XMLMoveSizeProtectHdl : public XMLPropertyHandler
796 {
797 public:
798     explicit XMLMoveSizeProtectHdl( sal_Int32 nType ) : mnType( nType ) {}
799 
800     virtual bool importXML(
801             const OUString& rStrImpValue,
802             css::uno::Any& rValue,
803             const SvXMLUnitConverter& rUnitConverter ) const override;
804     virtual bool exportXML(
805             OUString& rStrExpValue,
806             const css::uno::Any& rValue,
807             const SvXMLUnitConverter& rUnitConverter ) const override;
808 private:
809     const sal_Int32 mnType;
810 };
811 
812 bool XMLMoveSizeProtectHdl::importXML( const OUString& rStrImpValue, Any& rValue, const SvXMLUnitConverter& ) const
813 {
814     const bool bValue = rStrImpValue.indexOf( GetXMLToken( mnType == XML_SD_TYPE_MOVE_PROTECT ? XML_POSITION : XML_SIZE ) ) != -1;
815     rValue <<= bValue;
816     return true;
817 }
818 
819 bool XMLMoveSizeProtectHdl::exportXML( OUString& rStrExpValue, const Any& rValue, const SvXMLUnitConverter& ) const
820 {
821     bool bValue;
822     if( !(rValue >>= bValue ) )
823         return false;
824 
825     if( bValue )
826     {
827         if( !rStrExpValue.isEmpty() )
828             rStrExpValue += " ";
829 
830         rStrExpValue += GetXMLToken( mnType == XML_SD_TYPE_MOVE_PROTECT ? XML_POSITION : XML_SIZE );
831     }
832 
833     return true;
834 }
835 
836 class XMLSdHeaderFooterVisibilityTypeHdl : public XMLPropertyHandler
837 {
838 public:
839     virtual bool importXML( const OUString& rStrImpValue, css::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const override;
840     virtual bool exportXML( OUString& rStrExpValue, const css::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const override;
841 };
842 
843 bool XMLSdHeaderFooterVisibilityTypeHdl::importXML(
844         const OUString& rStrImpValue,
845         css::uno::Any& rValue,
846         const SvXMLUnitConverter& ) const
847 {
848     // #i38644#
849     // attributes with this type where saved with VISIBLE|HIDDEN prior
850     // to src680m67. So we have to import that correctly
851     const bool bBool = IsXMLToken(rStrImpValue, XML_TRUE) || IsXMLToken(rStrImpValue, XML_VISIBLE);
852     rValue <<= bBool;
853     return bBool || IsXMLToken(rStrImpValue, XML_FALSE) || IsXMLToken(rStrImpValue, XML_HIDDEN);
854 }
855 
856 bool XMLSdHeaderFooterVisibilityTypeHdl::exportXML(
857         OUString& rStrExpValue,
858         const Any& rValue,
859         const SvXMLUnitConverter& ) const
860 {
861     bool bRet = false;
862     OUStringBuffer aOut;
863     bool bValue;
864 
865     if (rValue >>= bValue)
866     {
867         ::sax::Converter::convertBool( aOut, bValue );
868         rStrExpValue = aOut.makeStringAndClear();
869 
870         bRet = true;
871     }
872 
873     return bRet;
874 }
875 
876 class XMLSdRotationAngleTypeHdl : public XMLPropertyHandler
877 {
878 public:
879     virtual bool importXML(const OUString& rStrImpValue, css::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter) const override;
880     virtual bool exportXML(OUString& rStrExpValue, const css::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter) const override;
881 };
882 
883 bool XMLSdRotationAngleTypeHdl::importXML(
884     const OUString& rStrImpValue,
885     css::uno::Any& rValue,
886     const SvXMLUnitConverter&) const
887 {
888     sal_Int32 nValue;
889     bool const bRet = ::sax::Converter::convertNumber(nValue, rStrImpValue);
890     if (bRet)
891     {
892         nValue = (nValue % 360);
893         if (nValue < 0)
894             nValue = 360 + nValue;
895         sal_Int32 nAngle;
896         if (nValue < 45 || nValue > 315)
897             nAngle = 0;
898         else if (nValue < 180)
899             nAngle = 9000;
900         else /* if nValue <= 315 ) */
901             nAngle = 27000;
902 
903         rValue <<= nAngle;
904     }
905     return bRet;
906 }
907 
908 bool XMLSdRotationAngleTypeHdl::exportXML(
909     OUString& rStrExpValue,
910     const Any& rValue,
911     const SvXMLUnitConverter&) const
912 {
913     sal_Int32 nAngle;
914     bool bRet = (rValue >>= nAngle) && nAngle != 0;
915     if (bRet)
916     {
917         rStrExpValue = OUString::number(nAngle / 100);
918     }
919     return bRet;
920 }
921 
922 class XMLFitToSizeEnumPropertyHdl : public XMLEnumPropertyHdl
923 {
924 public:
925     XMLFitToSizeEnumPropertyHdl(
926             const SvXMLEnumMapEntry<drawing::TextFitToSizeType> *const pMap)
927         : XMLEnumPropertyHdl(pMap) {}
928 
929     virtual bool importXML(const OUString& rStrImpValue, uno::Any& rValue,
930                            const SvXMLUnitConverter& rUC) const override
931     {
932         // we don't know here what the actual attribute name is -
933         // but we can combine the 2 attributes by just taking the
934         // "largest" result value; this can never result in ALLLINES
935         // so the implementation has to interpret PROPORTIONAL as ALLLINES;
936         // both "true" is invalid anyway.
937         Any any;
938         auto const bRet = XMLEnumPropertyHdl::importXML(rStrImpValue, any, rUC);
939         if (!bRet)
940         {
941             return false;
942         }
943         assert(any.hasValue());
944         if (!rValue.hasValue() ||
945             rValue.get<drawing::TextFitToSizeType>() < any.get<drawing::TextFitToSizeType>())
946         {
947             rValue = any;
948         }
949         return true;
950     }
951 };
952 
953 
954 XMLSdPropHdlFactory::XMLSdPropHdlFactory( uno::Reference< frame::XModel > const & xModel, SvXMLImport& rImport )
955 : mxModel( xModel ), mpExport(nullptr), mpImport( &rImport )
956 {
957 }
958 
959 XMLSdPropHdlFactory::XMLSdPropHdlFactory( uno::Reference< frame::XModel > const & xModel, SvXMLExport& rExport )
960 : mxModel( xModel ), mpExport( &rExport ), mpImport(nullptr)
961 {
962 }
963 
964 XMLSdPropHdlFactory::~XMLSdPropHdlFactory()
965 {
966 }
967 
968 const XMLPropertyHandler* XMLSdPropHdlFactory::GetPropertyHandler( sal_Int32 nType ) const
969 {
970     const XMLPropertyHandler* pHdl = XMLPropertyHandlerFactory::GetPropertyHandler( nType );
971     if(!pHdl)
972     {
973         switch(nType)
974         {
975             case XML_SD_TYPE_STROKE :
976             {
977                 pHdl = new XMLEnumPropertyHdl( aXML_LineStyle_EnumMap);
978                 break;
979             }
980             case XML_SD_TYPE_LINEJOIN :
981             {
982                 pHdl = new XMLEnumPropertyHdl( aXML_LineJoint_EnumMap);
983                 break;
984             }
985             case XML_SD_TYPE_LINECAP :
986             {
987                 pHdl = new XMLEnumPropertyHdl( aXML_LineCap_EnumMap );
988                 break;
989             }
990             case XML_SD_TYPE_FILLSTYLE :
991             {
992                 pHdl = new XMLEnumPropertyHdl( aXML_FillStyle_EnumMap );
993                 break;
994             }
995             case XML_SD_TYPE_PRESPAGE_TYPE :
996             {
997                 pHdl = new XMLEnumPropertyHdl( aXML_PresChange_EnumMap );
998                 break;
999             }
1000             case XML_SD_TYPE_SHADOW :
1001             {
1002                 pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_VISIBLE), GetXMLToken(XML_HIDDEN) );
1003                 break;
1004             }
1005             case XML_TYPE_SD_MIRROR:
1006             {
1007                 pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_HORIZONTAL), GetXMLToken(XML_NONE) );
1008                 break;
1009             }
1010             case XML_SD_TYPE_PRESPAGE_STYLE :
1011             {
1012                 pHdl = new XMLEnumPropertyHdl( aXML_FadeEffect_EnumMap );
1013                 break;
1014             }
1015             case XML_SD_TYPE_PRESPAGE_SPEED :
1016             {
1017                 pHdl = new XMLEnumPropertyHdl( aXML_TransSpeed_EnumMap );
1018                 break;
1019             }
1020             case XML_SD_TYPE_PRESPAGE_DURATION :
1021             {
1022                 pHdl = new XMLDurationPropertyHdl;
1023                 break;
1024             }
1025             case XML_SD_TYPE_TEXT_CROSSEDOUT :
1026             {
1027                 pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_SOLID), GetXMLToken(XML_NONE) );
1028                 break;
1029             }
1030             case XML_SD_TYPE_OPACITY :
1031             {
1032                 pHdl = new XMLOpacityPropertyHdl(mpImport);
1033                 break;
1034             }
1035             case XML_SD_TYPE_WRITINGMODE :
1036             {
1037                 pHdl = new XMLEnumPropertyHdl( aXML_WritingMode_EnumMap );
1038                 break;
1039             }
1040             case XML_SD_TYPE_PRESPAGE_VISIBILITY :
1041             {
1042                 pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_VISIBLE), GetXMLToken(XML_HIDDEN) );
1043                 break;
1044             }
1045             case XML_SD_TYPE_PRESPAGE_BACKSIZE:
1046             {
1047                 pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_FULL), GetXMLToken(XML_BORDER) );
1048                 break;
1049             }
1050 
1051             // 3D Properties
1052 
1053             case XML_SD_TYPE_BACKFACE_CULLING:
1054             {
1055                 // #87922# DoubleSided -> BackfaceCulling
1056                 // This sal_Bool needs to be flipped, DoubleSided sal_True -> NO Backface culling
1057                 // and vice versa.
1058                 pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_DISABLED), GetXMLToken(XML_ENABLED) );
1059                 break;
1060             }
1061 
1062             case XML_SD_TYPE_NORMALS_KIND:
1063             {
1064                 pHdl = new XMLEnumPropertyHdl( aXML_NormalsKind_EnumMap );
1065                 break;
1066             }
1067             case XML_SD_TYPE_NORMALS_DIRECTION:
1068             {
1069                 pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_NORMAL), GetXMLToken(XML_INVERSE) );
1070                 break;
1071             }
1072             case XML_SD_TYPE_TEX_GENERATION_MODE_X:
1073             {
1074                 pHdl = new XMLEnumPropertyHdl( aXML_TexGenerationX_EnumMap );
1075                 break;
1076             }
1077             case XML_SD_TYPE_TEX_GENERATION_MODE_Y:
1078             {
1079                 pHdl = new XMLEnumPropertyHdl( aXML_TexGenerationY_EnumMap );
1080                 break;
1081             }
1082             case XML_SD_TYPE_TEX_KIND:
1083             {
1084                 pHdl = new XMLEnumPropertyHdl( aXML_TexKind_EnumMap );
1085                 break;
1086             }
1087             case XML_SD_TYPE_TEX_MODE:
1088             {
1089                 pHdl = new XMLEnumPropertyHdl( aXML_TexMode_EnumMap );
1090                 break;
1091             }
1092             case XML_SD_TYPE_NUMBULLET:
1093             {
1094                 uno::Reference<ucb::XAnyCompareFactory> xCompareFac( mxModel, uno::UNO_QUERY );
1095                 uno::Reference<ucb::XAnyCompare> xCompare;
1096                 if( xCompareFac.is() )
1097                     xCompare = xCompareFac->createAnyCompareByName( "NumberingRules" );
1098 
1099                 pHdl = new XMLNumRulePropHdl( xCompare );
1100                 break;
1101             }
1102             case XML_SD_TYPE_BITMAP_MODE:
1103             {
1104                 pHdl = new XMLEnumPropertyHdl( aXML_BitmapMode_EnumMap );
1105                 break;
1106             }
1107             case XML_SD_TYPE_BITMAPREPOFFSETX:
1108             case XML_SD_TYPE_BITMAPREPOFFSETY:
1109             {
1110                 pHdl = new XMLBitmapRepeatOffsetPropertyHandler( nType == XML_SD_TYPE_BITMAPREPOFFSETX );
1111                 break;
1112             }
1113             case XML_SD_TYPE_FILLBITMAPSIZE:
1114             {
1115                 pHdl = new XMLFillBitmapSizePropertyHandler();
1116                 break;
1117             }
1118             case XML_SD_TYPE_LOGICAL_SIZE:
1119             {
1120                 pHdl = new XMLBitmapLogicalSizePropertyHandler();
1121                 break;
1122             }
1123             case XML_SD_TYPE_BITMAP_REFPOINT:
1124             {
1125                 pHdl = new XMLEnumPropertyHdl( aXML_RefPoint_EnumMap);
1126                 break;
1127             }
1128             case XML_TYPE_TEXT_ANIMATION:
1129                 pHdl = new XMLEnumPropertyHdl( pXML_TextAnimation_Enum);
1130                 break;
1131             case XML_TYPE_TEXT_ANIMATION_BLINKING:
1132                 pHdl = new XMLEnumPropertyHdl( pXML_TextAnimation_Blinking_Enum);
1133                 break;
1134             case XML_TYPE_TEXT_ANIMATION_DIRECTION:
1135                 pHdl = new XMLEnumPropertyHdl( pXML_TextAnimationDirection_Enum);
1136                 break;
1137             case XML_TYPE_TEXT_ANIMATION_STEPS:
1138                 pHdl = new XMLTextAnimationStepPropertyHdl;
1139                 break;
1140             case XML_SD_TYPE_TEXT_ALIGN:
1141                 pHdl = new XMLEnumPropertyHdl( pXML_TextAlign_Enum);
1142                 break;
1143             case XML_SD_TYPE_VERTICAL_ALIGN:
1144                 pHdl = new XMLEnumPropertyHdl( pXML_VerticalAlign_Enum);
1145                 break;
1146             case XML_SD_TYPE_FITTOSIZE:
1147                 {
1148                     if (mpExport
1149 #if 1
1150 // TODO: remove in a couple releases, when users have the import of style:shrink-to-fit
1151                             && (mpExport->getDefaultVersion()
1152                                         <= SvtSaveOptions::ODFVER_012)
1153 #endif
1154                         )
1155                     {
1156                         pHdl = new XMLFitToSizeEnumPropertyHdl(pXML_FitToSize_Enum_Odf12);
1157                     }
1158                     else
1159                     {   // import all values written by old LO
1160                         pHdl = new XMLFitToSizeEnumPropertyHdl(pXML_FitToSize_Enum);
1161                     }
1162                 }
1163                 break;
1164             case XML_SD_TYPE_FITTOSIZE_AUTOFIT:
1165                 {
1166                     pHdl = new XMLFitToSizeEnumPropertyHdl(pXML_ShrinkToFit_Enum);
1167                 }
1168                 break;
1169             case XML_SD_TYPE_MEASURE_UNIT:
1170                 pHdl = new XMLEnumPropertyHdl( pXML_MeasureUnit_Enum );
1171                 break;
1172             case XML_SD_TYPE_MEASURE_HALIGN:
1173                 pHdl = new XMLEnumPropertyHdl( pXML_Measure_HAlign_Enum);
1174                 break;
1175             case XML_SD_TYPE_MEASURE_VALIGN:
1176                 pHdl = new XMLEnumPropertyHdl( pXML_Measure_VAlign_Enum);
1177                 break;
1178             case XML_SD_TYPE_MEASURE_PLACING:
1179                 {
1180                     pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_BELOW), GetXMLToken(XML_ABOVE) );
1181                 }
1182                 break;
1183             case XML_TYPE_TEXT_CLIP11:
1184                 pHdl = new XMLClipPropertyHandler( true );
1185                 break;
1186             case XML_TYPE_TEXT_CLIP:
1187                 pHdl = new XMLClipPropertyHandler( false );
1188                 break;
1189 
1190             // #FontWork#
1191             case XML_SD_TYPE_FONTWORK_STYLE     :
1192                 pHdl = new XMLEnumPropertyHdl( pXML_Fontwork_Style_Enum );
1193                 break;
1194             case XML_SD_TYPE_FONTWORK_ADJUST        :
1195                 pHdl = new XMLEnumPropertyHdl( pXML_Fontwork_Adjust_Enum );
1196                 break;
1197             case XML_SD_TYPE_FONTWORK_SHADOW        :
1198                 pHdl = new XMLEnumPropertyHdl( pXML_Fontwork_Shadow_Enum );
1199                 break;
1200             case XML_SD_TYPE_FONTWORK_FORM      :
1201                 pHdl = new XMLEnumPropertyHdl( pXML_Fontwork_Form_Enum );
1202                 break;
1203 
1204             case XML_SD_TYPE_CONTROL_BORDER:
1205                 pHdl = new ::xmloff::OControlBorderHandler( ::xmloff::OControlBorderHandler::STYLE );
1206                 break;
1207             case XML_SD_TYPE_CONTROL_BORDER_COLOR:
1208                 pHdl = new ::xmloff::OControlBorderHandler( ::xmloff::OControlBorderHandler::COLOR );
1209                 break;
1210             case XML_SD_TYPE_IMAGE_SCALE_MODE:
1211                 pHdl = new ::xmloff::ImageScaleModeHandler;
1212                 break;
1213             case XML_TYPE_CONTROL_TEXT_EMPHASIZE:
1214                 pHdl = new ::xmloff::OControlTextEmphasisHandler;
1215                 break;
1216 
1217             case XML_SD_TYPE_CAPTION_ANGLE_TYPE:
1218             {
1219                 pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_FIXED), GetXMLToken(XML_FREE) );
1220                 break;
1221             }
1222             case XML_SD_TYPE_CAPTION_IS_ESC_REL:
1223                 pHdl = new XMLIsPercentagePropertyHandler;
1224                 break;
1225             case XML_SD_TYPE_CAPTION_ESC_REL:
1226                 pHdl = new XMLCaptionEscapeRelative;
1227                 break;
1228             case XML_SD_TYPE_CAPTION_ESC_ABS:
1229                 pHdl = new XMLPercentOrMeasurePropertyHandler;
1230                 break;
1231             case XML_SD_TYPE_CAPTION_ESC_DIR:
1232                 pHdl = new XMLEnumPropertyHdl( pXML_Caption_Esc_Dir_Enum );
1233                 break;
1234             case XML_SD_TYPE_CAPTION_TYPE:
1235                 pHdl = new XMLEnumPropertyHdl( pXML_Caption_Type_Enum );
1236                 break;
1237             case XML_SD_TYPE_DATETIMEUPDATE:
1238                 pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_FIXED), GetXMLToken(XML_VARIABLE) );
1239                 break;
1240             case XML_SD_TYPE_DATETIME_FORMAT:
1241                 pHdl = new XMLDateTimeFormatHdl( mpExport );
1242                 break;
1243             case XML_SD_TYPE_TRANSITION_TYPE:
1244                 pHdl = new XMLEnumPropertyHdl( xmloff::aAnimations_EnumMap_TransitionType );
1245                 break;
1246             case XML_SD_TYPE_TRANSTIION_SUBTYPE:
1247                 pHdl = new XMLEnumPropertyHdl( xmloff::aAnimations_EnumMap_TransitionSubType );
1248                 break;
1249             case XML_SD_TYPE_TRANSTIION_DIRECTION:
1250                 pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_FORWARD), GetXMLToken(XML_REVERSE) );
1251                 break;
1252             case XML_TYPE_WRAP_OPTION:
1253                 pHdl = new XMLWordWrapPropertyHdl( mpImport );
1254                 break;
1255 
1256             case XML_SD_TYPE_MOVE_PROTECT:
1257             case XML_SD_TYPE_SIZE_PROTECT:
1258                 pHdl = new XMLMoveSizeProtectHdl( nType );
1259                 break;
1260             case XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE:
1261                 pHdl = new XMLSdHeaderFooterVisibilityTypeHdl;
1262                 break;
1263             case XML_SD_TYPE_CELL_ROTATION_ANGLE:
1264                 pHdl = new XMLSdRotationAngleTypeHdl;
1265                 break;
1266         }
1267 
1268         if(pHdl)
1269             PutHdlCache(nType, pHdl);
1270     }
1271 
1272     return pHdl;
1273 }
1274 
1275 XMLShapePropertySetMapper::XMLShapePropertySetMapper(const rtl::Reference< XMLPropertyHandlerFactory >& rFactoryRef,
1276         bool bForExport)
1277 : XMLPropertySetMapper( aXMLSDProperties, rFactoryRef, bForExport )
1278 {
1279 }
1280 
1281 XMLShapePropertySetMapper::~XMLShapePropertySetMapper()
1282 {
1283 }
1284 
1285 XMLShapeExportPropertyMapper::XMLShapeExportPropertyMapper( const rtl::Reference< XMLPropertySetMapper >& rMapper, SvXMLExport& rExport )
1286 : SvXMLExportPropertyMapper( rMapper )
1287 , maNumRuleExp( rExport )
1288 , mbIsInAutoStyles( true )
1289 {
1290 }
1291 
1292 XMLShapeExportPropertyMapper::~XMLShapeExportPropertyMapper()
1293 {
1294 }
1295 
1296 void XMLShapeExportPropertyMapper::ContextFilter(
1297     bool bEnableFoFontFamily,
1298     std::vector< XMLPropertyState >& rProperties,
1299     const uno::Reference< beans::XPropertySet >& rPropSet ) const
1300 {
1301     XMLPropertyState* pRepeatOffsetX = nullptr;
1302     XMLPropertyState* pRepeatOffsetY = nullptr;
1303     XMLPropertyState* pTextAnimationBlinking = nullptr;
1304     XMLPropertyState* pTextAnimationKind = nullptr;
1305 
1306     // #FontWork#
1307     XMLPropertyState* pFontWorkStyle = nullptr;
1308     XMLPropertyState* pFontWorkAdjust = nullptr;
1309     XMLPropertyState* pFontWorkDistance = nullptr;
1310     XMLPropertyState* pFontWorkStart = nullptr;
1311     XMLPropertyState* pFontWorkMirror = nullptr;
1312     XMLPropertyState* pFontWorkOutline = nullptr;
1313     XMLPropertyState* pFontWorkShadow = nullptr;
1314     XMLPropertyState* pFontWorkShadowColor = nullptr;
1315     XMLPropertyState* pFontWorkShadowOffsetx = nullptr;
1316     XMLPropertyState* pFontWorkShadowOffsety = nullptr;
1317     XMLPropertyState* pFontWorkForm = nullptr;
1318     XMLPropertyState* pFontWorkHideform = nullptr;
1319     XMLPropertyState* pFontWorkShadowTransparence = nullptr;
1320 
1321     // OLE
1322     XMLPropertyState* pOLEVisAreaLeft = nullptr;
1323     XMLPropertyState* pOLEVisAreaTop = nullptr;
1324     XMLPropertyState* pOLEVisAreaWidth = nullptr;
1325     XMLPropertyState* pOLEVisAreaHeight = nullptr;
1326     XMLPropertyState* pOLEIsInternal = nullptr;
1327 
1328     // caption
1329     XMLPropertyState* pCaptionIsEscRel = nullptr;
1330     XMLPropertyState* pCaptionEscRel = nullptr;
1331     XMLPropertyState* pCaptionEscAbs = nullptr;
1332 
1333     // filter fo:clip
1334     XMLPropertyState* pClip11State = nullptr;
1335     XMLPropertyState* pClipState = nullptr;
1336 
1337     XMLPropertyState* pShapeWritingMode = nullptr;
1338     XMLPropertyState* pTextWritingMode = nullptr;
1339     XMLPropertyState* pControlWritingMode = nullptr;
1340 
1341     // filter properties
1342     for( auto& rProp : rProperties )
1343     {
1344         XMLPropertyState *property = &rProp;
1345         if( property->mnIndex == -1 )
1346             continue;
1347 
1348         // find properties with context
1349         // to prevent writing this property set mnIndex member to -1
1350         switch( getPropertySetMapper()->GetEntryContextId( property->mnIndex ))
1351         {
1352             case CTF_NUMBERINGRULES:
1353                 {
1354                     if( mbIsInAutoStyles )
1355                         property->mnIndex = -1;
1356                 }
1357                 break;
1358             case CTF_SD_NUMBERINGRULES_NAME:
1359                 {
1360                     // this property is not exported in the style:properties element
1361                     // because it's an XIndexAccess and not a string.
1362                     // This will be handled in SvXMLAutoStylePoolP::exportStyleAttributes
1363                     // This is suboptimal
1364                     if( !mbIsInAutoStyles )
1365                         property->mnIndex = -1;
1366                 }
1367                 break;
1368             case CTF_WRITINGMODE:
1369                 {
1370                     pShapeWritingMode = property;
1371                     text::WritingMode eWritingMode;
1372                     if( property->maValue >>= eWritingMode )
1373                     {
1374                         if( text::WritingMode_LR_TB == eWritingMode )
1375                         {
1376                             property->mnIndex = -1;
1377                             pShapeWritingMode = nullptr;
1378                         }
1379                     }
1380                 }
1381                 break;
1382             case CTF_CONTROLWRITINGMODE:
1383                 pControlWritingMode = property;
1384                 break;
1385             case CTF_TEXTWRITINGMODE:
1386                 {
1387                     pTextWritingMode = property;
1388                     sal_Int32 eWritingMode;
1389                     if (property->maValue >>= eWritingMode)
1390                     {
1391                         if (text::WritingMode2::LR_TB == eWritingMode)
1392                         {
1393                             property->mnIndex = -1;
1394                             pTextWritingMode = nullptr;
1395                         }
1396                     }
1397                 }
1398                 break;
1399             case CTF_REPEAT_OFFSET_X:
1400                 pRepeatOffsetX = property;
1401                 break;
1402 
1403             case CTF_REPEAT_OFFSET_Y:
1404                 pRepeatOffsetY = property;
1405                 break;
1406 
1407             case CTF_DASHNAME:
1408             case CTF_FILLGRADIENTNAME:
1409             case CTF_FILLHATCHNAME:
1410             case CTF_FILLBITMAPNAME:
1411                 {
1412                     OUString aStr;
1413                     if( (property->maValue >>= aStr) && aStr.isEmpty() )
1414                         property->mnIndex = -1;
1415                 }
1416                 break;
1417             case CTF_TEXTANIMATION_BLINKING:
1418                 pTextAnimationBlinking = property;
1419                 break;
1420             case CTF_TEXTANIMATION_KIND:
1421                 pTextAnimationKind = property;
1422                 break;
1423 
1424             // #FontWork#
1425             case CTF_FONTWORK_STYLE:                pFontWorkStyle = property;              break;
1426             case CTF_FONTWORK_ADJUST:               pFontWorkAdjust = property;             break;
1427             case CTF_FONTWORK_DISTANCE:             pFontWorkDistance = property;           break;
1428             case CTF_FONTWORK_START:                pFontWorkStart = property;              break;
1429             case CTF_FONTWORK_MIRROR:               pFontWorkMirror = property;             break;
1430             case CTF_FONTWORK_OUTLINE:              pFontWorkOutline = property;            break;
1431             case CTF_FONTWORK_SHADOW:               pFontWorkShadow = property;             break;
1432             case CTF_FONTWORK_SHADOWCOLOR:          pFontWorkShadowColor = property;        break;
1433             case CTF_FONTWORK_SHADOWOFFSETX:        pFontWorkShadowOffsetx = property;      break;
1434             case CTF_FONTWORK_SHADOWOFFSETY:        pFontWorkShadowOffsety = property;      break;
1435             case CTF_FONTWORK_FORM:                 pFontWorkForm = property;               break;
1436             case CTF_FONTWORK_HIDEFORM:             pFontWorkHideform = property;           break;
1437             case CTF_FONTWORK_SHADOWTRANSPARENCE:   pFontWorkShadowTransparence = property; break;
1438 
1439             // OLE
1440             case CTF_SD_OLE_VIS_AREA_EXPORT_LEFT:           pOLEVisAreaLeft = property;     break;
1441             case CTF_SD_OLE_VIS_AREA_EXPORT_TOP:            pOLEVisAreaTop = property;      break;
1442             case CTF_SD_OLE_VIS_AREA_EXPORT_WIDTH:          pOLEVisAreaWidth = property;    break;
1443             case CTF_SD_OLE_VIS_AREA_EXPORT_HEIGHT:     pOLEVisAreaHeight = property;   break;
1444             case CTF_SD_OLE_ISINTERNAL:             pOLEIsInternal = property;      break;
1445 
1446             case CTF_FRAME_DISPLAY_SCROLLBAR:
1447                 {
1448                     if( !property->maValue.hasValue() )
1449                         property->mnIndex = -1;
1450                 }
1451                 break;
1452             case CTF_FRAME_MARGIN_HORI:
1453             case CTF_FRAME_MARGIN_VERT:
1454                 {
1455                     sal_Int32 nValue = 0;
1456                     if( (property->maValue >>= nValue) && (nValue < 0) )
1457                         property->mnIndex = -1;
1458                 }
1459                 break;
1460 
1461             case CTF_SD_MOVE_PROTECT:
1462                 {
1463                     bool bProtected;
1464                     if( (property->maValue >>= bProtected) && !bProtected )
1465                         property->mnIndex = -1;
1466                 }
1467                 break;
1468             case CTF_SD_SIZE_PROTECT:
1469                 {
1470                     bool bProtected;
1471                     if( (property->maValue >>= bProtected) && !bProtected )
1472                         property->mnIndex = -1;
1473                 }
1474                 break;
1475             case CTF_CAPTION_ISESCREL:              pCaptionIsEscRel = property;    break;
1476             case CTF_CAPTION_ESCREL:                pCaptionEscRel = property;      break;
1477             case CTF_CAPTION_ESCABS:                pCaptionEscAbs = property;      break;
1478             case CTF_TEXT_CLIP11:           pClip11State = property; break;
1479             case CTF_TEXT_CLIP:             pClipState = property; break;
1480         }
1481     }
1482 
1483     // check for duplicate writing mode
1484     if( pShapeWritingMode && (pTextWritingMode || pControlWritingMode) )
1485     {
1486         if( pTextWritingMode )
1487             pTextWritingMode->mnIndex = -1;
1488         if( pControlWritingMode )
1489             pControlWritingMode->mnIndex = -1;
1490     }
1491     else if( pTextWritingMode && pControlWritingMode )
1492     {
1493         pControlWritingMode->mnIndex = -1;
1494     }
1495 
1496     // do not export visual area for internal ole objects
1497     if( pOLEIsInternal )
1498     {
1499         bool bInternal;
1500         if( (pOLEIsInternal->maValue >>= bInternal) && !bInternal )
1501         {
1502             try
1503             {
1504                 const OUString sVisibleArea( "VisibleArea" );
1505                 awt::Rectangle aRect;
1506                 if( rPropSet->getPropertyValue( sVisibleArea ) >>= aRect )
1507                 {
1508                     if( pOLEVisAreaLeft )
1509                     {
1510                         pOLEVisAreaLeft->mnIndex = getPropertySetMapper()->FindEntryIndex( CTF_SD_OLE_VIS_AREA_IMPORT_LEFT );
1511                         pOLEVisAreaLeft->maValue <<= aRect;
1512                     }
1513                     if( pOLEVisAreaTop )
1514                     {
1515                         pOLEVisAreaTop->mnIndex = getPropertySetMapper()->FindEntryIndex( CTF_SD_OLE_VIS_AREA_IMPORT_TOP );
1516                         pOLEVisAreaTop->maValue <<=  aRect;
1517                     }
1518                     if( pOLEVisAreaWidth )
1519                     {
1520                         pOLEVisAreaWidth->mnIndex = getPropertySetMapper()->FindEntryIndex( CTF_SD_OLE_VIS_AREA_IMPORT_WIDTH );
1521                         pOLEVisAreaWidth->maValue <<= aRect;
1522                     }
1523                     if( pOLEVisAreaHeight )
1524                     {
1525                         pOLEVisAreaHeight->mnIndex = getPropertySetMapper()->FindEntryIndex( CTF_SD_OLE_VIS_AREA_IMPORT_HEIGHT );
1526                         pOLEVisAreaHeight->maValue <<= aRect;
1527                     }
1528                 }
1529             }
1530             catch( uno::Exception& )
1531             {
1532             }
1533         }
1534         else
1535         {
1536             if( pOLEVisAreaLeft )   pOLEVisAreaLeft->mnIndex = -1;
1537             if( pOLEVisAreaTop )    pOLEVisAreaTop->mnIndex = -1;
1538             if( pOLEVisAreaWidth )  pOLEVisAreaWidth->mnIndex = -1;
1539             if( pOLEVisAreaHeight ) pOLEVisAreaHeight->mnIndex = -1;
1540         }
1541 
1542         pOLEIsInternal->mnIndex = -1;
1543     }
1544 
1545     if( pTextAnimationBlinking && pTextAnimationKind )
1546     {
1547         drawing::TextAnimationKind eKind;
1548         if( (pTextAnimationKind->maValue >>= eKind) && eKind != drawing::TextAnimationKind_BLINK )
1549         {
1550             pTextAnimationBlinking->mnIndex = -1;
1551         }
1552         else
1553         {
1554             pTextAnimationKind->mnIndex = -1;
1555         }
1556     }
1557 
1558     if( pRepeatOffsetX && pRepeatOffsetY )
1559     {
1560         sal_Int32 nOffset = 0;
1561         if( ( pRepeatOffsetX->maValue >>= nOffset ) && ( nOffset == 0 ) )
1562             pRepeatOffsetX->mnIndex = -1;
1563         else
1564             pRepeatOffsetY->mnIndex = -1;
1565     }
1566 
1567     if(pFontWorkStyle)
1568     {
1569         // #FontWork#
1570         sal_Int32 nStyle = 0;
1571 
1572         if(pFontWorkStyle->maValue >>= nStyle)
1573         {
1574             if(/*XFormTextStyle::NONE*/4 == nStyle)
1575             {
1576                 pFontWorkStyle->mnIndex = -1;
1577                 if(pFontWorkAdjust)
1578                     pFontWorkAdjust->mnIndex = -1;
1579                 if(pFontWorkDistance)
1580                     pFontWorkDistance->mnIndex = -1;
1581                 if(pFontWorkStart)
1582                     pFontWorkStart->mnIndex = -1;
1583                 if(pFontWorkMirror)
1584                     pFontWorkMirror->mnIndex = -1;
1585                 if(pFontWorkOutline)
1586                     pFontWorkOutline->mnIndex = -1;
1587                 if(pFontWorkShadow)
1588                     pFontWorkShadow->mnIndex = -1;
1589                 if(pFontWorkShadowColor)
1590                     pFontWorkShadowColor->mnIndex = -1;
1591                 if(pFontWorkShadowOffsetx)
1592                     pFontWorkShadowOffsetx->mnIndex = -1;
1593                 if(pFontWorkShadowOffsety)
1594                     pFontWorkShadowOffsety->mnIndex = -1;
1595                 if(pFontWorkForm)
1596                     pFontWorkForm->mnIndex = -1;
1597                 if(pFontWorkHideform)
1598                     pFontWorkHideform->mnIndex = -1;
1599                 if(pFontWorkShadowTransparence)
1600                     pFontWorkShadowTransparence->mnIndex = -1;
1601             }
1602         }
1603     }
1604 
1605     if( pCaptionIsEscRel )
1606     {
1607         bool bIsRel = false;
1608         pCaptionIsEscRel->maValue >>= bIsRel;
1609 
1610         if( bIsRel )
1611         {
1612             if( pCaptionEscAbs )
1613                 pCaptionEscAbs->mnIndex = -1;
1614         }
1615         else
1616         {
1617             if( pCaptionEscRel )
1618                 pCaptionEscRel->mnIndex = -1;
1619         }
1620 
1621         pCaptionIsEscRel->mnIndex = -1;
1622     }
1623 
1624     if( pClipState != nullptr && pClip11State != nullptr  )
1625         pClip11State->mnIndex = -1;
1626 
1627     SvXMLExportPropertyMapper::ContextFilter(bEnableFoFontFamily, rProperties, rPropSet);
1628 }
1629 
1630 void XMLShapeExportPropertyMapper::handleSpecialItem(
1631         SvXMLAttributeList& rAttrList,
1632         const XMLPropertyState& rProperty,
1633         const SvXMLUnitConverter& rUnitConverter,
1634         const SvXMLNamespaceMap& rNamespaceMap,
1635         const ::std::vector< XMLPropertyState > *pProperties,
1636         sal_uInt32 nIdx ) const
1637 {
1638     switch( getPropertySetMapper()->GetEntryContextId( rProperty.mnIndex ) )
1639     {
1640         case CTF_SD_CONTROL_SHAPE_DATA_STYLE:
1641             // not to be handled by the base class
1642             break;
1643 
1644         default:
1645             SvXMLExportPropertyMapper::handleSpecialItem( rAttrList, rProperty, rUnitConverter, rNamespaceMap, pProperties, nIdx );
1646             break;
1647     }
1648 }
1649 
1650 void XMLShapeExportPropertyMapper::handleElementItem(
1651     SvXMLExport& rExport,
1652     const XMLPropertyState& rProperty,
1653     SvXmlExportFlags nFlags,
1654     const ::std::vector< XMLPropertyState > *pProperties,
1655     sal_uInt32 nIdx) const
1656 {
1657     switch( getPropertySetMapper()->GetEntryContextId( rProperty.mnIndex ) )
1658     {
1659         case CTF_NUMBERINGRULES:
1660             {
1661                 // only export list-styles as elements in styles section
1662                 if( !mbIsInAutoStyles )
1663                 {
1664                     uno::Reference< container::XIndexReplace > xNumRule( rProperty.maValue, uno::UNO_QUERY );
1665                     if( xNumRule.is() )
1666                         const_cast<XMLShapeExportPropertyMapper*>(this)->maNumRuleExp.exportNumberingRule(GetStyleName(), false, xNumRule);
1667                 }
1668             }
1669             break;
1670         default:
1671             SvXMLExportPropertyMapper::handleElementItem( rExport, rProperty, nFlags, pProperties, nIdx );
1672             break;
1673     }
1674 }
1675 
1676 XMLPageExportPropertyMapper::XMLPageExportPropertyMapper( const rtl::Reference< XMLPropertySetMapper >& rMapper, SvXMLExport& rExport ) :
1677         SvXMLExportPropertyMapper( rMapper ),
1678         mrExport( rExport )
1679 {
1680 }
1681 
1682 XMLPageExportPropertyMapper::~XMLPageExportPropertyMapper()
1683 {
1684 }
1685 
1686 void XMLPageExportPropertyMapper::ContextFilter(
1687     bool bEnableFoFontFamily,
1688     std::vector< XMLPropertyState >& rProperties,
1689     const uno::Reference< beans::XPropertySet >& rPropSet ) const
1690 {
1691     XMLPropertyState* pRepeatOffsetX = nullptr;
1692     XMLPropertyState* pRepeatOffsetY = nullptr;
1693     XMLPropertyState* pTransType = nullptr;
1694     XMLPropertyState* pTransDuration = nullptr;
1695     XMLPropertyState* pDateTimeUpdate = nullptr;
1696     XMLPropertyState* pDateTimeFormat = nullptr;
1697     XMLPropertyState* pTransitionFadeColor = nullptr;
1698 
1699     sal_Int16 nTransitionType = 0;
1700 
1701     // filter properties
1702     for( auto& rProp : rProperties )
1703     {
1704         XMLPropertyState *property = &rProp;
1705         if( property->mnIndex == -1 )
1706             continue;
1707 
1708         // find properties with context
1709         // to prevent writing this property set mnIndex member to -1
1710         switch( getPropertySetMapper()->GetEntryContextId( property->mnIndex ))
1711         {
1712 
1713             case CTF_REPEAT_OFFSET_X:
1714                 pRepeatOffsetX = property;
1715                 break;
1716 
1717             case CTF_REPEAT_OFFSET_Y:
1718                 pRepeatOffsetY = property;
1719                 break;
1720             case CTF_PAGE_TRANS_TYPE:
1721                 pTransType = property;
1722                 break;
1723             case CTF_PAGE_TRANS_STYLE:
1724                 if( mrExport.getExportFlags() & SvXMLExportFlags::OASIS )
1725                     (*property).mnIndex = -1;
1726                 break;
1727             case CTF_PAGE_TRANSITION_TYPE:
1728                 {
1729                     if( (!(mrExport.getExportFlags() & SvXMLExportFlags::OASIS)) ||
1730                         (((*property).maValue >>= nTransitionType) && (nTransitionType == 0)) )
1731                             (*property).mnIndex = -1;
1732                 }
1733                 break;
1734             case CTF_PAGE_TRANSITION_SUBTYPE:
1735                 {
1736                     sal_Int16 nTransitionSubtype = sal_Int16();
1737                     if( (!(mrExport.getExportFlags() & SvXMLExportFlags::OASIS)) ||
1738                         (((*property).maValue >>= nTransitionSubtype) && (nTransitionSubtype == 0)) )
1739                             (*property).mnIndex = -1;
1740 
1741                 }
1742                 break;
1743             case CTF_PAGE_TRANSITION_DIRECTION:
1744                 {
1745                     bool bDirection;
1746                     if( (!(mrExport.getExportFlags() & SvXMLExportFlags::OASIS)) ||
1747                         (((*property).maValue >>= bDirection) && bDirection) )
1748                             (*property).mnIndex = -1;
1749                 }
1750                 break;
1751             case CTF_PAGE_TRANSITION_FADECOLOR:
1752                 if( !(mrExport.getExportFlags() & SvXMLExportFlags::OASIS) )
1753                     (*property).mnIndex = -1;
1754                 else
1755                     pTransitionFadeColor = property;
1756                 break;
1757             case CTF_PAGE_TRANS_SPEED:
1758                 {
1759                     presentation::AnimationSpeed aEnum;
1760                     if( ((*property).maValue >>= aEnum) && aEnum == presentation::AnimationSpeed_MEDIUM )
1761                         (*property).mnIndex = -1;
1762                 }
1763                 break;
1764             case CTF_PAGE_VISIBLE:
1765                 {
1766                     bool bVisible = false;
1767                     (*property).maValue >>= bVisible;
1768                     if( bVisible )
1769                         (*property).mnIndex = -1;
1770                 }
1771                 break;
1772             case CTF_PAGE_TRANS_DURATION:
1773                 pTransDuration = property;
1774                 break;
1775             case CTF_HEADER_TEXT:
1776             case CTF_FOOTER_TEXT:
1777             case CTF_DATE_TIME_TEXT:
1778                 {
1779                     OUString aValue;
1780                     (*property).maValue >>= aValue;
1781                     if( aValue.isEmpty() )
1782                         (*property).mnIndex = -1;
1783                 }
1784                 break;
1785 
1786             case CTF_DATE_TIME_UPDATE:
1787                 pDateTimeUpdate = property;
1788                 break;
1789 
1790             case CTF_DATE_TIME_FORMAT:
1791                 pDateTimeFormat = property;
1792                 break;
1793         }
1794     }
1795 
1796     if( pTransitionFadeColor && nTransitionType != css::animations::TransitionType::FADE )
1797         pTransitionFadeColor->mnIndex = -1;
1798 
1799     if( pDateTimeFormat && pDateTimeUpdate )
1800     {
1801         bool bIsFixed = false;
1802         pDateTimeUpdate->maValue >>= bIsFixed;
1803         if( bIsFixed )
1804             pDateTimeFormat->mnIndex = -1;
1805     }
1806 
1807     if( pRepeatOffsetX && pRepeatOffsetY )
1808     {
1809         sal_Int32 nOffset = 0;
1810         if( ( pRepeatOffsetX->maValue >>= nOffset ) && ( nOffset == 0 ) )
1811             pRepeatOffsetX->mnIndex = -1;
1812         else
1813             pRepeatOffsetY->mnIndex = -1;
1814     }
1815 
1816     if( pTransType && pTransDuration )
1817     {
1818         sal_Int32 nChange = 0;
1819         pTransType->maValue >>= nChange;
1820 
1821         // only export duration for automatic
1822         if( nChange != 1 )
1823             pTransDuration->mnIndex = -1;
1824 
1825         // do not export default transition change
1826         if( nChange == 0 )
1827             pTransType->mnIndex = -1;
1828     }
1829 
1830     SvXMLExportPropertyMapper::ContextFilter(bEnableFoFontFamily, rProperties, rPropSet);
1831 }
1832 
1833 void XMLPageExportPropertyMapper::handleElementItem(
1834     SvXMLExport& rExport,
1835     const XMLPropertyState& rProperty,
1836     SvXmlExportFlags nFlags,
1837     const ::std::vector< XMLPropertyState > *pProperties,
1838     sal_uInt32 nIdx) const
1839 {
1840     switch( getPropertySetMapper()->GetEntryContextId( rProperty.mnIndex ) )
1841     {
1842         case CTF_PAGE_SOUND_URL:
1843             {
1844                 OUString aSoundURL;
1845                 if( (rProperty.maValue >>= aSoundURL) && !aSoundURL.isEmpty() )
1846                 {
1847                     mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, mrExport.GetRelativeReference(aSoundURL) );
1848                     mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
1849                     mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_NEW );
1850                     mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONREQUEST );
1851                     SvXMLElementExport aElem( mrExport, XML_NAMESPACE_PRESENTATION, XML_SOUND, true, true );
1852                 }
1853             }
1854             break;
1855         default:
1856             SvXMLExportPropertyMapper::handleElementItem( rExport, rProperty, nFlags, pProperties, nIdx );
1857             break;
1858     }
1859 }
1860 
1861 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
1862