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 27 #include <com/sun/star/beans/PropertyValue.hpp> 28 #include <com/sun/star/beans/XPropertySet.hpp> 29 #include <com/sun/star/awt/Size.hpp> 30 #include <com/sun/star/awt/FontDescriptor.hpp> 31 #include <com/sun/star/document/XLinkAuthorizer.hpp> 32 #include <com/sun/star/text/HoriOrientation.hpp> 33 #include <com/sun/star/text/VertOrientation.hpp> 34 // --> OD 2008-01-16 #newlistlevelattrs# 35 #include <com/sun/star/text/PositionAndSpaceMode.hpp> 36 #include <com/sun/star/text/LabelFollow.hpp> 37 // <-- 38 #include <com/sun/star/container/XNameContainer.hpp> 39 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 40 #include <com/sun/star/style/XStyle.hpp> 41 #include <com/sun/star/io/XOutputStream.hpp> 42 43 #include <rtl/ustrbuf.hxx> 44 45 #include <tools/urlobj.hxx> 46 #include <tools/debug.hxx> 47 #include <tools/fontenum.hxx> 48 49 #include <xmloff/xmltkmap.hxx> 50 #include <xmloff/nmspmap.hxx> 51 #include "xmloff/xmlnmspe.hxx" 52 #include <xmloff/xmlimp.hxx> 53 #include <xmloff/XMLBase64ImportContext.hxx> 54 #include <xmloff/xmltoken.hxx> 55 56 #include <xmloff/i18nmap.hxx> 57 #include <xmloff/xmluconv.hxx> 58 #include "fonthdl.hxx" 59 #include <xmloff/XMLFontStylesContext.hxx> 60 #include <xmloff/families.hxx> 61 #include <xmloff/maptype.hxx> 62 63 #include <xmloff/xmlnumi.hxx> 64 65 #define _SVSTDARR_USHORTS 66 #include <svl/svstdarr.hxx> 67 68 69 using ::rtl::OUString; 70 using ::rtl::OUStringBuffer; 71 72 using namespace ::com::sun::star; 73 using namespace ::com::sun::star::uno; 74 using namespace ::com::sun::star::style; 75 using namespace ::com::sun::star::text; 76 using namespace ::com::sun::star::beans; 77 using namespace ::com::sun::star::container; 78 using namespace ::com::sun::star::lang; 79 using namespace ::com::sun::star::frame; 80 using namespace ::xmloff::token; 81 using namespace ::com::sun::star::io; 82 83 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_SYMBOL_TEXT_DISTANCE[] = 84 "SymbolTextDistance"; 85 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_PARENT_NUMBERING[] = 86 "ParentNumbering"; 87 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_CHAR_STYLE_NAME[] = 88 "CharStyleName"; 89 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_BULLET_CHAR[] ="BulletChar"; 90 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_BULLET_RELSIZE[] = "BulletRelSize"; 91 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_GRAPHIC_SIZE[] = 92 "GraphicSize"; 93 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_VERT_ORIENT[] ="VertOrient"; 94 95 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_NUMBERINGTYPE[] = "NumberingType"; 96 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_PREFIX[] = "Prefix"; 97 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_SUFFIX[] = "Suffix"; 98 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_ADJUST[] = "Adjust"; 99 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_LEFT_MARGIN[] = "LeftMargin"; 100 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_FIRST_LINE_OFFSET[] = 101 "FirstLineOffset"; 102 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_BULLET_FONT[] = "BulletFont"; 103 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_GRAPHICURL[] = "GraphicURL"; 104 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_START_WITH[] = "StartWith"; 105 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_BULLET_COLOR[] = "BulletColor"; 106 // --> OD 2008-01-15 #newlistlevelattrs# 107 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_POSITION_AND_SPACE_MODE[] = "PositionAndSpaceMode"; 108 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_LABEL_FOLLOWED_BY[] = "LabelFollowedBy"; 109 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_LISTTAB_STOP_POSITION[] = "ListtabStopPosition"; 110 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_FIRST_LINE_INDENT[] = "FirstLineIndent"; 111 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_INDENT_AT[] = "IndentAt"; 112 // <-- 113 114 // --------------------------------------------------------------------- 115 116 class SvxXMLListLevelStyleContext_Impl; 117 118 class SvxXMLListLevelStyleAttrContext_Impl : public SvXMLImportContext 119 { 120 SvxXMLListLevelStyleContext_Impl& rListLevel; 121 122 public: 123 124 SvxXMLListLevelStyleAttrContext_Impl( 125 SvXMLImport& rImport, sal_uInt16 nPrfx, 126 const OUString& rLName, 127 const Reference< xml::sax::XAttributeList >& xAttrList, 128 SvxXMLListLevelStyleContext_Impl& rLLevel ); 129 virtual ~SvxXMLListLevelStyleAttrContext_Impl(); 130 131 // --> OD 2008-01-16 #newlistlevelattrs# 132 virtual SvXMLImportContext *CreateChildContext( 133 sal_uInt16 nPrefix, const OUString& rLocalName, 134 const Reference< xml::sax::XAttributeList > & xAttrList ); 135 // <-- 136 }; 137 138 // --------------------------------------------------------------------- 139 140 // --> OD 2008-01-16 #newlistlevelattrs# 141 class SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl : public SvXMLImportContext 142 { 143 SvxXMLListLevelStyleContext_Impl& rListLevel; 144 145 public: 146 147 SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl( 148 SvXMLImport& rImport, sal_uInt16 nPrfx, 149 const OUString& rLName, 150 const Reference< xml::sax::XAttributeList >& xAttrList, 151 SvxXMLListLevelStyleContext_Impl& rLLevel ); 152 virtual ~SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl(); 153 }; 154 // <-- 155 156 // --------------------------------------------------------------------- 157 158 enum SvxXMLTextListLevelStyleAttrTokens 159 { 160 XML_TOK_TEXT_LEVEL_ATTR_LEVEL, 161 XML_TOK_TEXT_LEVEL_ATTR_STYLE_NAME, 162 XML_TOK_TEXT_LEVEL_ATTR_BULLET_CHAR, 163 XML_TOK_TEXT_LEVEL_ATTR_HREF, 164 XML_TOK_TEXT_LEVEL_ATTR_TYPE, 165 XML_TOK_TEXT_LEVEL_ATTR_SHOW, 166 XML_TOK_TEXT_LEVEL_ATTR_ACTUATE, 167 XML_TOK_TEXT_LEVEL_ATTR_NUM_FORMAT, 168 XML_TOK_TEXT_LEVEL_ATTR_NUM_PREFIX, 169 XML_TOK_TEXT_LEVEL_ATTR_NUM_SUFFIX, 170 XML_TOK_TEXT_LEVEL_ATTR_NUM_LETTER_SYNC, 171 XML_TOK_TEXT_LEVEL_ATTR_START_VALUE, 172 XML_TOK_TEXT_LEVEL_ATTR_DISPLAY_LEVELS, 173 174 XML_TOK_TEXT_LEVEL_ATTR_END=XML_TOK_UNKNOWN 175 }; 176 177 const SvXMLTokenMapEntry* lcl_getLevelAttrTokenMap() 178 { 179 static __FAR_DATA SvXMLTokenMapEntry aLevelAttrTokenMap[] = 180 { 181 { XML_NAMESPACE_TEXT, XML_LEVEL, XML_TOK_TEXT_LEVEL_ATTR_LEVEL }, 182 { XML_NAMESPACE_TEXT, XML_STYLE_NAME, XML_TOK_TEXT_LEVEL_ATTR_STYLE_NAME }, 183 { XML_NAMESPACE_TEXT, XML_BULLET_CHAR, XML_TOK_TEXT_LEVEL_ATTR_BULLET_CHAR }, 184 { XML_NAMESPACE_XLINK, XML_HREF, XML_TOK_TEXT_LEVEL_ATTR_HREF }, 185 { XML_NAMESPACE_XLINK, XML_TYPE, XML_TOK_TEXT_LEVEL_ATTR_TYPE }, 186 { XML_NAMESPACE_XLINK, XML_SHOW, XML_TOK_TEXT_LEVEL_ATTR_SHOW }, 187 { XML_NAMESPACE_XLINK, XML_ACTUATE, XML_TOK_TEXT_LEVEL_ATTR_ACTUATE }, 188 189 { XML_NAMESPACE_STYLE, XML_NUM_FORMAT, XML_TOK_TEXT_LEVEL_ATTR_NUM_FORMAT }, 190 { XML_NAMESPACE_STYLE, XML_NUM_PREFIX, XML_TOK_TEXT_LEVEL_ATTR_NUM_PREFIX }, 191 { XML_NAMESPACE_STYLE, XML_NUM_SUFFIX, XML_TOK_TEXT_LEVEL_ATTR_NUM_SUFFIX }, 192 { XML_NAMESPACE_STYLE, XML_NUM_LETTER_SYNC, XML_TOK_TEXT_LEVEL_ATTR_NUM_LETTER_SYNC }, 193 { XML_NAMESPACE_TEXT, XML_START_VALUE, XML_TOK_TEXT_LEVEL_ATTR_START_VALUE }, 194 { XML_NAMESPACE_TEXT, XML_DISPLAY_LEVELS, XML_TOK_TEXT_LEVEL_ATTR_DISPLAY_LEVELS }, 195 196 XML_TOKEN_MAP_END 197 }; 198 return aLevelAttrTokenMap; 199 } 200 201 class SvxXMLListLevelStyleContext_Impl : public SvXMLImportContext 202 { 203 friend class SvxXMLListLevelStyleAttrContext_Impl; 204 const OUString sStarBats; 205 const OUString sStarMath; 206 207 OUString sPrefix; 208 OUString sSuffix; 209 OUString sTextStyleName; 210 OUString sNumFormat; 211 OUString sNumLetterSync; 212 OUString sBulletFontName; 213 OUString sBulletFontStyleName; 214 OUString sImageURL; 215 216 Reference < XOutputStream > xBase64Stream; 217 218 sal_Int32 nLevel; 219 sal_Int32 nSpaceBefore; 220 sal_Int32 nMinLabelWidth; 221 sal_Int32 nMinLabelDist; 222 sal_Int32 nImageWidth; 223 sal_Int32 nImageHeight; 224 sal_Int16 nNumStartValue; 225 sal_Int16 nNumDisplayLevels; 226 227 sal_Int16 eAdjust; 228 sal_Int16 eBulletFontFamily; 229 sal_Int16 eBulletFontPitch; 230 rtl_TextEncoding eBulletFontEncoding; 231 sal_Int16 eImageVertOrient; 232 233 sal_Unicode cBullet; 234 235 sal_Int16 nRelSize; 236 Color aColor; 237 238 // --> OD 2008-01-16 #newlistlevelattrs# 239 sal_Int16 ePosAndSpaceMode; 240 sal_Int16 eLabelFollowedBy; 241 sal_Int32 nListtabStopPosition; 242 sal_Int32 nFirstLineIndent; 243 sal_Int32 nIndentAt; 244 // <-- 245 246 sal_Bool bBullet : 1; 247 sal_Bool bImage : 1; 248 sal_Bool bNum : 1; 249 sal_Bool bHasColor : 1; 250 251 void SetRelSize( sal_Int16 nRel ) { nRelSize = nRel; } 252 void SetColor( sal_Int32 _aColor ) { aColor = _aColor; bHasColor = sal_True; } 253 void SetSpaceBefore( sal_Int32 nSet ) { nSpaceBefore = nSet; } 254 void SetMinLabelWidth( sal_Int32 nSet ) { nMinLabelWidth = nSet; } 255 void SetMinLabelDist( sal_Int32 nSet ) { nMinLabelDist = nSet; } 256 void SetAdjust( sal_Int16 eSet ) { eAdjust = eSet; } 257 258 void SetBulletFontName( const OUString& rSet ) { sBulletFontName = rSet; } 259 void SetBulletFontStyleName( const OUString& rSet ) 260 { sBulletFontStyleName = rSet; } 261 void SetBulletFontFamily( sal_Int16 eSet ) { eBulletFontFamily = eSet; } 262 void SetBulletFontPitch( sal_Int16 eSet ) { eBulletFontPitch = eSet; } 263 void SetBulletFontEncoding( rtl_TextEncoding eSet ) 264 { eBulletFontEncoding = eSet; } 265 266 void SetImageWidth( sal_Int32 nSet ) { nImageWidth = nSet; } 267 void SetImageHeight( sal_Int32 nSet ) { nImageHeight = nSet; } 268 void SetImageVertOrient( sal_Int16 eSet ) 269 { eImageVertOrient = eSet; } 270 271 public: 272 273 SvxXMLListLevelStyleContext_Impl( 274 SvXMLImport& rImport, sal_uInt16 nPrfx, 275 const OUString& rLName, 276 const Reference< xml::sax::XAttributeList > & xAttrList ); 277 virtual ~SvxXMLListLevelStyleContext_Impl(); 278 279 virtual SvXMLImportContext *CreateChildContext( 280 sal_uInt16 nPrefix, const OUString& rLocalName, 281 const Reference< xml::sax::XAttributeList > & xAttrList ); 282 283 sal_Int32 GetLevel() const { return nLevel; } 284 Sequence<beans::PropertyValue> GetProperties( 285 const SvI18NMap *pI18NMap=0 ); 286 287 // --> OD 2008-01-16 #newlistlevelattrs# 288 inline void SetPosAndSpaceMode( sal_Int16 eValue ) 289 { 290 ePosAndSpaceMode = eValue; 291 } 292 inline void SetLabelFollowedBy( sal_Int16 eValue ) 293 { 294 eLabelFollowedBy = eValue; 295 } 296 inline void SetListtabStopPosition( sal_Int32 nValue ) 297 { 298 nListtabStopPosition = nValue; 299 } 300 inline void SetFirstLineIndent( sal_Int32 nValue ) 301 { 302 nFirstLineIndent = nValue; 303 } 304 inline void SetIndentAt( sal_Int32 nValue ) 305 { 306 nIndentAt = nValue; 307 } 308 // <-- 309 }; 310 311 SvxXMLListLevelStyleContext_Impl::SvxXMLListLevelStyleContext_Impl( 312 SvXMLImport& rImport, sal_uInt16 nPrfx, 313 const OUString& rLName, 314 const Reference< xml::sax::XAttributeList > & xAttrList ) 315 316 : SvXMLImportContext( rImport, nPrfx, rLName ) 317 , sStarBats( RTL_CONSTASCII_USTRINGPARAM( "StarBats" ) ) 318 , sStarMath( RTL_CONSTASCII_USTRINGPARAM( "StarMath" ) ) 319 , sNumFormat( OUString::createFromAscii( "1" ) ) 320 , nLevel( -1L ) 321 , nSpaceBefore( 0L ) 322 , nMinLabelWidth( 0L ) 323 , nMinLabelDist( 0L ) 324 , nImageWidth( 0L ) 325 , nImageHeight( 0L ) 326 , nNumStartValue( 1 ) 327 , nNumDisplayLevels( 1 ) 328 , eAdjust( HoriOrientation::LEFT ) 329 , eBulletFontFamily( FAMILY_DONTKNOW ) 330 , eBulletFontPitch( PITCH_DONTKNOW ) 331 , eBulletFontEncoding( RTL_TEXTENCODING_DONTKNOW ) 332 , eImageVertOrient(0) 333 , cBullet( 0 ) 334 , nRelSize(0) 335 , aColor( 0 ) 336 // --> OD 2008-01-16 #newlistelevelattrs# 337 , ePosAndSpaceMode( PositionAndSpaceMode::LABEL_WIDTH_AND_POSITION ) 338 , eLabelFollowedBy( LabelFollow::LISTTAB ) 339 , nListtabStopPosition( 0 ) 340 , nFirstLineIndent( 0 ) 341 , nIndentAt( 0 ) 342 // <-- 343 , bBullet( sal_False ) 344 , bImage( sal_False ) 345 , bNum( sal_False ) 346 , bHasColor( sal_False ) 347 { 348 if( IsXMLToken( rLName, XML_LIST_LEVEL_STYLE_NUMBER ) || 349 IsXMLToken( rLName, XML_OUTLINE_LEVEL_STYLE ) ) 350 bNum = sal_True; 351 else if( IsXMLToken( rLName, XML_LIST_LEVEL_STYLE_BULLET ) ) 352 bBullet = sal_True; 353 else if( IsXMLToken( rLName, XML_LIST_LEVEL_STYLE_IMAGE ) ) 354 bImage = sal_True; 355 356 SvXMLTokenMap aTokenMap( lcl_getLevelAttrTokenMap() ); 357 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 358 for( sal_Int16 i=0; i < nAttrCount; i++ ) 359 { 360 const OUString& rAttrName = xAttrList->getNameByIndex( i ); 361 OUString aLocalName; 362 sal_uInt16 nPrefix = 363 GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, 364 &aLocalName ); 365 const OUString& rValue = xAttrList->getValueByIndex( i ); 366 367 switch( aTokenMap.Get( nPrefix, aLocalName ) ) 368 { 369 case XML_TOK_TEXT_LEVEL_ATTR_LEVEL: 370 nLevel = rValue.toInt32(); 371 if( nLevel >= 1L ) 372 nLevel--; 373 else 374 nLevel = 0; 375 break; 376 case XML_TOK_TEXT_LEVEL_ATTR_STYLE_NAME: 377 sTextStyleName = rValue; 378 break; 379 case XML_TOK_TEXT_LEVEL_ATTR_BULLET_CHAR: 380 cBullet = rValue[0]; 381 break; 382 case XML_TOK_TEXT_LEVEL_ATTR_HREF: 383 if( bImage ) 384 sImageURL = rValue; 385 break; 386 case XML_TOK_TEXT_LEVEL_ATTR_TYPE: 387 case XML_TOK_TEXT_LEVEL_ATTR_SHOW: 388 case XML_TOK_TEXT_LEVEL_ATTR_ACTUATE: 389 // This properties will be ignored 390 break; 391 case XML_TOK_TEXT_LEVEL_ATTR_NUM_FORMAT: 392 if( bNum ) 393 sNumFormat = rValue; 394 break; 395 case XML_TOK_TEXT_LEVEL_ATTR_NUM_PREFIX: 396 sPrefix = rValue; 397 break; 398 case XML_TOK_TEXT_LEVEL_ATTR_NUM_SUFFIX: 399 sSuffix = rValue; 400 break; 401 case XML_TOK_TEXT_LEVEL_ATTR_NUM_LETTER_SYNC: 402 if( bNum ) 403 sNumLetterSync = rValue; 404 break; 405 case XML_TOK_TEXT_LEVEL_ATTR_START_VALUE: 406 if( bNum ) 407 { 408 sal_Int32 nTmp = rValue.toInt32(); 409 nNumStartValue = 410 (nTmp < 0L) ? 1 : ( (nTmp>SHRT_MAX) ? SHRT_MAX 411 : (sal_Int16)nTmp ); 412 } 413 break; 414 case XML_TOK_TEXT_LEVEL_ATTR_DISPLAY_LEVELS: 415 if( bNum ) 416 { 417 sal_Int32 nTmp = rValue.toInt32(); 418 nNumDisplayLevels = 419 (nTmp < 1L) ? 1 : ( (nTmp>SHRT_MAX) ? SHRT_MAX 420 : (sal_Int16)nTmp ); 421 } 422 break; 423 } 424 } 425 } 426 427 SvxXMLListLevelStyleContext_Impl::~SvxXMLListLevelStyleContext_Impl() 428 { 429 } 430 431 SvXMLImportContext *SvxXMLListLevelStyleContext_Impl::CreateChildContext( 432 sal_uInt16 nPrefix, const OUString& rLocalName, 433 const Reference< xml::sax::XAttributeList > & xAttrList ) 434 { 435 SvXMLImportContext *pContext = 0; 436 if( XML_NAMESPACE_STYLE == nPrefix && 437 ( IsXMLToken( rLocalName, XML_LIST_LEVEL_PROPERTIES ) || 438 IsXMLToken( rLocalName, XML_TEXT_PROPERTIES ) ) ) 439 { 440 pContext = new SvxXMLListLevelStyleAttrContext_Impl( GetImport(), 441 nPrefix, 442 rLocalName, 443 xAttrList, 444 *this ); 445 } 446 else if( (XML_NAMESPACE_OFFICE == nPrefix) && xmloff::token::IsXMLToken( rLocalName, 447 xmloff::token::XML_BINARY_DATA ) ) 448 { 449 if( bImage && !sImageURL.getLength() && !xBase64Stream.is() ) 450 { 451 xBase64Stream = GetImport().GetStreamForGraphicObjectURLFromBase64(); 452 if( xBase64Stream.is() ) 453 pContext = new XMLBase64ImportContext( GetImport(), nPrefix, 454 rLocalName, xAttrList, 455 xBase64Stream ); 456 } 457 } 458 if( !pContext ) 459 { 460 pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); 461 } 462 463 return pContext; 464 } 465 466 Sequence<beans::PropertyValue> SvxXMLListLevelStyleContext_Impl::GetProperties( 467 const SvI18NMap *pI18NMap ) 468 { 469 sal_Int16 eType = NumberingType::NUMBER_NONE; 470 471 sal_Int32 nCount = 0; 472 if( bBullet ) 473 { 474 eType = NumberingType::CHAR_SPECIAL; 475 nCount = cBullet ? 15 : 14; 476 } 477 if( bImage ) 478 { 479 eType = NumberingType::BITMAP; 480 nCount = 15; 481 482 if( (sImageURL.getLength() > 0L) || xBase64Stream.is() ) 483 nCount++; 484 } 485 if( bNum ) 486 { 487 eType = NumberingType::ARABIC; 488 GetImport().GetMM100UnitConverter().convertNumFormat( 489 eType, sNumFormat, sNumLetterSync, sal_True ); 490 nCount = 15; 491 } 492 493 if( ( bBullet || bNum ) && nRelSize ) 494 nCount++; 495 496 if( !bImage && bHasColor ) 497 { 498 nCount++; 499 } 500 501 if (bBullet && sSuffix.getLength()) 502 { 503 sal_uInt16 const nVersion(GetImport().getGeneratorVersion()); 504 sal_Int32 nUPD; 505 sal_Int32 nBuildId; 506 if (GetImport().getBuildIds(nUPD, nBuildId) 507 && ( (SvXMLImport::OOo_1x == nVersion) 508 || (SvXMLImport::OOo_2x == nVersion) 509 || (310 == nUPD) || (320 == nUPD) || (330 == nUPD) 510 || ((300 == nUPD) && (nBuildId <= 9573)))) 511 { 512 // #i93908# OOo < 3.4 wrote a bogus suffix for bullet chars 513 sSuffix = ::rtl::OUString(); // clear it 514 } 515 } 516 517 Sequence<beans::PropertyValue> aPropSeq( nCount ); 518 if( nCount > 0 ) 519 { 520 beans::PropertyValue *pProps = aPropSeq.getArray(); 521 sal_Int32 nPos = 0; 522 pProps[nPos].Name = 523 OUString::createFromAscii( XML_UNO_NAME_NRULE_NUMBERINGTYPE ); 524 pProps[nPos++].Value <<= (sal_Int16)eType ; 525 526 pProps[nPos].Name = OUString::createFromAscii( XML_UNO_NAME_NRULE_PREFIX ); 527 pProps[nPos++].Value <<= sPrefix; 528 529 pProps[nPos].Name = OUString::createFromAscii( XML_UNO_NAME_NRULE_SUFFIX ); 530 pProps[nPos++].Value <<= sSuffix; 531 532 pProps[nPos].Name = OUString::createFromAscii( XML_UNO_NAME_NRULE_ADJUST ); 533 pProps[nPos++].Value <<= eAdjust; 534 535 sal_Int32 nLeftMargin = nSpaceBefore + nMinLabelWidth; 536 pProps[nPos].Name = 537 OUString::createFromAscii( XML_UNO_NAME_NRULE_LEFT_MARGIN ); 538 pProps[nPos++].Value <<= (sal_Int32)nLeftMargin; 539 540 sal_Int32 nFirstLineOffset = -nMinLabelWidth; 541 542 pProps[nPos].Name = 543 OUString::createFromAscii( XML_UNO_NAME_NRULE_FIRST_LINE_OFFSET ); 544 pProps[nPos++].Value <<= (sal_Int32)nFirstLineOffset; 545 546 pProps[nPos].Name = 547 OUString::createFromAscii(XML_UNO_NAME_NRULE_SYMBOL_TEXT_DISTANCE); 548 pProps[nPos++].Value <<= (sal_Int16)nMinLabelDist; 549 550 // --> OD 2008-01-16 #newlistlevelattrs# 551 pProps[nPos].Name = 552 OUString::createFromAscii(XML_UNO_NAME_NRULE_POSITION_AND_SPACE_MODE); 553 pProps[nPos++].Value <<= (sal_Int16)ePosAndSpaceMode; 554 pProps[nPos].Name = 555 OUString::createFromAscii(XML_UNO_NAME_NRULE_LABEL_FOLLOWED_BY); 556 pProps[nPos++].Value <<= (sal_Int16)eLabelFollowedBy; 557 pProps[nPos].Name = 558 OUString::createFromAscii(XML_UNO_NAME_NRULE_LISTTAB_STOP_POSITION); 559 pProps[nPos++].Value <<= (sal_Int32)nListtabStopPosition; 560 pProps[nPos].Name = 561 OUString::createFromAscii(XML_UNO_NAME_NRULE_FIRST_LINE_INDENT); 562 pProps[nPos++].Value <<= (sal_Int32)nFirstLineIndent; 563 pProps[nPos].Name = 564 OUString::createFromAscii(XML_UNO_NAME_NRULE_INDENT_AT); 565 pProps[nPos++].Value <<= (sal_Int32)nIndentAt; 566 // <-- 567 568 OUString sDisplayTextStyleName = GetImport().GetStyleDisplayName( 569 XML_STYLE_FAMILY_TEXT_TEXT, sTextStyleName ); 570 OUString sStyleName = sDisplayTextStyleName; 571 if( sStyleName.getLength() && pI18NMap ) 572 sStyleName = pI18NMap->Get( SFX_STYLE_FAMILY_CHAR, sStyleName ); 573 pProps[nPos].Name = 574 OUString::createFromAscii( XML_UNO_NAME_NRULE_CHAR_STYLE_NAME ); 575 pProps[nPos++].Value <<= sDisplayTextStyleName; 576 577 if( bBullet ) 578 { 579 awt::FontDescriptor aFDesc; 580 aFDesc.Name = sBulletFontName; 581 if( sBulletFontName.getLength() ) 582 { 583 aFDesc.StyleName = sBulletFontStyleName; 584 aFDesc.Family = eBulletFontFamily; 585 aFDesc.Pitch = eBulletFontPitch; 586 aFDesc.CharSet = eBulletFontEncoding; 587 aFDesc.Weight = WEIGHT_DONTKNOW; 588 //aFDesc.Transparant = sal_True; 589 sal_Bool bStarSymbol = sal_False; 590 if( aFDesc.Name.equalsIgnoreAsciiCase( sStarBats ) ) 591 { 592 cBullet = GetImport().ConvStarBatsCharToStarSymbol( cBullet ); 593 bStarSymbol = sal_True; 594 } 595 else if( aFDesc.Name.equalsIgnoreAsciiCase( sStarMath ) ) 596 { 597 cBullet = GetImport().ConvStarMathCharToStarSymbol( cBullet ); 598 bStarSymbol = sal_True; 599 } 600 if( bStarSymbol ) 601 aFDesc.Name = 602 OUString( RTL_CONSTASCII_USTRINGPARAM("StarSymbol" ) ); 603 } 604 605 if( cBullet ) 606 { 607 OUStringBuffer sTmp(1); 608 sTmp.append( cBullet ); 609 pProps[nPos].Name = 610 OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_CHAR ); 611 pProps[nPos++].Value <<= sTmp.makeStringAndClear(); 612 } 613 614 pProps[nPos].Name = 615 OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_FONT ); 616 pProps[nPos++].Value <<= aFDesc; 617 618 } 619 620 if( bImage ) 621 { 622 OUString sStr( sImageURL ); 623 if( sImageURL.getLength() ) 624 { 625 sStr = GetImport().ResolveGraphicObjectURL( sImageURL, 626 sal_False ); 627 } 628 else if( xBase64Stream.is() ) 629 { 630 sStr = GetImport().ResolveGraphicObjectURLFromBase64( xBase64Stream ); 631 // xBase64Stream = 0; 632 } 633 634 if( sStr.getLength() ) 635 { 636 pProps[nPos].Name = 637 OUString::createFromAscii( XML_UNO_NAME_NRULE_GRAPHICURL ); 638 pProps[nPos++].Value <<= sStr; 639 } 640 641 awt::Size aSize( nImageWidth, nImageHeight ); 642 pProps[nPos].Name = 643 OUString::createFromAscii( XML_UNO_NAME_NRULE_GRAPHIC_SIZE ); 644 pProps[nPos++].Value <<= aSize; 645 646 pProps[nPos].Name = 647 OUString::createFromAscii( XML_UNO_NAME_NRULE_VERT_ORIENT ); 648 pProps[nPos++].Value <<= (sal_Int16)eImageVertOrient; 649 } 650 651 if( bNum ) 652 { 653 pProps[nPos].Name = 654 OUString::createFromAscii( XML_UNO_NAME_NRULE_START_WITH ); 655 pProps[nPos++].Value <<= (sal_Int16)nNumStartValue; 656 657 pProps[nPos].Name = 658 OUString::createFromAscii(XML_UNO_NAME_NRULE_PARENT_NUMBERING); 659 pProps[nPos++].Value <<= (sal_Int16)nNumDisplayLevels; 660 } 661 662 if( ( bNum || bBullet ) && nRelSize ) 663 { 664 pProps[nPos].Name = 665 OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_RELSIZE ); 666 pProps[nPos++].Value <<= nRelSize; 667 } 668 669 if( !bImage && bHasColor ) 670 { 671 pProps[nPos].Name = OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_COLOR ); 672 pProps[nPos++].Value <<= (sal_Int32)aColor.GetColor(); 673 } 674 675 DBG_ASSERT( nPos == nCount, "array under/overflow" ); 676 } 677 678 return aPropSeq; 679 } 680 681 // --------------------------------------------------------------------- 682 683 enum SvxXMLStyleAttributesAttrTokens 684 { 685 XML_TOK_STYLE_ATTRIBUTES_ATTR_SPACE_BEFORE, 686 XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_WIDTH, 687 XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_DIST, 688 XML_TOK_STYLE_ATTRIBUTES_ATTR_TEXT_ALIGN, 689 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_NAME, 690 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY, 691 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY_GENERIC, 692 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_STYLENAME, 693 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_PITCH, 694 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_CHARSET, 695 XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_POS, 696 XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_REL, 697 XML_TOK_STYLE_ATTRIBUTES_ATTR_WIDTH, 698 XML_TOK_STYLE_ATTRIBUTES_ATTR_HEIGHT, 699 XML_TOK_STYLE_ATTRIBUTES_ATTR_COLOR, 700 XML_TOK_STYLE_ATTRIBUTES_ATTR_WINDOW_FONT_COLOR, 701 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_SIZE, 702 // --> OD 2008-01-16 #newlistlevelattrs# 703 XML_TOK_STYLE_ATTRIBUTES_ATTR_POSITION_AND_SPACE_MODE, 704 // <-- 705 706 XML_TOK_STYLE_ATTRIBUTES_ATTR_END=XML_TOK_UNKNOWN 707 }; 708 const SvXMLTokenMapEntry* lcl_getStyleAttributesAttrTokenMap() 709 { 710 static __FAR_DATA SvXMLTokenMapEntry aStyleAttributesAttrTokenMap[] = 711 { 712 { XML_NAMESPACE_TEXT, XML_SPACE_BEFORE, 713 XML_TOK_STYLE_ATTRIBUTES_ATTR_SPACE_BEFORE }, 714 { XML_NAMESPACE_TEXT, XML_MIN_LABEL_WIDTH, 715 XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_WIDTH }, 716 { XML_NAMESPACE_TEXT, XML_MIN_LABEL_DISTANCE, 717 XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_DIST }, 718 { XML_NAMESPACE_FO, XML_TEXT_ALIGN, 719 XML_TOK_STYLE_ATTRIBUTES_ATTR_TEXT_ALIGN }, 720 { XML_NAMESPACE_STYLE, XML_FONT_NAME, 721 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_NAME }, 722 { XML_NAMESPACE_FO, XML_FONT_FAMILY, 723 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY }, 724 { XML_NAMESPACE_STYLE, XML_FONT_FAMILY_GENERIC, 725 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY_GENERIC }, 726 { XML_NAMESPACE_STYLE, XML_FONT_STYLE_NAME, 727 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_STYLENAME }, 728 { XML_NAMESPACE_STYLE, XML_FONT_PITCH, 729 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_PITCH }, 730 { XML_NAMESPACE_STYLE, XML_FONT_CHARSET, 731 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_CHARSET }, 732 { XML_NAMESPACE_STYLE, XML_VERTICAL_POS, 733 XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_POS }, 734 { XML_NAMESPACE_STYLE, XML_VERTICAL_REL, 735 XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_REL }, 736 { XML_NAMESPACE_FO, XML_WIDTH, 737 XML_TOK_STYLE_ATTRIBUTES_ATTR_WIDTH }, 738 { XML_NAMESPACE_FO, XML_HEIGHT, 739 XML_TOK_STYLE_ATTRIBUTES_ATTR_HEIGHT }, 740 { XML_NAMESPACE_FO, XML_COLOR, 741 XML_TOK_STYLE_ATTRIBUTES_ATTR_COLOR }, 742 { XML_NAMESPACE_STYLE, XML_USE_WINDOW_FONT_COLOR, 743 XML_TOK_STYLE_ATTRIBUTES_ATTR_WINDOW_FONT_COLOR }, 744 { XML_NAMESPACE_FO, XML_FONT_SIZE, 745 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_SIZE }, 746 // --> OD 2008-01-16 #newlistlevelattrs# 747 { XML_NAMESPACE_TEXT, XML_LIST_LEVEL_POSITION_AND_SPACE_MODE, 748 XML_TOK_STYLE_ATTRIBUTES_ATTR_POSITION_AND_SPACE_MODE }, 749 // <-- 750 751 XML_TOKEN_MAP_END 752 }; 753 return aStyleAttributesAttrTokenMap; 754 } 755 SvxXMLListLevelStyleAttrContext_Impl::SvxXMLListLevelStyleAttrContext_Impl( 756 SvXMLImport& rImport, sal_uInt16 nPrfx, 757 const OUString& rLName, 758 const Reference< xml::sax::XAttributeList > & xAttrList, 759 SvxXMLListLevelStyleContext_Impl& rLLevel ) : 760 SvXMLImportContext( rImport, nPrfx, rLName ), 761 rListLevel( rLLevel ) 762 { 763 SvXMLTokenMap aTokenMap( lcl_getStyleAttributesAttrTokenMap() ); 764 SvXMLUnitConverter& rUnitConv = GetImport().GetMM100UnitConverter(); 765 766 OUString sFontName, sFontFamily, sFontStyleName, sFontFamilyGeneric, 767 sFontPitch, sFontCharset; 768 OUString sVerticalPos, sVerticalRel; 769 770 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 771 for( sal_Int16 i=0; i < nAttrCount; i++ ) 772 { 773 const OUString& rAttrName = xAttrList->getNameByIndex( i ); 774 OUString aLocalName; 775 sal_uInt16 nPrefix = 776 GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, 777 &aLocalName ); 778 const OUString& rValue = xAttrList->getValueByIndex( i ); 779 780 sal_Int32 nVal; 781 switch( aTokenMap.Get( nPrefix, aLocalName ) ) 782 { 783 case XML_TOK_STYLE_ATTRIBUTES_ATTR_SPACE_BEFORE: 784 if( rUnitConv.convertMeasure( nVal, rValue, SHRT_MIN, SHRT_MAX ) ) 785 rListLevel.SetSpaceBefore( nVal ); 786 break; 787 case XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_WIDTH: 788 if( rUnitConv.convertMeasure( nVal, rValue, 0, SHRT_MAX ) ) 789 rListLevel.SetMinLabelWidth( nVal ); 790 break; 791 case XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_DIST: 792 if( rUnitConv.convertMeasure( nVal, rValue, 0, USHRT_MAX ) ) 793 rListLevel.SetMinLabelDist( nVal ); 794 break; 795 case XML_TOK_STYLE_ATTRIBUTES_ATTR_TEXT_ALIGN: 796 if( rValue.getLength() ) 797 { 798 sal_Int16 eAdjust = HoriOrientation::LEFT; 799 if( IsXMLToken( rValue, XML_CENTER ) ) 800 eAdjust = HoriOrientation::CENTER; 801 else if( IsXMLToken( rValue, XML_END ) ) 802 eAdjust = HoriOrientation::RIGHT; 803 rListLevel.SetAdjust( eAdjust ); 804 } 805 break; 806 case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_NAME: 807 sFontName = rValue; 808 break; 809 case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY: 810 sFontFamily = rValue; 811 break; 812 case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY_GENERIC: 813 sFontFamilyGeneric = rValue; 814 break; 815 case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_STYLENAME: 816 sFontStyleName = rValue; 817 break; 818 case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_PITCH: 819 sFontPitch = rValue; 820 break; 821 case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_CHARSET: 822 sFontCharset = rValue; 823 break; 824 case XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_POS: 825 sVerticalPos = rValue; 826 break; 827 case XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_REL: 828 sVerticalRel = rValue; 829 break; 830 case XML_TOK_STYLE_ATTRIBUTES_ATTR_WIDTH: 831 if( rUnitConv.convertMeasure( nVal, rValue, 0, SAL_MAX_INT32) ) 832 rListLevel.SetImageWidth( nVal ); 833 break; 834 case XML_TOK_STYLE_ATTRIBUTES_ATTR_HEIGHT: 835 if( rUnitConv.convertMeasure( nVal, rValue, 0, SAL_MAX_INT32) ) 836 rListLevel.SetImageHeight( nVal ); 837 break; 838 case XML_TOK_STYLE_ATTRIBUTES_ATTR_COLOR: 839 { 840 Color aColor; 841 if( SvXMLUnitConverter::convertColor( aColor, rValue ) ) 842 rListLevel.SetColor( (sal_Int32)aColor.GetColor() ); 843 } 844 break; 845 case XML_TOK_STYLE_ATTRIBUTES_ATTR_WINDOW_FONT_COLOR: 846 { 847 if( IsXMLToken( rValue, XML_TRUE ) ) 848 rListLevel.SetColor( (sal_Int32)0xffffffff ); 849 } 850 break; 851 case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_SIZE: 852 if(SvXMLUnitConverter::convertPercent( nVal, rValue ) ) 853 rListLevel.SetRelSize( (sal_Int16)nVal ); 854 break; 855 // --> OD 2008-01-16 #newlistlevelattrs# 856 case XML_TOK_STYLE_ATTRIBUTES_ATTR_POSITION_AND_SPACE_MODE: 857 { 858 sal_Int16 ePosAndSpaceMode = PositionAndSpaceMode::LABEL_WIDTH_AND_POSITION; 859 if( IsXMLToken( rValue, XML_LABEL_ALIGNMENT ) ) 860 ePosAndSpaceMode = PositionAndSpaceMode::LABEL_ALIGNMENT; 861 rListLevel.SetPosAndSpaceMode( ePosAndSpaceMode ); 862 } 863 break; 864 // <-- 865 } 866 } 867 868 if( sFontName.getLength() ) 869 { 870 const XMLFontStylesContext *pFontDecls = 871 GetImport().GetTextImport()->GetFontDecls(); 872 if( pFontDecls ) 873 { 874 ::std::vector < XMLPropertyState > aProps; 875 if( pFontDecls->FillProperties( sFontName, aProps, 0, 1, 2, 3, 4 ) ) 876 { 877 OUString sTmp; 878 sal_Int16 nTmp = 0; 879 ::std::vector< XMLPropertyState >::iterator i; 880 for( i = aProps.begin(); i != aProps.end(); i++ ) 881 { 882 switch( i->mnIndex ) 883 { 884 case 0: 885 i->maValue >>= sTmp; 886 rListLevel.SetBulletFontName( sTmp); 887 break; 888 case 1: 889 i->maValue >>= sTmp; 890 rListLevel.SetBulletFontStyleName( sTmp ); 891 break; 892 case 2: 893 i->maValue >>= nTmp; 894 rListLevel.SetBulletFontFamily( nTmp ); 895 break; 896 case 3: 897 i->maValue >>= nTmp; 898 rListLevel.SetBulletFontPitch( nTmp ); 899 break; 900 case 4: 901 i->maValue >>= nTmp; 902 rListLevel.SetBulletFontEncoding( nTmp ); 903 break; 904 } 905 } 906 } 907 } 908 } 909 if( sFontFamily.getLength() ) 910 { 911 String sEmpty; 912 Any aAny; 913 914 XMLFontFamilyNamePropHdl aFamilyNameHdl; 915 if( aFamilyNameHdl.importXML( sFontFamily, aAny, rUnitConv ) ) 916 { 917 OUString sTmp; 918 aAny >>= sTmp; 919 rListLevel.SetBulletFontName( sTmp); 920 } 921 922 XMLFontFamilyPropHdl aFamilyHdl; 923 if( sFontFamilyGeneric.getLength() && 924 aFamilyHdl.importXML( sFontFamilyGeneric, aAny, rUnitConv ) ) 925 { 926 sal_Int16 nTmp = 0; 927 aAny >>= nTmp; 928 rListLevel.SetBulletFontFamily( nTmp ); 929 } 930 931 if( sFontStyleName.getLength() ) 932 rListLevel.SetBulletFontStyleName( sFontStyleName ); 933 934 XMLFontPitchPropHdl aPitchHdl; 935 if( sFontPitch.getLength() && 936 aPitchHdl.importXML( sFontPitch, aAny, rUnitConv ) ) 937 { 938 sal_Int16 nTmp = 0; 939 aAny >>= nTmp; 940 rListLevel.SetBulletFontPitch( nTmp ); 941 } 942 943 XMLFontEncodingPropHdl aEncHdl; 944 if( sFontCharset.getLength() && 945 aEncHdl.importXML( sFontCharset, aAny, rUnitConv ) ) 946 { 947 sal_Int16 nTmp = 0; 948 aAny >>= nTmp; 949 rListLevel.SetBulletFontEncoding( nTmp ); 950 } 951 } 952 953 sal_Int16 eVertOrient = VertOrientation::LINE_CENTER; 954 if( sVerticalPos.getLength() ) 955 { 956 if( IsXMLToken( sVerticalPos, XML_TOP ) ) 957 eVertOrient = VertOrientation::LINE_TOP; 958 else if( IsXMLToken( sVerticalPos, XML_BOTTOM ) ) 959 eVertOrient = VertOrientation::LINE_BOTTOM; 960 } 961 if( sVerticalRel.getLength() ) 962 { 963 if( IsXMLToken( sVerticalRel, XML_BASELINE ) ) 964 { 965 // TOP and BOTTOM are exchanged for a baseline relation 966 switch( eVertOrient ) 967 { 968 case VertOrientation::LINE_TOP: 969 eVertOrient = VertOrientation::BOTTOM; 970 break; 971 case VertOrientation::LINE_CENTER: 972 eVertOrient = VertOrientation::CENTER; 973 break; 974 case VertOrientation::LINE_BOTTOM: 975 eVertOrient = VertOrientation::TOP; 976 break; 977 } 978 } 979 else if( IsXMLToken( sVerticalRel, XML_CHAR ) ) 980 { 981 switch( eVertOrient ) 982 { 983 case VertOrientation::LINE_TOP: 984 eVertOrient = VertOrientation::CHAR_TOP; 985 break; 986 case VertOrientation::LINE_CENTER: 987 eVertOrient = VertOrientation::CHAR_CENTER; 988 break; 989 case VertOrientation::LINE_BOTTOM: 990 eVertOrient = VertOrientation::CHAR_BOTTOM; 991 break; 992 } 993 } 994 } 995 rListLevel.SetImageVertOrient( eVertOrient ); 996 } 997 998 SvxXMLListLevelStyleAttrContext_Impl::~SvxXMLListLevelStyleAttrContext_Impl() 999 { 1000 } 1001 1002 // --> OD 2008-01-16 #newlistlevelattrs# 1003 SvXMLImportContext* SvxXMLListLevelStyleAttrContext_Impl::CreateChildContext( 1004 sal_uInt16 nPrefix, const OUString& rLocalName, 1005 const Reference< xml::sax::XAttributeList > & xAttrList ) 1006 { 1007 SvXMLImportContext *pContext = 0; 1008 if ( XML_NAMESPACE_STYLE == nPrefix && 1009 IsXMLToken( rLocalName, XML_LIST_LEVEL_LABEL_ALIGNMENT ) ) 1010 { 1011 pContext = new SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl( GetImport(), 1012 nPrefix, 1013 rLocalName, 1014 xAttrList, 1015 rListLevel ); 1016 } 1017 if( !pContext ) 1018 { 1019 pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); 1020 } 1021 1022 return pContext; 1023 } 1024 // <-- 1025 1026 // --------------------------------------------------------------------- 1027 1028 // --> OD 2008-01-16 #newlistlevelattrs# 1029 enum SvxXMLStyleAttributesLabelAlignmentAttrTokens 1030 { 1031 XML_TOK_STYLE_ATTRIBUTES_ATTR_LABEL_FOLLOWED_BY, 1032 XML_TOK_STYLE_ATTRIBUTES_ATTR_LISTTAB_STOP_POSITION, 1033 XML_TOK_STYLE_ATTRIBUTES_ATTR_FIRST_LINE_INDENT, 1034 XML_TOK_STYLE_ATTRIBUTES_ATTR_INDENT_AT, 1035 1036 XML_TOK_STYLE_ATTRIBUTES_LABEL_ALIGNMENT_ATTR_END=XML_TOK_UNKNOWN 1037 }; 1038 const SvXMLTokenMapEntry* lcl_getStyleAlignmentAttributesAttrTokenMap() 1039 { 1040 static __FAR_DATA SvXMLTokenMapEntry aStyleAlignmentAttributesAttrTokenMap[] = 1041 { 1042 { XML_NAMESPACE_TEXT, XML_LABEL_FOLLOWED_BY, 1043 XML_TOK_STYLE_ATTRIBUTES_ATTR_LABEL_FOLLOWED_BY }, 1044 { XML_NAMESPACE_TEXT, XML_LIST_TAB_STOP_POSITION, 1045 XML_TOK_STYLE_ATTRIBUTES_ATTR_LISTTAB_STOP_POSITION }, 1046 { XML_NAMESPACE_FO, XML_TEXT_INDENT, 1047 XML_TOK_STYLE_ATTRIBUTES_ATTR_FIRST_LINE_INDENT }, 1048 { XML_NAMESPACE_FO, XML_MARGIN_LEFT, 1049 XML_TOK_STYLE_ATTRIBUTES_ATTR_INDENT_AT }, 1050 1051 XML_TOKEN_MAP_END 1052 }; 1053 return aStyleAlignmentAttributesAttrTokenMap; 1054 } 1055 SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl::SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl( 1056 SvXMLImport& rImport, sal_uInt16 nPrfx, 1057 const OUString& rLName, 1058 const Reference< xml::sax::XAttributeList > & xAttrList, 1059 SvxXMLListLevelStyleContext_Impl& rLLevel ) : 1060 SvXMLImportContext( rImport, nPrfx, rLName ), 1061 rListLevel( rLLevel ) 1062 { 1063 SvXMLTokenMap aTokenMap( lcl_getStyleAlignmentAttributesAttrTokenMap() ); 1064 SvXMLUnitConverter& rUnitConv = GetImport().GetMM100UnitConverter(); 1065 1066 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 1067 for( sal_Int16 i=0; i < nAttrCount; i++ ) 1068 { 1069 const OUString& rAttrName = xAttrList->getNameByIndex( i ); 1070 OUString aLocalName; 1071 sal_uInt16 nPrefix = 1072 GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, 1073 &aLocalName ); 1074 const OUString& rValue = xAttrList->getValueByIndex( i ); 1075 1076 sal_Int32 nVal; 1077 switch( aTokenMap.Get( nPrefix, aLocalName ) ) 1078 { 1079 case XML_TOK_STYLE_ATTRIBUTES_ATTR_LABEL_FOLLOWED_BY: 1080 { 1081 sal_Int16 eLabelFollowedBy = LabelFollow::LISTTAB; 1082 if( IsXMLToken( rValue, XML_SPACE ) ) 1083 eLabelFollowedBy = LabelFollow::SPACE; 1084 else if( IsXMLToken( rValue, XML_NOTHING ) ) 1085 eLabelFollowedBy = LabelFollow::NOTHING; 1086 rListLevel.SetLabelFollowedBy( eLabelFollowedBy ); 1087 } 1088 break; 1089 case XML_TOK_STYLE_ATTRIBUTES_ATTR_LISTTAB_STOP_POSITION: 1090 if( rUnitConv.convertMeasure( nVal, rValue, 0, SHRT_MAX ) ) 1091 rListLevel.SetListtabStopPosition( nVal ); 1092 break; 1093 case XML_TOK_STYLE_ATTRIBUTES_ATTR_FIRST_LINE_INDENT: 1094 if( rUnitConv.convertMeasure( nVal, rValue, SHRT_MIN, SHRT_MAX ) ) 1095 rListLevel.SetFirstLineIndent( nVal ); 1096 break; 1097 case XML_TOK_STYLE_ATTRIBUTES_ATTR_INDENT_AT: 1098 if( rUnitConv.convertMeasure( nVal, rValue, SHRT_MIN, SHRT_MAX ) ) 1099 rListLevel.SetIndentAt( nVal ); 1100 break; 1101 } 1102 } 1103 } 1104 1105 SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl::~SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl() 1106 { 1107 } 1108 // <-- 1109 1110 // --------------------------------------------------------------------- 1111 1112 typedef SvxXMLListLevelStyleContext_Impl *SvxXMLListLevelStyleContext_ImplPtr; 1113 SV_DECL_PTRARR( SvxXMLListStyle_Impl, SvxXMLListLevelStyleContext_ImplPtr, 1114 10, 5 ) 1115 1116 void SvxXMLListStyleContext::SetAttribute( sal_uInt16 nPrefixKey, 1117 const OUString& rLocalName, 1118 const OUString& rValue ) 1119 { 1120 if( XML_NAMESPACE_TEXT == nPrefixKey && 1121 IsXMLToken( rLocalName, XML_CONSECUTIVE_NUMBERING ) ) 1122 { 1123 bConsecutive = IsXMLToken( rValue, XML_TRUE ); 1124 } 1125 else 1126 { 1127 SvXMLStyleContext::SetAttribute( nPrefixKey, rLocalName, rValue ); 1128 } 1129 } 1130 1131 1132 SvxXMLListStyleContext::SvxXMLListStyleContext( SvXMLImport& rImport, 1133 sal_uInt16 nPrfx, 1134 const OUString& rLName, 1135 const Reference< xml::sax::XAttributeList > & xAttrList, 1136 sal_Bool bOutl ) 1137 : SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList, bOutl ? XML_STYLE_FAMILY_TEXT_OUTLINE : XML_STYLE_FAMILY_TEXT_LIST ) 1138 , sIsPhysical( RTL_CONSTASCII_USTRINGPARAM( "IsPhysical" ) ) 1139 , sNumberingRules( RTL_CONSTASCII_USTRINGPARAM( "NumberingRules" ) ) 1140 , sName( RTL_CONSTASCII_USTRINGPARAM( "Name" ) ) 1141 , sIsContinuousNumbering( RTL_CONSTASCII_USTRINGPARAM( "IsContinuousNumbering" ) ) 1142 , pLevelStyles( 0 ) 1143 , nLevels( 0 ) 1144 , bConsecutive( sal_False ) 1145 , bOutline( bOutl ) 1146 { 1147 } 1148 1149 SvxXMLListStyleContext::~SvxXMLListStyleContext() 1150 { 1151 if( pLevelStyles ) 1152 { 1153 while( pLevelStyles->Count() ) 1154 { 1155 sal_uInt16 n = pLevelStyles->Count() - 1; 1156 SvxXMLListLevelStyleContext_Impl *pStyle = (*pLevelStyles)[n]; 1157 pLevelStyles->Remove( n, 1 ); 1158 pStyle->ReleaseRef(); 1159 } 1160 } 1161 1162 delete pLevelStyles; 1163 } 1164 1165 TYPEINIT1( SvxXMLListStyleContext, SvXMLStyleContext ); 1166 1167 SvXMLImportContext *SvxXMLListStyleContext::CreateChildContext( 1168 sal_uInt16 nPrefix, 1169 const OUString& rLocalName, 1170 const Reference< xml::sax::XAttributeList > & xAttrList ) 1171 { 1172 SvXMLImportContext *pContext = 0; 1173 1174 if( XML_NAMESPACE_TEXT == nPrefix && 1175 ( bOutline 1176 ? IsXMLToken( rLocalName, XML_OUTLINE_LEVEL_STYLE ) 1177 : ( IsXMLToken( rLocalName, XML_LIST_LEVEL_STYLE_NUMBER ) || 1178 IsXMLToken( rLocalName, XML_LIST_LEVEL_STYLE_BULLET ) || 1179 IsXMLToken( rLocalName, XML_LIST_LEVEL_STYLE_IMAGE ) ) ) ) 1180 { 1181 SvxXMLListLevelStyleContext_Impl *pLevelStyle = 1182 new SvxXMLListLevelStyleContext_Impl( GetImport(), nPrefix, 1183 rLocalName, xAttrList ); 1184 if( !pLevelStyles ) 1185 pLevelStyles = new SvxXMLListStyle_Impl; 1186 pLevelStyles->Insert( pLevelStyle, pLevelStyles->Count() ); 1187 pLevelStyle->AddRef(); 1188 1189 pContext = pLevelStyle; 1190 } 1191 else 1192 { 1193 pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); 1194 } 1195 1196 return pContext; 1197 } 1198 1199 void SvxXMLListStyleContext::FillUnoNumRule( 1200 const Reference< container::XIndexReplace > & rNumRule, 1201 const SvI18NMap *pI18NMap ) const 1202 { 1203 try 1204 { 1205 if( pLevelStyles && rNumRule.is() ) 1206 { 1207 sal_uInt16 nCount = pLevelStyles->Count(); 1208 sal_Int32 l_nLevels = rNumRule->getCount(); 1209 for( sal_uInt16 i=0; i < nCount; i++ ) 1210 { 1211 SvxXMLListLevelStyleContext_Impl *pLevelStyle = 1212 (*pLevelStyles)[i]; 1213 sal_Int32 nLevel = pLevelStyle->GetLevel(); 1214 if( nLevel >= 0 && nLevel < l_nLevels ) 1215 { 1216 Sequence<beans::PropertyValue> aProps = 1217 pLevelStyle->GetProperties( pI18NMap ); 1218 Any aAny; 1219 aAny <<= aProps; 1220 // Validate any URLs 1221 for( sal_Int32 j = 0; j < aProps.getLength(); j++ ) { 1222 if ( aProps[ j ].Name.equalsAscii( "GraphicURL" ) ) { 1223 OUString aURL; 1224 aProps[ j ].Value >>= aURL; 1225 uno::Reference< com::sun::star::document::XLinkAuthorizer > xLinkAuthorizer( GetImport().GetModel(), uno::UNO_QUERY ); 1226 if ( xLinkAuthorizer.is() ) { 1227 if ( !xLinkAuthorizer->authorizeLinks( aURL ) ) 1228 throw uno::RuntimeException(); 1229 } 1230 } 1231 } 1232 rNumRule->replaceByIndex( nLevel, aAny ); 1233 } 1234 } 1235 } 1236 1237 Reference < XPropertySet > xPropSet( rNumRule, UNO_QUERY ); 1238 Reference< XPropertySetInfo > xPropSetInfo; 1239 if (xPropSet.is()) 1240 xPropSetInfo = xPropSet->getPropertySetInfo(); 1241 if( xPropSetInfo.is() && 1242 xPropSetInfo->hasPropertyByName( sIsContinuousNumbering ) ) 1243 { 1244 Any aAny; 1245 sal_Bool bTmp = bConsecutive; 1246 aAny.setValue( &bTmp, ::getBooleanCppuType() ); 1247 xPropSet->setPropertyValue( sIsContinuousNumbering, aAny ); 1248 } 1249 } 1250 catch( Exception& ) 1251 { 1252 DBG_ERROR( "SvxXMLListStyleContext::FillUnoNumRule - Exception catched" ); 1253 } 1254 } 1255 1256 void SvxXMLListStyleContext::CreateAndInsertLate( sal_Bool bOverwrite ) 1257 { 1258 if( bOutline ) 1259 { 1260 if( bOverwrite ) 1261 { 1262 const Reference< XIndexReplace >& rNumRule = 1263 GetImport().GetTextImport()->GetChapterNumbering(); 1264 // We don't set xNumberingRules here, to avoid using them 1265 // as numbering rules. 1266 if( rNumRule.is() ) 1267 FillUnoNumRule( rNumRule, 0 ); 1268 } 1269 } 1270 else 1271 { 1272 Reference < XStyle > xStyle; 1273 const OUString& rName = GetDisplayName(); 1274 if( 0 == rName.getLength() ) 1275 { 1276 SetValid( sal_False ); 1277 return; 1278 } 1279 1280 const Reference < XNameContainer >& rNumStyles = 1281 GetImport().GetTextImport()->GetNumberingStyles(); 1282 if( !rNumStyles.is() ) 1283 { 1284 SetValid( sal_False ); 1285 return; 1286 } 1287 1288 sal_Bool bNew = sal_False; 1289 if( rNumStyles->hasByName( rName ) ) 1290 { 1291 Any aAny = rNumStyles->getByName( rName ); 1292 aAny >>= xStyle; 1293 } 1294 else 1295 { 1296 Reference< XMultiServiceFactory > xFactory( GetImport().GetModel(), 1297 UNO_QUERY ); 1298 DBG_ASSERT( xFactory.is(), "no factory" ); 1299 if( !xFactory.is() ) 1300 return; 1301 1302 Reference < XInterface > xIfc = xFactory->createInstance(OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.style.NumberingStyle")) ); 1303 if( !xIfc.is() ) 1304 return; 1305 Reference < XStyle > xTmp( xIfc, UNO_QUERY ); 1306 xStyle = xTmp; 1307 if( !xStyle.is() ) 1308 return; 1309 1310 Any aAny; 1311 aAny <<= xStyle; 1312 rNumStyles->insertByName( rName, aAny ); 1313 bNew = sal_True; 1314 } 1315 1316 Reference < XPropertySet > xPropSet( xStyle, UNO_QUERY ); 1317 Reference< XPropertySetInfo > xPropSetInfo = 1318 xPropSet->getPropertySetInfo(); 1319 if( !bNew && xPropSetInfo->hasPropertyByName( sIsPhysical ) ) 1320 { 1321 Any aAny = xPropSet->getPropertyValue( sIsPhysical ); 1322 bNew = !*(sal_Bool *)aAny.getValue(); 1323 } 1324 if( rName != GetName() ) 1325 GetImport().AddStyleDisplayName( XML_STYLE_FAMILY_TEXT_LIST, 1326 GetName(), rName ); 1327 1328 Any aAny = xPropSet->getPropertyValue( sNumberingRules ); 1329 aAny >>= xNumRules; 1330 nLevels = xNumRules->getCount(); 1331 if( bOverwrite || bNew ) 1332 { 1333 FillUnoNumRule( xNumRules, 0 ); 1334 aAny <<= xNumRules; 1335 xPropSet->setPropertyValue( sNumberingRules, aAny ); 1336 } 1337 else 1338 { 1339 SetValid( sal_False ); 1340 } 1341 1342 SetNew( bNew ); 1343 } 1344 } 1345 1346 void SvxXMLListStyleContext::CreateAndInsertAuto() const 1347 { 1348 DBG_ASSERT( !bOutline, "Outlines cannot be inserted here" ); 1349 DBG_ASSERT( !xNumRules.is(), "Numbering Rule is existing already" ); 1350 1351 const OUString& rName = GetName(); 1352 if( bOutline || xNumRules.is() || 0 == rName.getLength() ) 1353 { 1354 ((SvxXMLListStyleContext *)this)->SetValid( sal_False ); 1355 return; 1356 } 1357 1358 ((SvxXMLListStyleContext *)this)->xNumRules = CreateNumRule( 1359 GetImport().GetModel() ); 1360 ((SvxXMLListStyleContext *)this)->nLevels = xNumRules->getCount(); 1361 1362 FillUnoNumRule( xNumRules, 0 ); 1363 } 1364 1365 Reference < XIndexReplace > SvxXMLListStyleContext::CreateNumRule( 1366 const Reference < XModel > & rModel ) 1367 { 1368 Reference<XIndexReplace> xNumRule; 1369 1370 Reference< XMultiServiceFactory > xFactory( rModel, UNO_QUERY ); 1371 DBG_ASSERT( xFactory.is(), "no factory" ); 1372 if( !xFactory.is() ) 1373 return xNumRule; 1374 1375 Reference < XInterface > xIfc = xFactory->createInstance(OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.text.NumberingRules")) ); 1376 if( !xIfc.is() ) 1377 return xNumRule; 1378 1379 xNumRule = Reference<XIndexReplace>( xIfc, UNO_QUERY ); 1380 DBG_ASSERT( xNumRule.is(), "go no numbering rule" ); 1381 1382 return xNumRule; 1383 } 1384 1385 void SvxXMLListStyleContext::SetDefaultStyle( 1386 const Reference < XIndexReplace > & rNumRule, 1387 sal_Int16 nLevel, 1388 sal_Bool bOrdered ) 1389 { 1390 Sequence<beans::PropertyValue> aPropSeq( bOrdered ? 1 : 4 ); 1391 beans::PropertyValue *pProps = aPropSeq.getArray(); 1392 1393 pProps->Name = 1394 OUString::createFromAscii( XML_UNO_NAME_NRULE_NUMBERINGTYPE ); 1395 (pProps++)->Value <<= (sal_Int16)(bOrdered ? NumberingType::ARABIC 1396 : NumberingType::CHAR_SPECIAL ); 1397 if( !bOrdered ) 1398 { 1399 // TODO: Bullet-Font 1400 //aNumFmt.SetBulletFont( &SwNumRule::GetDefBulletFont() ); 1401 awt::FontDescriptor aFDesc; 1402 aFDesc.Name = OUString( 1403 #if defined UNX 1404 RTL_CONSTASCII_USTRINGPARAM( "starbats" ) 1405 #else 1406 RTL_CONSTASCII_USTRINGPARAM( "StarBats" ) 1407 #endif 1408 ); 1409 aFDesc.Family = FAMILY_DONTKNOW ; 1410 aFDesc.Pitch = PITCH_DONTKNOW ; 1411 aFDesc.CharSet = RTL_TEXTENCODING_SYMBOL ; 1412 aFDesc.Weight = WEIGHT_DONTKNOW; 1413 //aFDesc.Transparant = sal_True; 1414 pProps->Name = 1415 OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_FONT ); 1416 (pProps++)->Value <<= aFDesc; 1417 1418 OUStringBuffer sTmp(1); 1419 sTmp.append( (sal_Unicode)(0xF000 + 149) ); 1420 pProps->Name = 1421 OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_CHAR ); 1422 (pProps++)->Value <<= sTmp.makeStringAndClear(); 1423 pProps->Name = 1424 OUString::createFromAscii( XML_UNO_NAME_NRULE_CHAR_STYLE_NAME ); 1425 (pProps++)->Value <<= 1426 OUString( RTL_CONSTASCII_USTRINGPARAM( "Numbering Symbols" ) ); 1427 } 1428 1429 Any aAny; 1430 aAny <<= aPropSeq; 1431 rNumRule->replaceByIndex( nLevel, aAny ); 1432 } 1433 1434