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 : :
21 : : // must be first
22 : : #include <canvas/debug.hxx>
23 : :
24 : : #include <com/sun/star/awt/Rectangle.hpp>
25 : : #include <com/sun/star/beans/XPropertySet.hpp>
26 : : #include <com/sun/star/awt/FontWeight.hpp>
27 : : #include <rtl/logfile.hxx>
28 : :
29 : : #include <vcl/metaact.hxx>
30 : : #include <vcl/gdimtf.hxx>
31 : :
32 : : #include <basegfx/numeric/ftools.hxx>
33 : :
34 : : #include <boost/bind.hpp>
35 : :
36 : : #include <cmath> // for trigonometry and fabs
37 : : #include <algorithm>
38 : : #include <functional>
39 : : #include <limits>
40 : :
41 : : #include "backgroundshape.hxx"
42 : : #include "slideshowexceptions.hxx"
43 : : #include "slideshowcontext.hxx"
44 : : #include "gdimtftools.hxx"
45 : : #include "shape.hxx"
46 : : #include "viewbackgroundshape.hxx"
47 : :
48 : :
49 : : using namespace ::com::sun::star;
50 : :
51 : :
52 : : namespace slideshow
53 : : {
54 : : namespace internal
55 : : {
56 : : /** Representation of a draw document's background shape.
57 : :
58 : : This class implements the Shape interface for the
59 : : background shape. Since the background shape is neither
60 : : animatable nor attributable, those more specialized
61 : : derivations of the Shape interface are not implemented
62 : : here.
63 : :
64 : : @attention this class is to be treated 'final', i.e. one
65 : : should not derive from it.
66 : : */
67 : 0 : class BackgroundShape : public Shape
68 : : {
69 : : public:
70 : : /** Create the background shape.
71 : :
72 : : This method creates a shape that handles the
73 : : peculiarities of the draw API regarding background
74 : : content.
75 : : */
76 : : BackgroundShape( const ::com::sun::star::uno::Reference<
77 : : ::com::sun::star::drawing::XDrawPage >& xDrawPage,
78 : : const ::com::sun::star::uno::Reference<
79 : : ::com::sun::star::drawing::XDrawPage >& xMasterPage,
80 : : const SlideShowContext& rContext ); // throw ShapeLoadFailedException;
81 : :
82 : : virtual ::com::sun::star::uno::Reference<
83 : : ::com::sun::star::drawing::XShape > getXShape() const;
84 : :
85 : : // View layer methods
86 : : //------------------------------------------------------------------
87 : :
88 : : virtual void addViewLayer( const ViewLayerSharedPtr& rNewLayer,
89 : : bool bRedrawLayer );
90 : : virtual bool removeViewLayer( const ViewLayerSharedPtr& rNewLayer );
91 : : virtual bool clearAllViewLayers();
92 : :
93 : :
94 : : // attribute methods
95 : : //------------------------------------------------------------------
96 : :
97 : : virtual ::basegfx::B2DRectangle getBounds() const;
98 : : virtual ::basegfx::B2DRectangle getDomBounds() const;
99 : : virtual ::basegfx::B2DRectangle getUpdateArea() const;
100 : : virtual bool isVisible() const;
101 : : virtual double getPriority() const;
102 : : virtual bool isBackgroundDetached() const;
103 : :
104 : :
105 : : // render methods
106 : : //------------------------------------------------------------------
107 : :
108 : : virtual bool update() const;
109 : : virtual bool render() const;
110 : : virtual bool isContentChanged() const;
111 : :
112 : : private:
113 : : /// The metafile actually representing the Shape
114 : : GDIMetaFileSharedPtr mpMtf;
115 : :
116 : : // The attributes of this Shape
117 : : ::basegfx::B2DRectangle maBounds; // always needed for rendering
118 : :
119 : : /// the list of active view shapes (one for each registered view layer)
120 : : typedef ::std::vector< ViewBackgroundShapeSharedPtr > ViewBackgroundShapeVector;
121 : : ViewBackgroundShapeVector maViewShapes;
122 : : };
123 : :
124 : :
125 : : ////////////////////////////////////////////////////////////////////////////////
126 : :
127 : :
128 : 0 : BackgroundShape::BackgroundShape( const uno::Reference< drawing::XDrawPage >& xDrawPage,
129 : : const uno::Reference< drawing::XDrawPage >& xMasterPage,
130 : : const SlideShowContext& rContext ) :
131 : : mpMtf(),
132 : : maBounds(),
133 : 0 : maViewShapes()
134 : : {
135 : : uno::Reference< beans::XPropertySet > xPropSet( xDrawPage,
136 : 0 : uno::UNO_QUERY_THROW );
137 : 0 : GDIMetaFileSharedPtr pMtf( new GDIMetaFile() );
138 : :
139 : : // first try the page background (overrides
140 : : // masterpage background), then try masterpage
141 : 0 : if( !getMetaFile( uno::Reference<lang::XComponent>(xDrawPage, uno::UNO_QUERY),
142 : 0 : xDrawPage, *pMtf, MTF_LOAD_BACKGROUND_ONLY,
143 : 0 : rContext.mxComponentContext ) &&
144 : : !getMetaFile( uno::Reference<lang::XComponent>(xMasterPage, uno::UNO_QUERY),
145 : 0 : xDrawPage, *pMtf, MTF_LOAD_BACKGROUND_ONLY,
146 : 0 : rContext.mxComponentContext ))
147 : : {
148 : 0 : throw ShapeLoadFailedException();
149 : : }
150 : :
151 : : // there is a special background shape, add it
152 : : // as the first one
153 : : // ---------------------------------------------------
154 : :
155 : 0 : sal_Int32 nDocWidth=0;
156 : 0 : sal_Int32 nDocHeight=0;
157 : 0 : xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Width") ) ) >>= nDocWidth;
158 : 0 : xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Height") ) ) >>= nDocHeight;
159 : :
160 : 0 : mpMtf = pMtf;
161 : 0 : maBounds = ::basegfx::B2DRectangle( 0,0,nDocWidth, nDocHeight );
162 : 0 : }
163 : :
164 : 0 : uno::Reference< drawing::XShape > BackgroundShape::getXShape() const
165 : : {
166 : : // no real XShape representative
167 : 0 : return uno::Reference< drawing::XShape >();
168 : : }
169 : :
170 : 0 : void BackgroundShape::addViewLayer( const ViewLayerSharedPtr& rNewLayer,
171 : : bool bRedrawLayer )
172 : : {
173 : 0 : ViewBackgroundShapeVector::iterator aEnd( maViewShapes.end() );
174 : :
175 : : // already added?
176 : 0 : if( ::std::find_if( maViewShapes.begin(),
177 : : aEnd,
178 : : ::boost::bind<bool>(
179 : : ::std::equal_to< ViewLayerSharedPtr >(),
180 : : ::boost::bind( &ViewBackgroundShape::getViewLayer,
181 : : _1 ),
182 : 0 : ::boost::cref( rNewLayer ) ) ) != aEnd )
183 : : {
184 : : // yes, nothing to do
185 : 0 : return;
186 : : }
187 : :
188 : : maViewShapes.push_back(
189 : : ViewBackgroundShapeSharedPtr(
190 : : new ViewBackgroundShape( rNewLayer,
191 : 0 : maBounds ) ) );
192 : :
193 : : // render the Shape on the newly added ViewLayer
194 : 0 : if( bRedrawLayer )
195 : 0 : maViewShapes.back()->render( mpMtf );
196 : : }
197 : :
198 : 0 : bool BackgroundShape::removeViewLayer( const ViewLayerSharedPtr& rLayer )
199 : : {
200 : 0 : const ViewBackgroundShapeVector::iterator aEnd( maViewShapes.end() );
201 : :
202 : : OSL_ENSURE( ::std::count_if(maViewShapes.begin(),
203 : : aEnd,
204 : : ::boost::bind<bool>(
205 : : ::std::equal_to< ViewLayerSharedPtr >(),
206 : : ::boost::bind( &ViewBackgroundShape::getViewLayer,
207 : : _1 ),
208 : : ::boost::cref( rLayer ) ) ) < 2,
209 : : "BackgroundShape::removeViewLayer(): Duplicate ViewLayer entries!" );
210 : :
211 : 0 : ViewBackgroundShapeVector::iterator aIter;
212 : :
213 : 0 : if( (aIter=::std::remove_if( maViewShapes.begin(),
214 : : aEnd,
215 : : ::boost::bind<bool>(
216 : : ::std::equal_to< ViewLayerSharedPtr >(),
217 : : ::boost::bind( &ViewBackgroundShape::getViewLayer,
218 : : _1 ),
219 : 0 : ::boost::cref( rLayer ) ) )) == aEnd )
220 : : {
221 : : // view layer seemingly was not added, failed
222 : 0 : return false;
223 : : }
224 : :
225 : : // actually erase from container
226 : 0 : maViewShapes.erase( aIter, aEnd );
227 : :
228 : 0 : return true;
229 : : }
230 : :
231 : 0 : bool BackgroundShape::clearAllViewLayers()
232 : : {
233 : 0 : maViewShapes.clear();
234 : 0 : return true;
235 : : }
236 : :
237 : 0 : ::basegfx::B2DRectangle BackgroundShape::getBounds() const
238 : : {
239 : 0 : return maBounds;
240 : : }
241 : :
242 : 0 : ::basegfx::B2DRectangle BackgroundShape::getDomBounds() const
243 : : {
244 : 0 : return maBounds;
245 : : }
246 : :
247 : 0 : ::basegfx::B2DRectangle BackgroundShape::getUpdateArea() const
248 : : {
249 : : // TODO(F1): Need to expand background, too, when
250 : : // antialiasing?
251 : :
252 : : // no transformation etc. possible for background shape
253 : 0 : return maBounds;
254 : : }
255 : :
256 : 0 : bool BackgroundShape::isVisible() const
257 : : {
258 : 0 : return true;
259 : : }
260 : :
261 : 0 : double BackgroundShape::getPriority() const
262 : : {
263 : 0 : return 0.0; // lowest prio, we're the background
264 : : }
265 : :
266 : 0 : bool BackgroundShape::update() const
267 : : {
268 : 0 : return render();
269 : : }
270 : :
271 : 0 : bool BackgroundShape::render() const
272 : : {
273 : : RTL_LOGFILE_CONTEXT( aLog, "::presentation::internal::BackgroundShape::render()" );
274 : : RTL_LOGFILE_CONTEXT_TRACE1( aLog, "::presentation::internal::BackgroundShape: 0x%X", this );
275 : :
276 : : // gcc again...
277 : 0 : const ::basegfx::B2DRectangle& rCurrBounds( BackgroundShape::getBounds() );
278 : :
279 : 0 : if( rCurrBounds.getRange().equalZero() )
280 : : {
281 : : // zero-sized shapes are effectively invisible,
282 : : // thus, we save us the rendering...
283 : 0 : return true;
284 : : }
285 : :
286 : : // redraw all view shapes, by calling their render() method
287 : 0 : if( ::std::count_if( maViewShapes.begin(),
288 : : maViewShapes.end(),
289 : : ::boost::bind( &ViewBackgroundShape::render,
290 : : _1,
291 : 0 : ::boost::cref( mpMtf ) ) )
292 : 0 : != static_cast<ViewBackgroundShapeVector::difference_type>(maViewShapes.size()) )
293 : : {
294 : : // at least one of the ViewBackgroundShape::render() calls did return
295 : : // false - update failed on at least one ViewLayer
296 : 0 : return false;
297 : : }
298 : :
299 : 0 : return true;
300 : : }
301 : :
302 : 0 : bool BackgroundShape::isContentChanged() const
303 : : {
304 : 0 : return false;
305 : : }
306 : :
307 : 0 : bool BackgroundShape::isBackgroundDetached() const
308 : : {
309 : 0 : return false; // we're not animatable
310 : : }
311 : :
312 : : //////////////////////////////////////////////////////////
313 : :
314 : 0 : ShapeSharedPtr createBackgroundShape(
315 : : const uno::Reference< drawing::XDrawPage >& xDrawPage,
316 : : const uno::Reference< drawing::XDrawPage >& xMasterPage,
317 : : const SlideShowContext& rContext )
318 : : {
319 : : return ShapeSharedPtr(
320 : : new BackgroundShape(
321 : : xDrawPage,
322 : : xMasterPage,
323 : 0 : rContext ));
324 : : }
325 : : }
326 : 0 : }
327 : :
328 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|