1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #ifndef INCLUDED_SLIDESHOW_SHAPEATTRIBUTELAYERHOLDER_HXX
25*b1cdbd2cSJim Jagielski #define INCLUDED_SLIDESHOW_SHAPEATTRIBUTELAYERHOLDER_HXX
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "attributableshape.hxx"
28*b1cdbd2cSJim Jagielski #include "shapeattributelayer.hxx"
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <boost/noncopyable.hpp>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski namespace slideshow
33*b1cdbd2cSJim Jagielski {
34*b1cdbd2cSJim Jagielski     namespace internal
35*b1cdbd2cSJim Jagielski     {
36*b1cdbd2cSJim Jagielski         /** Holds a ShapeAttributeLayer, together with the associated
37*b1cdbd2cSJim Jagielski             Shape
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski             Use this class to hold ShapeAttributeLayer objects the
40*b1cdbd2cSJim Jagielski             RAII way. When this object gets deleted, it will
41*b1cdbd2cSJim Jagielski             automatically revoke the attribute layer for the given
42*b1cdbd2cSJim Jagielski             shape (this encapsulates the somewhat clumsy notification
43*b1cdbd2cSJim Jagielski             process that is required for shape and attribute layer
44*b1cdbd2cSJim Jagielski             interaction).
45*b1cdbd2cSJim Jagielski          */
46*b1cdbd2cSJim Jagielski         class ShapeAttributeLayerHolder : private boost::noncopyable
47*b1cdbd2cSJim Jagielski         {
48*b1cdbd2cSJim Jagielski         public:
49*b1cdbd2cSJim Jagielski             /** Create a ShapeAttributeLayerHolder instance.
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski             	This constructor creates an empty attribute holder, to
52*b1cdbd2cSJim Jagielski             	generate an attribute layer, you have to manually call
53*b1cdbd2cSJim Jagielski             	createAttributeLayer().
54*b1cdbd2cSJim Jagielski              */
ShapeAttributeLayerHolder()55*b1cdbd2cSJim Jagielski             ShapeAttributeLayerHolder() :
56*b1cdbd2cSJim Jagielski                 mpShape(),
57*b1cdbd2cSJim Jagielski                 mpAttributeLayer()
58*b1cdbd2cSJim Jagielski             {
59*b1cdbd2cSJim Jagielski             }
60*b1cdbd2cSJim Jagielski 
~ShapeAttributeLayerHolder()61*b1cdbd2cSJim Jagielski             ~ShapeAttributeLayerHolder()
62*b1cdbd2cSJim Jagielski             {
63*b1cdbd2cSJim Jagielski                 reset(); // ensures that the last attribute layer is
64*b1cdbd2cSJim Jagielski                          // correctly deregistered from the shape.
65*b1cdbd2cSJim Jagielski             }
66*b1cdbd2cSJim Jagielski 
reset()67*b1cdbd2cSJim Jagielski             void reset()
68*b1cdbd2cSJim Jagielski             {
69*b1cdbd2cSJim Jagielski                 if( mpShape && mpAttributeLayer )
70*b1cdbd2cSJim Jagielski                     mpShape->revokeAttributeLayer( mpAttributeLayer );
71*b1cdbd2cSJim Jagielski             }
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski             /** This constructor receives a pointer to the Shape, from
74*b1cdbd2cSJim Jagielski             	which attribute layers should be generated. Initially,
75*b1cdbd2cSJim Jagielski             	this object does not create an attribute layer, you
76*b1cdbd2cSJim Jagielski             	have to manually call createAttributeLayer().
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski                 @param rShape
79*b1cdbd2cSJim Jagielski                 Shape for which attribute layers should be generated.
80*b1cdbd2cSJim Jagielski             */
createAttributeLayer(const AttributableShapeSharedPtr & rShape)81*b1cdbd2cSJim Jagielski             bool createAttributeLayer( const AttributableShapeSharedPtr& rShape )
82*b1cdbd2cSJim Jagielski             {
83*b1cdbd2cSJim Jagielski                 reset();
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski                 mpShape = rShape;
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski                 if( mpShape )
88*b1cdbd2cSJim Jagielski                     mpAttributeLayer = mpShape->createAttributeLayer();
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski                 return (mpAttributeLayer.get() != NULL);
91*b1cdbd2cSJim Jagielski             }
92*b1cdbd2cSJim Jagielski 
get() const93*b1cdbd2cSJim Jagielski             ShapeAttributeLayerSharedPtr get() const
94*b1cdbd2cSJim Jagielski             {
95*b1cdbd2cSJim Jagielski                 return mpAttributeLayer;
96*b1cdbd2cSJim Jagielski             }
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski         private:
99*b1cdbd2cSJim Jagielski             AttributableShapeSharedPtr		mpShape;
100*b1cdbd2cSJim Jagielski             ShapeAttributeLayerSharedPtr	mpAttributeLayer;
101*b1cdbd2cSJim Jagielski         };
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski     }
104*b1cdbd2cSJim Jagielski }
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski #endif /* INCLUDED_SLIDESHOW_SHAPEATTRIBUTELAYERHOLDER_HXX */
107