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_DRAWSHAPESUBSETTING_HXX
21 : : #define INCLUDED_SLIDESHOW_DRAWSHAPESUBSETTING_HXX
22 : :
23 : : #include <boost/shared_ptr.hpp>
24 : : #include <boost/noncopyable.hpp>
25 : :
26 : : #include "doctreenode.hxx"
27 : : #include "attributableshape.hxx"
28 : :
29 : :
30 : : class GDIMetaFile;
31 : :
32 : : namespace slideshow
33 : : {
34 : : namespace internal
35 : : {
36 : : /** This class encapsulates the subsetting aspects of a
37 : : DrawShape.
38 : : */
39 : 0 : class DrawShapeSubsetting : private boost::noncopyable
40 : : {
41 : : public:
42 : : /** Create empty shape subset handling.
43 : :
44 : : This method creates a subset handler which contains no
45 : : subset information. All methods will return default
46 : : values.
47 : :
48 : : @param rMtf
49 : : Metafile to retrieve subset info from (must have been
50 : : generated with verbose text comments switched on).
51 : : */
52 : : DrawShapeSubsetting();
53 : :
54 : : /** Create new shape subset handling.
55 : :
56 : : @param rShapeSubset
57 : : The subset this object represents (can be empty, then
58 : : denoting 'represents a whole shape')
59 : :
60 : : @param rMtf
61 : : Metafile to retrieve subset info from (must have been
62 : : generated with verbose text comments switched on).
63 : : */
64 : : DrawShapeSubsetting( const DocTreeNode& rShapeSubset,
65 : : const ::boost::shared_ptr< GDIMetaFile >& rMtf );
66 : :
67 : : /** Reset metafile.
68 : :
69 : : Use this method to completely reset the
70 : : ShapeSubsetting, with a new metafile. Note that any
71 : : information previously set will be lost, including
72 : : added subset shapes!
73 : :
74 : : @param rMtf
75 : : Metafile to retrieve subset info from (must have been
76 : : generated with verbose text comments switched on).
77 : : */
78 : : void reset( const ::boost::shared_ptr< GDIMetaFile >& rMtf );
79 : :
80 : : // Shape subsetting methods
81 : : // ========================================================
82 : :
83 : : /// Return subset node for this shape
84 : : DocTreeNode getSubsetNode () const;
85 : :
86 : : /// Get subset shape for given node, if any
87 : : AttributableShapeSharedPtr getSubsetShape ( const DocTreeNode& rTreeNode ) const;
88 : :
89 : : /// Add child subset shape (or increase use count, if already existent)
90 : : void addSubsetShape ( const AttributableShapeSharedPtr& rShape );
91 : :
92 : : /** Revoke subset shape
93 : :
94 : : This method revokes a subset shape, decrementing the
95 : : use count for this subset by one. If the use count
96 : : reaches zero (i.e. when the number of addSubsetShape()
97 : : matches the number of revokeSubsetShape() calls for
98 : : the same subset), the subset entry is removed from the
99 : : internal list, and subsequent getSubsetShape() calls
100 : : will return the empty pointer for this subset.
101 : :
102 : : @return true, if the subset shape was physically
103 : : removed from the list (false is returned, when nothing
104 : : was removed, either because only the use count was
105 : : decremented, or there was no such subset found, in the
106 : : first place).
107 : : */
108 : : bool revokeSubsetShape ( const AttributableShapeSharedPtr& rShape );
109 : :
110 : :
111 : : // Doc tree methods
112 : : // ========================================================
113 : :
114 : : /// Return overall number of nodes for given type
115 : : sal_Int32 getNumberOfTreeNodes ( DocTreeNode::NodeType eNodeType ) const;
116 : :
117 : : /// Return tree node of given index and given type
118 : : DocTreeNode getTreeNode ( sal_Int32 nNodeIndex,
119 : : DocTreeNode::NodeType eNodeType ) const;
120 : :
121 : : /// Return number of nodes of given type, below parent node
122 : : sal_Int32 getNumberOfSubsetTreeNodes ( const DocTreeNode& rParentNode,
123 : : DocTreeNode::NodeType eNodeType ) const;
124 : :
125 : : /// Return tree node of given index and given type, relative to parent node
126 : : DocTreeNode getSubsetTreeNode ( const DocTreeNode& rParentNode,
127 : : sal_Int32 nNodeIndex,
128 : : DocTreeNode::NodeType eNodeType ) const;
129 : :
130 : : // Helper
131 : : // ========================================================
132 : :
133 : : /** Return a vector of currently active subsets.
134 : :
135 : : Needed when rendering a shape, this method provides a
136 : : vector of subsets currently visible (the range as
137 : : returned by getEffectiveSubset(), minus the parts that
138 : : are currently hidden, because displayed by child
139 : : shapes).
140 : : */
141 : : const VectorOfDocTreeNodes& getActiveSubsets() const;
142 : :
143 : : /** This enum classifies each action index in the
144 : : metafile.
145 : :
146 : : Of interest are, of course, the places where
147 : : structural shape and/or text elements end. The
148 : : remainder of the action gets classified as 'noop'
149 : : */
150 : : enum IndexClassificator
151 : : {
152 : : CLASS_NOOP,
153 : : CLASS_SHAPE_START,
154 : : CLASS_SHAPE_END,
155 : :
156 : : CLASS_LINE_END,
157 : : CLASS_PARAGRAPH_END,
158 : : CLASS_SENTENCE_END,
159 : : CLASS_WORD_END,
160 : : CLASS_CHARACTER_CELL_END
161 : : };
162 : :
163 : : typedef ::std::vector< IndexClassificator > IndexClassificatorVector;
164 : :
165 : : private:
166 : : /** Entry for subset shape
167 : :
168 : : This struct contains data for every subset shape
169 : : generated. Note that for a given start/end action
170 : : index combination, only one subset instance is
171 : : generated (and reused for subsequent queries).
172 : : */
173 : 0 : struct SubsetEntry
174 : : {
175 : : AttributableShapeSharedPtr mpShape;
176 : : sal_Int32 mnStartActionIndex;
177 : : sal_Int32 mnEndActionIndex;
178 : :
179 : : /// Number of times this subset was queried, and not yet revoked
180 : : int mnSubsetQueriedCount;
181 : :
182 : 0 : sal_Int32 getHashValue() const
183 : : {
184 : : // TODO(Q3): That's a hack. We assume that start
185 : : // index will always be less than 65535 (if this
186 : : // assumption is violated, hash map performance
187 : : // will degrade severely)
188 : 0 : return mnStartActionIndex*SAL_MAX_INT16 + mnEndActionIndex;
189 : : }
190 : :
191 : : /// The shape set is ordered according to this method
192 : 0 : bool operator<(const SubsetEntry& rOther) const
193 : : {
194 : 0 : return getHashValue() < rOther.getHashValue();
195 : : }
196 : :
197 : : };
198 : :
199 : : typedef ::std::set< SubsetEntry > ShapeSet;
200 : :
201 : : void ensureInitializedNodeTree() const;
202 : : void updateSubsetBounds( const SubsetEntry& rSubsetEntry );
203 : : void updateSubsets();
204 : : void initCurrentSubsets();
205 : : void reset();
206 : :
207 : : sal_Int32 implGetNumberOfTreeNodes( const IndexClassificatorVector::const_iterator& rBegin,
208 : : const IndexClassificatorVector::const_iterator& rEnd,
209 : : DocTreeNode::NodeType eNodeType ) const;
210 : : DocTreeNode implGetTreeNode( const IndexClassificatorVector::const_iterator& rBegin,
211 : : const IndexClassificatorVector::const_iterator& rEnd,
212 : : sal_Int32 nNodeIndex,
213 : : DocTreeNode::NodeType eNodeType ) const;
214 : :
215 : : mutable IndexClassificatorVector maActionClassVector;
216 : :
217 : : /// Metafile to retrieve subset info from
218 : : ::boost::shared_ptr< GDIMetaFile > mpMtf;
219 : :
220 : : /// Subset of the metafile represented by this object
221 : : DocTreeNode maSubset;
222 : :
223 : : /// the list of subset shapes spawned from this one.
224 : : ShapeSet maSubsetShapes;
225 : :
226 : : /// caches minimal subset index from maSubsetShapes
227 : : sal_Int32 mnMinSubsetActionIndex;
228 : :
229 : : /// caches maximal subset index from maSubsetShapes
230 : : sal_Int32 mnMaxSubsetActionIndex;
231 : :
232 : : /** Current number of subsets to render (calculated from
233 : : maSubset and mnMin/MaxSubsetActionIndex).
234 : :
235 : : Note that this is generally _not_ equivalent to
236 : : maSubset, as it excludes all active subset children!
237 : : */
238 : : mutable VectorOfDocTreeNodes maCurrentSubsets;
239 : :
240 : : /// Whether the shape's doc tree has been initialized successfully, or not
241 : : mutable bool mbNodeTreeInitialized;
242 : : };
243 : :
244 : : }
245 : : }
246 : :
247 : : #endif /* INCLUDED_SLIDESHOW_DRAWSHAPESUBSETTING_HXX */
248 : :
249 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|