Branch data 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 : : #ifndef INCLUDED_SLIDESHOW_SHAPEATTRIBUTELAYER_HXX
21 : : #define INCLUDED_SLIDESHOW_SHAPEATTRIBUTELAYER_HXX
22 : :
23 : : #include <com/sun/star/drawing/FillStyle.hpp>
24 : : #include <com/sun/star/drawing/LineStyle.hpp>
25 : : #include <com/sun/star/awt/FontSlant.hpp>
26 : :
27 : : #include <basegfx/vector/b2dsize.hxx>
28 : : #include <basegfx/point/b2dpoint.hxx>
29 : : #include <basegfx/range/b2drectangle.hxx>
30 : : #include <basegfx/polygon/b2dpolypolygon.hxx>
31 : :
32 : : #include "state.hxx"
33 : : #include "rgbcolor.hxx"
34 : :
35 : : #include <stack>
36 : : #include <boost/shared_ptr.hpp>
37 : :
38 : :
39 : : namespace slideshow
40 : : {
41 : : namespace internal
42 : : {
43 : : class ShapeAttributeLayer;
44 : :
45 : : typedef ::boost::shared_ptr< ShapeAttributeLayer > ShapeAttributeLayerSharedPtr;
46 : :
47 : : /** Encapsulates all modifiable attributes of a shape.
48 : :
49 : : This class holds all modifiable attributes of a shape, and
50 : : at the same time provides means to layer attributes on top
51 : : of each other..
52 : :
53 : : And yes, there's a reason why we even pass bools and ints
54 : : by const reference. Namely, that makes the set* methods
55 : : differ only in the value type, which greatly reduces
56 : : template variability (e.g. in AnimationFactory).
57 : : */
58 : 0 : class ShapeAttributeLayer
59 : : {
60 : : public:
61 : : /** Create a ShapeAttributeLayer instance, with all
62 : : attributes set to default.
63 : :
64 : : Furthermore, this constructor gets a pointer to a
65 : : child layer, which is used as the fallback (or the
66 : : base value) for all attributes
67 : :
68 : : @param rChildLayer
69 : : Layer below this one
70 : :
71 : : @attention
72 : : This method is only supposed to be called from Shape objects
73 : : */
74 : : explicit ShapeAttributeLayer( const ShapeAttributeLayerSharedPtr& rChildLayer );
75 : :
76 : : // Children management methods
77 : : //------------------------------------------------------------------
78 : :
79 : : /** Revoke the given layer.
80 : :
81 : : This method revokes the given layer from this object
82 : : or one of the children. That is, if this object does
83 : : have children, and the given layer is no direct child,
84 : : it is recursively passed to the children for removal.
85 : :
86 : : @return true, if removal was successful.
87 : :
88 : : @attention
89 : : This method is only supposed to be called from Shape objects
90 : : */
91 : : bool revokeChildLayer( const ShapeAttributeLayerSharedPtr& rChildLayer );
92 : :
93 : : /** Query the child layer of this object.
94 : :
95 : : @attention
96 : : This method is only supposed to be called from Shape objects
97 : : */
98 : : ShapeAttributeLayerSharedPtr getChildLayer() const;
99 : :
100 : : /** Set the additive mode for possible child attributes
101 : :
102 : : This method sets the additive mode for child
103 : : attributes. That is the way underlying attribute
104 : : layers are combined with this one (i.e. to overrule
105 : : lower layers, or how to combine the values). The
106 : : default is
107 : : ::com::sun::star::animations::AnimationAdditiveMode::BASE,
108 : : which means, take the value of the underlying layers,
109 : : or from the model shape itself.
110 : :
111 : : @param nMode
112 : : Must be one of
113 : : ::com::sun::star::animations::AnimationAdditiveMode.
114 : : */
115 : : void setAdditiveMode( sal_Int16 nMode );
116 : :
117 : : // Attribute methods
118 : : //------------------------------------------------------------------
119 : :
120 : : /** Query whether the width attribute is valid.
121 : : */
122 : : bool isWidthValid() const;
123 : : /** Query the current width of the shape
124 : : */
125 : : double getWidth() const;
126 : : /** Set the new width of the shape
127 : :
128 : : @param rNewWidth
129 : : A negative width mirrors the shape.
130 : : */
131 : : void setWidth( const double& rNewWidth );
132 : :
133 : : /** Query whether the height attribute is valid.
134 : : */
135 : : bool isHeightValid() const;
136 : : /** Query the current height of the shape
137 : : */
138 : : double getHeight() const;
139 : : /** Set the new height of the shape
140 : :
141 : : @param rNewHeight
142 : : A negative height mirrors the shape.
143 : : */
144 : : void setHeight( const double& rNewHeight );
145 : :
146 : : /** Set the new size of the shape
147 : :
148 : : @param rNewSize
149 : : A negative size mirrors the shape.
150 : : */
151 : : void setSize( const ::basegfx::B2DSize& rNewSize );
152 : :
153 : : /** Query whether the x position attribute is valid
154 : : */
155 : : bool isPosXValid() const;
156 : : /** Query the current x position of the shape.
157 : :
158 : : The current x position of the shape is always relative
159 : : to the <em>center</em> of the shape (in contrast to
160 : : the Shape::getBounds() and Shape::getUpdateArea()
161 : : methods).
162 : : */
163 : : double getPosX() const;
164 : : /** Set the new x position of the shape
165 : :
166 : : The current x position of the shape is always relative
167 : : to the <em>center</em> of the shape (in contrast to
168 : : the Shape::getBounds() and Shape::getUpdateArea()
169 : : methods).
170 : : */
171 : : void setPosX( const double& rNewX );
172 : :
173 : : /** Query whether the y position attribute is valid
174 : : */
175 : : bool isPosYValid() const;
176 : : /** Query the current y position of the shape
177 : :
178 : : The current y position of the shape is always relative
179 : : to the <em>center</em> of the shape (in contrast to
180 : : the Shape::getBounds() and Shape::getUpdateArea()
181 : : methods).
182 : : */
183 : : double getPosY() const;
184 : : /** Set the new y position of the shape
185 : :
186 : : The current y position of the shape is always relative
187 : : to the <em>center</em> of the shape (in contrast to
188 : : the Shape::getBounds() and Shape::getUpdateArea()
189 : : methods).
190 : : */
191 : : void setPosY( const double& rNewY );
192 : :
193 : : /** Set the new position of the shape
194 : :
195 : : The current position of the shape is always relative
196 : : to the <em>center</em> of the shape (in contrast to
197 : : the Shape::getBounds() and Shape::getUpdateArea()
198 : : methods).
199 : : */
200 : : void setPosition( const ::basegfx::B2DPoint& rNewPos );
201 : :
202 : : /** Query whether the rotation angle attribute is valid
203 : : */
204 : : bool isRotationAngleValid() const;
205 : : /** Query the current rotation angle of the shape
206 : :
207 : : @return the rotation angle in degrees.
208 : : */
209 : : double getRotationAngle() const;
210 : : /** Set the new rotation angle of the shape
211 : :
212 : : @param rNewAngle
213 : : New rotation angle in degrees.
214 : : */
215 : : void setRotationAngle( const double& rNewAngle );
216 : :
217 : : /** Query whether the shear x angle attribute is valid
218 : : */
219 : : bool isShearXAngleValid() const;
220 : : /** Query the current shear angle at the x axis of the shape
221 : :
222 : : @return the shear angle in degrees.
223 : : */
224 : : double getShearXAngle() const;
225 : : /** Set the new shear angle at the x axis of the shape
226 : :
227 : : @param rNewAngle
228 : : New shear angle in radians.
229 : : */
230 : : void setShearXAngle( const double& rNewAngle );
231 : :
232 : : /** Query whether the shear y angle attribute is valid
233 : : */
234 : : bool isShearYAngleValid() const;
235 : : /** Query the current shear angle at the y axis of the shape
236 : :
237 : : @return the shear angle in degrees.
238 : : */
239 : : double getShearYAngle() const;
240 : : /** Set the new shear angle at the y axis of the shape
241 : :
242 : : @param rNewAngle
243 : : New shear angle in radians.
244 : : */
245 : : void setShearYAngle( const double& rNewAngle );
246 : :
247 : : /** Query whether the alpha attribute is valid
248 : : */
249 : : bool isAlphaValid() const;
250 : : /** Query the current alpha value of the shape
251 : : */
252 : : double getAlpha() const;
253 : : /** Set the new alpha value of the shape
254 : :
255 : : @param rNewValue
256 : : New alpha value, must be in the [0,1] range
257 : : */
258 : : void setAlpha( const double& rNewValue );
259 : :
260 : : /** Query whether the clip attribute is valid
261 : : */
262 : : bool isClipValid() const;
263 : : /** Query the current clip polygon of the shape
264 : : */
265 : : ::basegfx::B2DPolyPolygon getClip() const;
266 : : /** Set the new clip polygon of the shape
267 : :
268 : : @param rNewClip
269 : : New clip polygon, is interpreted in shape view coordinates, but
270 : : relative to the shape (i.e. the origin of the shape coincides
271 : : with the origin of the clip polygon).
272 : : */
273 : : void setClip( const ::basegfx::B2DPolyPolygon& rNewClip );
274 : :
275 : : /** Query whether the dim color attribute is valid
276 : :
277 : : The dim color globally 'dims' the shape towards that
278 : : color
279 : : */
280 : : bool isDimColorValid() const;
281 : : /** Get the dim color for the whole shape.
282 : : */
283 : : RGBColor getDimColor() const;
284 : : /** Set the dim color globally for the whole shape.
285 : : */
286 : : void setDimColor( const RGBColor& nNewColor );
287 : :
288 : : /** Query whether the fill color attribute is valid
289 : : */
290 : : bool isFillColorValid() const;
291 : : /** Get the fill color for the whole shape.
292 : :
293 : : If there's no unique fill color, the color from the
294 : : first filled polygon is returned.
295 : : */
296 : : RGBColor getFillColor() const;
297 : : /** Set the fill color globally for the whole shape.
298 : : */
299 : : void setFillColor( const RGBColor& nNewColor );
300 : :
301 : : /** Query whether the line color attribute is valid
302 : : */
303 : : bool isLineColorValid() const;
304 : : /** Get the line color for the whole shape.
305 : :
306 : : If there's no unique line color, the color from the
307 : : first line is returned.
308 : : */
309 : : RGBColor getLineColor() const;
310 : : /** Set the line color globally for the whole shape.
311 : : */
312 : : void setLineColor( const RGBColor& nNewColor );
313 : :
314 : : /** Query whether the fill mode attribute is valid
315 : : */
316 : : bool isFillStyleValid() const;
317 : : /** Get the current fill mode for polygon fillings.
318 : :
319 : : @returns the current style
320 : : */
321 : : sal_Int16 getFillStyle() const;
322 : : /** Changes polygon fillings.
323 : : */
324 : : void setFillStyle( const sal_Int16& rStyle );
325 : :
326 : : /** Query whether the line mode attribute is valid
327 : : */
328 : : bool isLineStyleValid() const;
329 : : /** Get the current line mode for line drawing.
330 : :
331 : : @returns the current line style
332 : : */
333 : : sal_Int16 getLineStyle() const;
334 : : /** Set line style for the whole shape
335 : : */
336 : : void setLineStyle( const sal_Int16& rStyle );
337 : :
338 : : /** Query whether the visibility state attribute is valid
339 : : */
340 : : bool isVisibilityValid() const;
341 : : /** Get the current shape visibility.
342 : :
343 : : @returns true for visible, false for invisible.
344 : : */
345 : : bool getVisibility() const;
346 : : /** Set the shape visibility
347 : : */
348 : : void setVisibility( const bool& bVisible );
349 : :
350 : : /** Query whether the char color attribute is valid
351 : : */
352 : : bool isCharColorValid() const;
353 : : /** Get the text color for the whole shape.
354 : :
355 : : If there's no unique text color, the color from the
356 : : first text drawn is returned.
357 : : */
358 : : RGBColor getCharColor() const;
359 : : /** Set the text color globally for the whole shape.
360 : : */
361 : : void setCharColor( const RGBColor& nNewColor );
362 : :
363 : : /** Query whether the char rotation angle attribute is valid
364 : : */
365 : : bool isCharRotationAngleValid() const;
366 : : /** Query the current text rotation angle of the shape
367 : :
368 : : @return the text rotation angle in degrees.
369 : : */
370 : : double getCharRotationAngle() const;
371 : : /** Set the new text rotation angle of the shape
372 : :
373 : : @param rNewAngle
374 : : New text rotation angle in degrees.
375 : : */
376 : : void setCharRotationAngle( const double& rNewAngle );
377 : :
378 : : /** Query whether the char weight attribute is valid
379 : : */
380 : : bool isCharWeightValid() const;
381 : : /** Get the current char weight value for the whole shape.
382 : :
383 : : @returns the value for the char weight. The value must
384 : : be out of the ::com::sun::star::awt::FontWeight
385 : : constant group.
386 : : */
387 : : double getCharWeight() const;
388 : : /** Set the char weight globally for the whole shape.
389 : :
390 : : The value must be out of the
391 : : ::com::sun::star::awt::FontWeight constant group.
392 : : */
393 : : void setCharWeight( const double& rStyle );
394 : :
395 : : /** Query whether the underline mode attribute is valid
396 : : */
397 : : bool isUnderlineModeValid() const;
398 : : /** Get the current text underline status for the whole shape.
399 : :
400 : : If there is no unique underline status, false is returned.
401 : :
402 : : @returns true for underlined text, false for normal.
403 : : */
404 : : sal_Int16 getUnderlineMode() const;
405 : : /** Set the underline status globally for the whole shape
406 : : */
407 : : void setUnderlineMode( const sal_Int16& bUnderline );
408 : :
409 : : /** Query whether the font family attribute is valid
410 : : */
411 : : bool isFontFamilyValid() const;
412 : : /** Get the current text font family for the whole shape.
413 : :
414 : : If there is no unique font family, the font family of
415 : : the first text of the shape is returned.
416 : : */
417 : : ::rtl::OUString getFontFamily() const;
418 : : /** Set the text font family name globally for the whole shape
419 : : */
420 : : void setFontFamily( const ::rtl::OUString& rName );
421 : :
422 : : /** Query whether the italic mode attribute is valid
423 : : */
424 : : bool isCharPostureValid() const;
425 : : /** Get the current text italic style for the whole shape.
426 : :
427 : : @returns the italic style. The value returned is one
428 : : of the ::com::sun::star::awt::FontSlant enums
429 : : */
430 : : sal_Int16 getCharPosture() const;
431 : : /** Set the italic style globally for the whole shape.
432 : :
433 : : The value must be one of the
434 : : ::com::sun::star::awt::FontSlant enums.
435 : : */
436 : : void setCharPosture( const sal_Int16& rStyle );
437 : :
438 : : /** Query whether the char scaling attribute is valid
439 : : */
440 : : bool isCharScaleValid() const;
441 : : /** Query the current char scaling attribute globally for
442 : : the shape.
443 : :
444 : : The char scaling changes the scale of the whole shape
445 : : text (uniformely, i.e. both in x and in y direction).
446 : : */
447 : : double getCharScale() const;
448 : : /** Set the new char scale globally for the shape
449 : :
450 : : @param rNewScale
451 : : New char scale
452 : : */
453 : : void setCharScale( const double& rNewScale );
454 : :
455 : : // State change query methods
456 : : // ==========================
457 : :
458 : : State::StateId getTransformationState() const;
459 : : State::StateId getClipState() const;
460 : : State::StateId getAlphaState() const;
461 : : State::StateId getPositionState() const;
462 : : State::StateId getContentState() const;
463 : : State::StateId getVisibilityState() const;
464 : :
465 : : private:
466 : : // default copy/assignment operator is okay
467 : : // ShapeAttributeLayer(const ShapeAttributeLayer&);
468 : : // ShapeAttributeLayer& operator=( const ShapeAttributeLayer& );
469 : :
470 : 0 : bool haveChild() const { return mpChild; }
471 : : void updateStateIds();
472 : :
473 : : template< typename T > T calcValue( const T& rCurrValue,
474 : : bool bThisInstanceValid,
475 : : bool (ShapeAttributeLayer::*pIsValid)() const,
476 : : T (ShapeAttributeLayer::*pGetValue)() const ) const;
477 : :
478 : : ShapeAttributeLayerSharedPtr mpChild; // may be NULL
479 : :
480 : : ::basegfx::B2DSize maSize;
481 : : ::basegfx::B2DPoint maPosition;
482 : : ::basegfx::B2DPolyPolygon maClip;
483 : :
484 : : ::rtl::OUString maFontFamily;
485 : :
486 : : double mnRotationAngle;
487 : : double mnShearXAngle;
488 : : double mnShearYAngle;
489 : : double mnAlpha;
490 : : double mnCharRotationAngle;
491 : : double mnCharScale;
492 : : double mnCharWeight;
493 : :
494 : : ::com::sun::star::drawing::FillStyle meFillStyle;
495 : : ::com::sun::star::drawing::LineStyle meLineStyle;
496 : : ::com::sun::star::awt::FontSlant meCharPosture;
497 : : sal_Int16 mnUnderlineMode;
498 : :
499 : : RGBColor maDimColor;
500 : : RGBColor maFillColor;
501 : : RGBColor maLineColor;
502 : : RGBColor maCharColor;
503 : :
504 : : State::StateId mnTransformationState;
505 : : State::StateId mnClipState;
506 : : State::StateId mnAlphaState;
507 : : State::StateId mnPositionState;
508 : : State::StateId mnContentState;
509 : : State::StateId mnVisibilityState;
510 : :
511 : : sal_Int16 mnAdditiveMode;
512 : :
513 : : bool mbVisibility : 1;
514 : :
515 : : bool mbWidthValid : 1;
516 : : bool mbHeightValid : 1;
517 : : bool mbPosXValid : 1;
518 : : bool mbPosYValid : 1;
519 : : bool mbClipValid : 1;
520 : :
521 : : bool mbFontFamilyValid : 1;
522 : :
523 : : bool mbRotationAngleValid : 1;
524 : : bool mbShearXAngleValid : 1;
525 : : bool mbShearYAngleValid : 1;
526 : :
527 : : bool mbAlphaValid : 1;
528 : :
529 : : bool mbCharRotationAngleValid: 1;
530 : : bool mbCharScaleValid : 1;
531 : :
532 : : bool mbDimColorValid : 1;
533 : : bool mbFillColorValid : 1;
534 : : bool mbLineColorValid : 1;
535 : : bool mbCharColorValid : 1;
536 : :
537 : : bool mbFillStyleValid : 1;
538 : : bool mbLineStyleValid : 1;
539 : : bool mbCharWeightValid : 1;
540 : : bool mbUnderlineModeValid : 1;
541 : : bool mbCharPostureValid : 1;
542 : : bool mbVisibilityValid : 1;
543 : : };
544 : :
545 : : }
546 : : }
547 : :
548 : : #endif /* INCLUDED_SLIDESHOW_SHAPEATTRIBUTELAYER_HXX */
549 : :
550 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|