summaryrefslogtreecommitdiff
path: root/slideshow/source/engine/shapes/shapeimporter.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'slideshow/source/engine/shapes/shapeimporter.cxx')
-rw-r--r--slideshow/source/engine/shapes/shapeimporter.cxx672
1 files changed, 0 insertions, 672 deletions
diff --git a/slideshow/source/engine/shapes/shapeimporter.cxx b/slideshow/source/engine/shapes/shapeimporter.cxx
deleted file mode 100644
index 2eac8d631..000000000
--- a/slideshow/source/engine/shapes/shapeimporter.cxx
+++ /dev/null
@@ -1,672 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_slideshow.hxx"
-
-// must be first
-#include <canvas/debug.hxx>
-#include <vcl/cvtgrf.hxx>
-#include <tools/urlobj.hxx>
-#include <tools/stream.hxx>
-#include <svtools/grfmgr.hxx>
-#include <unotools/ucbstreamhelper.hxx>
-#include <unotools/streamwrap.hxx>
-#include <basegfx/point/b2dpoint.hxx>
-#include <basegfx/polygon/b2dpolygon.hxx>
-#include <cppcanvas/basegfxfactory.hxx>
-#include <cppcanvas/polypolygon.hxx>
-#include <com/sun/star/awt/Rectangle.hpp>
-#include <com/sun/star/drawing/ColorMode.hpp>
-#include <com/sun/star/text/GraphicCrop.hpp>
-#include <com/sun/star/container/XNameContainer.hpp>
-#include <com/sun/star/drawing/PointSequenceSequence.hpp>
-#include <com/sun/star/drawing/PointSequence.hpp>
-#include <com/sun/star/lang/XMultiComponentFactory.hpp>
-#include <com/sun/star/drawing/XLayerSupplier.hpp>
-#include <com/sun/star/drawing/XLayerManager.hpp>
-#include <com/sun/star/container/XNameAccess.hpp>
-#include <com/sun/star/lang/XComponent.hpp>
-#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
-
-#include "drawshapesubsetting.hxx"
-#include "drawshape.hxx"
-#include "backgroundshape.hxx"
-#include "mediashape.hxx"
-#include "appletshape.hxx"
-#include "shapeimporter.hxx"
-#include "slideshowexceptions.hxx"
-#include "gdimtftools.hxx"
-#include "tools.hxx"
-#include "slideshowcontext.hxx"
-
-#include <boost/shared_ptr.hpp>
-#include <boost/scoped_ptr.hpp>
-
-using namespace com::sun::star;
-using namespace ::comphelper;
-
-namespace slideshow {
-namespace internal {
-
-namespace {
-
-bool importShapeGraphic(
- GraphicObject & o_rGraphic,
- uno::Reference<beans::XPropertySet> const& xPropSet )
-{
- rtl::OUString aURL;
- if( !getPropertyValue( aURL, xPropSet, OUSTR("GraphicURL")) ||
- aURL.getLength() == 0 )
- {
- // no or empty property - cannot import shape graphic
- return false;
- }
-
- rtl::OUString const aVndUrl(
- RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.GraphicObject:" ) );
- sal_Int32 nIndex( aURL.indexOf( aVndUrl ) );
-
- if(nIndex != -1)
- {
- // skip past the end of the "vnd..." prefix
- nIndex += aVndUrl.getLength();
-
- if(nIndex >= aURL.getLength())
- {
- OSL_FAIL( "ShapeImporter::importShape(): "
- "embedded graphic has no graphic ID" );
- return false;
- }
-
- // unique ID string found in URL, extract
- // to separate string
- rtl::OUString const aUniqueId(
- aURL.copy( nIndex, aURL.getLength() - nIndex ) );
-
- // TODO(T2): Creating a GraphicObject is not
- // thread safe (internally calls VCL, and has
- // unguarded internal singleton mpGlobalMgr)
-
- // fetch already loaded graphic from graphic manager.
- ByteString const aOldString( static_cast<String>(aUniqueId),
- RTL_TEXTENCODING_UTF8 );
- o_rGraphic = GraphicObject( aOldString );
-
-
- if( GRAPHIC_DEFAULT == o_rGraphic.GetType()
- || GRAPHIC_NONE == o_rGraphic.GetType() )
- {
- // even the GrfMgr does not seem to know this graphic
- return false;
- }
- }
- else
- {
- // no special string found, graphic must be
- // external. Load via GraphicIm porter
- INetURLObject aTmp( aURL );
- boost::scoped_ptr<SvStream> pGraphicStream(
- utl::UcbStreamHelper::CreateStream(
- aTmp.GetMainURL( INetURLObject::NO_DECODE ),
- STREAM_READ ) );
- if( !pGraphicStream )
- {
- OSL_FAIL( "ShapeImporter::importShape(): "
- "cannot create input stream for graphic" );
- return false;
- }
-
- Graphic aTmpGraphic;
- if( GraphicConverter::Import(
- *pGraphicStream, aTmpGraphic ) != ERRCODE_NONE )
- {
- OSL_FAIL( "ShapeImporter::importShape(): "
- "Failed to import shape graphic from given URL" );
- return false;
- }
-
- o_rGraphic = GraphicObject( aTmpGraphic );
- }
- return true;
-}
-
-/** This shape implementation just acts as a dummy for the layermanager.
- Its sole role is for hit test detection of group shapes.
-*/
-class ShapeOfGroup : public Shape
-{
-public:
- ShapeOfGroup( ShapeSharedPtr const& pGroupShape,
- uno::Reference<drawing::XShape> const& xShape,
- uno::Reference<beans::XPropertySet> const& xPropSet,
- double nPrio );
-
- // Shape:
- virtual uno::Reference<drawing::XShape> getXShape() const;
- virtual void addViewLayer( ViewLayerSharedPtr const& pNewLayer,
- bool bRedrawLayer );
- virtual bool removeViewLayer( ViewLayerSharedPtr const& pNewLayer );
- virtual bool clearAllViewLayers();
- virtual bool update() const;
- virtual bool render() const;
- virtual bool isContentChanged() const;
- virtual basegfx::B2DRectangle getBounds() const;
- virtual basegfx::B2DRectangle getDomBounds() const;
- virtual basegfx::B2DRectangle getUpdateArea() const;
- virtual bool isVisible() const;
- virtual double getPriority() const;
- virtual bool isBackgroundDetached() const;
-
-private:
- ShapeSharedPtr const mpGroupShape;
- uno::Reference<drawing::XShape> const mxShape;
- double const mnPrio;
- basegfx::B2DPoint maPosOffset;
- double mnWidth;
- double mnHeight;
-};
-
-ShapeOfGroup::ShapeOfGroup( ShapeSharedPtr const& pGroupShape,
- uno::Reference<drawing::XShape> const& xShape,
- uno::Reference<beans::XPropertySet> const& xPropSet,
- double nPrio ) :
- mpGroupShape(pGroupShape),
- mxShape(xShape),
- mnPrio(nPrio)
-{
- // read bound rect
- uno::Any const aTmpRect_( xPropSet->getPropertyValue( OUSTR("BoundRect") ));
- awt::Rectangle const aTmpRect( aTmpRect_.get<awt::Rectangle>() );
- basegfx::B2DRectangle const groupPosSize( pGroupShape->getBounds() );
- maPosOffset = basegfx::B2DPoint( aTmpRect.X - groupPosSize.getMinX(),
- aTmpRect.Y - groupPosSize.getMinY() );
- mnWidth = aTmpRect.Width;
- mnHeight = aTmpRect.Height;
-}
-
-uno::Reference<drawing::XShape> ShapeOfGroup::getXShape() const
-{
- return mxShape;
-}
-
-void ShapeOfGroup::addViewLayer( ViewLayerSharedPtr const& /*pNewLayer*/,
- bool /*bRedrawLayer*/ )
-{
-}
-
-bool ShapeOfGroup::removeViewLayer( ViewLayerSharedPtr const& /*pNewLayer*/ )
-{
- return true;
-}
-
-bool ShapeOfGroup::clearAllViewLayers()
-{
- return true;
-}
-
-bool ShapeOfGroup::update() const
-{
- return true;
-}
-
-bool ShapeOfGroup::render() const
-{
- return true;
-}
-
-bool ShapeOfGroup::isContentChanged() const
-{
- return false;
-}
-
-basegfx::B2DRectangle ShapeOfGroup::getBounds() const
-{
- basegfx::B2DRectangle const groupPosSize( mpGroupShape->getBounds() );
- double const posX = (groupPosSize.getMinX() + maPosOffset.getX());
- double const posY = (groupPosSize.getMinY() + maPosOffset.getY());
- return basegfx::B2DRectangle( posX, posY, posX + mnWidth, posY + mnHeight );
-}
-
-basegfx::B2DRectangle ShapeOfGroup::getDomBounds() const
-{
- return getBounds();
-}
-
-basegfx::B2DRectangle ShapeOfGroup::getUpdateArea() const
-{
- return getBounds();
-}
-
-bool ShapeOfGroup::isVisible() const
-{
- return mpGroupShape->isVisible();
-}
-
-double ShapeOfGroup::getPriority() const
-{
- return mnPrio;
-}
-
-bool ShapeOfGroup::isBackgroundDetached() const
-{
- return false;
-}
-
-} // anon namespace
-
-ShapeSharedPtr ShapeImporter::createShape(
- uno::Reference<drawing::XShape> const& xCurrShape,
- uno::Reference<beans::XPropertySet> const& xPropSet,
- rtl::OUString const& shapeType ) const
-{
- if( shapeType.equalsAsciiL(
- RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.MediaShape") ) ||
- shapeType.equalsAsciiL(
- RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation.MediaShape") ) )
- {
- // Media shape (video etc.). This is a special object
- return createMediaShape(xCurrShape,
- mnAscendingPrio,
- mrContext);
- }
- else if( shapeType.equalsAsciiL(
- RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.PluginShape") ))
- {
- // PropertyValues to copy from XShape to plugin
- static const char* aPropertyValues[] =
- {
- "PluginURL",
- "PluginMimeType",
- "PluginCommands"
- };
-
- // (Netscape)Plugin shape. This is a special object
- return createAppletShape( xCurrShape,
- mnAscendingPrio,
- ::rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "com.sun.star.comp.sfx2.PluginObject" )),
- aPropertyValues,
- sizeof(aPropertyValues)/sizeof(*aPropertyValues),
- mrContext );
- }
- else if( shapeType.equalsAsciiL(
- RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.AppletShape") ))
- {
- // PropertyValues to copy from XShape to applet
- static const char* aPropertyValues[] =
- {
- "AppletCodeBase",
- "AppletName",
- "AppletCode",
- "AppletCommands",
- "AppletIsScript"
- };
-
- // (Java)Applet shape. This is a special object
- return createAppletShape( xCurrShape,
- mnAscendingPrio,
- ::rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "com.sun.star.comp.sfx2.AppletObject" )),
- aPropertyValues,
- sizeof(aPropertyValues)/sizeof(*aPropertyValues),
- mrContext );
- }
- else if( shapeType.equalsAsciiL(
- RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.OLE2Shape") ) ||
- shapeType.equalsAsciiL(
- RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation.OLE2Shape") ) )
- {
- // #i46224# Mark OLE shapes as foreign content - scan them for
- // unsupported actions, and fallback to bitmap, if necessary
- return DrawShape::create( xCurrShape,
- mxPage,
- mnAscendingPrio,
- true,
- mrContext );
- }
- else if( shapeType.equalsAsciiL(
- RTL_CONSTASCII_STRINGPARAM(
- "com.sun.star.drawing.GraphicObjectShape") ) ||
- shapeType.equalsAsciiL(
- RTL_CONSTASCII_STRINGPARAM(
- "com.sun.star.presentation.GraphicObjectShape") ) )
- {
- GraphicObject aGraphicObject;
-
- // to get hold of GIF animations, inspect Graphic
- // objects more thoroughly (the plain-jane shape
- // metafile of course would only contain the first
- // animation frame)
- if( !importShapeGraphic( aGraphicObject, xPropSet ) )
- return ShapeSharedPtr(); // error loading graphic -
- // no placeholders in
- // slideshow
-
- if( !aGraphicObject.IsAnimated() )
- {
- // no animation - simply utilize plain draw shape import
-
- // import shape as bitmap - either its a bitmap
- // anyway, or its a metafile, which currently the
- // metafile renderer might not display correctly.
- return DrawShape::create( xCurrShape,
- mxPage,
- mnAscendingPrio,
- true,
- mrContext );
- }
-
-
- // now extract relevant shape attributes via API
- // ---------------------------------------------
-
- drawing::ColorMode eColorMode( drawing::ColorMode_STANDARD );
- sal_Int16 nLuminance(0);
- sal_Int16 nContrast(0);
- sal_Int16 nRed(0);
- sal_Int16 nGreen(0);
- sal_Int16 nBlue(0);
- double nGamma(1.0);
- sal_Int16 nTransparency(0);
- sal_Int32 nRotation(0);
-
- getPropertyValue( eColorMode, xPropSet, OUSTR("GraphicColorMode") );
- getPropertyValue( nLuminance, xPropSet, OUSTR("AdjustLuminance") );
- getPropertyValue( nContrast, xPropSet, OUSTR("AdjustContrast") );
- getPropertyValue( nRed, xPropSet, OUSTR("AdjustRed") );
- getPropertyValue( nGreen, xPropSet, OUSTR("AdjustGreen") );
- getPropertyValue( nBlue, xPropSet, OUSTR("AdjustBlue") );
- getPropertyValue( nGamma, xPropSet, OUSTR("Gamma") );
- getPropertyValue( nTransparency, xPropSet, OUSTR("Transparency") );
- getPropertyValue( nRotation, xPropSet, OUSTR("RotateAngle") );
-
- GraphicAttr aGraphAttrs;
- aGraphAttrs.SetDrawMode( (GraphicDrawMode)eColorMode );
- aGraphAttrs.SetLuminance( nLuminance );
- aGraphAttrs.SetContrast( nContrast );
- aGraphAttrs.SetChannelR( nRed );
- aGraphAttrs.SetChannelG( nGreen );
- aGraphAttrs.SetChannelB( nBlue );
- aGraphAttrs.SetGamma( nGamma );
- aGraphAttrs.SetTransparency( static_cast<sal_uInt8>(nTransparency) );
- aGraphAttrs.SetRotation( static_cast<sal_uInt16>(nRotation*10) );
-
- text::GraphicCrop aGraphCrop;
- if( getPropertyValue( aGraphCrop, xPropSet, OUSTR("GraphicCrop") ))
- {
- aGraphAttrs.SetCrop( aGraphCrop.Left,
- aGraphCrop.Top,
- aGraphCrop.Right,
- aGraphCrop.Bottom );
- }
-
- // fetch readily transformed and color-modified
- // graphic
- // ---------------------------------------------
-
- Graphic aGraphic(
- aGraphicObject.GetTransformedGraphic(
- aGraphicObject.GetPrefSize(),
- aGraphicObject.GetPrefMapMode(),
- aGraphAttrs ) );
-
- return DrawShape::create( xCurrShape,
- mxPage,
- mnAscendingPrio,
- aGraphic,
- mrContext );
- }
- else
- {
- return DrawShape::create( xCurrShape,
- mxPage,
- mnAscendingPrio,
- false,
- mrContext );
- }
-}
-
-bool ShapeImporter::isSkip(
- uno::Reference<beans::XPropertySet> const& xPropSet,
- rtl::OUString const& shapeType,
- uno::Reference< drawing::XLayer> const& xLayer )
-{
- // skip empty presentation objects:
- bool bEmpty = false;
- if( getPropertyValue( bEmpty,
- xPropSet,
- OUSTR("IsEmptyPresentationObject")) &&
- bEmpty )
- {
- return true;
- }
-
- //skip shapes which corresponds to annotations
- if(xLayer.is())
- {
- rtl::OUString layerName;
- uno::Reference<beans::XPropertySet> xPropLayerSet(
- xLayer, uno::UNO_QUERY );
- const uno::Any& a(xPropLayerSet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Name"))) );
- bool const bRet = (a >>= layerName);
- if(bRet)
- {
- if( layerName.equals(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DrawnInSlideshow"))))
- {
- //Transform shapes into PolyPolygons
- importPolygons(xPropSet);
-
- return true;
- }
- }
- }
-
- // don't export presentation placeholders on masterpage
- // they can be non empty when user edits the default texts
- if(mbConvertingMasterPage)
- {
- if(shapeType.equalsAsciiL(
- RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation."
- "TitleTextShape") ) ||
- shapeType.equalsAsciiL(
- RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation."
- "OutlinerShape") ))
- {
- return true;
- }
- }
- return false;
-}
-
-
-void ShapeImporter::importPolygons(uno::Reference<beans::XPropertySet> const& xPropSet) {
-
- drawing::PointSequenceSequence aRetval;
- sal_Int32 nLineColor=0;
- double fLineWidth;
- getPropertyValue( aRetval, xPropSet, OUSTR("PolyPolygon") );
- getPropertyValue( nLineColor, xPropSet, OUSTR("LineColor") );
- getPropertyValue( fLineWidth, xPropSet, OUSTR("LineWidth") );
-
- drawing::PointSequence* pOuterSequence = aRetval.getArray();
- awt::Point* pInnerSequence = pOuterSequence->getArray();
-
- ::basegfx::B2DPolygon aPoly;
- basegfx::B2DPoint aPoint;
- for( sal_Int32 nCurrPoly=0; nCurrPoly<pOuterSequence->getLength(); ++nCurrPoly, ++pInnerSequence )
- {
- aPoint.setX((*pInnerSequence).X);
- aPoint.setY((*pInnerSequence).Y);
- aPoly.append( aPoint );
- }
- UnoViewVector::const_iterator aIter=(mrContext.mrViewContainer).begin();
- UnoViewVector::const_iterator aEnd=(mrContext.mrViewContainer).end();
- while(aIter != aEnd)
- {
- ::cppcanvas::PolyPolygonSharedPtr pPolyPoly(
- ::cppcanvas::BaseGfxFactory::getInstance().createPolyPolygon( (*aIter)->getCanvas(),
- aPoly ) );
- if( pPolyPoly )
- {
- pPolyPoly->setRGBALineColor( unoColor2RGBColor( nLineColor ).getIntegerColor() );
- pPolyPoly->setStrokeWidth(fLineWidth);
- pPolyPoly->draw();
- maPolygons.push_back(pPolyPoly);
- }
- ++aIter;
- }
-}
-
-ShapeSharedPtr ShapeImporter::importBackgroundShape() // throw (ShapeLoadFailedException)
-{
- if( maShapesStack.empty() )
- throw ShapeLoadFailedException();
-
- XShapesEntry& rTop = maShapesStack.top();
- ShapeSharedPtr pBgShape(
- createBackgroundShape(mxPage,
- uno::Reference<drawing::XDrawPage>(
- rTop.mxShapes,
- uno::UNO_QUERY_THROW),
- mrContext) );
- mnAscendingPrio += 1.0;
-
- return pBgShape;
-}
-
-ShapeSharedPtr ShapeImporter::importShape() // throw (ShapeLoadFailedException)
-{
- ShapeSharedPtr pRet;
- bool bIsGroupShape = false;
-
- while( !maShapesStack.empty() && !pRet )
- {
- XShapesEntry& rTop = maShapesStack.top();
- if( rTop.mnPos < rTop.mnCount )
- {
- uno::Reference<drawing::XShape> const xCurrShape(
- rTop.mxShapes->getByIndex( rTop.mnPos ), uno::UNO_QUERY );
- ++rTop.mnPos;
- uno::Reference<beans::XPropertySet> xPropSet(
- xCurrShape, uno::UNO_QUERY );
- if( !xPropSet.is() )
- {
- // we definitely need the properties of
- // the shape here. This will also fail,
- // if getByIndex did not return a valid
- // shape
- throw ShapeLoadFailedException();
- }
-
- //Retrieve the layer for the current shape
- uno::Reference< drawing::XLayer > xDrawnInSlideshow;
-
- uno::Reference< drawing::XLayerSupplier > xLayerSupplier(mxPagesSupplier, uno::UNO_QUERY);
- if(xLayerSupplier.is())
- {
- uno::Reference< container::XNameAccess > xNameAccess = xLayerSupplier->getLayerManager();
-
- uno::Reference< drawing::XLayerManager > xLayerManager(xNameAccess, uno::UNO_QUERY);
-
- xDrawnInSlideshow = xLayerManager->getLayerForShape(xCurrShape);
- }
-
- rtl::OUString const shapeType( xCurrShape->getShapeType());
-
- // is this shape presentation-invisible?
- if( !isSkip(xPropSet, shapeType, xDrawnInSlideshow) )
- {
- bIsGroupShape = shapeType.equalsAsciiL(
- RTL_CONSTASCII_STRINGPARAM(
- "com.sun.star.drawing.GroupShape") );
-
- if( rTop.mpGroupShape ) // in group particle mode?
- {
- pRet.reset( new ShapeOfGroup(
- rTop.mpGroupShape /* container shape */,
- xCurrShape, xPropSet,
- mnAscendingPrio ) );
- }
- else
- {
- pRet = createShape( xCurrShape, xPropSet, shapeType );
- }
- mnAscendingPrio += 1.0;
- }
- }
- if( rTop.mnPos >= rTop.mnCount )
- {
- // group or top-level shapes finished:
- maShapesStack.pop();
- }
- if( bIsGroupShape && pRet )
- {
- // push new group on the stack: group traversal
- maShapesStack.push( XShapesEntry( pRet ) );
- }
- }
-
- return pRet;
-}
-
-bool ShapeImporter::isImportDone() const
-{
- return maShapesStack.empty();
-}
-
-PolyPolygonVector ShapeImporter::getPolygons()
-{
- return maPolygons;
-}
-
-ShapeImporter::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 ) :
- mxPage( xActualPage ),
- mxPagesSupplier( xPagesSupplier ),
- mrContext( rContext ),
- maPolygons(),
- maShapesStack(),
- mnAscendingPrio( nOrdNumStart ),
- mbConvertingMasterPage( bConvertingMasterPage )
-{
- uno::Reference<drawing::XShapes> const xShapes(
- xPage, uno::UNO_QUERY_THROW );
- maShapesStack.push( XShapesEntry(xShapes) );
-}
-
-} // namespace internal
-} // namespace presentation
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */