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_SHAPE_HXX
21 : #define INCLUDED_SLIDESHOW_SHAPE_HXX
22 :
23 : #include <com/sun/star/uno/Reference.hxx>
24 : #include <com/sun/star/drawing/XShape.hpp>
25 : #include <com/sun/star/drawing/XDrawPage.hpp>
26 :
27 : #include <basegfx/range/b2drectangle.hxx>
28 :
29 : #include "viewlayer.hxx"
30 :
31 : #include <boost/shared_ptr.hpp>
32 : #include <boost/noncopyable.hpp>
33 : #include <set>
34 : #include <vector>
35 :
36 : namespace basegfx {
37 : class B2DRange;
38 : }
39 :
40 : namespace slideshow
41 : {
42 : namespace internal
43 : {
44 : // forward declaration necessary, because methods use ShapeSharedPtr
45 : class Shape;
46 :
47 : typedef ::boost::shared_ptr< Shape > ShapeSharedPtr;
48 :
49 : /** Represents a slide's shape object.
50 :
51 : This interface represents the view-independent aspects of a
52 : slide's shape, providing bound rect, underlying XShape and
53 : basic paint methods.
54 : */
55 0 : class Shape : private boost::noncopyable
56 : {
57 : public:
58 0 : virtual ~Shape() {}
59 :
60 : /** Get the associated XShape of this shape.
61 :
62 : @return the associated XShape. If this method returns
63 : an empty reference, this object might be one of the
64 : special-purpose shapes of a slide, which have no
65 : direct corresponding XShape (the background comes to
66 : mind here).
67 : */
68 : virtual ::com::sun::star::uno::Reference<
69 : ::com::sun::star::drawing::XShape > getXShape() const = 0;
70 :
71 :
72 : // View layer methods
73 : //------------------------------------------------------------------
74 :
75 : /** Add a new view layer.
76 :
77 : This method adds a new view layer, this shape shall
78 : show itself on.
79 :
80 : @param rNewLayer
81 : New layer to show on
82 :
83 : @param bRedrawLayer
84 : Redraw shape on given layer
85 : */
86 : virtual void addViewLayer( const ViewLayerSharedPtr& rNewLayer,
87 : bool bRedrawLayer ) = 0;
88 :
89 : /** Withdraw the shape from a view layer
90 :
91 : This method removes the shape from the given view
92 : layer.
93 :
94 : @return true, if the shape was successfully removed
95 : */
96 : virtual bool removeViewLayer( const ViewLayerSharedPtr& rNewLayer ) = 0;
97 :
98 : /** Withdraw all view layers at once
99 :
100 : This method will be faster than repeated
101 : removeViewLayer() calls.
102 : */
103 : virtual bool clearAllViewLayers() = 0;
104 :
105 : // render methods
106 : //------------------------------------------------------------------
107 :
108 : /** Update the shape
109 :
110 : This method updates the Shape on all registered view
111 : layers, but only if shape content has actually
112 : changed.
113 :
114 : @return whether the update finished successfully.
115 : */
116 : virtual bool update() const = 0;
117 :
118 : /** Render the shape.
119 :
120 : This method renders the shape on all registered view
121 : layers, regardless of whether shape content has
122 : changed or not.
123 :
124 : @return whether the rendering finished successfully.
125 : */
126 : virtual bool render() const = 0;
127 :
128 : /** Query whether shape content changed
129 :
130 : This method returns true, if shape content changed
131 : since the last rendering (i.e. the shape needs an
132 : update to reflect that changed content on the views).
133 : */
134 : virtual bool isContentChanged() const = 0;
135 :
136 :
137 : // Shape attributes
138 : //------------------------------------------------------------------
139 :
140 : /** Get the current shape position and size.
141 :
142 : This method yields the currently effective shape
143 : bounds (which might change over time, for animated
144 : shapes). Please note that possibly shape rotations
145 : from its original document state must not be taken
146 : into account here: if you need the screen bounding
147 : box, use getUpdateArea() instead. Note further that
148 : shape rotations, which are already contained in the
149 : shape as displayed in the original document
150 : <em>are</em> included herein (we currently take the
151 : shape as-is from the document, assuming a rotation
152 : angle of 0).
153 : */
154 : virtual ::basegfx::B2DRange getBounds() const = 0;
155 :
156 : /** Get the DOM position and size of the shape.
157 :
158 : This method yields the underlying DOM shape bounds,
159 : i.e. the original shape bounds from the document
160 : model. This value is <em>always</em> unaffected by any
161 : animation activity. Note that shape rotations, which
162 : are already contained in the shape as displayed in the
163 : original document are already included herein (we
164 : currently take the shape as-is from the document,
165 : assuming a rotation angle of 0).
166 : */
167 : virtual ::basegfx::B2DRange getDomBounds() const = 0;
168 :
169 : /** Get the current shape update area.
170 :
171 : This method yields the currently effective update area
172 : for the shape, i.e. the area that needs to be updated,
173 : should the shape be painted. Normally, this will be
174 : the (possibly rotated and sheared) area returned by
175 : getBounds().
176 : */
177 : virtual ::basegfx::B2DRange getUpdateArea() const = 0;
178 :
179 : /** Query whether the shape is visible at all.
180 :
181 : @return true, if this shape is visible, false
182 : otherwise.
183 : */
184 : virtual bool isVisible() const = 0;
185 :
186 : /** Get the shape priority.
187 :
188 : The shape priority defines the relative order of the
189 : shapes on the slide.
190 :
191 : @return the priority. Will be in the [0,+infty) range.
192 : */
193 : virtual double getPriority() const = 0;
194 :
195 : /** Query whether the Shape is currently detached from the
196 : background.
197 :
198 : This method checks whether the Shape is currently
199 : detached from the slide background, i.e. whether shape
200 : updates affect the underlying slide background or
201 : not. A shape that returnes true here must not alter
202 : slide content in any way when called render() or
203 : update() (this is normally achieved by making this
204 : shape a sprite).
205 : */
206 : virtual bool isBackgroundDetached() const = 0;
207 :
208 : // Misc
209 : //------------------------------------------------------------------
210 :
211 : /** Functor struct, for shape ordering
212 :
213 : This defines a strict weak ordering of shapes, primary
214 : sort key is the shape priority, and secondy sort key
215 : the object ptr value. Most typical use is for
216 : associative containers holding shapes (and which also
217 : have to maintain something like a paint order).
218 : */
219 : struct lessThanShape
220 : {
221 : // make functor adaptable (to boost::bind)
222 : typedef bool result_type;
223 :
224 : // since the ZOrder property on the XShape has somewhat
225 : // peculiar attributes (it's basically the index of the shapes
226 : // in the drawing layer's SdrObjList - which means, it starts
227 : // from 0 for children of group objects), we cannot use it to determine
228 : // drawing order. Thus, we rely on importer-provided order values here,
229 : // which is basically a running counter during shape import (i.e. denotes
230 : // the order of shape import). This is the correct order, at least for the
231 : // current drawing core.
232 : //
233 : // If, someday, the above proposition is no longer true, one directly use
234 : // the shape's ZOrder property
235 : //
236 0 : static bool compare(const Shape* pLHS, const Shape* pRHS)
237 : {
238 0 : const double nPrioL( pLHS->getPriority() );
239 0 : const double nPrioR( pRHS->getPriority() );
240 :
241 : // if prios are equal, tie-break on ptr value
242 0 : return nPrioL == nPrioR ? pLHS < pRHS : nPrioL < nPrioR;
243 : }
244 :
245 0 : bool operator()(const ShapeSharedPtr& rLHS, const ShapeSharedPtr& rRHS) const
246 : {
247 0 : return compare(rLHS.get(),rRHS.get());
248 : }
249 :
250 : bool operator()(const Shape* pLHS, const Shape* pRHS) const
251 : {
252 : return compare(pLHS, pRHS);
253 : }
254 : };
255 : };
256 :
257 : typedef ::boost::shared_ptr< Shape > ShapeSharedPtr;
258 :
259 : /** A set which contains all shapes in an ordered fashion.
260 : */
261 : typedef ::std::set< ShapeSharedPtr, Shape::lessThanShape > ShapeSet;
262 : }
263 : }
264 :
265 : #endif /* INCLUDED_SLIDESHOW_SHAPE_HXX */
266 :
267 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|