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: */
|