Coverage Report

Created: 2026-05-16 09:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/include/oox/vml/vmlshapecontainer.hxx
Line
Count
Source
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_OOX_VML_VMLSHAPECONTAINER_HXX
21
#define INCLUDED_OOX_VML_VMLSHAPECONTAINER_HXX
22
23
#include <cstddef>
24
#include <memory>
25
#include <stack>
26
27
#include <com/sun/star/awt/Rectangle.hpp>
28
#include <com/sun/star/uno/Reference.hxx>
29
#include <oox/helper/refmap.hxx>
30
#include <oox/helper/refvector.hxx>
31
#include <rtl/ustring.hxx>
32
33
namespace com::sun::star {
34
    namespace drawing { class XShapes; }
35
}
36
37
namespace oox::vml {
38
39
class Drawing;
40
class ShapeType;
41
class ShapeBase;
42
43
44
struct ShapeParentAnchor
45
{
46
    css::awt::Rectangle maShapeRect;
47
    css::awt::Rectangle maCoordSys;
48
};
49
50
51
/** Container that holds a list of shapes and shape templates. */
52
class ShapeContainer
53
{
54
public:
55
    typedef RefVector< ShapeBase >                  ShapeVector;
56
57
    explicit            ShapeContainer( Drawing& rDrawing );
58
                        ~ShapeContainer();
59
60
    /** Returns the drawing this shape container is part of. */
61
199
    Drawing&     getDrawing() { return mrDrawing; }
62
63
    /** Creates and returns a new shape template object. */
64
    std::shared_ptr<ShapeType> createShapeType();
65
    /** Creates and returns a new shape object of the specified type. */
66
    template< typename ShapeT >
67
    std::shared_ptr<ShapeT> createShape();
68
69
    /** Final processing after import of the drawing fragment. */
70
    void                finalizeFragmentImport();
71
72
    /** Returns true, if this container does not contain any shapes. */
73
108
    bool         empty() const { return maShapes.empty(); }
74
75
    /** Returns the shape template with the passed identifier.
76
        Searches in all group shapes too. */
77
    const ShapeType*    getShapeTypeById( const OUString& rShapeId ) const;
78
    /** Returns the shape with the passed identifier.
79
        Searches in all group shapes too. */
80
    const ShapeBase*    getShapeById( const OUString& rShapeId ) const;
81
82
    /** Searches for a shape by using the passed functor that takes a constant
83
        reference of a ShapeBase object. */
84
    template< typename Functor >
85
    const ShapeBase*    findShape( const Functor& rFunctor ) const;
86
87
    /**
88
      (Word only) Returns the last shape in the collection, if it is after the last
89
      mark from pushMark(), and removes it.
90
    */
91
    std::shared_ptr< ShapeBase > takeLastShape();
92
    /**
93
      Adds a recursion mark to the stack. It is possible that a shape contains <w:txbxContent>
94
      which contains another shape, and writerfilter needs to know which shape is from the inner
95
      ooxml context and which from the outer ooxml context, while it is necessary to keep
96
      at least shape types across such blocks. Therefore this function marks beginning
97
      of each shape xml block, and takeLastShape() returns only shapes from this block.
98
    */
99
    void pushMark();
100
    /**
101
      Removes a recursion mark.
102
    */
103
    void popMark();
104
105
    /** Creates and inserts all UNO shapes into the passed container. */
106
    void                convertAndInsert(
107
                            const css::uno::Reference< css::drawing::XShapes >& rxShapes,
108
                            const ShapeParentAnchor* pParentAnchor = nullptr ) const;
109
110
8.67k
    const ShapeVector & getAllShapes() const { return maShapes; }
111
112
private:
113
    typedef RefVector< ShapeType >                  ShapeTypeVector;
114
    typedef RefMap< OUString, ShapeType >    ShapeTypeMap;
115
    typedef RefMap< OUString, ShapeBase >    ShapeMap;
116
117
    Drawing&            mrDrawing;          ///< The VML drawing page that contains this shape.
118
    ShapeTypeVector     maTypes;            ///< All shape templates.
119
    ShapeVector         maShapes;           ///< All shape definitions.
120
    ShapeTypeMap        maTypesById;        ///< All shape templates mapped by identifier.
121
    ShapeMap            maShapesById;       ///< All shape definitions mapped by identifier.
122
    std::stack< size_t > markStack;         ///< Recursion marks from pushMark()/popMark().
123
};
124
125
126
template< typename ShapeT >
127
std::shared_ptr<ShapeT> ShapeContainer::createShape()
128
7.16k
{
129
7.16k
    auto xShape = std::make_shared<ShapeT>( mrDrawing );
130
7.16k
    xShape->setContainer(this);
131
7.16k
    maShapes.push_back( xShape );
132
7.16k
    return xShape;
133
7.16k
}
std::__1::shared_ptr<oox::vml::GroupShape> oox::vml::ShapeContainer::createShape<oox::vml::GroupShape>()
Line
Count
Source
128
108
{
129
108
    auto xShape = std::make_shared<ShapeT>( mrDrawing );
130
108
    xShape->setContainer(this);
131
108
    maShapes.push_back( xShape );
132
108
    return xShape;
133
108
}
std::__1::shared_ptr<oox::vml::BezierShape> oox::vml::ShapeContainer::createShape<oox::vml::BezierShape>()
Line
Count
Source
128
463
{
129
463
    auto xShape = std::make_shared<ShapeT>( mrDrawing );
130
463
    xShape->setContainer(this);
131
463
    maShapes.push_back( xShape );
132
463
    return xShape;
133
463
}
std::__1::shared_ptr<oox::vml::ComplexShape> oox::vml::ShapeContainer::createShape<oox::vml::ComplexShape>()
Line
Count
Source
128
5.62k
{
129
5.62k
    auto xShape = std::make_shared<ShapeT>( mrDrawing );
130
5.62k
    xShape->setContainer(this);
131
5.62k
    maShapes.push_back( xShape );
132
5.62k
    return xShape;
133
5.62k
}
std::__1::shared_ptr<oox::vml::RectangleShape> oox::vml::ShapeContainer::createShape<oox::vml::RectangleShape>()
Line
Count
Source
128
587
{
129
587
    auto xShape = std::make_shared<ShapeT>( mrDrawing );
130
587
    xShape->setContainer(this);
131
587
    maShapes.push_back( xShape );
132
587
    return xShape;
133
587
}
std::__1::shared_ptr<oox::vml::EllipseShape> oox::vml::ShapeContainer::createShape<oox::vml::EllipseShape>()
Line
Count
Source
128
149
{
129
149
    auto xShape = std::make_shared<ShapeT>( mrDrawing );
130
149
    xShape->setContainer(this);
131
149
    maShapes.push_back( xShape );
132
149
    return xShape;
133
149
}
Unexecuted instantiation: std::__1::shared_ptr<oox::vml::PolyLineShape> oox::vml::ShapeContainer::createShape<oox::vml::PolyLineShape>()
std::__1::shared_ptr<oox::vml::LineShape> oox::vml::ShapeContainer::createShape<oox::vml::LineShape>()
Line
Count
Source
128
234
{
129
234
    auto xShape = std::make_shared<ShapeT>( mrDrawing );
130
234
    xShape->setContainer(this);
131
234
    maShapes.push_back( xShape );
132
234
    return xShape;
133
234
}
134
135
template< typename Functor >
136
const ShapeBase* ShapeContainer::findShape( const Functor& rFunctor ) const
137
{
138
    return maShapes.findIf( rFunctor ).get();
139
}
140
141
142
} // namespace oox::vml
143
144
#endif
145
146
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */