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 // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_slideshow.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski // must be first
28*b1cdbd2cSJim Jagielski #include <canvas/debug.hxx>
29*b1cdbd2cSJim Jagielski #include <vcl/cvtgrf.hxx>
30*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
31*b1cdbd2cSJim Jagielski #include <tools/stream.hxx>
32*b1cdbd2cSJim Jagielski #include <svtools/grfmgr.hxx>
33*b1cdbd2cSJim Jagielski #include <unotools/ucbstreamhelper.hxx>
34*b1cdbd2cSJim Jagielski #include <unotools/streamwrap.hxx>
35*b1cdbd2cSJim Jagielski #include <basegfx/point/b2dpoint.hxx>
36*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygon.hxx>
37*b1cdbd2cSJim Jagielski #include <cppcanvas/basegfxfactory.hxx>
38*b1cdbd2cSJim Jagielski #include <cppcanvas/polypolygon.hxx>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/Rectangle.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/ColorMode.hpp>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/text/GraphicCrop.hpp>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameContainer.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/PointSequenceSequence.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/PointSequence.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiComponentFactory.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XLayerSupplier.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XLayerManager.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameAccess.hpp>
49*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XComponent.hpp>
50*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski #include "drawshapesubsetting.hxx"
53*b1cdbd2cSJim Jagielski #include "drawshape.hxx"
54*b1cdbd2cSJim Jagielski #include "backgroundshape.hxx"
55*b1cdbd2cSJim Jagielski #include "mediashape.hxx"
56*b1cdbd2cSJim Jagielski #include "appletshape.hxx"
57*b1cdbd2cSJim Jagielski #include "shapeimporter.hxx"
58*b1cdbd2cSJim Jagielski #include "slideshowexceptions.hxx"
59*b1cdbd2cSJim Jagielski #include "gdimtftools.hxx"
60*b1cdbd2cSJim Jagielski #include "tools.hxx"
61*b1cdbd2cSJim Jagielski #include "slideshowcontext.hxx"
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski #include <boost/shared_ptr.hpp>
64*b1cdbd2cSJim Jagielski #include <boost/scoped_ptr.hpp>
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski using namespace com::sun::star;
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski namespace slideshow {
69*b1cdbd2cSJim Jagielski namespace internal {
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski namespace {
72*b1cdbd2cSJim Jagielski 
importShapeGraphic(GraphicObject & o_rGraphic,uno::Reference<beans::XPropertySet> const & xPropSet)73*b1cdbd2cSJim Jagielski bool importShapeGraphic(
74*b1cdbd2cSJim Jagielski     GraphicObject & o_rGraphic,
75*b1cdbd2cSJim Jagielski     uno::Reference<beans::XPropertySet> const& xPropSet )
76*b1cdbd2cSJim Jagielski {
77*b1cdbd2cSJim Jagielski     rtl::OUString aURL;
78*b1cdbd2cSJim Jagielski     if( !getPropertyValue( aURL, xPropSet, OUSTR("GraphicURL")) ||
79*b1cdbd2cSJim Jagielski         aURL.getLength() == 0 )
80*b1cdbd2cSJim Jagielski     {
81*b1cdbd2cSJim Jagielski         // no or empty property - cannot import shape graphic
82*b1cdbd2cSJim Jagielski         return false;
83*b1cdbd2cSJim Jagielski     }
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski     rtl::OUString const aVndUrl(
86*b1cdbd2cSJim Jagielski         RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.GraphicObject:" ) );
87*b1cdbd2cSJim Jagielski     sal_Int32 nIndex( aURL.indexOf( aVndUrl ) );
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski     if(nIndex != -1)
90*b1cdbd2cSJim Jagielski     {
91*b1cdbd2cSJim Jagielski         // skip past the end of the "vnd..." prefix
92*b1cdbd2cSJim Jagielski         nIndex += aVndUrl.getLength();
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski         if(nIndex >= aURL.getLength())
95*b1cdbd2cSJim Jagielski         {
96*b1cdbd2cSJim Jagielski             OSL_ENSURE( false, "ShapeImporter::importShape(): "
97*b1cdbd2cSJim Jagielski                         "embedded graphic has no graphic ID" );
98*b1cdbd2cSJim Jagielski             return false;
99*b1cdbd2cSJim Jagielski         }
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski         // unique ID string found in URL, extract
102*b1cdbd2cSJim Jagielski         // to separate string
103*b1cdbd2cSJim Jagielski         rtl::OUString const aUniqueId(
104*b1cdbd2cSJim Jagielski             aURL.copy( nIndex, aURL.getLength() - nIndex ) );
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski         // TODO(T2): Creating a GraphicObject is not
107*b1cdbd2cSJim Jagielski         // thread safe (internally calls VCL, and has
108*b1cdbd2cSJim Jagielski         // unguarded internal singleton mpGlobalMgr)
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski         // fetch already loaded graphic from graphic manager.
111*b1cdbd2cSJim Jagielski         ByteString const aOldString( static_cast<String>(aUniqueId),
112*b1cdbd2cSJim Jagielski                                      RTL_TEXTENCODING_UTF8 );
113*b1cdbd2cSJim Jagielski         o_rGraphic = GraphicObject( aOldString );
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski         if( GRAPHIC_DEFAULT == o_rGraphic.GetType()
117*b1cdbd2cSJim Jagielski             || GRAPHIC_NONE == o_rGraphic.GetType() )
118*b1cdbd2cSJim Jagielski         {
119*b1cdbd2cSJim Jagielski             // even the GrfMgr does not seem to know this graphic
120*b1cdbd2cSJim Jagielski             return false;
121*b1cdbd2cSJim Jagielski         }
122*b1cdbd2cSJim Jagielski     }
123*b1cdbd2cSJim Jagielski     else
124*b1cdbd2cSJim Jagielski     {
125*b1cdbd2cSJim Jagielski         // no special string found, graphic must be
126*b1cdbd2cSJim Jagielski         // external. Load via GraphicIm porter
127*b1cdbd2cSJim Jagielski         INetURLObject aTmp( aURL );
128*b1cdbd2cSJim Jagielski         boost::scoped_ptr<SvStream> pGraphicStream(
129*b1cdbd2cSJim Jagielski             utl::UcbStreamHelper::CreateStream(
130*b1cdbd2cSJim Jagielski                 aTmp.GetMainURL( INetURLObject::NO_DECODE ),
131*b1cdbd2cSJim Jagielski                 STREAM_READ ) );
132*b1cdbd2cSJim Jagielski         if( !pGraphicStream )
133*b1cdbd2cSJim Jagielski         {
134*b1cdbd2cSJim Jagielski             OSL_ENSURE( false, "ShapeImporter::importShape(): "
135*b1cdbd2cSJim Jagielski                         "cannot create input stream for graphic" );
136*b1cdbd2cSJim Jagielski             return false;
137*b1cdbd2cSJim Jagielski         }
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski         Graphic aTmpGraphic;
140*b1cdbd2cSJim Jagielski         if( GraphicConverter::Import(
141*b1cdbd2cSJim Jagielski                 *pGraphicStream, aTmpGraphic ) != ERRCODE_NONE )
142*b1cdbd2cSJim Jagielski         {
143*b1cdbd2cSJim Jagielski             OSL_ENSURE( false, "ShapeImporter::importShape(): "
144*b1cdbd2cSJim Jagielski                         "Failed to import shape graphic from given URL" );
145*b1cdbd2cSJim Jagielski             return false;
146*b1cdbd2cSJim Jagielski         }
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski         o_rGraphic = GraphicObject( aTmpGraphic );
149*b1cdbd2cSJim Jagielski     }
150*b1cdbd2cSJim Jagielski     return true;
151*b1cdbd2cSJim Jagielski }
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski /** This shape implementation just acts as a dummy for the layermanager.
154*b1cdbd2cSJim Jagielski     Its sole role is for hit test detection of group shapes.
155*b1cdbd2cSJim Jagielski */
156*b1cdbd2cSJim Jagielski class ShapeOfGroup : public Shape
157*b1cdbd2cSJim Jagielski {
158*b1cdbd2cSJim Jagielski public:
159*b1cdbd2cSJim Jagielski     ShapeOfGroup( ShapeSharedPtr const&                      pGroupShape,
160*b1cdbd2cSJim Jagielski                   uno::Reference<drawing::XShape> const&     xShape,
161*b1cdbd2cSJim Jagielski                   uno::Reference<beans::XPropertySet> const& xPropSet,
162*b1cdbd2cSJim Jagielski                   double                                     nPrio );
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski     // Shape:
165*b1cdbd2cSJim Jagielski     virtual uno::Reference<drawing::XShape> getXShape() const;
166*b1cdbd2cSJim Jagielski     virtual void addViewLayer( ViewLayerSharedPtr const& pNewLayer,
167*b1cdbd2cSJim Jagielski                                bool                      bRedrawLayer );
168*b1cdbd2cSJim Jagielski     virtual bool removeViewLayer( ViewLayerSharedPtr const& pNewLayer );
169*b1cdbd2cSJim Jagielski     virtual bool clearAllViewLayers();
170*b1cdbd2cSJim Jagielski     virtual bool update() const;
171*b1cdbd2cSJim Jagielski     virtual bool render() const;
172*b1cdbd2cSJim Jagielski     virtual bool isContentChanged() const;
173*b1cdbd2cSJim Jagielski     virtual basegfx::B2DRectangle getBounds() const;
174*b1cdbd2cSJim Jagielski     virtual basegfx::B2DRectangle getDomBounds() const;
175*b1cdbd2cSJim Jagielski     virtual basegfx::B2DRectangle getUpdateArea() const;
176*b1cdbd2cSJim Jagielski     virtual bool isVisible() const;
177*b1cdbd2cSJim Jagielski     virtual double getPriority() const;
178*b1cdbd2cSJim Jagielski     virtual bool isBackgroundDetached() const;
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski private:
181*b1cdbd2cSJim Jagielski     ShapeSharedPtr const                  mpGroupShape;
182*b1cdbd2cSJim Jagielski     uno::Reference<drawing::XShape> const mxShape;
183*b1cdbd2cSJim Jagielski     double const                          mnPrio;
184*b1cdbd2cSJim Jagielski     basegfx::B2DPoint                     maPosOffset;
185*b1cdbd2cSJim Jagielski     double                                mnWidth;
186*b1cdbd2cSJim Jagielski     double                                mnHeight;
187*b1cdbd2cSJim Jagielski };
188*b1cdbd2cSJim Jagielski 
ShapeOfGroup(ShapeSharedPtr const & pGroupShape,uno::Reference<drawing::XShape> const & xShape,uno::Reference<beans::XPropertySet> const & xPropSet,double nPrio)189*b1cdbd2cSJim Jagielski ShapeOfGroup::ShapeOfGroup( ShapeSharedPtr const&                      pGroupShape,
190*b1cdbd2cSJim Jagielski                             uno::Reference<drawing::XShape> const&     xShape,
191*b1cdbd2cSJim Jagielski                             uno::Reference<beans::XPropertySet> const& xPropSet,
192*b1cdbd2cSJim Jagielski                             double                                     nPrio ) :
193*b1cdbd2cSJim Jagielski     mpGroupShape(pGroupShape),
194*b1cdbd2cSJim Jagielski     mxShape(xShape),
195*b1cdbd2cSJim Jagielski     mnPrio(nPrio)
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski     // read bound rect
198*b1cdbd2cSJim Jagielski     uno::Any const aTmpRect_( xPropSet->getPropertyValue( OUSTR("BoundRect") ));
199*b1cdbd2cSJim Jagielski     awt::Rectangle const aTmpRect( aTmpRect_.get<awt::Rectangle>() );
200*b1cdbd2cSJim Jagielski     basegfx::B2DRectangle const groupPosSize( pGroupShape->getBounds() );
201*b1cdbd2cSJim Jagielski     maPosOffset = basegfx::B2DPoint( aTmpRect.X - groupPosSize.getMinX(),
202*b1cdbd2cSJim Jagielski                                      aTmpRect.Y - groupPosSize.getMinY() );
203*b1cdbd2cSJim Jagielski     mnWidth = aTmpRect.Width;
204*b1cdbd2cSJim Jagielski     mnHeight = aTmpRect.Height;
205*b1cdbd2cSJim Jagielski }
206*b1cdbd2cSJim Jagielski 
getXShape() const207*b1cdbd2cSJim Jagielski uno::Reference<drawing::XShape> ShapeOfGroup::getXShape() const
208*b1cdbd2cSJim Jagielski {
209*b1cdbd2cSJim Jagielski     return mxShape;
210*b1cdbd2cSJim Jagielski }
211*b1cdbd2cSJim Jagielski 
addViewLayer(ViewLayerSharedPtr const &,bool)212*b1cdbd2cSJim Jagielski void ShapeOfGroup::addViewLayer( ViewLayerSharedPtr const& /*pNewLayer*/,
213*b1cdbd2cSJim Jagielski                                  bool                      /*bRedrawLayer*/ )
214*b1cdbd2cSJim Jagielski {
215*b1cdbd2cSJim Jagielski }
216*b1cdbd2cSJim Jagielski 
removeViewLayer(ViewLayerSharedPtr const &)217*b1cdbd2cSJim Jagielski bool ShapeOfGroup::removeViewLayer( ViewLayerSharedPtr const& /*pNewLayer*/ )
218*b1cdbd2cSJim Jagielski {
219*b1cdbd2cSJim Jagielski     return true;
220*b1cdbd2cSJim Jagielski }
221*b1cdbd2cSJim Jagielski 
clearAllViewLayers()222*b1cdbd2cSJim Jagielski bool ShapeOfGroup::clearAllViewLayers()
223*b1cdbd2cSJim Jagielski {
224*b1cdbd2cSJim Jagielski     return true;
225*b1cdbd2cSJim Jagielski }
226*b1cdbd2cSJim Jagielski 
update() const227*b1cdbd2cSJim Jagielski bool ShapeOfGroup::update() const
228*b1cdbd2cSJim Jagielski {
229*b1cdbd2cSJim Jagielski     return true;
230*b1cdbd2cSJim Jagielski }
231*b1cdbd2cSJim Jagielski 
render() const232*b1cdbd2cSJim Jagielski bool ShapeOfGroup::render() const
233*b1cdbd2cSJim Jagielski {
234*b1cdbd2cSJim Jagielski     return true;
235*b1cdbd2cSJim Jagielski }
236*b1cdbd2cSJim Jagielski 
isContentChanged() const237*b1cdbd2cSJim Jagielski bool ShapeOfGroup::isContentChanged() const
238*b1cdbd2cSJim Jagielski {
239*b1cdbd2cSJim Jagielski     return false;
240*b1cdbd2cSJim Jagielski }
241*b1cdbd2cSJim Jagielski 
getBounds() const242*b1cdbd2cSJim Jagielski basegfx::B2DRectangle ShapeOfGroup::getBounds() const
243*b1cdbd2cSJim Jagielski {
244*b1cdbd2cSJim Jagielski     basegfx::B2DRectangle const groupPosSize( mpGroupShape->getBounds() );
245*b1cdbd2cSJim Jagielski     double const posX = (groupPosSize.getMinX() + maPosOffset.getX());
246*b1cdbd2cSJim Jagielski     double const posY = (groupPosSize.getMinY() + maPosOffset.getY());
247*b1cdbd2cSJim Jagielski     return basegfx::B2DRectangle( posX, posY, posX + mnWidth, posY + mnHeight );
248*b1cdbd2cSJim Jagielski }
249*b1cdbd2cSJim Jagielski 
getDomBounds() const250*b1cdbd2cSJim Jagielski basegfx::B2DRectangle ShapeOfGroup::getDomBounds() const
251*b1cdbd2cSJim Jagielski {
252*b1cdbd2cSJim Jagielski     return getBounds();
253*b1cdbd2cSJim Jagielski }
254*b1cdbd2cSJim Jagielski 
getUpdateArea() const255*b1cdbd2cSJim Jagielski basegfx::B2DRectangle ShapeOfGroup::getUpdateArea() const
256*b1cdbd2cSJim Jagielski {
257*b1cdbd2cSJim Jagielski     return getBounds();
258*b1cdbd2cSJim Jagielski }
259*b1cdbd2cSJim Jagielski 
isVisible() const260*b1cdbd2cSJim Jagielski bool ShapeOfGroup::isVisible() const
261*b1cdbd2cSJim Jagielski {
262*b1cdbd2cSJim Jagielski     return mpGroupShape->isVisible();
263*b1cdbd2cSJim Jagielski }
264*b1cdbd2cSJim Jagielski 
getPriority() const265*b1cdbd2cSJim Jagielski double ShapeOfGroup::getPriority() const
266*b1cdbd2cSJim Jagielski {
267*b1cdbd2cSJim Jagielski     return mnPrio;
268*b1cdbd2cSJim Jagielski }
269*b1cdbd2cSJim Jagielski 
isBackgroundDetached() const270*b1cdbd2cSJim Jagielski bool ShapeOfGroup::isBackgroundDetached() const
271*b1cdbd2cSJim Jagielski {
272*b1cdbd2cSJim Jagielski     return false;
273*b1cdbd2cSJim Jagielski }
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski } // anon namespace
276*b1cdbd2cSJim Jagielski 
createShape(uno::Reference<drawing::XShape> const & xCurrShape,uno::Reference<beans::XPropertySet> const & xPropSet,rtl::OUString const & shapeType) const277*b1cdbd2cSJim Jagielski ShapeSharedPtr ShapeImporter::createShape(
278*b1cdbd2cSJim Jagielski     uno::Reference<drawing::XShape> const& xCurrShape,
279*b1cdbd2cSJim Jagielski     uno::Reference<beans::XPropertySet> const& xPropSet,
280*b1cdbd2cSJim Jagielski     rtl::OUString const& shapeType ) const
281*b1cdbd2cSJim Jagielski {
282*b1cdbd2cSJim Jagielski     if( shapeType.equalsAsciiL(
283*b1cdbd2cSJim Jagielski             RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.MediaShape") ) ||
284*b1cdbd2cSJim Jagielski 		shapeType.equalsAsciiL(
285*b1cdbd2cSJim Jagielski             RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation.MediaShape") ) )
286*b1cdbd2cSJim Jagielski     {
287*b1cdbd2cSJim Jagielski         // Media shape (video etc.). This is a special object
288*b1cdbd2cSJim Jagielski         return createMediaShape(xCurrShape,
289*b1cdbd2cSJim Jagielski                                 mnAscendingPrio,
290*b1cdbd2cSJim Jagielski                                 mrContext);
291*b1cdbd2cSJim Jagielski     }
292*b1cdbd2cSJim Jagielski     else if( shapeType.equalsAsciiL(
293*b1cdbd2cSJim Jagielski                  RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.PluginShape") ))
294*b1cdbd2cSJim Jagielski     {
295*b1cdbd2cSJim Jagielski         // PropertyValues to copy from XShape to plugin
296*b1cdbd2cSJim Jagielski         static const char* aPropertyValues[] =
297*b1cdbd2cSJim Jagielski             {
298*b1cdbd2cSJim Jagielski                 "PluginURL",
299*b1cdbd2cSJim Jagielski                 "PluginMimeType",
300*b1cdbd2cSJim Jagielski                 "PluginCommands"
301*b1cdbd2cSJim Jagielski             };
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski         // (Netscape)Plugin shape. This is a special object
304*b1cdbd2cSJim Jagielski         return createAppletShape( xCurrShape,
305*b1cdbd2cSJim Jagielski                                   mnAscendingPrio,
306*b1cdbd2cSJim Jagielski                                   ::rtl::OUString(
307*b1cdbd2cSJim Jagielski                                       RTL_CONSTASCII_USTRINGPARAM(
308*b1cdbd2cSJim Jagielski                                           "com.sun.star.comp.sfx2.PluginObject" )),
309*b1cdbd2cSJim Jagielski                                   aPropertyValues,
310*b1cdbd2cSJim Jagielski                                   sizeof(aPropertyValues)/sizeof(*aPropertyValues),
311*b1cdbd2cSJim Jagielski                                   mrContext );
312*b1cdbd2cSJim Jagielski     }
313*b1cdbd2cSJim Jagielski     else if( shapeType.equalsAsciiL(
314*b1cdbd2cSJim Jagielski                  RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.AppletShape") ))
315*b1cdbd2cSJim Jagielski     {
316*b1cdbd2cSJim Jagielski         // PropertyValues to copy from XShape to applet
317*b1cdbd2cSJim Jagielski         static const char* aPropertyValues[] =
318*b1cdbd2cSJim Jagielski             {
319*b1cdbd2cSJim Jagielski                 "AppletCodeBase",
320*b1cdbd2cSJim Jagielski                 "AppletName",
321*b1cdbd2cSJim Jagielski                 "AppletCode",
322*b1cdbd2cSJim Jagielski                 "AppletCommands",
323*b1cdbd2cSJim Jagielski                 "AppletIsScript"
324*b1cdbd2cSJim Jagielski             };
325*b1cdbd2cSJim Jagielski 
326*b1cdbd2cSJim Jagielski         // (Java)Applet shape. This is a special object
327*b1cdbd2cSJim Jagielski         return createAppletShape( xCurrShape,
328*b1cdbd2cSJim Jagielski                                   mnAscendingPrio,
329*b1cdbd2cSJim Jagielski                                   ::rtl::OUString(
330*b1cdbd2cSJim Jagielski                                       RTL_CONSTASCII_USTRINGPARAM(
331*b1cdbd2cSJim Jagielski                                           "com.sun.star.comp.sfx2.AppletObject" )),
332*b1cdbd2cSJim Jagielski                                   aPropertyValues,
333*b1cdbd2cSJim Jagielski                                   sizeof(aPropertyValues)/sizeof(*aPropertyValues),
334*b1cdbd2cSJim Jagielski                                   mrContext );
335*b1cdbd2cSJim Jagielski     }
336*b1cdbd2cSJim Jagielski     else if( shapeType.equalsAsciiL(
337*b1cdbd2cSJim Jagielski                  RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.OLE2Shape") ) ||
338*b1cdbd2cSJim Jagielski              shapeType.equalsAsciiL(
339*b1cdbd2cSJim Jagielski 				RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation.OLE2Shape") ) )
340*b1cdbd2cSJim Jagielski     {
341*b1cdbd2cSJim Jagielski         // #i46224# Mark OLE shapes as foreign content - scan them for
342*b1cdbd2cSJim Jagielski         // unsupported actions, and fallback to bitmap, if necessary
343*b1cdbd2cSJim Jagielski         return DrawShape::create( xCurrShape,
344*b1cdbd2cSJim Jagielski                                   mxPage,
345*b1cdbd2cSJim Jagielski                                   mnAscendingPrio,
346*b1cdbd2cSJim Jagielski                                   true,
347*b1cdbd2cSJim Jagielski                                   mrContext );
348*b1cdbd2cSJim Jagielski     }
349*b1cdbd2cSJim Jagielski     else if( shapeType.equalsAsciiL(
350*b1cdbd2cSJim Jagielski                  RTL_CONSTASCII_STRINGPARAM(
351*b1cdbd2cSJim Jagielski                      "com.sun.star.drawing.GraphicObjectShape") ) ||
352*b1cdbd2cSJim Jagielski 			 shapeType.equalsAsciiL(
353*b1cdbd2cSJim Jagielski                  RTL_CONSTASCII_STRINGPARAM(
354*b1cdbd2cSJim Jagielski                      "com.sun.star.presentation.GraphicObjectShape") ) )
355*b1cdbd2cSJim Jagielski     {
356*b1cdbd2cSJim Jagielski         GraphicObject aGraphicObject;
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski         // to get hold of GIF animations, inspect Graphic
359*b1cdbd2cSJim Jagielski         // objects more thoroughly (the plain-jane shape
360*b1cdbd2cSJim Jagielski         // metafile of course would only contain the first
361*b1cdbd2cSJim Jagielski         // animation frame)
362*b1cdbd2cSJim Jagielski         if( !importShapeGraphic( aGraphicObject, xPropSet ) )
363*b1cdbd2cSJim Jagielski             return ShapeSharedPtr(); // error loading graphic -
364*b1cdbd2cSJim Jagielski                                      // #142147# no placeholders in
365*b1cdbd2cSJim Jagielski                                      // slideshow
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski         if( !aGraphicObject.IsAnimated() )
368*b1cdbd2cSJim Jagielski         {
369*b1cdbd2cSJim Jagielski             // no animation - simply utilize plain draw shape import
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski             // import shape as bitmap - either its a bitmap
372*b1cdbd2cSJim Jagielski             // anyway, or its a metafile, which currently the
373*b1cdbd2cSJim Jagielski             // metafile renderer might not display correctly.
374*b1cdbd2cSJim Jagielski             return DrawShape::create( xCurrShape,
375*b1cdbd2cSJim Jagielski                                       mxPage,
376*b1cdbd2cSJim Jagielski                                       mnAscendingPrio,
377*b1cdbd2cSJim Jagielski                                       true,
378*b1cdbd2cSJim Jagielski                                       mrContext );
379*b1cdbd2cSJim Jagielski         }
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski         // now extract relevant shape attributes via API
383*b1cdbd2cSJim Jagielski         // ---------------------------------------------
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski         drawing::ColorMode eColorMode( drawing::ColorMode_STANDARD );
386*b1cdbd2cSJim Jagielski         sal_Int16 nLuminance(0);
387*b1cdbd2cSJim Jagielski         sal_Int16 nContrast(0);
388*b1cdbd2cSJim Jagielski         sal_Int16 nRed(0);
389*b1cdbd2cSJim Jagielski         sal_Int16 nGreen(0);
390*b1cdbd2cSJim Jagielski         sal_Int16 nBlue(0);
391*b1cdbd2cSJim Jagielski         double    nGamma(1.0);
392*b1cdbd2cSJim Jagielski         sal_Int16 nTransparency(0);
393*b1cdbd2cSJim Jagielski         sal_Int32 nRotation(0);
394*b1cdbd2cSJim Jagielski 
395*b1cdbd2cSJim Jagielski         getPropertyValue( eColorMode, xPropSet, OUSTR("GraphicColorMode") );
396*b1cdbd2cSJim Jagielski         getPropertyValue( nLuminance, xPropSet, OUSTR("AdjustLuminance") );
397*b1cdbd2cSJim Jagielski         getPropertyValue( nContrast, xPropSet, OUSTR("AdjustContrast") );
398*b1cdbd2cSJim Jagielski         getPropertyValue( nRed, xPropSet, OUSTR("AdjustRed") );
399*b1cdbd2cSJim Jagielski         getPropertyValue( nGreen, xPropSet, OUSTR("AdjustGreen") );
400*b1cdbd2cSJim Jagielski         getPropertyValue( nBlue, xPropSet, OUSTR("AdjustBlue") );
401*b1cdbd2cSJim Jagielski         getPropertyValue( nGamma, xPropSet, OUSTR("Gamma") );
402*b1cdbd2cSJim Jagielski         getPropertyValue( nTransparency, xPropSet, OUSTR("Transparency") );
403*b1cdbd2cSJim Jagielski         getPropertyValue( nRotation, xPropSet, OUSTR("RotateAngle") );
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski         GraphicAttr aGraphAttrs;
406*b1cdbd2cSJim Jagielski         aGraphAttrs.SetDrawMode( (GraphicDrawMode)eColorMode );
407*b1cdbd2cSJim Jagielski         aGraphAttrs.SetLuminance( nLuminance );
408*b1cdbd2cSJim Jagielski         aGraphAttrs.SetContrast( nContrast );
409*b1cdbd2cSJim Jagielski         aGraphAttrs.SetChannelR( nRed );
410*b1cdbd2cSJim Jagielski         aGraphAttrs.SetChannelG( nGreen );
411*b1cdbd2cSJim Jagielski         aGraphAttrs.SetChannelB( nBlue );
412*b1cdbd2cSJim Jagielski         aGraphAttrs.SetGamma( nGamma );
413*b1cdbd2cSJim Jagielski         aGraphAttrs.SetTransparency( static_cast<sal_uInt8>(nTransparency) );
414*b1cdbd2cSJim Jagielski         aGraphAttrs.SetRotation( static_cast<sal_uInt16>(nRotation*10) );
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski         text::GraphicCrop aGraphCrop;
417*b1cdbd2cSJim Jagielski         if( getPropertyValue( aGraphCrop, xPropSet, OUSTR("GraphicCrop") ))
418*b1cdbd2cSJim Jagielski         {
419*b1cdbd2cSJim Jagielski             aGraphAttrs.SetCrop( aGraphCrop.Left,
420*b1cdbd2cSJim Jagielski                                  aGraphCrop.Top,
421*b1cdbd2cSJim Jagielski                                  aGraphCrop.Right,
422*b1cdbd2cSJim Jagielski                                  aGraphCrop.Bottom );
423*b1cdbd2cSJim Jagielski         }
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski         // fetch readily transformed and color-modified
426*b1cdbd2cSJim Jagielski         // graphic
427*b1cdbd2cSJim Jagielski         // ---------------------------------------------
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski         Graphic aGraphic(
430*b1cdbd2cSJim Jagielski             aGraphicObject.GetTransformedGraphic(
431*b1cdbd2cSJim Jagielski                 aGraphicObject.GetPrefSize(),
432*b1cdbd2cSJim Jagielski                 aGraphicObject.GetPrefMapMode(),
433*b1cdbd2cSJim Jagielski                 aGraphAttrs ) );
434*b1cdbd2cSJim Jagielski 
435*b1cdbd2cSJim Jagielski         return DrawShape::create( xCurrShape,
436*b1cdbd2cSJim Jagielski                                   mxPage,
437*b1cdbd2cSJim Jagielski                                   mnAscendingPrio,
438*b1cdbd2cSJim Jagielski                                   aGraphic,
439*b1cdbd2cSJim Jagielski                                   mrContext );
440*b1cdbd2cSJim Jagielski     }
441*b1cdbd2cSJim Jagielski     else
442*b1cdbd2cSJim Jagielski     {
443*b1cdbd2cSJim Jagielski         return DrawShape::create( xCurrShape,
444*b1cdbd2cSJim Jagielski                                   mxPage,
445*b1cdbd2cSJim Jagielski                                   mnAscendingPrio,
446*b1cdbd2cSJim Jagielski                                   false,
447*b1cdbd2cSJim Jagielski                                   mrContext );
448*b1cdbd2cSJim Jagielski     }
449*b1cdbd2cSJim Jagielski }
450*b1cdbd2cSJim Jagielski 
isSkip(uno::Reference<beans::XPropertySet> const & xPropSet,rtl::OUString const & shapeType,uno::Reference<drawing::XLayer> const & xLayer)451*b1cdbd2cSJim Jagielski bool ShapeImporter::isSkip(
452*b1cdbd2cSJim Jagielski     uno::Reference<beans::XPropertySet> const& xPropSet,
453*b1cdbd2cSJim Jagielski     rtl::OUString const& shapeType,
454*b1cdbd2cSJim Jagielski     uno::Reference< drawing::XLayer> const& xLayer )
455*b1cdbd2cSJim Jagielski {
456*b1cdbd2cSJim Jagielski     // skip empty presentation objects:
457*b1cdbd2cSJim Jagielski     bool bEmpty = false;
458*b1cdbd2cSJim Jagielski     if( getPropertyValue( bEmpty,
459*b1cdbd2cSJim Jagielski                           xPropSet,
460*b1cdbd2cSJim Jagielski                           OUSTR("IsEmptyPresentationObject")) &&
461*b1cdbd2cSJim Jagielski         bEmpty )
462*b1cdbd2cSJim Jagielski     {
463*b1cdbd2cSJim Jagielski         return true;
464*b1cdbd2cSJim Jagielski     }
465*b1cdbd2cSJim Jagielski 
466*b1cdbd2cSJim Jagielski     //skip shapes which corresponds to annotations
467*b1cdbd2cSJim Jagielski     if(xLayer.is())
468*b1cdbd2cSJim Jagielski     {
469*b1cdbd2cSJim Jagielski         rtl::OUString layerName;
470*b1cdbd2cSJim Jagielski         uno::Reference<beans::XPropertySet> xPropLayerSet(
471*b1cdbd2cSJim Jagielski                                                           xLayer, uno::UNO_QUERY );
472*b1cdbd2cSJim Jagielski         const uno::Any& a(xPropLayerSet->getPropertyValue(rtl::OUString::createFromAscii("Name")) );
473*b1cdbd2cSJim Jagielski         bool const bRet = (a >>= layerName);
474*b1cdbd2cSJim Jagielski         if(bRet)
475*b1cdbd2cSJim Jagielski         {
476*b1cdbd2cSJim Jagielski             if( layerName.equals(rtl::OUString::createFromAscii("DrawnInSlideshow")))
477*b1cdbd2cSJim Jagielski             {
478*b1cdbd2cSJim Jagielski                 //Transform shapes into PolyPolygons
479*b1cdbd2cSJim Jagielski                 importPolygons(xPropSet);
480*b1cdbd2cSJim Jagielski 
481*b1cdbd2cSJim Jagielski                 return true;
482*b1cdbd2cSJim Jagielski             }
483*b1cdbd2cSJim Jagielski         }
484*b1cdbd2cSJim Jagielski     }
485*b1cdbd2cSJim Jagielski 
486*b1cdbd2cSJim Jagielski     // don't export presentation placeholders on masterpage
487*b1cdbd2cSJim Jagielski     // they can be non empty when user edits the default texts
488*b1cdbd2cSJim Jagielski     if(mbConvertingMasterPage)
489*b1cdbd2cSJim Jagielski     {
490*b1cdbd2cSJim Jagielski         if(shapeType.equalsAsciiL(
491*b1cdbd2cSJim Jagielski                 RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation."
492*b1cdbd2cSJim Jagielski                                            "TitleTextShape") ) ||
493*b1cdbd2cSJim Jagielski             shapeType.equalsAsciiL(
494*b1cdbd2cSJim Jagielski                 RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation."
495*b1cdbd2cSJim Jagielski                                            "OutlinerShape") ))
496*b1cdbd2cSJim Jagielski         {
497*b1cdbd2cSJim Jagielski             return true;
498*b1cdbd2cSJim Jagielski         }
499*b1cdbd2cSJim Jagielski     }
500*b1cdbd2cSJim Jagielski     return false;
501*b1cdbd2cSJim Jagielski }
502*b1cdbd2cSJim Jagielski 
503*b1cdbd2cSJim Jagielski 
importPolygons(uno::Reference<beans::XPropertySet> const & xPropSet)504*b1cdbd2cSJim Jagielski void ShapeImporter::importPolygons(uno::Reference<beans::XPropertySet> const& xPropSet) {
505*b1cdbd2cSJim Jagielski 
506*b1cdbd2cSJim Jagielski     drawing::PointSequenceSequence aRetval;
507*b1cdbd2cSJim Jagielski     sal_Int32			nLineColor=0;
508*b1cdbd2cSJim Jagielski     double				fLineWidth;
509*b1cdbd2cSJim Jagielski     getPropertyValue( aRetval, xPropSet, OUSTR("PolyPolygon") );
510*b1cdbd2cSJim Jagielski     getPropertyValue( nLineColor, xPropSet, OUSTR("LineColor") );
511*b1cdbd2cSJim Jagielski     getPropertyValue( fLineWidth, xPropSet, OUSTR("LineWidth") );
512*b1cdbd2cSJim Jagielski 
513*b1cdbd2cSJim Jagielski 	drawing::PointSequence* pOuterSequence = aRetval.getArray();
514*b1cdbd2cSJim Jagielski 	awt::Point* pInnerSequence = pOuterSequence->getArray();
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski 	::basegfx::B2DPolygon aPoly;
517*b1cdbd2cSJim Jagielski     basegfx::B2DPoint aPoint;
518*b1cdbd2cSJim Jagielski     for( sal_Int32 nCurrPoly=0; nCurrPoly<pOuterSequence->getLength(); ++nCurrPoly, ++pInnerSequence )
519*b1cdbd2cSJim Jagielski     {
520*b1cdbd2cSJim Jagielski         aPoint.setX((*pInnerSequence).X);
521*b1cdbd2cSJim Jagielski         aPoint.setY((*pInnerSequence).Y);
522*b1cdbd2cSJim Jagielski         aPoly.append( aPoint );
523*b1cdbd2cSJim Jagielski     }
524*b1cdbd2cSJim Jagielski     UnoViewVector::const_iterator aIter=(mrContext.mrViewContainer).begin();
525*b1cdbd2cSJim Jagielski     UnoViewVector::const_iterator aEnd=(mrContext.mrViewContainer).end();
526*b1cdbd2cSJim Jagielski     while(aIter != aEnd)
527*b1cdbd2cSJim Jagielski     {
528*b1cdbd2cSJim Jagielski         ::cppcanvas::PolyPolygonSharedPtr pPolyPoly(
529*b1cdbd2cSJim Jagielski             ::cppcanvas::BaseGfxFactory::getInstance().createPolyPolygon( (*aIter)->getCanvas(),
530*b1cdbd2cSJim Jagielski                                                                           aPoly ) );
531*b1cdbd2cSJim Jagielski         if( pPolyPoly )
532*b1cdbd2cSJim Jagielski         {
533*b1cdbd2cSJim Jagielski                 pPolyPoly->setRGBALineColor( unoColor2RGBColor( nLineColor ).getIntegerColor() );
534*b1cdbd2cSJim Jagielski                 pPolyPoly->setStrokeWidth(fLineWidth);
535*b1cdbd2cSJim Jagielski                 pPolyPoly->draw();
536*b1cdbd2cSJim Jagielski                 maPolygons.push_back(pPolyPoly);
537*b1cdbd2cSJim Jagielski         }
538*b1cdbd2cSJim Jagielski         aIter++;
539*b1cdbd2cSJim Jagielski     }
540*b1cdbd2cSJim Jagielski }
541*b1cdbd2cSJim Jagielski 
importBackgroundShape()542*b1cdbd2cSJim Jagielski ShapeSharedPtr ShapeImporter::importBackgroundShape() // throw (ShapeLoadFailedException)
543*b1cdbd2cSJim Jagielski {
544*b1cdbd2cSJim Jagielski     if( maShapesStack.empty() )
545*b1cdbd2cSJim Jagielski         throw ShapeLoadFailedException();
546*b1cdbd2cSJim Jagielski 
547*b1cdbd2cSJim Jagielski     XShapesEntry& rTop = maShapesStack.top();
548*b1cdbd2cSJim Jagielski     ShapeSharedPtr pBgShape(
549*b1cdbd2cSJim Jagielski         createBackgroundShape(mxPage,
550*b1cdbd2cSJim Jagielski                               uno::Reference<drawing::XDrawPage>(
551*b1cdbd2cSJim Jagielski                                   rTop.mxShapes,
552*b1cdbd2cSJim Jagielski                                   uno::UNO_QUERY_THROW),
553*b1cdbd2cSJim Jagielski                               mrContext) );
554*b1cdbd2cSJim Jagielski     mnAscendingPrio += 1.0;
555*b1cdbd2cSJim Jagielski 
556*b1cdbd2cSJim Jagielski     return pBgShape;
557*b1cdbd2cSJim Jagielski }
558*b1cdbd2cSJim Jagielski 
importShape()559*b1cdbd2cSJim Jagielski ShapeSharedPtr ShapeImporter::importShape() // throw (ShapeLoadFailedException)
560*b1cdbd2cSJim Jagielski {
561*b1cdbd2cSJim Jagielski     ShapeSharedPtr pRet;
562*b1cdbd2cSJim Jagielski     bool bIsGroupShape = false;
563*b1cdbd2cSJim Jagielski 
564*b1cdbd2cSJim Jagielski     while( !maShapesStack.empty() && !pRet )
565*b1cdbd2cSJim Jagielski     {
566*b1cdbd2cSJim Jagielski         XShapesEntry& rTop = maShapesStack.top();
567*b1cdbd2cSJim Jagielski         if( rTop.mnPos < rTop.mnCount )
568*b1cdbd2cSJim Jagielski         {
569*b1cdbd2cSJim Jagielski             uno::Reference<drawing::XShape> const xCurrShape(
570*b1cdbd2cSJim Jagielski                 rTop.mxShapes->getByIndex( rTop.mnPos ), uno::UNO_QUERY );
571*b1cdbd2cSJim Jagielski             ++rTop.mnPos;
572*b1cdbd2cSJim Jagielski             uno::Reference<beans::XPropertySet> xPropSet(
573*b1cdbd2cSJim Jagielski                 xCurrShape, uno::UNO_QUERY );
574*b1cdbd2cSJim Jagielski             if( !xPropSet.is() )
575*b1cdbd2cSJim Jagielski             {
576*b1cdbd2cSJim Jagielski                 // we definitely need the properties of
577*b1cdbd2cSJim Jagielski                 // the shape here. This will also fail,
578*b1cdbd2cSJim Jagielski                 // if getByIndex did not return a valid
579*b1cdbd2cSJim Jagielski                 // shape
580*b1cdbd2cSJim Jagielski                 throw ShapeLoadFailedException();
581*b1cdbd2cSJim Jagielski             }
582*b1cdbd2cSJim Jagielski 
583*b1cdbd2cSJim Jagielski             //Retrieve the layer for the current shape
584*b1cdbd2cSJim Jagielski             uno::Reference< drawing::XLayer > xDrawnInSlideshow;
585*b1cdbd2cSJim Jagielski 
586*b1cdbd2cSJim Jagielski             uno::Reference< drawing::XLayerSupplier > xLayerSupplier(mxPagesSupplier, uno::UNO_QUERY);
587*b1cdbd2cSJim Jagielski 		    if(xLayerSupplier.is())
588*b1cdbd2cSJim Jagielski             {
589*b1cdbd2cSJim Jagielski                 uno::Reference< container::XNameAccess > xNameAccess = xLayerSupplier->getLayerManager();
590*b1cdbd2cSJim Jagielski 
591*b1cdbd2cSJim Jagielski 	    	    uno::Reference< drawing::XLayerManager > xLayerManager(xNameAccess, uno::UNO_QUERY);
592*b1cdbd2cSJim Jagielski 
593*b1cdbd2cSJim Jagielski 		   	    xDrawnInSlideshow = xLayerManager->getLayerForShape(xCurrShape);
594*b1cdbd2cSJim Jagielski 		    }
595*b1cdbd2cSJim Jagielski 
596*b1cdbd2cSJim Jagielski             rtl::OUString const shapeType( xCurrShape->getShapeType());
597*b1cdbd2cSJim Jagielski 
598*b1cdbd2cSJim Jagielski             // is this shape presentation-invisible?
599*b1cdbd2cSJim Jagielski             if( !isSkip(xPropSet, shapeType, xDrawnInSlideshow) )
600*b1cdbd2cSJim Jagielski             {
601*b1cdbd2cSJim Jagielski                 bIsGroupShape = shapeType.equalsAsciiL(
602*b1cdbd2cSJim Jagielski                     RTL_CONSTASCII_STRINGPARAM(
603*b1cdbd2cSJim Jagielski                         "com.sun.star.drawing.GroupShape") );
604*b1cdbd2cSJim Jagielski 
605*b1cdbd2cSJim Jagielski                 if( rTop.mpGroupShape ) // in group particle mode?
606*b1cdbd2cSJim Jagielski                 {
607*b1cdbd2cSJim Jagielski                     pRet.reset( new ShapeOfGroup(
608*b1cdbd2cSJim Jagielski                                     rTop.mpGroupShape /* container shape */,
609*b1cdbd2cSJim Jagielski                                     xCurrShape, xPropSet,
610*b1cdbd2cSJim Jagielski                                     mnAscendingPrio ) );
611*b1cdbd2cSJim Jagielski                 }
612*b1cdbd2cSJim Jagielski                 else
613*b1cdbd2cSJim Jagielski                 {
614*b1cdbd2cSJim Jagielski                     pRet = createShape( xCurrShape, xPropSet, shapeType );
615*b1cdbd2cSJim Jagielski                 }
616*b1cdbd2cSJim Jagielski                 mnAscendingPrio += 1.0;
617*b1cdbd2cSJim Jagielski             }
618*b1cdbd2cSJim Jagielski         }
619*b1cdbd2cSJim Jagielski         if( rTop.mnPos >= rTop.mnCount )
620*b1cdbd2cSJim Jagielski         {
621*b1cdbd2cSJim Jagielski             // group or top-level shapes finished:
622*b1cdbd2cSJim Jagielski             maShapesStack.pop();
623*b1cdbd2cSJim Jagielski         }
624*b1cdbd2cSJim Jagielski         if( bIsGroupShape && pRet )
625*b1cdbd2cSJim Jagielski         {
626*b1cdbd2cSJim Jagielski             // push new group on the stack: group traversal
627*b1cdbd2cSJim Jagielski             maShapesStack.push( XShapesEntry( pRet ) );
628*b1cdbd2cSJim Jagielski         }
629*b1cdbd2cSJim Jagielski     }
630*b1cdbd2cSJim Jagielski 
631*b1cdbd2cSJim Jagielski     return pRet;
632*b1cdbd2cSJim Jagielski }
633*b1cdbd2cSJim Jagielski 
isImportDone() const634*b1cdbd2cSJim Jagielski bool ShapeImporter::isImportDone() const
635*b1cdbd2cSJim Jagielski {
636*b1cdbd2cSJim Jagielski     return maShapesStack.empty();
637*b1cdbd2cSJim Jagielski }
638*b1cdbd2cSJim Jagielski 
getPolygons()639*b1cdbd2cSJim Jagielski PolyPolygonVector ShapeImporter::getPolygons()
640*b1cdbd2cSJim Jagielski {
641*b1cdbd2cSJim Jagielski     return maPolygons;
642*b1cdbd2cSJim Jagielski }
643*b1cdbd2cSJim Jagielski 
ShapeImporter(uno::Reference<drawing::XDrawPage> const & xPage,uno::Reference<drawing::XDrawPage> const & xActualPage,uno::Reference<drawing::XDrawPagesSupplier> const & xPagesSupplier,const SlideShowContext & rContext,sal_Int32 nOrdNumStart,bool bConvertingMasterPage)644*b1cdbd2cSJim Jagielski ShapeImporter::ShapeImporter( uno::Reference<drawing::XDrawPage> const&          xPage,
645*b1cdbd2cSJim Jagielski                               uno::Reference<drawing::XDrawPage> const&          xActualPage,
646*b1cdbd2cSJim Jagielski                               uno::Reference<drawing::XDrawPagesSupplier> const& xPagesSupplier,
647*b1cdbd2cSJim Jagielski                               const SlideShowContext&                            rContext,
648*b1cdbd2cSJim Jagielski                               sal_Int32                                          nOrdNumStart,
649*b1cdbd2cSJim Jagielski                               bool                                               bConvertingMasterPage ) :
650*b1cdbd2cSJim Jagielski     mxPage( xActualPage ),
651*b1cdbd2cSJim Jagielski     mxPagesSupplier( xPagesSupplier ),
652*b1cdbd2cSJim Jagielski     mrContext( rContext ),
653*b1cdbd2cSJim Jagielski     maPolygons(),
654*b1cdbd2cSJim Jagielski     maShapesStack(),
655*b1cdbd2cSJim Jagielski     mnAscendingPrio( nOrdNumStart ),
656*b1cdbd2cSJim Jagielski     mbConvertingMasterPage( bConvertingMasterPage )
657*b1cdbd2cSJim Jagielski {
658*b1cdbd2cSJim Jagielski     uno::Reference<drawing::XShapes> const xShapes(
659*b1cdbd2cSJim Jagielski         xPage, uno::UNO_QUERY_THROW );
660*b1cdbd2cSJim Jagielski     maShapesStack.push( XShapesEntry(xShapes) );
661*b1cdbd2cSJim Jagielski }
662*b1cdbd2cSJim Jagielski 
663*b1cdbd2cSJim Jagielski } // namespace internal
664*b1cdbd2cSJim Jagielski } // namespace presentation
665*b1cdbd2cSJim Jagielski 
666