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