diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:06:44 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:06:44 +0000 |
commit | ed5640d8b587fbcfed7dd7967f3de04b37a76f26 (patch) | |
tree | 7a5f7c6c9d02226d7471cb3cc8fbbf631b415303 /sw/source/core/text/itrtxt.hxx | |
parent | Initial commit. (diff) | |
download | libreoffice-upstream.tar.xz libreoffice-upstream.zip |
Adding upstream version 4:7.4.7.upstream/4%7.4.7upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sw/source/core/text/itrtxt.hxx')
-rw-r--r-- | sw/source/core/text/itrtxt.hxx | 340 |
1 files changed, 340 insertions, 0 deletions
diff --git a/sw/source/core/text/itrtxt.hxx b/sw/source/core/text/itrtxt.hxx new file mode 100644 index 000000000..f36932dbd --- /dev/null +++ b/sw/source/core/text/itrtxt.hxx @@ -0,0 +1,340 @@ +/* -*- 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 . + */ +#pragma once + +#include <swtypes.hxx> +#include "itratr.hxx" +#include "inftxt.hxx" + +struct SwPosition; +struct SwCursorMoveState; +class SwMarginPortion; +class SwFlyPortion; + +class SwTextIter : public SwAttrIter +{ +protected: + SwLineInfo m_aLineInf; + SwTextFrame *m_pFrame; + SwTextInfo *m_pInf; + SwLineLayout *m_pCurr; + SwLineLayout *m_pPrev; + SwTwips m_nFrameStart; + SwTwips m_nY; + SwTwips m_nRegStart; // The register's start position (Y) + TextFrameIndex m_nStart; // Start in the text string, end = pCurr->GetLen() + sal_uInt16 m_nRegDiff; // Register's line distance + sal_uInt16 m_nLineNr; // Line number + bool m_bPrev : 1; + bool m_bRegisterOn : 1; // Keep in register + bool m_bOneBlock : 1; // Justified text: Dispose single words + bool m_bLastBlock : 1; // Justified text: Also the last line + bool m_bLastCenter : 1; // Justified text: Center last line + + SwLineLayout *GetPrev_(); + + // Reset in the first line + void Init(); + void CtorInitTextIter( SwTextFrame *pFrame, SwTextInfo *pInf ); + explicit SwTextIter(SwTextNode const * pTextNode) + : SwAttrIter(pTextNode) + , m_pFrame(nullptr) + , m_pInf(nullptr) + , m_pCurr(nullptr) + , m_pPrev(nullptr) + , m_nFrameStart(0) + , m_nY(0) + , m_nRegStart(0) + , m_nStart(0) + , m_nRegDiff(0) + , m_nLineNr(0) + , m_bPrev(false) + , m_bRegisterOn(false) + , m_bOneBlock(false) + , m_bLastBlock(false) + , m_bLastCenter(false) + { + } +public: + SwTextIter(SwTextFrame *pTextFrame, SwTextInfo *pTextInf) + : SwAttrIter(pTextFrame->GetTextNodeFirst()) + , m_bOneBlock(false) + , m_bLastBlock(false) + , m_bLastCenter(false) + { + CtorInitTextIter(pTextFrame, pTextInf); + } + const SwLineLayout *GetCurr() const { return m_pCurr; } // NEVER 0! + const SwLineLayout *GetNext() const { return m_pCurr->GetNext(); } + const SwLineLayout *GetPrev(); + TextFrameIndex GetLength() const { return m_pCurr->GetLen(); } + sal_uInt16 GetLineNr() const { return m_nLineNr; } + TextFrameIndex GetStart() const { return m_nStart; } + TextFrameIndex GetEnd() const { return GetStart() + GetLength(); } + SwTwips Y() const { return m_nY; } + + SwTwips RegStart() const { return m_nRegStart; } + sal_uInt16 RegDiff() const { return m_nRegDiff; } + bool IsRegisterOn() const { return m_bRegisterOn; } + + SwTextInfo &GetInfo() { return *m_pInf; } + const SwTextInfo &GetInfo() const { return *m_pInf; } + + void Top() { Init(); } + void Bottom(); + const SwLineLayout *Next(); + const SwLineLayout *Prev(); + + // Skips the FlyFrames dummy line + const SwLineLayout *NextLine(); + const SwLineLayout *PrevLine(); + const SwLineLayout *GetNextLine() const; + const SwLineLayout *GetPrevLine(); + + void CharToLine(TextFrameIndex); + void TwipsToLine(const SwTwips); + + // Truncates all after pCurr + void TruncLines( bool bNoteFollow = false ); + + SwTwips GetLineHeight() const { return m_pCurr->GetRealHeight(); } + void CalcAscentAndHeight( SwTwips &rAscent, SwTwips &rHeight ) const; + + // Lots of trouble for querying pCurr == pPara + bool IsFirstTextLine() const + { return m_nStart == GetInfo().GetTextStart() && + !( m_pCurr->IsDummy() && GetNextLine() ); } + + // Replacement for the old IsFirstLine() + bool IsParaLine() const + { return m_pCurr == m_pInf->GetParaPortion(); } + + const SwLineInfo &GetLineInfo() const { return m_aLineInf; } + SwTwips GetFirstPos() const { return m_nFrameStart; } + inline bool SeekAndChg( SwTextSizeInfo &rInf ); + inline bool SeekAndChgBefore( SwTextSizeInfo &rInf ); + inline bool SeekStartAndChg( SwTextSizeInfo &rInf, const bool bPara=false ); + + SwTextFrame *GetTextFrame() { return m_pFrame; } + const SwTextFrame *GetTextFrame() const { return m_pFrame; } + + // Counts consecutive hyphens in order to be within the boundary given by MaxHyphens + void CntHyphens( sal_uInt8 &nEndCnt, sal_uInt8 &nMidCnt) const; +}; + +class SwTextMargin : public SwTextIter +{ +private: + SwTwips mnLeft; + SwTwips mnRight; + SwTwips mnFirst; + sal_uInt16 mnDropLeft; + sal_uInt16 mnDropHeight; + sal_uInt16 mnDropDescent; + sal_uInt16 mnDropLines; + SvxAdjust mnAdjust; + // #i91133# + SwTwips mnTabLeft; + +protected: + // For FormatQuoVadis + void Right( const SwTwips nNew ) { mnRight = nNew; } + + void CtorInitTextMargin( SwTextFrame *pFrame, SwTextSizeInfo *pInf ); + explicit SwTextMargin(SwTextNode const * pTextNode) + : SwTextIter(pTextNode) + , mnLeft(0) + , mnRight(0) + , mnFirst(0) + , mnDropLeft(0) + , mnDropHeight(0) + , mnDropDescent(0) + , mnDropLines(0) + , mnAdjust(SvxAdjust::Left) + , mnTabLeft(0) + { + } +public: + SwTextMargin(SwTextFrame *pTextFrame, SwTextSizeInfo *pTextSizeInf) + : SwTextIter(pTextFrame->GetTextNodeFirst()) + { + CtorInitTextMargin( pTextFrame, pTextSizeInf ); + } + inline SwTwips GetLeftMargin() const; + inline SwTwips Left() const; + SwTwips Right() const { return mnRight; } + SwTwips FirstLeft() const { return mnFirst; } + SwTwips CurrWidth() const { return m_pCurr->PrtWidth(); } + SwTwips GetLineStart() const; + SwTwips GetLineEnd() const { return GetLineStart() + CurrWidth(); } + Point GetTopLeft() const { return Point( GetLineStart(), Y() ); } + bool IsOneBlock() const { return m_bOneBlock; } + bool IsLastBlock() const { return m_bLastBlock; } + bool IsLastCenter() const { return m_bLastCenter; } + SvxAdjust GetAdjust() const { return mnAdjust; } + sal_uInt16 GetLineWidth() const + { return sal_uInt16( Right() - GetLeftMargin() + 1 ); } + SwTwips GetLeftMin() const { return std::min(mnFirst, mnLeft); } + bool HasNegFirst() const { return mnFirst < mnLeft; } + + // #i91133# + SwTwips GetTabLeft() const + { + return mnTabLeft; + } + // DropCaps + sal_uInt16 GetDropLines() const { return mnDropLines; } + void SetDropLines( const sal_uInt16 nNew ) { mnDropLines = nNew; } + sal_uInt16 GetDropLeft() const { return mnDropLeft; } + sal_uInt16 GetDropHeight() const { return mnDropHeight; } + void SetDropHeight( const sal_uInt16 nNew ) { mnDropHeight = nNew; } + sal_uInt16 GetDropDescent() const { return mnDropDescent; } + void SetDropDescent( const sal_uInt16 nNew ) { mnDropDescent = nNew; } + void DropInit(); + + // Returns the TextPos for start and end of the current line without whitespace + // Implemented in frminf.cxx + TextFrameIndex GetTextStart() const; + TextFrameIndex GetTextEnd() const; + + SwTextSizeInfo &GetInfo() + { return static_cast<SwTextSizeInfo&>(SwTextIter::GetInfo()); } + const SwTextSizeInfo &GetInfo() const + { return static_cast<const SwTextSizeInfo&>(SwTextIter::GetInfo()); } + +}; + +class SwTextAdjuster : public SwTextMargin +{ + // Adjusts the portion, if we have adjustment and FlyFrames + void CalcFlyAdjust( SwLineLayout *pCurr ); + + // Calls SplitGlues and CalcBlockAdjust + void FormatBlock( ); + + // Creates the glue chain for short lines + SwMarginPortion* CalcRightMargin( SwLineLayout *pCurr, SwTwips nReal = 0 ); + + // Calculate the adjustment (FlyPortions) + SwFlyPortion *CalcFlyPortion( const tools::Long nRealWidth, + const SwRect &rCurrRect ); + +protected: + explicit SwTextAdjuster(SwTextNode const * pTextNode) : SwTextMargin(pTextNode) { } + // Creates the Glues for adjusted paragraphs + void CalcNewBlock( SwLineLayout *pCurr, const SwLinePortion *pStopAt, + SwTwips nReal = 0, bool bSkipKashida = false ); + SwTwips CalcKanaAdj( SwLineLayout *pCurr ); + +public: + // Is overloaded by SwTextFormatter due to UpdatePos + void CalcAdjLine( SwLineLayout *pCurr ); + + // For adjusting afterwards + void GetAdjusted() const + { + if( m_pCurr->IsFormatAdj() ) + const_cast<SwTextAdjuster*>(this)->CalcAdjLine( m_pCurr ); + } + + // Special treatment for DropCaps + void CalcDropAdjust(); + void CalcDropRepaint(); +}; + +class SwTextCursor : public SwTextAdjuster +{ + // A small helper-class to save SwTextCursor member, manipulate them + // and to restore them + friend class SwTextCursorSave; + + // Ambiguities + static bool s_bRightMargin; + void GetCharRect_(SwRect *, TextFrameIndex, SwCursorMoveState *); +protected: + void CtorInitTextCursor( SwTextFrame *pFrame, SwTextSizeInfo *pInf ); + explicit SwTextCursor(SwTextNode const * pTextNode) : SwTextAdjuster(pTextNode) { } +public: + SwTextCursor( SwTextFrame *pTextFrame, SwTextSizeInfo *pTextSizeInf ) + : SwTextAdjuster(pTextFrame->GetTextNodeFirst()) + { + CtorInitTextCursor(pTextFrame, pTextSizeInf); + } + void GetCharRect(SwRect *, TextFrameIndex, SwCursorMoveState* = nullptr, + const tools::Long nMax = 0 ); + void GetEndCharRect(SwRect *, TextFrameIndex, SwCursorMoveState* = nullptr, + const tools::Long nMax = 0 ); + TextFrameIndex GetModelPositionForViewPoint( SwPosition *pPos, const Point &rPoint, + bool bChgNode, SwCursorMoveState* = nullptr ) const; + // Respects ambiguities: For the implementation see below + const SwLineLayout *CharCursorToLine(TextFrameIndex const nPos); + + // calculates baseline for portion rPor + // bAutoToCentered indicates, if AUTOMATIC mode means CENTERED or BASELINE + SwTwips AdjustBaseLine( const SwLineLayout& rLine, const SwLinePortion* pPor, + SwTwips nPorHeight = 0, SwTwips nAscent = 0, + const bool bAutoToCentered = false ) const; + + static void SetRightMargin( const bool bNew ){ s_bRightMargin = bNew; } + static bool IsRightMargin() { return s_bRightMargin; } +}; + +// Change current output device to printer, this has to be done before +// formatting. +class SwHookOut +{ + SwTextSizeInfo* pInf; + VclPtr<OutputDevice> pOut; + bool bOnWin; +public: + explicit SwHookOut( SwTextSizeInfo& rInfo ); + ~SwHookOut(); +}; + +inline bool SwTextIter::SeekAndChg( SwTextSizeInfo &rInf ) +{ + return SeekAndChgAttrIter( rInf.GetIdx(), rInf.GetOut() ); +} + +inline bool SwTextIter::SeekAndChgBefore( SwTextSizeInfo &rInf ) +{ + if ( rInf.GetIdx() ) + return SeekAndChgAttrIter(rInf.GetIdx() - TextFrameIndex(1), rInf.GetOut()); + else + return SeekAndChgAttrIter( rInf.GetIdx(), rInf.GetOut() ); +} + +inline bool SwTextIter::SeekStartAndChg( SwTextSizeInfo &rInf, const bool bPara ) +{ + return SeekStartAndChgAttrIter( rInf.GetOut(), bPara ); +} + +inline SwTwips SwTextMargin::GetLeftMargin() const +{ + return IsFirstTextLine() ? mnFirst : Left(); +} + +inline SwTwips SwTextMargin::Left() const +{ + return (mnDropLines >= m_nLineNr && 1 != m_nLineNr) ? mnFirst + mnDropLeft : mnLeft; +} + + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |