summaryrefslogtreecommitdiffstats
path: root/sw/source/core/inc/ascharanchoredobjectposition.hxx
blob: 34f42e3643a686922af9cdc58ff4f68226c545b4 (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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/* -*- 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/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   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 .
 */

#ifndef INCLUDED_SW_SOURCE_CORE_INC_ASCHARANCHOREDOBJECTPOSITION_HXX
#define INCLUDED_SW_SOURCE_CORE_INC_ASCHARANCHOREDOBJECTPOSITION_HXX

#include "anchoredobjectposition.hxx"
#include <swtypes.hxx>
#include <swrect.hxx>
#include <o3tl/typed_flags_set.hxx>

class SwTextFrame;
class SwFormatVertOrient;

// flags for positioning algorithm of as-character-anchored objects
enum class AsCharFlags {
    None    = 0x00,
    Quick   = 0x01,
    UlSpace = 0x02,
    Init    = 0x04,
    Rotate  = 0x08,
    Reverse = 0x10,
    Bidi    = 0x20,
};
namespace o3tl {
    template<> struct typed_flags<AsCharFlags> : is_typed_flags<AsCharFlags, 0x3f> {};
};

namespace sw
{
    // TODO: merge/migrate this to com::sun::star::VertOrientation instead of duplicating?
    enum class LineAlign
    {
        NONE,
        TOP,
        CENTER,
        BOTTOM
    };
};
namespace objectpositioning
{
    class SwAsCharAnchoredObjectPosition final : public SwAnchoredObjectPosition
    {
    private:
        // data to calculate object position
        // Proposed anchor position, starting point for the calculation
        // of the object position.
        const Point& mrProposedAnchorPos;
        // flags that influences the calculation of the anchor position
        // AsCharFlags::Quick   : quick formatting - calculated position not set at object
        // AsCharFlags::UlSpace : consider upper/lower spacing - adjustment of anchor position
        // AsCharFlags::Init    : initial calculation
        // AsCharFlags::Rotate  : object is rotated by 90 degrees
        // AsCharFlags::Reverse : object is reversed (rotated by 270 degrees)
        // AsCharFlags::Bidi    : object belongs to a BIDI-multi-portion
        const AsCharFlags mnFlags;
        // needed line values for the different alignments.
        const SwTwips mnLineAscent;
        const SwTwips mnLineDescent;
        const SwTwips mnLineAscentInclObjs;
        const SwTwips mnLineDescentInclObjs;

        // calculated data for object position
        Point       maAnchorPos;
        SwTwips     mnRelPos;
        SwRect      maObjBoundRect;
        // line alignment relative to line height
        sw::LineAlign   mnLineAlignment;

        // method to cast <SwAnchoredObjectPosition::GetAnchorFrame()>
        const SwTextFrame& GetAnchorTextFrame() const;

        /** determine the relative position to base line for object position

            @param _ObjBoundHeight
            height including corresponding spacing of the object, for which
            the Y-position has to be calculated.

            @param _rVert
            given vertical positioning and alignment

            @return relative position to the base line
        */
        SwTwips GetRelPosToBase( const SwTwips          _nObjBoundHeight,
                                  const SwFormatVertOrient& _rVert );

    public:
        /** constructor; provided object to be positioned and needed data
            for calculation of the object position

            @param _rDrawObj
            input parameter - object, that is be positioned.

            @param _rProposedAnchorPos
            proposed anchor position; starting point for the calculation
            of the anchor position

            @param _nFlags
            flags that influences the calculation of the anchor position
            AsCharFlags::Quick   : quick formatting - calculated position not set at object
            AsCharFlags::UlSpace : consider upper/lower spacing - adjustment of anchor position
            AsCharFlags::Init    : initial calculation
            AsCharFlags::Rotate  : object is rotated by 90 degrees
            AsCharFlags::Reverse : object is reversed (rotated by 270 degrees)
            AsCharFlags::Bidi    : object belongs to a BIDI-multi-portion

            @param _nLineAscent, _nLineDescent, _nLineAscentInclObjs,
            _nLineDescentInclObjs - needed line values for the different
            alignments.
        */
        SwAsCharAnchoredObjectPosition( SdrObject&      _rDrawObj,
                                        const Point&    _rProposedAnchorPos,
                                        const AsCharFlags _nFlags,
                                        const SwTwips     _nLineAscent,
                                        const SwTwips     _nLineDescent,
                                        const SwTwips     _nLineAscentInclObjs,
                                        const SwTwips     _nLineDescentInclObjs );
        virtual ~SwAsCharAnchoredObjectPosition() override;

        /** calculate position for object position

            members <maAnchorPos>, <mnRelPos>, <maObjBoundRect> and
            <mnLineAlignment> are calculated.
            calculated position is set at the given object.
        */
        virtual void CalcPosition() override;

        // calculated anchored position for object position type AS_CHAR
        const Point& GetAnchorPos() const { return maAnchorPos;}

        // calculated relative position to base line for object position type AS_CHAR
        SwTwips GetRelPosY() const { return mnRelPos;}

        // determined object rectangle including spacing for object position type AS_CHAR
        const SwRect& GetObjBoundRectInclSpacing() const { return maObjBoundRect;}

        // determined line alignment relative to line height
        sw::LineAlign GetLineAlignment() const { return mnLineAlignment;}
    };
}

#endif

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