summaryrefslogtreecommitdiffstats
path: root/include/oox/export/DMLPresetShapeExport.hxx
blob: 1f650f55837955dd67f1442efd33341090a984a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

#ifndef INCLUDED_OOX_EXPORT_DMLPRESETSHAPEXPORT_HXX
#define INCLUDED_OOX_EXPORT_DMLPRESETSHAPEXPORT_HXX

#include <com/sun/star/awt/Rectangle.hpp>
#include <com/sun/star/uno/Any.hxx>
#include <com/sun/star/uno/Reference.hxx>
#include <com/sun/star/uno/Sequence.hxx>

#include <rtl/ustring.hxx>
#include <sal/types.h>

#include <string_view>

#include <oox/export/drawingml.hxx>

namespace com::sun::star::beans
{
struct PropertyValue;
}

namespace com::sun::star::drawing
{
class XShape;
struct EnhancedCustomShapeAdjustmentValue;
}

namespace oox::core
{
class XmlFilterBase;
}

namespace oox::drawingml
{
/// Class for exporting the custom shapes to OOXML preset ones, if possible.
/// This functionality needed for keeping the information for the office programs
/// about the shape type, and geometry data. Before these shapes were exported
/// with custom geometry, and they kept their geometry but has no information
/// about the shape itself. This lead to lost textbox size/position/padding for
/// example.
class DMLPresetShapeExporter
{
private:
    // the shape to export
    css::uno::Reference<css::drawing::XShape> m_xShape;
    // the DMLwriter
    DrawingML* m_pDMLexporter;
    // the type of the custom shape (diamond/rectangle/circle/triangle...)
    OUString m_sPresetShapeType;
    // True if the shape has points where its geometry can be modified
    bool m_bHasHandleValues;
    // The first the x the second the y coordinate, of flipping
    std::pair<bool, bool> m_bIsFlipped;

    // Custom Shape Geometry information for export:

    // The adjusting values stored in this sequence:
    css::uno::Sequence<css::drawing::EnhancedCustomShapeAdjustmentValue> m_AdjustmentValues;
    // Shapes what have adjusting points, the range of these points
    // and the index of the value stored in this sequence:
    css::uno::Sequence<css::uno::Sequence<css::beans::PropertyValue>> m_HandleValues;

    //TODO:
    //css::awt::Rectangle m_ViewBox;
    //css::uno::Sequence<css::beans::PropertyValue> m_Path;
    //css::uno::Sequence<OUString> m_Equations;

public:
    DMLPresetShapeExporter() = delete;
    ~DMLPresetShapeExporter();

    DMLPresetShapeExporter(DrawingML* pDMLExporter,
                           css::uno::Reference<css::drawing::XShape> xShape);

    // Writes the preset shape to the xml
    bool WriteShape();

private:
    struct AdjustmentPointValueBase
    {
        std::optional<double> nMaxVal;
        std::optional<double> nMinVal;
        std::optional<double> nCurrVal;
    };

    typedef AdjustmentPointValueBase RadiusAdjustmentValue;
    typedef AdjustmentPointValueBase AngleAdjustmentValue;
    typedef AdjustmentPointValueBase XAdjustmentValue;
    typedef AdjustmentPointValueBase YAdjustmentValue;

    // Returns true, if the shape has adjusting points
    bool HasHandleValue() const;

    // Returns true if the shape flipped.
    bool IsXFlipped() const { return m_bIsFlipped.first; };
    bool IsYFlipped() const { return m_bIsFlipped.second; };

    // Returns with the shape type, like triangle for example
    const OUString& GetShapeType() const;
    // Returns with the handle points
    const css::uno::Sequence<css::uno::Sequence<css::beans::PropertyValue>>&
    GetHandleValues() const;
    // Returns with the adjustment values
    const css::uno::Sequence<css::drawing::EnhancedCustomShapeAdjustmentValue>&
    GetAdjustmentValues() const;
    // Returns with the raw value of the given property of the shape geometry.
    css::uno::Any GetHandleValueOfModificationPoint(sal_Int32 nPoint, std::u16string_view sType);
    // Returns with the appropriate value of the handle point.
    RadiusAdjustmentValue GetAdjustmentPointRadiusValue(sal_Int32 nPoint);
    AngleAdjustmentValue GetAdjustmentPointAngleValue(sal_Int32 nPoint);
    XAdjustmentValue GetAdjustmentPointXValue(sal_Int32 nPoint);
    YAdjustmentValue GetAdjustmentPointYValue(sal_Int32 nPoint);

    // Writes one adjustment point.
    bool WriteAV(const OUString& sValName, const OUString& sVal);
    // Opens/Closes the AVlist tag.
    bool StartAVListWriting();
    bool EndAVListWriting();

    // Finds the given value in the sequence
    static css::uno::Any FindHandleValue(css::uno::Sequence<css::beans::PropertyValue> aValues,
                                         std::u16string_view sKey);
    // Writes and converts the adjustment points from sdr to ooxml ones per shape type.
    bool WriteShapeWithAVlist();

}; // end of DMLPresetShapeExporter class

} // end of namespace oox::drawingml

#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */