/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#ifndef INCLUDED_SLIDESHOW_SHAPEATTRIBUTELAYER_HXX
#define INCLUDED_SLIDESHOW_SHAPEATTRIBUTELAYER_HXX

#include <com/sun/star/drawing/FillStyle.hpp>
#include <com/sun/star/drawing/LineStyle.hpp>
#include <com/sun/star/awt/FontSlant.hpp>

#include <basegfx/vector/b2dsize.hxx>
#include <basegfx/point/b2dpoint.hxx>
#include <basegfx/range/b2drectangle.hxx>
#include <basegfx/polygon/b2dpolypolygon.hxx>

#include "state.hxx"
#include "rgbcolor.hxx"

#include <stack>
#include <boost/shared_ptr.hpp>


namespace slideshow
{
    namespace internal
    {
        class ShapeAttributeLayer;

        typedef ::boost::shared_ptr< ShapeAttributeLayer > ShapeAttributeLayerSharedPtr;

        /** Encapsulates all modifiable attributes of a shape.

        	This class holds all modifiable attributes of a shape, and
        	at the same time provides means to layer attributes on top
        	of each other..

            And yes, there's a reason why we even pass bools and ints
            by const reference. Namely, that makes the set* methods
            differ only in the value type, which greatly reduces
            template variability (e.g. in AnimationFactory).
         */
        class ShapeAttributeLayer
        {
        public:
            /** Create a ShapeAttributeLayer instance, with all
                attributes set to default.

                Furthermore, this constructor gets a pointer to a
                child layer, which is used as the fallback (or the
                base value) for all attributes

                @param rChildLayer
                Layer below this one

                @attention
                This method is only supposed to be called from Shape objects
             */
            explicit ShapeAttributeLayer( const ShapeAttributeLayerSharedPtr& rChildLayer );

            // Children management methods
            //------------------------------------------------------------------

            /** Revoke the given layer.

            	This method revokes the given layer from this object
            	or one of the children. That is, if this object does
            	have children, and the given layer is no direct child,
            	it is recursively passed to the children for removal.

                @return true, if removal was successful.

                @attention
                This method is only supposed to be called from Shape objects
             */
            bool revokeChildLayer( const ShapeAttributeLayerSharedPtr& rChildLayer );

            /** Query the child layer of this object.

                @attention
                This method is only supposed to be called from Shape objects
             */
            ShapeAttributeLayerSharedPtr getChildLayer() const;

            /** Set the additive mode for possible child attributes

            	This method sets the additive mode for child
            	attributes. That is the way underlying attribute
            	layers are combined with this one (i.e. to overrule
            	lower layers, or how to combine the values). The
            	default is
            	::com::sun::star::animations::AnimationAdditiveMode::BASE,
            	which means, take the value of the underlying layers,
            	or from the model shape itself.

                @param nMode
                Must be one of
                ::com::sun::star::animations::AnimationAdditiveMode.
             */
            void setAdditiveMode( sal_Int16 nMode );

            // Attribute methods
            //------------------------------------------------------------------

            /** Query whether the width attribute is valid.
             */
            bool isWidthValid() const;
            /** Query the current width of the shape
             */
            double getWidth() const;
            /** Set the new width of the shape

				@param rNewWidth
                A negative width mirrors the shape.
             */
            void setWidth( const double& rNewWidth );

            /** Query whether the height attribute is valid.
             */
            bool isHeightValid() const;
            /** Query the current height of the shape
             */
            double getHeight() const;
            /** Set the new height of the shape

				@param rNewHeight
                A negative height mirrors the shape.
             */
            void setHeight( const double& rNewHeight );

            /** Set the new size of the shape

				@param rNewSize
                A negative size mirrors the shape.
             */
            void setSize( const ::basegfx::B2DSize& rNewSize );

            /** Query whether the x position attribute is valid
             */
            bool isPosXValid() const;
            /** Query the current x position of the shape.

            	The current x position of the shape is always relative
            	to the <em>center</em> of the shape (in contrast to
            	the Shape::getBounds() and Shape::getUpdateArea()
            	methods).
             */
            double getPosX() const;
            /** Set the new x position of the shape

            	The current x position of the shape is always relative
            	to the <em>center</em> of the shape (in contrast to
            	the Shape::getBounds() and Shape::getUpdateArea()
            	methods).
             */
            void setPosX( const double& rNewX );

            /** Query whether the y position attribute is valid
             */
            bool isPosYValid() const;
            /** Query the current y position of the shape

            	The current y position of the shape is always relative
            	to the <em>center</em> of the shape (in contrast to
            	the Shape::getBounds() and Shape::getUpdateArea()
            	methods).
             */
            double getPosY() const;
            /** Set the new y position of the shape

            	The current y position of the shape is always relative
            	to the <em>center</em> of the shape (in contrast to
            	the Shape::getBounds() and Shape::getUpdateArea()
            	methods).
             */
            void setPosY( const double& rNewY );

            /** Set the new position of the shape

            	The current position of the shape is always relative
            	to the <em>center</em> of the shape (in contrast to
            	the Shape::getBounds() and Shape::getUpdateArea()
            	methods).
             */
            void setPosition( const ::basegfx::B2DPoint& rNewPos );

            /** Query whether the rotation angle attribute is valid
             */
            bool isRotationAngleValid() const;
            /** Query the current rotation angle of the shape

            	@return the rotation angle in degrees.
             */
            double getRotationAngle() const;
            /** Set the new rotation angle of the shape

            	@param rNewAngle
                New rotation angle in degrees.
             */
            void setRotationAngle( const double& rNewAngle );

            /** Query whether the shear x angle attribute is valid
             */
            bool isShearXAngleValid() const;
            /** Query the current shear angle at the x axis of the shape

            	@return the shear angle in degrees.
             */
            double getShearXAngle() const;
            /** Set the new shear angle at the x axis of the shape

            	@param rNewAngle
                New shear angle in radians.
             */
            void setShearXAngle( const double& rNewAngle );

            /** Query whether the shear y angle attribute is valid
             */
            bool isShearYAngleValid() const;
            /** Query the current shear angle at the y axis of the shape

            	@return the shear angle in degrees.
             */
            double getShearYAngle() const;
            /** Set the new shear angle at the y axis of the shape

            	@param rNewAngle
                New shear angle in radians.
             */
            void setShearYAngle( const double& rNewAngle );

            /** Query whether the alpha attribute is valid
             */
            bool isAlphaValid() const;
            /** Query the current alpha value of the shape
             */
            double getAlpha() const;
            /** Set the new alpha value of the shape

            	@param rNewValue
                New alpha value, must be in the [0,1] range
             */
            void setAlpha( const double& rNewValue );
            
            /** Query whether the clip attribute is valid
             */
            bool isClipValid() const;
            /** Query the current clip polygon of the shape
             */
            ::basegfx::B2DPolyPolygon getClip() const;
            /** Set the new clip polygon of the shape

            	@param rNewClip
                New clip polygon, is interpreted in shape view coordinates, but
                relative to the shape (i.e. the origin of the shape coincides
                with the origin of the clip polygon).
             */
            void setClip( const ::basegfx::B2DPolyPolygon& rNewClip );
            
            /** Query whether the dim color attribute is valid

            	The dim color globally 'dims' the shape towards that
            	color
             */
            bool isDimColorValid() const;
            /** Get the dim color for the whole shape.
             */
            RGBColor getDimColor() const;
            /** Set the dim color globally for the whole shape.
             */
            void setDimColor( const RGBColor& nNewColor );

            /** Query whether the fill color attribute is valid
             */
            bool isFillColorValid() const;
            /** Get the fill color for the whole shape.

            	If there's no unique fill color, the color from the
            	first filled polygon is returned.
             */
            RGBColor getFillColor() const;
            /** Set the fill color globally for the whole shape.
             */
            void setFillColor( const RGBColor& nNewColor );

            /** Query whether the line color attribute is valid
             */
            bool isLineColorValid() const;
            /** Get the line color for the whole shape.

            	If there's no unique line color, the color from the
            	first line is returned.
             */
            RGBColor  getLineColor() const;
            /** Set the line color globally for the whole shape.
             */
            void setLineColor( const RGBColor& nNewColor );

            /** Query whether the fill mode attribute is valid
             */
            bool isFillStyleValid() const;
            /** Get the current fill mode for polygon fillings.

				@returns the current style
             */
            sal_Int16 getFillStyle() const;
            /** Changes polygon fillings.
             */
            void setFillStyle( const sal_Int16& rStyle );

            /** Query whether the line mode attribute is valid
             */
            bool isLineStyleValid() const;
            /** Get the current line mode for line drawing.
                
				@returns the current line style
             */
            sal_Int16 getLineStyle() const;
            /** Set line style for the whole shape
             */
            void setLineStyle( const sal_Int16& rStyle );

            /** Query whether the visibility state attribute is valid
             */
            bool isVisibilityValid() const;
            /** Get the current shape visibility.

				@returns true for visible, false for invisible.
             */
            bool getVisibility() const;
            /** Set the shape visibility
             */
            void setVisibility( const bool& bVisible );

            /** Query whether the char color attribute is valid
             */
            bool isCharColorValid() const;
            /** Get the text color for the whole shape.

            	If there's no unique text color, the color from the
            	first text drawn is returned.
             */
            RGBColor getCharColor() const;
            /** Set the text color globally for the whole shape.
             */
            void setCharColor( const RGBColor& nNewColor );
            
            /** Query whether the char rotation angle attribute is valid
             */
            bool isCharRotationAngleValid() const;
            /** Query the current text rotation angle of the shape

            	@return the text rotation angle in degrees.
             */
            double getCharRotationAngle() const;
            /** Set the new text rotation angle of the shape

            	@param rNewAngle
                New text rotation angle in degrees.
             */
            void setCharRotationAngle( const double& rNewAngle );

            /** Query whether the char weight attribute is valid
             */
            bool isCharWeightValid() const;
            /** Get the current char weight value for the whole shape.

				@returns the value for the char weight. The value must
				be out of the ::com::sun::star::awt::FontWeight
				constant group.
             */
            double getCharWeight() const;
            /** Set the char weight globally for the whole shape.

            	The value must be out of the
            	::com::sun::star::awt::FontWeight constant group.
             */
            void setCharWeight( const double& rStyle );
            
