blob: 511f2e49061c3a79b21cca94e3f6624079fd3166 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef OOX_VML_VMLSHAPECONTAINER_HXX
#define OOX_VML_VMLSHAPECONTAINER_HXX
#include <com/sun/star/awt/Rectangle.hpp>
#include "oox/helper/refmap.hxx"
#include "oox/helper/refvector.hxx"
namespace com { namespace sun { namespace star {
namespace drawing { class XShapes; }
} } }
namespace oox {
namespace vml {
class Drawing;
class ShapeType;
class ShapeBase;
// ============================================================================
struct ShapeParentAnchor
{
::com::sun::star::awt::Rectangle maShapeRect;
::com::sun::star::awt::Rectangle maCoordSys;
};
// ============================================================================
/** Container that holds a list of shapes and shape templates. */
class ShapeContainer
{
public:
explicit ShapeContainer( Drawing& rDrawing );
~ShapeContainer();
/** Returns the drawing this shape container is part of. */
inline Drawing& getDrawing() { return mrDrawing; }
/** Creates and returns a new shape template object. */
ShapeType& createShapeType();
/** Creates and returns a new shape object of the specified type. */
template< typename ShapeT >
ShapeT& createShape();
/** Final processing after import of the drawing fragment. */
void finalizeFragmentImport();
/** Returns true, if this contaikner does not contain any shapes. */
inline bool empty() const { return maShapes.empty(); }
/** Returns the shape template with the passed identifier.
@param bDeep True = searches in all group shapes too. */
const ShapeType* getShapeTypeById( const ::rtl::OUString& rShapeId, bool bDeep ) const;
/** Returns the shape with the passed identifier.
@param bDeep True = searches in all group shapes too. */
const ShapeBase* getShapeById( const ::rtl::OUString& rShapeId, bool bDeep ) const;
/** Searches for a shape type by using the passed functor that takes a
constant reference of a ShapeType object. */
template< typename Functor >
const ShapeType* findShapeType( const Functor& rFunctor ) const;
/** Searches for a shape by using the passed functor that takes a constant
reference of a ShapeBase object. */
template< typename Functor >
const ShapeBase* findShape( const Functor& rFunctor ) const;
/** Returns the first shape in the collection (Word only). */
const ShapeBase* getFirstShape() const;
/** Creates and inserts all UNO shapes into the passed container. */
void convertAndInsert(
const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes,
const ShapeParentAnchor* pParentAnchor = 0 ) const;
private:
typedef RefVector< ShapeType > ShapeTypeVector;
typedef RefVector< ShapeBase > ShapeVector;
typedef RefMap< ::rtl::OUString, ShapeType > ShapeTypeMap;
typedef RefMap< ::rtl::OUString, ShapeBase > ShapeMap;
Drawing& mrDrawing; /// The VML drawing page that contains this shape.
ShapeTypeVector maTypes; /// All shape templates.
ShapeVector maShapes; /// All shape definitions.
ShapeTypeMap maTypesById; /// All shape templates mapped by identifier.
ShapeMap maShapesById; /// All shape definitions mapped by identifier.
};
// ----------------------------------------------------------------------------
template< typename ShapeT >
ShapeT& ShapeContainer::createShape()
{
::boost::shared_ptr< ShapeT > xShape( new ShapeT( mrDrawing ) );
maShapes.push_back( xShape );
return *xShape;
}
template< typename Functor >
const ShapeType* ShapeContainer::findShapeType( const Functor& rFunctor ) const
{
return maTypes.findIf( rFunctor ).get();
}
template< typename Functor >
const ShapeBase* ShapeContainer::findShape( const Functor& rFunctor ) const
{
return maShapes.findIf( rFunctor ).get();
}
// ============================================================================
} // namespace vml
} // namespace oox
#endif