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