summaryrefslogtreecommitdiff
path: root/sw/source/core/inc/rowfrm.hxx
blob: a48dacf6a37e678e029fd066c318e978ac5ea8eb (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
/* -*- 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_ROWFRM_HXX
#define INCLUDED_SW_SOURCE_CORE_INC_ROWFRM_HXX

#include "layfrm.hxx"

class SwTableLine;
class SwBorderAttrs;

/// SwRowFrame is one table row in the document layout.
class SwRowFrame final : public SwLayoutFrame
{
    virtual void Format(vcl::RenderContext* pRenderContext,
                        const SwBorderAttrs* pAttrs = nullptr) override;
    /// Only change the Frame size, not the PrtArea SSize
    virtual SwTwips ShrinkFrame(SwTwips, bool bTst = false, bool bInfo = false) override;
    virtual SwTwips GrowFrame(SwTwips, bool bTst = false, bool bInfo = false) override;

    const SwTableLine* m_pTabLine;
    SwRowFrame* m_pFollowRow; ///< note: this is *only* set on old-style tables!
    // #i29550#
    sal_uInt16 mnTopMarginForLowers;
    sal_uInt16 mnBottomMarginForLowers;
    sal_uInt16 mnBottomLineSize;
    // <-- collapsing
    bool m_bIsFollowFlowRow; ///< note: this is *only* set on old-style tables!
    bool m_bIsRepeatedHeadline;
    bool m_bIsRowSpanLine;

    bool m_bForceRowSplitAllowed;
    bool m_bIsInSplit;

    virtual void DestroyImpl() override;
    virtual ~SwRowFrame() override;

    virtual void MakeAll(vcl::RenderContext* pRenderContext) override;
    virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
    virtual const SwRowFrame* DynCastRowFrame() const override { return this; }

public:
    SwRowFrame(const SwTableLine&, SwFrame*, bool bInsertContent = true);

    virtual void Cut() override;

    /**
     * Register Flys after a line was created _AND_ inserted
     * Must be called by the creator; the Fly is inserted _after_ it has
     * been created; the same holds true for the Page at which the Flys
     * are to be registered at.
     */
    void RegistFlys(SwPageFrame* pPage = nullptr);

    const SwTableLine* GetTabLine() const { return m_pTabLine; }

    /**
     * Adapts the Cells to the current height; invalidates the Cells if
     * the Direction does not match the height
     */
    void AdjustCells(const SwTwips nHeight, const bool bHeight);

    SwRowFrame* GetFollowRow() const { return m_pFollowRow; }
    void SetFollowRow(SwRowFrame* pNew) { m_pFollowRow = pNew; }

    // #i29550#
    sal_uInt16 GetTopMarginForLowers() const { return mnTopMarginForLowers; }
    void SetTopMarginForLowers(sal_uInt16 nNew) { mnTopMarginForLowers = nNew; }
    sal_uInt16 GetBottomMarginForLowers() const { return mnBottomMarginForLowers; }
    void SetBottomMarginForLowers(sal_uInt16 nNew) { mnBottomMarginForLowers = nNew; }
    sal_uInt16 GetBottomLineSize() const { return mnBottomLineSize; }
    void SetBottomLineSize(sal_uInt16 nNew) { mnBottomLineSize = nNew; }
    // <-- collapsing

    bool IsRepeatedHeadline() const { return m_bIsRepeatedHeadline; }
    void SetRepeatedHeadline(bool bNew) { m_bIsRepeatedHeadline = bNew; }

    // --> split table rows
    bool IsRowSplitAllowed() const;
    bool IsForceRowSplitAllowed() const { return m_bForceRowSplitAllowed; }
    void SetForceRowSplitAllowed(bool bNew) { m_bForceRowSplitAllowed = bNew; };
    bool IsFollowFlowRow() const { return m_bIsFollowFlowRow; }
    void SetFollowFlowRow(bool bNew) { m_bIsFollowFlowRow = bNew; }
    // <-- split table rows

    // #131283# Table row keep feature
    bool ShouldRowKeepWithNext(const bool bCheckParents = true) const;

    // #i4032# NEW TABLES
    bool IsRowSpanLine() const { return m_bIsRowSpanLine; }
    void SetRowSpanLine(bool bNew) { m_bIsRowSpanLine = bNew; }

    // A row may only be split if the minimum height of the row frame
    // fits into the vertical space left.
    // The minimum height is found as maximum of two values: minimal
    // contents of the row (e.g., height of first line of text, or an
    // object, or lower table cell), and the minimum height setting.
    // As the minimum height setting should not prevent the row to
    // flow, (it only should ensure that *total* height is no less), we
    // should not consider the setting when the split is performed
    // (we should be able to keep on first page as little as required).
    // When IsInSplit is true, lcl_CalcMinRowHeight will ignore the
    // minimum height setting. It is set in lcl_RecalcSplitLine around
    // lcl_RecalcRow and SwRowFrame::Calc that decide if it's possible
    // to keep part of row's content on first page, and update table's
    // height to fit the rest of space.
    bool IsInSplit() const { return m_bIsInSplit; }
    void SetInSplit(bool bNew = true) { m_bIsInSplit = bNew; }
    void OnFrameSize(const SfxPoolItem&);

    void dumpAsXml(xmlTextWriterPtr writer = nullptr) const override;
};

#endif

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