1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_xmloff.hxx" 26 #include "xmloff/GradientStyle.hxx" 27 #include <com/sun/star/awt/Gradient.hpp> 28 #include <xmloff/attrlist.hxx> 29 #include <xmloff/nmspmap.hxx> 30 #include <xmloff/xmluconv.hxx> 31 #include "xmloff/xmlnmspe.hxx" 32 #include <xmloff/xmltoken.hxx> 33 #include <rtl/ustrbuf.hxx> 34 #include <rtl/ustring.hxx> 35 #include <tools/debug.hxx> 36 #include <xmloff/xmltkmap.hxx> 37 #include <xmloff/xmlexp.hxx> 38 #include <xmloff/xmlimp.hxx> 39 40 41 42 using namespace ::com::sun::star; 43 using ::rtl::OUString; 44 using ::rtl::OUStringBuffer; 45 46 using namespace ::xmloff::token; 47 48 enum SvXMLTokenMapAttrs 49 { 50 XML_TOK_GRADIENT_NAME, 51 XML_TOK_GRADIENT_DISPLAY_NAME, 52 XML_TOK_GRADIENT_STYLE, 53 XML_TOK_GRADIENT_CX, 54 XML_TOK_GRADIENT_CY, 55 XML_TOK_GRADIENT_STARTCOLOR, 56 XML_TOK_GRADIENT_ENDCOLOR, 57 XML_TOK_GRADIENT_STARTINT, 58 XML_TOK_GRADIENT_ENDINT, 59 XML_TOK_GRADIENT_ANGLE, 60 XML_TOK_GRADIENT_BORDER, 61 XML_TOK_TABSTOP_END=XML_TOK_UNKNOWN 62 }; 63 64 65 SvXMLEnumMapEntry __READONLY_DATA pXML_GradientStyle_Enum[] = 66 { 67 { XML_GRADIENTSTYLE_LINEAR, awt::GradientStyle_LINEAR }, 68 { XML_GRADIENTSTYLE_AXIAL, awt::GradientStyle_AXIAL }, 69 { XML_GRADIENTSTYLE_RADIAL, awt::GradientStyle_RADIAL }, 70 { XML_GRADIENTSTYLE_ELLIPSOID, awt::GradientStyle_ELLIPTICAL }, 71 { XML_GRADIENTSTYLE_SQUARE, awt::GradientStyle_SQUARE }, 72 { XML_GRADIENTSTYLE_RECTANGULAR, awt::GradientStyle_RECT }, 73 { XML_TOKEN_INVALID, 0 } 74 }; 75 76 //------------------------------------------------------------- 77 // Import 78 //------------------------------------------------------------- 79 XMLGradientStyleImport::XMLGradientStyleImport( 80 SvXMLImport& rImp ) 81 : rImport(rImp) 82 { 83 } 84 85 XMLGradientStyleImport::~XMLGradientStyleImport() 86 { 87 } 88 89 sal_Bool XMLGradientStyleImport::importXML( 90 const uno::Reference< xml::sax::XAttributeList >& xAttrList, 91 uno::Any& rValue, 92 OUString& rStrName ) 93 { 94 sal_Bool bRet = sal_False; 95 sal_Bool bHasName = sal_False; 96 sal_Bool bHasStyle = sal_False; 97 sal_Bool bHasStartColor = sal_False; 98 sal_Bool bHasEndColor = sal_False; 99 OUString aDisplayName; 100 101 awt::Gradient aGradient; 102 aGradient.XOffset = 0; 103 aGradient.YOffset = 0; 104 aGradient.StartIntensity = 100; 105 aGradient.EndIntensity = 100; 106 aGradient.Angle = 0; 107 aGradient.Border = 0; 108 109 { 110 static __FAR_DATA SvXMLTokenMapEntry aGradientAttrTokenMap[] = 111 { 112 { XML_NAMESPACE_DRAW, XML_NAME, XML_TOK_GRADIENT_NAME }, 113 { XML_NAMESPACE_DRAW, XML_DISPLAY_NAME, XML_TOK_GRADIENT_DISPLAY_NAME }, 114 { XML_NAMESPACE_DRAW, XML_STYLE, XML_TOK_GRADIENT_STYLE }, 115 { XML_NAMESPACE_DRAW, XML_CX, XML_TOK_GRADIENT_CX }, 116 { XML_NAMESPACE_DRAW, XML_CY, XML_TOK_GRADIENT_CY }, 117 { XML_NAMESPACE_DRAW, XML_START_COLOR, XML_TOK_GRADIENT_STARTCOLOR }, 118 { XML_NAMESPACE_DRAW, XML_END_COLOR, XML_TOK_GRADIENT_ENDCOLOR }, 119 { XML_NAMESPACE_DRAW, XML_START_INTENSITY, XML_TOK_GRADIENT_STARTINT }, 120 { XML_NAMESPACE_DRAW, XML_END_INTENSITY, XML_TOK_GRADIENT_ENDINT }, 121 { XML_NAMESPACE_DRAW, XML_GRADIENT_ANGLE, XML_TOK_GRADIENT_ANGLE }, 122 { XML_NAMESPACE_DRAW, XML_GRADIENT_BORDER, XML_TOK_GRADIENT_BORDER }, 123 XML_TOKEN_MAP_END 124 }; 125 126 SvXMLTokenMap aTokenMap( aGradientAttrTokenMap ); 127 SvXMLNamespaceMap& rNamespaceMap = rImport.GetNamespaceMap(); 128 129 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 130 for( sal_Int16 i=0; i < nAttrCount; i++ ) 131 { 132 const OUString& rFullAttrName = xAttrList->getNameByIndex( i ); 133 OUString aStrAttrName; 134 sal_uInt16 nPrefix = rNamespaceMap.GetKeyByAttrName( rFullAttrName, &aStrAttrName ); 135 const OUString& rStrValue = xAttrList->getValueByIndex( i ); 136 137 sal_Int32 nTmpValue; 138 139 switch( aTokenMap.Get( nPrefix, aStrAttrName ) ) 140 { 141 case XML_TOK_GRADIENT_NAME: 142 { 143 rStrName = rStrValue; 144 bHasName = sal_True; 145 } 146 break; 147 case XML_TOK_GRADIENT_DISPLAY_NAME: 148 { 149 aDisplayName = rStrValue; 150 } 151 break; 152 case XML_TOK_GRADIENT_STYLE: 153 { 154 sal_uInt16 eValue; 155 if( SvXMLUnitConverter::convertEnum( eValue, rStrValue, pXML_GradientStyle_Enum ) ) 156 { 157 aGradient.Style = (awt::GradientStyle) eValue; 158 bHasStyle = sal_True; 159 } 160 } 161 break; 162 case XML_TOK_GRADIENT_CX: 163 SvXMLUnitConverter::convertPercent( nTmpValue, rStrValue ); 164 aGradient.XOffset = static_cast< sal_Int16 >( nTmpValue ); 165 break; 166 case XML_TOK_GRADIENT_CY: 167 SvXMLUnitConverter::convertPercent( nTmpValue, rStrValue ); 168 aGradient.YOffset = static_cast< sal_Int16 >( nTmpValue ); 169 break; 170 case XML_TOK_GRADIENT_STARTCOLOR: 171 { 172 Color aColor; 173 bHasStartColor = SvXMLUnitConverter::convertColor( aColor, rStrValue ); 174 if( bHasStartColor ) 175 aGradient.StartColor = (sal_Int32)( aColor.GetColor() ); 176 } 177 break; 178 case XML_TOK_GRADIENT_ENDCOLOR: 179 { 180 Color aColor; 181 bHasStartColor = SvXMLUnitConverter::convertColor( aColor, rStrValue ); 182 if( bHasStartColor ) 183 aGradient.EndColor = (sal_Int32)( aColor.GetColor() ); 184 } 185 break; 186 case XML_TOK_GRADIENT_STARTINT: 187 SvXMLUnitConverter::convertPercent( nTmpValue, rStrValue ); 188 aGradient.StartIntensity = static_cast< sal_Int16 >( nTmpValue ); 189 break; 190 case XML_TOK_GRADIENT_ENDINT: 191 SvXMLUnitConverter::convertPercent( nTmpValue, rStrValue ); 192 aGradient.EndIntensity = static_cast< sal_Int16 >( nTmpValue ); 193 break; 194 case XML_TOK_GRADIENT_ANGLE: 195 { 196 sal_Int32 nValue; 197 SvXMLUnitConverter::convertNumber( nValue, rStrValue, 0, 3600 ); 198 aGradient.Angle = sal_Int16( nValue ); 199 } 200 break; 201 case XML_TOK_GRADIENT_BORDER: 202 SvXMLUnitConverter::convertPercent( nTmpValue, rStrValue ); 203 aGradient.Border = static_cast< sal_Int16 >( nTmpValue ); 204 break; 205 206 default: 207 DBG_WARNING( "Unknown token at import gradient style" ) 208 ; 209 } 210 } 211 212 rValue <<= aGradient; 213 214 if( aDisplayName.getLength() ) 215 { 216 rImport.AddStyleDisplayName( XML_STYLE_FAMILY_SD_GRADIENT_ID, rStrName, 217 aDisplayName ); 218 rStrName = aDisplayName; 219 } 220 221 bRet = bHasName && bHasStyle && bHasStartColor && bHasEndColor; 222 223 } 224 225 return bRet; 226 } 227 228 229 //------------------------------------------------------------- 230 // Export 231 //------------------------------------------------------------- 232 233 #ifndef SVX_LIGHT 234 235 XMLGradientStyleExport::XMLGradientStyleExport( 236 SvXMLExport& rExp ) 237 : rExport(rExp) 238 { 239 } 240 241 XMLGradientStyleExport::~XMLGradientStyleExport() 242 { 243 } 244 245 sal_Bool XMLGradientStyleExport::exportXML( 246 const OUString& rStrName, 247 const uno::Any& rValue ) 248 { 249 sal_Bool bRet = sal_False; 250 awt::Gradient aGradient; 251 252 if( rStrName.getLength() ) 253 { 254 if( rValue >>= aGradient ) 255 { 256 OUString aStrValue; 257 OUStringBuffer aOut; 258 259 // Style 260 if( !SvXMLUnitConverter::convertEnum( aOut, aGradient.Style, pXML_GradientStyle_Enum ) ) 261 { 262 bRet = sal_False; 263 } 264 else 265 { 266 // Name 267 sal_Bool bEncoded = sal_False; 268 OUString aStrName( rStrName ); 269 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, 270 rExport.EncodeStyleName( aStrName, 271 &bEncoded ) ); 272 if( bEncoded ) 273 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DISPLAY_NAME, 274 aStrName ); 275 276 277 aStrValue = aOut.makeStringAndClear(); 278 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_STYLE, aStrValue ); 279 280 // Center x/y 281 if( aGradient.Style != awt::GradientStyle_LINEAR && 282 aGradient.Style != awt::GradientStyle_AXIAL ) 283 { 284 SvXMLUnitConverter::convertPercent( aOut, aGradient.XOffset ); 285 aStrValue = aOut.makeStringAndClear(); 286 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CX, aStrValue ); 287 288 SvXMLUnitConverter::convertPercent( aOut, aGradient.YOffset ); 289 aStrValue = aOut.makeStringAndClear(); 290 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CY, aStrValue ); 291 } 292 293 Color aColor; 294 295 // Color start 296 aColor.SetColor( aGradient.StartColor ); 297 SvXMLUnitConverter::convertColor( aOut, aColor ); 298 aStrValue = aOut.makeStringAndClear(); 299 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_START_COLOR, aStrValue ); 300 301 // Color end 302 aColor.SetColor( aGradient.EndColor ); 303 SvXMLUnitConverter::convertColor( aOut, aColor ); 304 aStrValue = aOut.makeStringAndClear(); 305 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_END_COLOR, aStrValue ); 306 307 // Intensity start 308 SvXMLUnitConverter::convertPercent( aOut, aGradient.StartIntensity ); 309 aStrValue = aOut.makeStringAndClear(); 310 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_START_INTENSITY, aStrValue ); 311 312 // Intensity end 313 SvXMLUnitConverter::convertPercent( aOut, aGradient.EndIntensity ); 314 aStrValue = aOut.makeStringAndClear(); 315 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_END_INTENSITY, aStrValue ); 316 317 // Angle 318 if( aGradient.Style != awt::GradientStyle_RADIAL ) 319 { 320 SvXMLUnitConverter::convertNumber( aOut, sal_Int32( aGradient.Angle ) ); 321 aStrValue = aOut.makeStringAndClear(); 322 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_GRADIENT_ANGLE, aStrValue ); 323 } 324 325 // Border 326 SvXMLUnitConverter::convertPercent( aOut, aGradient.Border ); 327 aStrValue = aOut.makeStringAndClear(); 328 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_GRADIENT_BORDER, aStrValue ); 329 330 // Do Write 331 SvXMLElementExport aElem( rExport, XML_NAMESPACE_DRAW, XML_GRADIENT, 332 sal_True, sal_False ); 333 } 334 } 335 } 336 337 return bRet; 338 } 339 340 #endif // #ifndef SVX_LIGHT 341