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 : #include <rtl/instance.hxx>
29 :
30 :
31 : namespace drawinglayer
32 : {
33 : namespace attribute
34 : {
35 87406 : class ImpSdrTextAttribute
36 : {
37 : public:
38 : // all-text attributes. The SdrText itself and a copy
39 : // of the OPO
40 : const SdrText* mpSdrText;
41 : std::shared_ptr<OutlinerParaObject> mxOutlinerParaObject;
42 :
43 : // Set when it's a FormText; contains all FormText attributes
44 : SdrFormTextAttribute maSdrFormTextAttribute;
45 :
46 : // text distances
47 : sal_Int32 maTextLeftDistance;
48 : sal_Int32 maTextUpperDistance;
49 : sal_Int32 maTextRightDistance;
50 : sal_Int32 maTextLowerDistance;
51 :
52 : // #i101556# use versioning from text attributes to detect changes
53 : sal_uInt32 maPropertiesVersion;
54 :
55 : // text alignments
56 : SdrTextHorzAdjust maSdrTextHorzAdjust;
57 : SdrTextVertAdjust maSdrTextVertAdjust;
58 :
59 : // bitfield
60 : bool mbContour : 1;
61 : bool mbFitToSize : 1;
62 : bool mbAutoFit : 1;
63 : bool mbHideContour : 1;
64 : bool mbBlink : 1;
65 : bool mbScroll : 1;
66 : bool mbInEditMode : 1;
67 : bool mbFixedCellHeight : 1;
68 : bool mbWrongSpell : 1;
69 :
70 : public:
71 29180 : ImpSdrTextAttribute(
72 : const SdrText* pSdrText,
73 : const OutlinerParaObject& rOutlinerParaObject,
74 : XFormTextStyle eFormTextStyle,
75 : sal_Int32 aTextLeftDistance,
76 : sal_Int32 aTextUpperDistance,
77 : sal_Int32 aTextRightDistance,
78 : sal_Int32 aTextLowerDistance,
79 : SdrTextHorzAdjust aSdrTextHorzAdjust,
80 : SdrTextVertAdjust aSdrTextVertAdjust,
81 : bool bContour,
82 : bool bFitToSize,
83 : bool bAutoFit,
84 : bool bHideContour,
85 : bool bBlink,
86 : bool bScroll,
87 : bool bInEditMode,
88 : bool bFixedCellHeight,
89 : bool bWrongSpell)
90 : : mpSdrText(pSdrText),
91 29180 : mxOutlinerParaObject(new OutlinerParaObject(rOutlinerParaObject)),
92 : maSdrFormTextAttribute(),
93 : maTextLeftDistance(aTextLeftDistance),
94 : maTextUpperDistance(aTextUpperDistance),
95 : maTextRightDistance(aTextRightDistance),
96 : maTextLowerDistance(aTextLowerDistance),
97 : maPropertiesVersion(0),
98 : maSdrTextHorzAdjust(aSdrTextHorzAdjust),
99 : maSdrTextVertAdjust(aSdrTextVertAdjust),
100 : mbContour(bContour),
101 : mbFitToSize(bFitToSize),
102 : mbAutoFit(bAutoFit),
103 : mbHideContour(bHideContour),
104 : mbBlink(bBlink),
105 : mbScroll(bScroll),
106 : mbInEditMode(bInEditMode),
107 : mbFixedCellHeight(bFixedCellHeight),
108 58360 : mbWrongSpell(bWrongSpell)
109 : {
110 29180 : if(pSdrText)
111 : {
112 29180 : if(XFT_NONE != eFormTextStyle)
113 : {
114 : // text on path. Create FormText attribute
115 0 : const SfxItemSet& rSet = pSdrText->GetItemSet();
116 0 : maSdrFormTextAttribute = SdrFormTextAttribute(rSet);
117 : }
118 :
119 : // #i101556# init with version number to detect changes of single text
120 : // attribute and/or style sheets in primitive data without having to
121 : // copy that data locally (which would be better from principle)
122 29180 : maPropertiesVersion = pSdrText->GetObject().GetProperties().getVersion();
123 : }
124 29180 : }
125 :
126 64 : ImpSdrTextAttribute()
127 : : mpSdrText(0),
128 : maSdrFormTextAttribute(),
129 : maTextLeftDistance(0),
130 : maTextUpperDistance(0),
131 : maTextRightDistance(0),
132 : maTextLowerDistance(0),
133 : maPropertiesVersion(0),
134 : maSdrTextHorzAdjust(SDRTEXTHORZADJUST_LEFT),
135 : maSdrTextVertAdjust(SDRTEXTVERTADJUST_TOP),
136 : mbContour(false),
137 : mbFitToSize(false),
138 : mbAutoFit(false),
139 : mbHideContour(false),
140 : mbBlink(false),
141 : mbScroll(false),
142 : mbInEditMode(false),
143 : mbFixedCellHeight(false),
144 64 : mbWrongSpell(false)
145 : {
146 64 : }
147 :
148 : // data read access
149 16854 : const SdrText& getSdrText() const
150 : {
151 : assert(mpSdrText && "Access to text of default version of ImpSdrTextAttribute (!)");
152 16854 : return *mpSdrText;
153 : }
154 :
155 72760 : const OutlinerParaObject& getOutlinerParaObject() const
156 : {
157 : assert(mxOutlinerParaObject && "Access to OutlinerParaObject of default version of ImpSdrTextAttribute (!)");
158 72760 : return *mxOutlinerParaObject;
159 : }
160 :
161 42489 : bool isContour() const { return mbContour; }
162 42489 : bool isFitToSize() const { return mbFitToSize; }
163 42489 : bool isAutoFit() const { return mbAutoFit; }
164 25648 : bool isHideContour() const { return mbHideContour; }
165 42489 : bool isBlink() const { return mbBlink; }
166 59275 : bool isScroll() const { return mbScroll; }
167 42489 : bool isInEditMode() const { return mbInEditMode; }
168 42411 : bool isFixedCellHeight() const { return mbFixedCellHeight; }
169 25638 : bool isWrongSpell() const { return mbWrongSpell; }
170 131416 : const SdrFormTextAttribute& getSdrFormTextAttribute() const { return maSdrFormTextAttribute; }
171 43017 : sal_Int32 getTextLeftDistance() const { return maTextLeftDistance; }
172 43005 : sal_Int32 getTextUpperDistance() const { return maTextUpperDistance; }
173 43018 : sal_Int32 getTextRightDistance() const { return maTextRightDistance; }
174 43018 : sal_Int32 getTextLowerDistance() const { return maTextLowerDistance; }
175 26164 : sal_uInt32 getPropertiesVersion() const { return maPropertiesVersion; }
176 42421 : SdrTextHorzAdjust getSdrTextHorzAdjust() const { return maSdrTextHorzAdjust; }
177 42421 : SdrTextVertAdjust getSdrTextVertAdjust() const { return maSdrTextVertAdjust; }
178 :
179 : // compare operator
180 14861 : bool operator==(const ImpSdrTextAttribute& rCandidate) const
181 : {
182 14861 : if (mxOutlinerParaObject.get() != rCandidate.mxOutlinerParaObject.get())
183 : {
184 14861 : if (mxOutlinerParaObject && rCandidate.mxOutlinerParaObject)
185 : {
186 : // compares OPO and it's contents, but traditionally not the RedLining
187 : // which is not seen as model, but as temporary information
188 14861 : if(!(getOutlinerParaObject() == rCandidate.getOutlinerParaObject()))
189 : {
190 1769 : return false;
191 : }
192 :
193 : // #i102062# for primitive visualisation, the WrongList (SpellChecking)
194 : // is important, too, so use isWrongListEqual since there is no WrongList
195 : // comparison in the regular OutlinerParaObject compare (since it's
196 : // not-persistent data)
197 13092 : if(!(getOutlinerParaObject().isWrongListEqual(rCandidate.getOutlinerParaObject())))
198 : {
199 10 : return false;
200 : }
201 : }
202 : else
203 : {
204 : // only one is zero; not equal
205 0 : return false;
206 : }
207 : }
208 :
209 : return (
210 13082 : getSdrFormTextAttribute() == rCandidate.getSdrFormTextAttribute()
211 13082 : && getTextLeftDistance() == rCandidate.getTextLeftDistance()
212 13082 : && getTextUpperDistance() == rCandidate.getTextUpperDistance()
213 13082 : && getTextRightDistance() == rCandidate.getTextRightDistance()
214 13082 : && getTextLowerDistance() == rCandidate.getTextLowerDistance()
215 13082 : && getPropertiesVersion() == rCandidate.getPropertiesVersion()
216 :
217 12824 : && getSdrTextHorzAdjust() == rCandidate.getSdrTextHorzAdjust()
218 12824 : && getSdrTextVertAdjust() == rCandidate.getSdrTextVertAdjust()
219 :
220 12824 : && isContour() == rCandidate.isContour()
221 12824 : && isFitToSize() == rCandidate.isFitToSize()
222 12824 : && isAutoFit() == rCandidate.isAutoFit()
223 12824 : && isHideContour() == rCandidate.isHideContour()
224 12824 : && isBlink() == rCandidate.isBlink()
225 12824 : && isScroll() == rCandidate.isScroll()
226 12824 : && isInEditMode() == rCandidate.isInEditMode()
227 12819 : && isFixedCellHeight() == rCandidate.isFixedCellHeight()
228 25901 : && isWrongSpell() == rCandidate.isWrongSpell());
229 : }
230 : };
231 :
232 : namespace
233 : {
234 : struct theGlobalDefault :
235 : public rtl::Static< SdrTextAttribute::ImplType, theGlobalDefault > {};
236 : }
237 :
238 29180 : SdrTextAttribute::SdrTextAttribute(
239 : const SdrText& rSdrText,
240 : const OutlinerParaObject& rOutlinerParaObject,
241 : XFormTextStyle eFormTextStyle,
242 : sal_Int32 aTextLeftDistance,
243 : sal_Int32 aTextUpperDistance,
244 : sal_Int32 aTextRightDistance,
245 : sal_Int32 aTextLowerDistance,
246 : SdrTextHorzAdjust aSdrTextHorzAdjust,
247 : SdrTextVertAdjust aSdrTextVertAdjust,
248 : bool bContour,
249 : bool bFitToSize,
250 : bool bAutoFit,
251 : bool bHideContour,
252 : bool bBlink,
253 : bool bScroll,
254 : bool bInEditMode,
255 : bool bFixedCellHeight,
256 : bool bWrongSpell)
257 : : mpSdrTextAttribute(
258 : ImpSdrTextAttribute(
259 : &rSdrText, rOutlinerParaObject, eFormTextStyle, aTextLeftDistance,
260 : aTextUpperDistance, aTextRightDistance, aTextLowerDistance,
261 : aSdrTextHorzAdjust, aSdrTextVertAdjust, bContour, bFitToSize, bAutoFit,
262 29180 : bHideContour, bBlink, bScroll, bInEditMode, bFixedCellHeight, bWrongSpell))
263 : {
264 29180 : }
265 :
266 173153 : SdrTextAttribute::SdrTextAttribute()
267 173153 : : mpSdrTextAttribute(theGlobalDefault::get())
268 : {
269 173153 : }
270 :
271 178705 : SdrTextAttribute::SdrTextAttribute(const SdrTextAttribute& rCandidate)
272 178705 : : mpSdrTextAttribute(rCandidate.mpSdrTextAttribute)
273 : {
274 178705 : }
275 :
276 380437 : SdrTextAttribute::~SdrTextAttribute()
277 : {
278 380437 : }
279 :
280 207398 : bool SdrTextAttribute::isDefault() const
281 : {
282 207398 : return mpSdrTextAttribute.same_object(theGlobalDefault::get());
283 : }
284 :
285 95771 : SdrTextAttribute& SdrTextAttribute::operator=(const SdrTextAttribute& rCandidate)
286 : {
287 95771 : mpSdrTextAttribute = rCandidate.mpSdrTextAttribute;
288 95771 : return *this;
289 : }
290 :
291 54636 : bool SdrTextAttribute::operator==(const SdrTextAttribute& rCandidate) const
292 : {
293 : // tdf#87509 default attr is always != non-default attr, even with same values
294 54636 : if(rCandidate.isDefault() != isDefault())
295 218 : return false;
296 :
297 54418 : return rCandidate.mpSdrTextAttribute == mpSdrTextAttribute;
298 : }
299 :
300 16854 : const SdrText& SdrTextAttribute::getSdrText() const
301 : {
302 16854 : return mpSdrTextAttribute->getSdrText();
303 : }
304 :
305 16854 : const OutlinerParaObject& SdrTextAttribute::getOutlinerParaObject() const
306 : {
307 16854 : return mpSdrTextAttribute->getOutlinerParaObject();
308 : }
309 :
310 16841 : bool SdrTextAttribute::isContour() const
311 : {
312 16841 : return mpSdrTextAttribute->isContour();
313 : }
314 :
315 16841 : bool SdrTextAttribute::isFitToSize() const
316 : {
317 16841 : return mpSdrTextAttribute->isFitToSize();
318 : }
319 :
320 16841 : bool SdrTextAttribute::isAutoFit() const
321 : {
322 16841 : return mpSdrTextAttribute->isAutoFit();
323 : }
324 :
325 0 : bool SdrTextAttribute::isHideContour() const
326 : {
327 0 : return mpSdrTextAttribute->isHideContour();
328 : }
329 :
330 16841 : bool SdrTextAttribute::isBlink() const
331 : {
332 16841 : return mpSdrTextAttribute->isBlink();
333 : }
334 :
335 33627 : bool SdrTextAttribute::isScroll() const
336 : {
337 33627 : return mpSdrTextAttribute->isScroll();
338 : }
339 :
340 16841 : bool SdrTextAttribute::isInEditMode() const
341 : {
342 16841 : return mpSdrTextAttribute->isInEditMode();
343 : }
344 :
345 16773 : bool SdrTextAttribute::isFixedCellHeight() const
346 : {
347 16773 : return mpSdrTextAttribute->isFixedCellHeight();
348 : }
349 :
350 105252 : const SdrFormTextAttribute& SdrTextAttribute::getSdrFormTextAttribute() const
351 : {
352 105252 : return mpSdrTextAttribute->getSdrFormTextAttribute();
353 : }
354 :
355 16853 : sal_Int32 SdrTextAttribute::getTextLeftDistance() const
356 : {
357 16853 : return mpSdrTextAttribute->getTextLeftDistance();
358 : }
359 :
360 16841 : sal_Int32 SdrTextAttribute::getTextUpperDistance() const
361 : {
362 16841 : return mpSdrTextAttribute->getTextUpperDistance();
363 : }
364 :
365 16854 : sal_Int32 SdrTextAttribute::getTextRightDistance() const
366 : {
367 16854 : return mpSdrTextAttribute->getTextRightDistance();
368 : }
369 :
370 16854 : sal_Int32 SdrTextAttribute::getTextLowerDistance() const
371 : {
372 16854 : return mpSdrTextAttribute->getTextLowerDistance();
373 : }
374 :
375 16773 : SdrTextHorzAdjust SdrTextAttribute::getSdrTextHorzAdjust() const
376 : {
377 16773 : return mpSdrTextAttribute->getSdrTextHorzAdjust();
378 : }
379 :
380 16773 : SdrTextVertAdjust SdrTextAttribute::getSdrTextVertAdjust() const
381 : {
382 16773 : return mpSdrTextAttribute->getSdrTextVertAdjust();
383 : }
384 :
385 0 : void SdrTextAttribute::getBlinkTextTiming(drawinglayer::animation::AnimationEntryList& rAnimList) const
386 : {
387 0 : if(isBlink())
388 : {
389 0 : getSdrText().GetObject().impGetBlinkTextTiming(rAnimList);
390 : }
391 0 : }
392 :
393 0 : void SdrTextAttribute::getScrollTextTiming(drawinglayer::animation::AnimationEntryList& rAnimList, double fFrameLength, double fTextLength) const
394 : {
395 0 : if(isScroll())
396 : {
397 0 : getSdrText().GetObject().impGetScrollTextTiming(rAnimList, fFrameLength, fTextLength);
398 : }
399 0 : }
400 : } // end of namespace attribute
401 435 : } // end of namespace drawinglayer
402 :
403 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|