diff options
Diffstat (limited to 'sw/source/core/text/porfld.hxx')
-rw-r--r-- | sw/source/core/text/porfld.hxx | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/sw/source/core/text/porfld.hxx b/sw/source/core/text/porfld.hxx new file mode 100644 index 0000000000..b923729424 --- /dev/null +++ b/sw/source/core/text/porfld.hxx @@ -0,0 +1,285 @@ +/* -*- 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 <sal/config.h> + +#include <string_view> + +#include <swtypes.hxx> +#include <swfont.hxx> +#include "porexp.hxx" +#include <o3tl/enumarray.hxx> + +class SvxBrushItem; +class SwFormatVertOrient; + +class SwFieldPortion : public SwExpandPortion +{ + friend class SwTextFormatter; +protected: + OUString m_aExpand; // The expanded field + std::unique_ptr<SwFont> m_pFont; // For multi-line fields + TextFrameIndex m_nNextOffset; // Offset of the follow in the original string + TextFrameIndex m_nNextScriptChg; + TextFrameIndex m_nFieldLen; //< Length of field text, 1 for normal fields, any number for input fields + // TODO ^ do we need this as member or is base class len enough? + sal_uInt16 m_nViewWidth; // Screen width for empty fields + bool m_bFollow : 1; // 2nd or later part of a field + bool m_bLeft : 1; // Used by SwNumberPortion + bool m_bHide : 1; // Used by SwNumberPortion + bool m_bCenter : 1; // Used by SwNumberPortion + bool m_bHasFollow : 1; // Continues on the next line + bool m_bAnimated : 1; // Used by SwGrfNumPortion + bool m_bNoPaint : 1; // Used by SwGrfNumPortion + bool m_bReplace : 1; // Used by SwGrfNumPortion + bool m_bNoLength : 1; // HACK for meta suffix (no CH_TXTATR) + bool m_bContentControl = false; + + void SetFont( std::unique_ptr<SwFont> pNew ) { m_pFont = std::move(pNew); } + bool IsNoLength() const { return m_bNoLength; } + void SetNoLength() { m_bNoLength = true; } + +public: + SwFieldPortion( const SwFieldPortion& rField ); + SwFieldPortion(OUString aExpand, std::unique_ptr<SwFont> pFnt = nullptr, TextFrameIndex nLen = TextFrameIndex(1)); + virtual ~SwFieldPortion() override; + + void TakeNextOffset( const SwFieldPortion* pField ); + void CheckScript( const SwTextSizeInfo &rInf ); + bool HasFont() const { return nullptr != m_pFont; } + // #i89179# - made public + const SwFont *GetFont() const { return m_pFont.get(); } + + const OUString& GetExp() const { return m_aExpand; } + virtual bool GetExpText( const SwTextSizeInfo &rInf, OUString &rText ) const override; + virtual bool Format( SwTextFormatInfo &rInf ) override; + virtual void Paint( const SwTextPaintInfo &rInf ) const override; + + // Empty fields are also allowed + virtual SwLinePortion *Compress() override; + + virtual sal_uInt16 GetViewWidth( const SwTextSizeInfo &rInf ) const override; + + bool IsFollow() const { return m_bFollow; } + void SetFollow( bool bNew ) { m_bFollow = bNew; } + + bool IsLeft() const { return m_bLeft; } + void SetLeft( bool bNew ) { m_bLeft = bNew; } + + bool IsHide() const { return m_bHide; } + void SetHide( bool bNew ) { m_bHide = bNew; } + + bool IsCenter() const { return m_bCenter; } + void SetCenter( bool bNew ) { m_bCenter = bNew; } + + bool HasFollow() const { return m_bHasFollow; } + void SetHasFollow( bool bNew ) { m_bHasFollow = bNew; } + + TextFrameIndex GetNextOffset() const { return m_nNextOffset; } + void SetNextOffset(TextFrameIndex nNew) { m_nNextOffset = nNew; } + + TextFrameIndex GetFieldLen() const { return m_nFieldLen; } + + // Field cloner for SplitGlue + virtual SwFieldPortion *Clone( const OUString &rExpand ) const; + + // Extra GetTextSize because of pFnt + virtual SwPosSize GetTextSize( const SwTextSizeInfo &rInfo ) const override; + + // Accessibility: pass information about this portion to the PortionHandler + virtual void HandlePortion( SwPortionHandler& rPH ) const override; + + void SetContentControl(bool bContentControl) { m_bContentControl = bContentControl; } + + void dumpAsXml(xmlTextWriterPtr pWriter, const OUString& rText, + TextFrameIndex& nOffset) const override; +}; + +/** + * Distinguish only for painting/hide + */ +class SwHiddenPortion : public SwFieldPortion +{ +public: + SwHiddenPortion( const OUString &rExpand, std::unique_ptr<SwFont> pFntL = nullptr ) + : SwFieldPortion( rExpand, std::move(pFntL) ) + { SetLen(TextFrameIndex(1)); SetWhichPor( PortionType::Hidden ); } + virtual void Paint( const SwTextPaintInfo &rInf ) const override; + virtual bool GetExpText( const SwTextSizeInfo &rInf, OUString &rText ) const override; + + // Field cloner for SplitGlue + virtual SwFieldPortion *Clone( const OUString &rExpand ) const override; +}; + +class SwNumberPortion : public SwFieldPortion +{ +protected: + sal_uInt16 m_nFixWidth; // See Glues + sal_uInt16 m_nMinDist; // Minimal distance to the text + bool mbLabelAlignmentPosAndSpaceModeActive; + +public: + SwNumberPortion( const OUString &rExpand, + std::unique_ptr<SwFont> pFnt, + const bool bLeft, + const bool bCenter, + const sal_uInt16 nMinDst, + const bool bLabelAlignmentPosAndSpaceModeActive ); + virtual void Paint( const SwTextPaintInfo &rInf ) const override; + virtual TextFrameIndex GetModelPositionForViewPoint(sal_uInt16 nOfst) const override; + virtual bool Format( SwTextFormatInfo &rInf ) override; + + // Field cloner for SplitGlue + virtual SwFieldPortion *Clone( const OUString &rExpand ) const override; + virtual void FormatEOL( SwTextFormatInfo &rInf ) override; +}; + +class SwBulletPortion : public SwNumberPortion +{ +public: + SwBulletPortion( const sal_UCS4 cCh, + std::u16string_view rBulletFollowedBy, + std::unique_ptr<SwFont> pFnt, + const bool bLeft, + const bool bCenter, + const sal_uInt16 nMinDst, + const bool bLabelAlignmentPosAndSpaceModeActive ); +}; + +class SwGrfNumPortion : public SwNumberPortion +{ + std::unique_ptr<SvxBrushItem> m_pBrush; + tools::Long m_nId; // For StopAnimation + SwTwips m_nYPos; // _Always_ contains the current RelPos + SwTwips m_nGrfHeight; + sal_Int16 m_eOrient; +public: + SwGrfNumPortion( const OUString& rGraphicFollowedBy, + const SvxBrushItem* pGrfBrush, + OUString const & referer, + const SwFormatVertOrient* pGrfOrient, + const Size& rGrfSize, + const bool bLeft, + const bool bCenter, + const sal_uInt16 nMinDst, + const bool bLabelAlignmentPosAndSpaceModeActive ); + virtual ~SwGrfNumPortion() override; + virtual void Paint( const SwTextPaintInfo &rInf ) const override; + virtual bool Format( SwTextFormatInfo &rInf ) override; + + void SetBase( tools::Long nLnAscent, tools::Long nLnDescent, + tools::Long nFlyAscent, tools::Long nFlyDescent ); + + void StopAnimation( const OutputDevice* pOut ); + + bool IsAnimated() const { return m_bAnimated; } + void SetAnimated( bool bNew ) { m_bAnimated = bNew; } + void SetRelPos( SwTwips nNew ) { m_nYPos = nNew; } + void SetId( tools::Long nNew ) const + { const_cast<SwGrfNumPortion*>(this)->m_nId = nNew; } + SwTwips GetRelPos() const { return m_nYPos; } + SwTwips GetGrfHeight() const { return m_nGrfHeight; } + sal_Int16 GetOrient() const { return m_eOrient; } +}; + +/** + * Used in for asian layout specialities to display up to six characters + * in 2 rows and 2-3 columns. + * E.g.: <pre> + * A.. A.. A.B A.B A.B.C A.B.C + * ... ..B .C. C.D .D.E. D.E.F + * </pre> + */ +class SwCombinedPortion : public SwFieldPortion +{ + sal_uInt16 m_aPos[6]; // up to six X positions + o3tl::enumarray<SwFontScript,sal_uInt16> m_aWidth; // one width for every scripttype + SwFontScript m_aScrType[6]; // scripttype of every character + sal_uInt16 m_nUpPos; // the Y position of the upper baseline + sal_uInt16 m_nLowPos; // the Y position of the lower baseline + sal_uInt8 m_nProportion; // relative font height +public: + explicit SwCombinedPortion( const OUString &rExpand ); + virtual void Paint( const SwTextPaintInfo &rInf ) const override; + virtual bool Format( SwTextFormatInfo &rInf ) override; + virtual sal_uInt16 GetViewWidth( const SwTextSizeInfo &rInf ) const override; +}; + +namespace sw::mark { class IFieldmark; } + +class SwFieldFormDropDownPortion : public SwFieldPortion +{ +public: + explicit SwFieldFormDropDownPortion(sw::mark::IFieldmark *pFieldMark, const OUString &rExpand) + : SwFieldPortion(rExpand) + , m_pFieldMark(pFieldMark) + { + } + // Field cloner for SplitGlue + virtual SwFieldPortion *Clone( const OUString &rExpand ) const override; + + virtual void Paint( const SwTextPaintInfo &rInf ) const override; + +private: + sw::mark::IFieldmark* m_pFieldMark; +}; + +class SwFieldFormDatePortion : public SwFieldPortion +{ +public: + explicit SwFieldFormDatePortion(sw::mark::IFieldmark *pFieldMark, bool bStart) + : SwFieldPortion("") + , m_pFieldMark(pFieldMark) + , m_bStart(bStart) + { + } + // Field cloner for SplitGlue + virtual SwFieldPortion *Clone( const OUString &rExpand) const override; + + virtual void Paint( const SwTextPaintInfo &rInf ) const override; + +private: + sw::mark::IFieldmark* m_pFieldMark; + bool m_bStart; +}; + +class SwJumpFieldPortion final : public SwFieldPortion +{ +public: + explicit SwJumpFieldPortion(OUString aExpand, OUString aHelp, std::unique_ptr<SwFont> pFont, + sal_uInt32 nFormat) + : SwFieldPortion(std::move(aExpand), std::move(pFont)) + , m_nFormat(nFormat) + , m_sHelp(std::move(aHelp)) + { + } + virtual SwFieldPortion* Clone(const OUString& rExpand) const override; + + virtual void Paint(const SwTextPaintInfo& rInf) const override; + +private: + sal_uInt32 m_nFormat; // SwJumpEditFormat from SwField::GetFormat() + OUString m_sHelp; + + bool DescribePDFControl(const SwTextPaintInfo& rInf) const; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |