1
0
Fork 0
libreoffice/sw/source/core/inc/ftnfrm.hxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

172 lines
6.4 KiB
C++

/* -*- 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_FTNFRM_HXX
#define INCLUDED_SW_SOURCE_CORE_INC_FTNFRM_HXX
#include "layfrm.hxx"
class SwContentFrame;
class SwRootFrame;
class SwTextNode;
class SwTextFootnote;
class SwBorderAttrs;
class SwFootnoteFrame;
void sw_RemoveFootnotes( SwFootnoteBossFrame* pBoss, bool bPageOnly, bool bEndNotes );
namespace sw {
void RemoveFootnotesForNode(
SwRootFrame const& rLayout, SwTextNode const& rTextNode,
std::vector<std::pair<sal_Int32, sal_Int32>> const*const pExtents);
}
// There exists a special container frame on a page for footnotes. It's called
// SwFootnoteContFrame. Each footnote is separated by a SwFootnoteFrame which contains
// the text frames of a footnote. SwFootnoteFrame can be split and will then
// continue on another page.
class SwFootnoteContFrame final : public SwLayoutFrame
{
static SwFootnoteFrame* AddChained(bool bAppend, SwFrame *pNewUpper, bool bDefaultFormat);
public:
SwFootnoteContFrame( SwFrameFormat*, SwFrame* );
const SwFootnoteFrame* FindFootNote() const;
const SwFootnoteFrame* FindEndNote() const;
static inline SwFootnoteFrame* AppendChained(SwFrame* pThis, bool bDefaultFormat);
static inline SwFootnoteFrame* PrependChained(SwFrame* pThis, bool bDefaultFormat);
virtual SwTwips ShrinkFrame( SwTwips, bool bTst = false, bool bInfo = false ) override;
virtual SwTwips GrowFrame(SwTwips, SwResizeLimitReason&, bool bTst, bool bInfo) override;
virtual void Format( vcl::RenderContext* pRenderContext, const SwBorderAttrs *pAttrs = nullptr ) override;
virtual void PaintSwFrameShadowAndBorder(
const SwRect&,
const SwPageFrame* pPage,
const SwBorderAttrs&) const override;
virtual void PaintSubsidiaryLines( const SwPageFrame*, const SwRect& ) const override;
void PaintLine( const SwRect &, const SwPageFrame * ) const;
void dumpAsXml(xmlTextWriterPtr writer = nullptr) const override;
};
inline SwFootnoteFrame* SwFootnoteContFrame::AppendChained(SwFrame* pThis, bool bDefaultFormat)
{
return AddChained(true, pThis, bDefaultFormat);
}
inline SwFootnoteFrame* SwFootnoteContFrame::PrependChained(SwFrame* pThis, bool bDefaultFormat)
{
return AddChained(false, pThis, bDefaultFormat);
}
/// Represents one footnote or endnote in the layout. Typical upper is an SwFootnoteContFrame,
/// typical lower is an SwTextFrame.
class SwFootnoteFrame final : public SwLayoutFrame
{
// Pointer to FootnoteFrame in which the footnote will be continued:
// - 0 no following existent
// - otherwise the following FootnoteFrame
SwFootnoteFrame *mpFollow;
SwFootnoteFrame *mpMaster; // FootnoteFrame from which I am the following
SwContentFrame *mpReference; // in this ContentFrame is the footnote reference
SwTextFootnote *mpAttribute; // footnote attribute (for recognition)
// if true paragraphs in this footnote are NOT permitted to flow backwards
bool mbBackMoveLocked : 1;
// #i49383# - control unlock of position of lower anchored objects.
bool mbUnlockPosOfLowerObjs : 1;
public:
SwFootnoteFrame( SwFrameFormat*, SwFrame*, SwContentFrame*, SwTextFootnote* );
virtual bool IsDeleteForbidden() const override;
virtual void Cut() override;
virtual void Paste( SwFrame* pParent, SwFrame* pSibling = nullptr ) override;
virtual void PaintSubsidiaryLines( const SwPageFrame*, const SwRect& ) const override;
bool operator<( const SwTextFootnote* pTextFootnote ) const;
#ifdef DBG_UTIL
const SwContentFrame *GetRef() const;
SwContentFrame *GetRef();
#else
const SwContentFrame *GetRef() const { return mpReference; }
SwContentFrame *GetRef() { return mpReference; }
#endif
const SwContentFrame *GetRefFromAttr() const;
SwContentFrame *GetRefFromAttr();
const SwFootnoteFrame *GetFollow() const { return mpFollow; }
SwFootnoteFrame *GetFollow() { return mpFollow; }
const SwFootnoteFrame *GetMaster() const { return mpMaster; }
SwFootnoteFrame *GetMaster() { return mpMaster; }
const SwTextFootnote *GetAttr() const { return mpAttribute; }
SwTextFootnote *GetAttr() { return mpAttribute; }
void SetFollow( SwFootnoteFrame *pNew ) { mpFollow = pNew; }
void SetMaster( SwFootnoteFrame *pNew ) { mpMaster = pNew; }
void SetRef ( SwContentFrame *pNew ) { mpReference = pNew; }
void InvalidateNxtFootnoteCnts( SwPageFrame const * pPage );
void LockBackMove() { mbBackMoveLocked = true; }
void UnlockBackMove() { mbBackMoveLocked = false;}
bool IsBackMoveLocked() const { return mbBackMoveLocked; }
// prevents that the last content deletes the SwFootnoteFrame as well (Cut())
void ColLock() { mbColLocked = true; }
void ColUnlock() { mbColLocked = false; }
// #i49383#
void UnlockPosOfLowerObjs()
{
mbUnlockPosOfLowerObjs = true;
}
void KeepLockPosOfLowerObjs()
{
mbUnlockPosOfLowerObjs = false;
}
bool IsUnlockPosOfLowerObjs() const
{
return mbUnlockPosOfLowerObjs;
}
/** search for last content in the current footnote frame
OD 2005-12-02 #i27138#
@return SwContentFrame*
pointer to found last content frame. NULL, if none is found.
*/
SwContentFrame* FindLastContent();
void dumpAsXml(xmlTextWriterPtr writer = nullptr) const override;
void dumpAsXmlAttributes(xmlTextWriterPtr writer) const override;
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */