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 <com/sun/star/drawing/DashStyle.hpp> 27 #include <com/sun/star/drawing/LineDash.hpp> 28 #include "xmloff/DashStyle.hxx" 29 #include <xmloff/attrlist.hxx> 30 #include <xmloff/nmspmap.hxx> 31 #include <xmloff/xmluconv.hxx> 32 #include "xmloff/xmlnmspe.hxx" 33 #include <xmloff/xmltoken.hxx> 34 #include <xmloff/xmlexp.hxx> 35 #include <xmloff/xmlimp.hxx> 36 #include <rtl/ustrbuf.hxx> 37 #include <rtl/ustring.hxx> 38 #include <tools/debug.hxx> 39 #include <xmloff/xmltkmap.hxx> 40 41 using namespace ::com::sun::star; 42 using ::rtl::OUString; 43 using ::rtl::OUStringBuffer; 44 45 using namespace ::xmloff::token; 46 47 enum SvXMLTokenMapAttrs 48 { 49 XML_TOK_DASH_NAME, 50 XML_TOK_DASH_DISPLAY_NAME, 51 XML_TOK_DASH_STYLE, 52 XML_TOK_DASH_DOTS1, 53 XML_TOK_DASH_DOTS1LEN, 54 XML_TOK_DASH_DOTS2, 55 XML_TOK_DASH_DOTS2LEN, 56 XML_TOK_DASH_DISTANCE, 57 XML_TOK_DASH_END=XML_TOK_UNKNOWN 58 }; 59 60 static __FAR_DATA SvXMLTokenMapEntry aDashStyleAttrTokenMap[] = 61 { 62 { XML_NAMESPACE_DRAW, XML_NAME, XML_TOK_DASH_NAME }, 63 { XML_NAMESPACE_DRAW, XML_DISPLAY_NAME, XML_TOK_DASH_DISPLAY_NAME }, 64 { XML_NAMESPACE_DRAW, XML_STYLE, XML_TOK_DASH_STYLE }, 65 { XML_NAMESPACE_DRAW, XML_DOTS1, XML_TOK_DASH_DOTS1 }, 66 { XML_NAMESPACE_DRAW, XML_DOTS1_LENGTH, XML_TOK_DASH_DOTS1LEN }, 67 { XML_NAMESPACE_DRAW, XML_DOTS2, XML_TOK_DASH_DOTS2 }, 68 { XML_NAMESPACE_DRAW, XML_DOTS2_LENGTH, XML_TOK_DASH_DOTS2LEN }, 69 { XML_NAMESPACE_DRAW, XML_DISTANCE, XML_TOK_DASH_DISTANCE }, 70 XML_TOKEN_MAP_END 71 }; 72 73 SvXMLEnumMapEntry __READONLY_DATA pXML_DashStyle_Enum[] = 74 { 75 { XML_RECT, drawing::DashStyle_RECT }, 76 { XML_ROUND, drawing::DashStyle_ROUND }, 77 { XML_RECT, drawing::DashStyle_RECTRELATIVE }, 78 { XML_ROUND, drawing::DashStyle_ROUNDRELATIVE }, 79 { XML_TOKEN_INVALID, 0 } 80 }; 81 82 //------------------------------------------------------------- 83 // Import 84 //------------------------------------------------------------- 85 86 XMLDashStyleImport::XMLDashStyleImport( SvXMLImport& rImp ) 87 : rImport(rImp) 88 { 89 } 90 91 XMLDashStyleImport::~XMLDashStyleImport() 92 { 93 } 94 95 sal_Bool XMLDashStyleImport::importXML( 96 const uno::Reference< xml::sax::XAttributeList >& xAttrList, 97 uno::Any& rValue, 98 OUString& rStrName ) 99 { 100 drawing::LineDash aLineDash; 101 aLineDash.Style = drawing::DashStyle_RECT; 102 aLineDash.Dots = 0; 103 aLineDash.DotLen = 0; 104 aLineDash.Dashes = 0; 105 aLineDash.DashLen = 0; 106 aLineDash.Distance = 20; 107 OUString aDisplayName; 108 109 sal_Bool bIsRel = sal_False; 110 111 SvXMLNamespaceMap& rNamespaceMap = rImport.GetNamespaceMap(); 112 SvXMLUnitConverter& rUnitConverter = rImport.GetMM100UnitConverter(); 113 114 SvXMLTokenMap aTokenMap( aDashStyleAttrTokenMap ); 115 116 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 117 for( sal_Int16 i=0; i < nAttrCount; i++ ) 118 { 119 const OUString& rFullAttrName = xAttrList->getNameByIndex( i ); 120 OUString aStrAttrName; 121 sal_uInt16 nPrefix = rNamespaceMap.GetKeyByAttrName( rFullAttrName, &aStrAttrName ); 122 const OUString& rStrValue = xAttrList->getValueByIndex( i ); 123 124 switch( aTokenMap.Get( nPrefix, aStrAttrName ) ) 125 { 126 case XML_TOK_DASH_NAME: 127 { 128 rStrName = rStrValue; 129 } 130 break; 131 case XML_TOK_DASH_DISPLAY_NAME: 132 { 133 aDisplayName = rStrValue; 134 } 135 break; 136 case XML_TOK_DASH_STYLE: 137 { 138 sal_uInt16 eValue; 139 if( rUnitConverter.convertEnum( eValue, rStrValue, pXML_DashStyle_Enum ) ) 140 { 141 aLineDash.Style = (drawing::DashStyle) eValue; 142 } 143 } 144 break; 145 case XML_TOK_DASH_DOTS1: 146 aLineDash.Dots = (sal_Int16)rStrValue.toInt32(); 147 break; 148 149 case XML_TOK_DASH_DOTS1LEN: 150 { 151 if( rStrValue.indexOf( sal_Unicode('%') ) != -1 ) // its a percentage 152 { 153 bIsRel = sal_True; 154 rUnitConverter.convertPercent( aLineDash.DotLen, rStrValue ); 155 } 156 else 157 { 158 rUnitConverter.convertMeasure( aLineDash.DotLen, rStrValue ); 159 } 160 } 161 break; 162 163 case XML_TOK_DASH_DOTS2: 164 aLineDash.Dashes = (sal_Int16)rStrValue.toInt32(); 165 break; 166 167 case XML_TOK_DASH_DOTS2LEN: 168 { 169 if( rStrValue.indexOf( sal_Unicode('%') ) != -1 ) // its a percentage 170 { 171 bIsRel = sal_True; 172 rUnitConverter.convertPercent( aLineDash.DashLen, rStrValue ); 173 } 174 else 175 { 176 rUnitConverter.convertMeasure( aLineDash.DashLen, rStrValue ); 177 } 178 } 179 break; 180 181 case XML_TOK_DASH_DISTANCE: 182 { 183 if( rStrValue.indexOf( sal_Unicode('%') ) != -1 ) // its a percentage 184 { 185 bIsRel = sal_True; 186 rUnitConverter.convertPercent( aLineDash.Distance, rStrValue ); 187 } 188 else 189 { 190 rUnitConverter.convertMeasure( aLineDash.Distance, rStrValue ); 191 } 192 } 193 break; 194 default: 195 DBG_WARNING( "Unknown token at import gradient style" ); 196 } 197 } 198 199 if( bIsRel ) 200 aLineDash.Style = aLineDash.Style == drawing::DashStyle_RECT ? drawing::DashStyle_RECTRELATIVE : drawing::DashStyle_ROUNDRELATIVE; 201 202 rValue <<= aLineDash; 203 204 if( aDisplayName.getLength() ) 205 { 206 rImport.AddStyleDisplayName( XML_STYLE_FAMILY_SD_STROKE_DASH_ID, 207 rStrName, aDisplayName ); 208 rStrName = aDisplayName; 209 } 210 211 return sal_True; 212 } 213 214 215 //------------------------------------------------------------- 216 // Export 217 //------------------------------------------------------------- 218 219 #ifndef SVX_LIGHT 220 221 XMLDashStyleExport::XMLDashStyleExport( SvXMLExport& rExp ) 222 : rExport(rExp) 223 { 224 } 225 226 XMLDashStyleExport::~XMLDashStyleExport() 227 { 228 } 229 230 sal_Bool XMLDashStyleExport::exportXML( 231 const OUString& rStrName, 232 const uno::Any& rValue ) 233 { 234 sal_Bool bRet = sal_False; 235 236 SvXMLUnitConverter rUnitConverter = rExport.GetMM100UnitConverter(); 237 238 drawing::LineDash aLineDash; 239 240 if( rStrName.getLength() ) 241 { 242 if( rValue >>= aLineDash ) 243 { 244 sal_Bool bIsRel = aLineDash.Style == drawing::DashStyle_RECTRELATIVE || aLineDash.Style == drawing::DashStyle_ROUNDRELATIVE; 245 246 OUString aStrValue; 247 OUStringBuffer aOut; 248 249 // Name 250 sal_Bool bEncoded = sal_False; 251 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, 252 rExport.EncodeStyleName( rStrName, 253 &bEncoded ) ); 254 if( bEncoded ) 255 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DISPLAY_NAME, 256 rStrName ); 257 258 // Style 259 rUnitConverter.convertEnum( aOut, aLineDash.Style, pXML_DashStyle_Enum ); 260 aStrValue = aOut.makeStringAndClear(); 261 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_STYLE, aStrValue ); 262 263 264 // dots 265 if( aLineDash.Dots ) 266 { 267 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DOTS1, OUString::valueOf( (sal_Int32)aLineDash.Dots ) ); 268 269 if( aLineDash.DotLen ) 270 { 271 // dashes length 272 if( bIsRel ) 273 { 274 rUnitConverter.convertPercent( aOut, aLineDash.DotLen ); 275 } 276 else 277 { 278 rUnitConverter.convertMeasure( aOut, aLineDash.DotLen ); 279 } 280 aStrValue = aOut.makeStringAndClear(); 281 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DOTS1_LENGTH, aStrValue ); 282 } 283 } 284 285 // dashes 286 if( aLineDash.Dashes ) 287 { 288 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DOTS2, OUString::valueOf( (sal_Int32)aLineDash.Dashes ) ); 289 290 if( aLineDash.DashLen ) 291 { 292 // dashes length 293 if( bIsRel ) 294 { 295 rUnitConverter.convertPercent( aOut, aLineDash.DashLen ); 296 } 297 else 298 { 299 rUnitConverter.convertMeasure( aOut, aLineDash.DashLen ); 300 } 301 aStrValue = aOut.makeStringAndClear(); 302 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DOTS2_LENGTH, aStrValue ); 303 } 304 } 305 306 // distance 307 if( bIsRel ) 308 { 309 rUnitConverter.convertPercent( aOut, aLineDash.Distance ); 310 } 311 else 312 { 313 rUnitConverter.convertMeasure( aOut, aLineDash.Distance ); 314 } 315 aStrValue = aOut.makeStringAndClear(); 316 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DISTANCE, aStrValue ); 317 318 319 // do Write 320 SvXMLElementExport rElem( rExport, 321 XML_NAMESPACE_DRAW, XML_STROKE_DASH, 322 sal_True, sal_False ); 323 } 324 } 325 return bRet; 326 } 327 328 #endif // #ifndef SVX_LIGHT 329