            /** Query whether the underline mode attribute is valid
             */
            bool isUnderlineModeValid() const;
            /** Get the current text underline status for the whole shape.

            	If there is no unique underline status, false is returned.

				@returns true for underlined text, false for normal.
             */
            sal_Int16 getUnderlineMode() const;
            /** Set the underline status globally for the whole shape
             */
            void setUnderlineMode( const sal_Int16& bUnderline );

            /** Query whether the font family attribute is valid
             */
            bool isFontFamilyValid() const;
            /** Get the current text font family for the whole shape.

            	If there is no unique font family, the font family of
            	the first text of the shape is returned.
             */
            ::rtl::OUString getFontFamily() const;
            /** Set the text font family name globally for the whole shape
             */
            void setFontFamily( const ::rtl::OUString& rName );

            /** Query whether the italic mode attribute is valid
             */
            bool isCharPostureValid() const;
            /** Get the current text italic style for the whole shape.

				@returns the italic style. The value returned is one
				of the ::com::sun::star::awt::FontSlant enums
             */
            sal_Int16 getCharPosture() const;
            /** Set the italic style globally for the whole shape.

            	The value must be one of the
            	::com::sun::star::awt::FontSlant enums.
            */
            void setCharPosture( const sal_Int16& rStyle );

            /** Query whether the char scaling attribute is valid
             */
            bool isCharScaleValid() const;
            /** Query the current char scaling attribute globally for
                the shape.

                The char scaling changes the scale of the whole shape
                text (uniformely, i.e. both in x and in y direction).
             */
            double getCharScale() const;
            /** Set the new char scale globally for the shape

            	@param rNewScale
                New char scale
             */
            void setCharScale( const double& rNewScale );

            // State change query methods
            // ==========================

            State::StateId getTransformationState() const;
            State::StateId getClipState() const;
            State::StateId getAlphaState() const;
            State::StateId getPositionState() const;
            State::StateId getContentState() const;
            State::StateId getVisibilityState() const;

        private:
            // default copy/assignment operator is okay
            // ShapeAttributeLayer(const ShapeAttributeLayer&);
            // ShapeAttributeLayer& operator=( const ShapeAttributeLayer& );

            bool haveChild() const { return (mpChild.get() != NULL); }
            void updateStateIds();

            template< typename T > T calcValue( const T& 				   rCurrValue,
                                                bool						   bThisInstanceValid,
                                                bool (ShapeAttributeLayer::*pIsValid)() const,
                                                T 	(ShapeAttributeLayer::*pGetValue)() const ) const;
            
            ShapeAttributeLayerSharedPtr				mpChild; // may be NULL

            ::basegfx::B2DSize 							maSize;
            ::basegfx::B2DPoint							maPosition;
            ::basegfx::B2DPolyPolygon					maClip;

            ::rtl::OUString								maFontFamily;

            double										mnRotationAngle;
            double 										mnShearXAngle;
            double										mnShearYAngle;
            double										mnAlpha;
            double										mnCharRotationAngle;
            double										mnCharScale;
            double										mnCharWeight;

            ::com::sun::star::drawing::FillStyle		meFillStyle;
            ::com::sun::star::drawing::LineStyle		meLineStyle;
            ::com::sun::star::awt::FontSlant			meCharPosture;
            sal_Int16									mnUnderlineMode;

            RGBColor									maDimColor;
            RGBColor									maFillColor;
            RGBColor									maLineColor;
            RGBColor									maCharColor;

            State::StateId 								mnTransformationState;
            State::StateId 								mnClipState;
            State::StateId 								mnAlphaState;
            State::StateId 								mnPositionState;
            State::StateId 								mnContentState;
            State::StateId 								mnVisibilityState;

            sal_Int16									mnAdditiveMode;

            bool										mbVisibility 			: 1;

            bool										mbWidthValid 			: 1;
            bool										mbHeightValid 			: 1;
            bool										mbPosXValid 			: 1;
            bool										mbPosYValid 			: 1;
            bool										mbClipValid				: 1;

            bool										mbFontFamilyValid 		: 1;

            bool										mbRotationAngleValid	: 1;
            bool										mbShearXAngleValid		: 1;
            bool										mbShearYAngleValid		: 1;

            bool										mbAlphaValid			: 1;

            bool										mbCharRotationAngleValid: 1;
            bool										mbCharScaleValid		: 1;

            bool										mbDimColorValid			: 1;
            bool										mbFillColorValid		: 1;
            bool										mbLineColorValid		: 1;
            bool										mbCharColorValid		: 1;

            bool										mbFillStyleValid		: 1;
            bool										mbLineStyleValid		: 1;
            bool										mbCharWeightValid		: 1;
            bool										mbUnderlineModeValid	: 1;
            bool										mbCharPostureValid		: 1;
            bool										mbVisibilityValid		: 1;
        };

    }
}

#endif /* INCLUDED_SLIDESHOW_SHAPEATTRIBUTELAYER_HXX */
