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 #include "precompiled_svx.hxx" 25 26 #include <svx/sdr/attribute/sdrtextattribute.hxx> 27 #include <svx/sdr/attribute/sdrformtextattribute.hxx> 28 #include <svx/svdotext.hxx> 29 #include <editeng/outlobj.hxx> 30 #include <editeng/editobj.hxx> 31 #include <editeng/flditem.hxx> 32 #include <svx/sdr/properties/properties.hxx> 33 34 ////////////////////////////////////////////////////////////////////////////// 35 36 namespace drawinglayer 37 { 38 namespace attribute 39 { 40 class ImpSdrTextAttribute 41 { 42 public: 43 // refcounter 44 sal_uInt32 mnRefCount; 45 46 // all-text attributes. The SdrText itself and a copy 47 // of te OPO 48 const SdrText* mpSdrText; 49 const OutlinerParaObject* mpOutlinerParaObject; 50 51 // Set when it's a FormText; contains all FormText attributes 52 SdrFormTextAttribute maSdrFormTextAttribute; 53 54 // text distances 55 sal_Int32 maTextLeftDistance; 56 sal_Int32 maTextUpperDistance; 57 sal_Int32 maTextRightDistance; 58 sal_Int32 maTextLowerDistance; 59 60 // #i101556# use versioning from text attributes to detect changes 61 sal_uInt32 maPropertiesVersion; 62 63 // text alignments 64 SdrTextHorzAdjust maSdrTextHorzAdjust; 65 SdrTextVertAdjust maSdrTextVertAdjust; 66 67 // bitfield 68 unsigned mbContour : 1; 69 unsigned mbFitToSize : 1; 70 unsigned mbHideContour : 1; 71 unsigned mbBlink : 1; 72 unsigned mbScroll : 1; 73 unsigned mbInEditMode : 1; 74 unsigned mbFixedCellHeight : 1; 75 unsigned mbWrongSpell : 1; 76 77 public: ImpSdrTextAttribute(const SdrText * pSdrText,const OutlinerParaObject & rOutlinerParaObject,XFormTextStyle eFormTextStyle,sal_Int32 aTextLeftDistance,sal_Int32 aTextUpperDistance,sal_Int32 aTextRightDistance,sal_Int32 aTextLowerDistance,SdrTextHorzAdjust aSdrTextHorzAdjust,SdrTextVertAdjust aSdrTextVertAdjust,bool bContour,bool bFitToSize,bool bHideContour,bool bBlink,bool bScroll,bool bInEditMode,bool bFixedCellHeight,bool bWrongSpell)78 ImpSdrTextAttribute( 79 const SdrText* pSdrText, 80 const OutlinerParaObject& rOutlinerParaObject, 81 XFormTextStyle eFormTextStyle, 82 sal_Int32 aTextLeftDistance, 83 sal_Int32 aTextUpperDistance, 84 sal_Int32 aTextRightDistance, 85 sal_Int32 aTextLowerDistance, 86 SdrTextHorzAdjust aSdrTextHorzAdjust, 87 SdrTextVertAdjust aSdrTextVertAdjust, 88 bool bContour, 89 bool bFitToSize, 90 bool bHideContour, 91 bool bBlink, 92 bool bScroll, 93 bool bInEditMode, 94 bool bFixedCellHeight, 95 bool bWrongSpell) 96 : mnRefCount(0), 97 mpSdrText(pSdrText), 98 mpOutlinerParaObject(new OutlinerParaObject(rOutlinerParaObject)), 99 maSdrFormTextAttribute(), 100 maTextLeftDistance(aTextLeftDistance), 101 maTextUpperDistance(aTextUpperDistance), 102 maTextRightDistance(aTextRightDistance), 103 maTextLowerDistance(aTextLowerDistance), 104 maPropertiesVersion(0), 105 maSdrTextHorzAdjust(aSdrTextHorzAdjust), 106 maSdrTextVertAdjust(aSdrTextVertAdjust), 107 mbContour(bContour), 108 mbFitToSize(bFitToSize), 109 mbHideContour(bHideContour), 110 mbBlink(bBlink), 111 mbScroll(bScroll), 112 mbInEditMode(bInEditMode), 113 mbFixedCellHeight(bFixedCellHeight), 114 mbWrongSpell(bWrongSpell) 115 { 116 if(pSdrText) 117 { 118 if(XFT_NONE != eFormTextStyle) 119 { 120 // text on path. Create FormText attribute 121 const SfxItemSet& rSet = pSdrText->GetItemSet(); 122 maSdrFormTextAttribute = SdrFormTextAttribute(rSet); 123 } 124 125 // #i101556# init with version number to detect changes of single text 126 // attribute and/or style sheets in primitive data without having to 127 // copy that data locally (which would be better from principle) 128 maPropertiesVersion = pSdrText->GetObject().GetProperties().getVersion(); 129 } 130 } 131 ImpSdrTextAttribute()132 ImpSdrTextAttribute() 133 : mnRefCount(0), 134 mpSdrText(0), 135 mpOutlinerParaObject(0), 136 maSdrFormTextAttribute(), 137 maTextLeftDistance(0), 138 maTextUpperDistance(0), 139 maTextRightDistance(0), 140 maTextLowerDistance(0), 141 maPropertiesVersion(0), 142 maSdrTextHorzAdjust(SDRTEXTHORZADJUST_LEFT), 143 maSdrTextVertAdjust(SDRTEXTVERTADJUST_TOP), 144 mbContour(false), 145 mbFitToSize(false), 146 mbHideContour(false), 147 mbBlink(false), 148 mbScroll(false), 149 mbInEditMode(false), 150 mbFixedCellHeight(false), 151 mbWrongSpell(false) 152 { 153 } 154 ~ImpSdrTextAttribute()155 ~ImpSdrTextAttribute() 156 { 157 if(mpOutlinerParaObject) 158 { 159 delete mpOutlinerParaObject; 160 } 161 } 162 163 // data read access getSdrText() const164 const SdrText& getSdrText() const 165 { 166 OSL_ENSURE(mpSdrText, "Access to text of default version of ImpSdrTextAttribute (!)"); 167 return *mpSdrText; 168 } getOutlinerParaObject() const169 const OutlinerParaObject& getOutlinerParaObject() const 170 { 171 OSL_ENSURE(mpOutlinerParaObject, "Access to OutlinerParaObject of default version of ImpSdrTextAttribute (!)"); 172 return *mpOutlinerParaObject; 173 } isContour() const174 bool isContour() const { return mbContour; } isFitToSize() const175 bool isFitToSize() const { return mbFitToSize; } isHideContour() const176 bool isHideContour() const { return mbHideContour; } isBlink() const177 bool isBlink() const { return mbBlink; } isScroll() const178 bool isScroll() const { return mbScroll; } isInEditMode() const179 bool isInEditMode() const { return mbInEditMode; } isFixedCellHeight() const180 bool isFixedCellHeight() const { return mbFixedCellHeight; } isWrongSpell() const181 bool isWrongSpell() const { return mbWrongSpell; } getSdrFormTextAttribute() const182 const SdrFormTextAttribute& getSdrFormTextAttribute() const { return maSdrFormTextAttribute; } getTextLeftDistance() const183 sal_Int32 getTextLeftDistance() const { return maTextLeftDistance; } getTextUpperDistance() const184 sal_Int32 getTextUpperDistance() const { return maTextUpperDistance; } getTextRightDistance() const185 sal_Int32 getTextRightDistance() const { return maTextRightDistance; } getTextLowerDistance() const186 sal_Int32 getTextLowerDistance() const { return maTextLowerDistance; } getPropertiesVersion() const187 sal_uInt32 getPropertiesVersion() const { return maPropertiesVersion; } getSdrTextHorzAdjust() const188 SdrTextHorzAdjust getSdrTextHorzAdjust() const { return maSdrTextHorzAdjust; } getSdrTextVertAdjust() const189 SdrTextVertAdjust getSdrTextVertAdjust() const { return maSdrTextVertAdjust; } 190 191 // compare operator operator ==(const ImpSdrTextAttribute & rCandidate) const192 bool operator==(const ImpSdrTextAttribute& rCandidate) const 193 { 194 if(mpOutlinerParaObject != rCandidate.mpOutlinerParaObject) 195 { 196 if(mpOutlinerParaObject && rCandidate.mpOutlinerParaObject) 197 { 198 // compares OPO and it's contents, but traditionally not the RedLining 199 // which is not seen as model, but as temporary information 200 if(!(getOutlinerParaObject() == rCandidate.getOutlinerParaObject())) 201 { 202 return false; 203 } 204 205 // #i102062# for primitive visualisation, the WrongList (SpellChecking) 206 // is important, too, so use isWrongListEqual since there is no WrongList 207 // comparison in the regular OutlinerParaObject compare (since it's 208 // not-persistent data) 209 if(!(getOutlinerParaObject().isWrongListEqual(rCandidate.getOutlinerParaObject()))) 210 { 211 return false; 212 } 213 } 214 else 215 { 216 // only one is zero; not equal 217 return false; 218 } 219 } 220 221 return ( 222 getSdrFormTextAttribute() == rCandidate.getSdrFormTextAttribute() 223 && getTextLeftDistance() == rCandidate.getTextLeftDistance() 224 && getTextUpperDistance() == rCandidate.getTextUpperDistance() 225 && getTextRightDistance() == rCandidate.getTextRightDistance() 226 && getTextLowerDistance() == rCandidate.getTextLowerDistance() 227 && getPropertiesVersion() == rCandidate.getPropertiesVersion() 228 229 && getSdrTextHorzAdjust() == rCandidate.getSdrTextHorzAdjust() 230 && getSdrTextVertAdjust() == rCandidate.getSdrTextVertAdjust() 231 232 && isContour() == rCandidate.isContour() 233 && isFitToSize() == rCandidate.isFitToSize() 234 && isHideContour() == rCandidate.isHideContour() 235 && isBlink() == rCandidate.isBlink() 236 && isScroll() == rCandidate.isScroll() 237 && isInEditMode() == rCandidate.isInEditMode() 238 && isFixedCellHeight() == rCandidate.isFixedCellHeight() 239 && isWrongSpell() == rCandidate.isWrongSpell()); 240 } 241 get_global_default()242 static ImpSdrTextAttribute* get_global_default() 243 { 244 static ImpSdrTextAttribute* pDefault = 0; 245 246 if(!pDefault) 247 { 248 // use default constructor 249 pDefault = new ImpSdrTextAttribute(); 250 251 // never delete; start with RefCount 1, not 0 252 pDefault->mnRefCount++; 253 } 254 255 return pDefault; 256 } 257 }; 258 SdrTextAttribute(const SdrText & rSdrText,const OutlinerParaObject & rOutlinerParaObject,XFormTextStyle eFormTextStyle,sal_Int32 aTextLeftDistance,sal_Int32 aTextUpperDistance,sal_Int32 aTextRightDistance,sal_Int32 aTextLowerDistance,SdrTextHorzAdjust aSdrTextHorzAdjust,SdrTextVertAdjust aSdrTextVertAdjust,bool bContour,bool bFitToSize,bool bHideContour,bool bBlink,bool bScroll,bool bInEditMode,bool bFixedCellHeight,bool bWrongSpell)259 SdrTextAttribute::SdrTextAttribute( 260 const SdrText& rSdrText, 261 const OutlinerParaObject& rOutlinerParaObject, 262 XFormTextStyle eFormTextStyle, 263 sal_Int32 aTextLeftDistance, 264 sal_Int32 aTextUpperDistance, 265 sal_Int32 aTextRightDistance, 266 sal_Int32 aTextLowerDistance, 267 SdrTextHorzAdjust aSdrTextHorzAdjust, 268 SdrTextVertAdjust aSdrTextVertAdjust, 269 bool bContour, 270 bool bFitToSize, 271 bool bHideContour, 272 bool bBlink, 273 bool bScroll, 274 bool bInEditMode, 275 bool bFixedCellHeight, 276 bool bWrongSpell) 277 : mpSdrTextAttribute(new ImpSdrTextAttribute( 278 &rSdrText, rOutlinerParaObject, eFormTextStyle, aTextLeftDistance, aTextUpperDistance, 279 aTextRightDistance, aTextLowerDistance, aSdrTextHorzAdjust, aSdrTextVertAdjust, bContour, 280 bFitToSize, bHideContour, bBlink, bScroll, bInEditMode, bFixedCellHeight, bWrongSpell)) 281 { 282 } 283 SdrTextAttribute()284 SdrTextAttribute::SdrTextAttribute() 285 : mpSdrTextAttribute(ImpSdrTextAttribute::get_global_default()) 286 { 287 mpSdrTextAttribute->mnRefCount++; 288 } 289 SdrTextAttribute(const SdrTextAttribute & rCandidate)290 SdrTextAttribute::SdrTextAttribute(const SdrTextAttribute& rCandidate) 291 : mpSdrTextAttribute(rCandidate.mpSdrTextAttribute) 292 { 293 mpSdrTextAttribute->mnRefCount++; 294 } 295 ~SdrTextAttribute()296 SdrTextAttribute::~SdrTextAttribute() 297 { 298 if(mpSdrTextAttribute->mnRefCount) 299 { 300 mpSdrTextAttribute->mnRefCount--; 301 } 302 else 303 { 304 delete mpSdrTextAttribute; 305 } 306 } 307 isDefault() const308 bool SdrTextAttribute::isDefault() const 309 { 310 return mpSdrTextAttribute == ImpSdrTextAttribute::get_global_default(); 311 } 312 operator =(const SdrTextAttribute & rCandidate)313 SdrTextAttribute& SdrTextAttribute::operator=(const SdrTextAttribute& rCandidate) 314 { 315 if(rCandidate.mpSdrTextAttribute != mpSdrTextAttribute) 316 { 317 if(mpSdrTextAttribute->mnRefCount) 318 { 319 mpSdrTextAttribute->mnRefCount--; 320 } 321 else 322 { 323 delete mpSdrTextAttribute; 324 } 325 326 mpSdrTextAttribute = rCandidate.mpSdrTextAttribute; 327 mpSdrTextAttribute->mnRefCount++; 328 } 329 330 return *this; 331 } 332 operator ==(const SdrTextAttribute & rCandidate) const333 bool SdrTextAttribute::operator==(const SdrTextAttribute& rCandidate) const 334 { 335 if(rCandidate.mpSdrTextAttribute == mpSdrTextAttribute) 336 { 337 return true; 338 } 339 340 if(rCandidate.isDefault() != isDefault()) 341 { 342 return false; 343 } 344 345 return (*rCandidate.mpSdrTextAttribute == *mpSdrTextAttribute); 346 } 347 getSdrText() const348 const SdrText& SdrTextAttribute::getSdrText() const 349 { 350 return mpSdrTextAttribute->getSdrText(); 351 } 352 getOutlinerParaObject() const353 const OutlinerParaObject& SdrTextAttribute::getOutlinerParaObject() const 354 { 355 return mpSdrTextAttribute->getOutlinerParaObject(); 356 } 357 isContour() const358 bool SdrTextAttribute::isContour() const 359 { 360 return mpSdrTextAttribute->isContour(); 361 } 362 isFitToSize() const363 bool SdrTextAttribute::isFitToSize() const 364 { 365 return mpSdrTextAttribute->isFitToSize(); 366 } 367 isHideContour() const368 bool SdrTextAttribute::isHideContour() const 369 { 370 return mpSdrTextAttribute->isHideContour(); 371 } 372 isBlink() const373 bool SdrTextAttribute::isBlink() const 374 { 375 return mpSdrTextAttribute->isBlink(); 376 } 377 isScroll() const378 bool SdrTextAttribute::isScroll() const 379 { 380 return mpSdrTextAttribute->isScroll(); 381 } 382 isInEditMode() const383 bool SdrTextAttribute::isInEditMode() const 384 { 385 return mpSdrTextAttribute->isInEditMode(); 386 } 387 isFixedCellHeight() const388 bool SdrTextAttribute::isFixedCellHeight() const 389 { 390 return mpSdrTextAttribute->isFixedCellHeight(); 391 } 392 isWrongSpell() const393 bool SdrTextAttribute::isWrongSpell() const 394 { 395 return mpSdrTextAttribute->isWrongSpell(); 396 } 397 getSdrFormTextAttribute() const398 const SdrFormTextAttribute& SdrTextAttribute::getSdrFormTextAttribute() const 399 { 400 return mpSdrTextAttribute->getSdrFormTextAttribute(); 401 } 402 getTextLeftDistance() const403 sal_Int32 SdrTextAttribute::getTextLeftDistance() const 404 { 405 return mpSdrTextAttribute->getTextLeftDistance(); 406 } 407 getTextUpperDistance() const408 sal_Int32 SdrTextAttribute::getTextUpperDistance() const 409 { 410 return mpSdrTextAttribute->getTextUpperDistance(); 411 } 412 getTextRightDistance() const413 sal_Int32 SdrTextAttribute::getTextRightDistance() const 414 { 415 return mpSdrTextAttribute->getTextRightDistance(); 416 } 417 getTextLowerDistance() const418 sal_Int32 SdrTextAttribute::getTextLowerDistance() const 419 { 420 return mpSdrTextAttribute->getTextLowerDistance(); 421 } 422 getPropertiesVersion() const423 sal_uInt32 SdrTextAttribute::getPropertiesVersion() const 424 { 425 return mpSdrTextAttribute->getPropertiesVersion(); 426 } 427 getSdrTextHorzAdjust() const428 SdrTextHorzAdjust SdrTextAttribute::getSdrTextHorzAdjust() const 429 { 430 return mpSdrTextAttribute->getSdrTextHorzAdjust(); 431 } 432 getSdrTextVertAdjust() const433 SdrTextVertAdjust SdrTextAttribute::getSdrTextVertAdjust() const 434 { 435 return mpSdrTextAttribute->getSdrTextVertAdjust(); 436 } 437 getBlinkTextTiming(drawinglayer::animation::AnimationEntryList & rAnimList) const438 void SdrTextAttribute::getBlinkTextTiming(drawinglayer::animation::AnimationEntryList& rAnimList) const 439 { 440 if(isBlink()) 441 { 442 getSdrText().GetObject().impGetBlinkTextTiming(rAnimList); 443 } 444 } 445 getScrollTextTiming(drawinglayer::animation::AnimationEntryList & rAnimList,double fFrameLength,double fTextLength) const446 void SdrTextAttribute::getScrollTextTiming(drawinglayer::animation::AnimationEntryList& rAnimList, double fFrameLength, double fTextLength) const 447 { 448 if(isScroll()) 449 { 450 getSdrText().GetObject().impGetScrollTextTiming(rAnimList, fFrameLength, fTextLength); 451 } 452 } 453 } // end of namespace attribute 454 } // end of namespace drawinglayer 455 456 ////////////////////////////////////////////////////////////////////////////// 457 // eof 458