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_SHAPESUBSET_HXX
25 #define INCLUDED_SLIDESHOW_SHAPESUBSET_HXX
26 
27 #include "attributableshape.hxx"
28 #include "subsettableshapemanager.hxx"
29 #include "doctreenode.hxx"
30 
31 #include <boost/shared_ptr.hpp>
32 
33 namespace slideshow
34 {
35     namespace internal
36     {
37         class ShapeSubset;
38         typedef ::boost::shared_ptr< ShapeSubset > ShapeSubsetSharedPtr;
39 
40 		/* Definition of ShapeSubset class */
41 
42         /** Subset RAII wrapper for shapes.
43 
44         	This class wraps the plain Shape with a wrapper for subset
45         	functionality. Subsetting can be turned on and off. Note
46         	that the reason to have shape subsetting RAII implemented
47         	separately (i.e. not within the DrawShape) was that
48         	subsetting (and de-subsetting) needs the
49         	SubsettableShapeManager. And holding that at the DrawShape
50         	creates one heck of a circular reference.
51          */
52         class ShapeSubset
53         {
54         public:
55             /** Create a subset directly from a Shape.
56 
57             	@param rOriginalShape
58                 Original shape to subset
59 
60                 @param rTreeNode
61                 Subset this object should represent
62 
63                 @param rShapeManager
64                 Manager object, where subsets are
65                 registered/unregistered
66              */
67             ShapeSubset( const AttributableShapeSharedPtr&	     rOriginalShape,
68                          const DocTreeNode&					     rTreeNode,
69                          const SubsettableShapeManagerSharedPtr& rSubsetManager );
70 
71             /** Create a subset from another subset.
72 
73 				Note: if you want this subset to subtract from the
74 				passed subset reference (and not from the original,
75 				unsubsetted shape), the passed subset must be enabled
76 				(enableSubsetShape() must have been called)
77 
78             	@param rOriginalSubset
79                 Original subset, which to subset again.
80 
81                 @param rTreeNode
82                 Subset of the original subset
83              */
84             ShapeSubset( const ShapeSubsetSharedPtr&		rOriginalSubset,
85                          const DocTreeNode&					rTreeNode );
86 
87             /** Create full set for the given shape.
88 
89             	@param rOriginalShape
90                 Original shape, which will be represented as a whole
91                 by this object
92              */
93             ShapeSubset( const AttributableShapeSharedPtr&	     rOriginalShape,
94                          const SubsettableShapeManagerSharedPtr& rShapeManager );
95 
96             ~ShapeSubset();
97 
98             /** Get the actual subset shape.
99 
100             	If the subset is currently revoked, this method
101             	returns the original shape.
102              */
103             AttributableShapeSharedPtr 	getSubsetShape() const;
104 
105             /** Enable the subset shape.
106 
107             	This method enables the subset. That means, on
108             	successful completion of this method, the original
109             	shape will cease to show the subset range, and
110             	getSubsetShape() will return a valid shape.
111 
112                 @return true, if subsetting was successfully enabled.
113              */
114             bool			enableSubsetShape();
115 
116             /** Disable the subset shape.
117 
118             	This method revokes the subset from the original
119             	shape. That means, the original shape will again show
120             	the hidden range.
121              */
122             void			disableSubsetShape();
123 
124             /** Query whether this subset actually is none, but
125                 contains the whole original shape's content
126              */
127             bool isFullSet() const;
128 
129             /** Query subset this object represents
130              */
131             DocTreeNode getSubset() const;
132 
133         private:
134             // default copy/assignment are okay
135             //ShapeSubset(const ShapeSubset&);
136             //ShapeSubset& operator=( const ShapeSubset& );
137 
138             AttributableShapeSharedPtr	     mpOriginalShape;
139             AttributableShapeSharedPtr       mpSubsetShape;
140             DocTreeNode                      maTreeNode;
141             SubsettableShapeManagerSharedPtr mpShapeManager;
142         };
143     }
144 }
145 
146 #endif /* INCLUDED_SLIDESHOW_SHAPESUBSET_HXX */
147