editeng/Library_editeng.mk | 1 editeng/inc/ParagraphPortion.hxx | 133 +++++++++++++++++++++++++++++ editeng/inc/TextPortionList.hxx | 32 +++++- editeng/inc/editdoc.hxx | 104 ---------------------- editeng/source/editeng/TextPortionList.cxx | 95 ++++++++++++++++++++ editeng/source/editeng/editdoc.cxx | 113 ------------------------ solenv/clang-format/excludelist | 1 7 files changed, 254 insertions(+), 225 deletions(-)
New commits: commit 916268c70a5673680c86eaac11c543fd45b90eb3 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Fri Dec 29 20:54:43 2023 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Mon Jan 1 04:34:20 2024 +0100 editeng: move ParaPortion into its own header file Change-Id: I3fefe4a9fc5d391b1c3af335893a084eaeddba4d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161475 Tested-by: Tomaž Vajngerl <qui...@gmail.com> Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/editeng/inc/ParagraphPortion.hxx b/editeng/inc/ParagraphPortion.hxx new file mode 100644 index 000000000000..93eb8356f611 --- /dev/null +++ b/editeng/inc/ParagraphPortion.hxx @@ -0,0 +1,133 @@ +/* -*- 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 "EditLineList.hxx" +#include "TextPortionList.hxx" + +struct ScriptTypePosInfo +{ + short nScriptType; + sal_Int32 nStartPos; + sal_Int32 nEndPos; + + ScriptTypePosInfo(short Type, sal_Int32 Start, sal_Int32 End) + : nScriptType(Type) + , nStartPos(Start) + , nEndPos(End) + { + } +}; + +typedef std::vector<ScriptTypePosInfo> ScriptTypePosInfos; + +struct WritingDirectionInfo +{ + sal_uInt8 nType; + sal_Int32 nStartPos; + sal_Int32 nEndPos; + + WritingDirectionInfo(sal_uInt8 Type, sal_Int32 Start, sal_Int32 End) + : nType(Type) + , nStartPos(Start) + , nEndPos(End) + { + } +}; + +typedef std::vector<WritingDirectionInfo> WritingDirectionInfos; + +class ParaPortion +{ + friend class ImpEditEngine; // to adjust the height +private: + EditLineList aLineList; + TextPortionList aTextPortionList; + ContentNode* pNode; + tools::Long nHeight; + + ScriptTypePosInfos aScriptInfos; + WritingDirectionInfos aWritingDirectionInfos; + + sal_Int32 nInvalidPosStart; + sal_Int32 nFirstLineOffset; // For Writer-LineSpacing-Interpretation + sal_Int32 nBulletX; + sal_Int32 nInvalidDiff; + + bool bInvalid : 1; + bool bSimple : 1; // only linear Tap + bool bVisible : 1; // Belongs to the node! + bool bForceRepaint : 1; + + ParaPortion(const ParaPortion&) = delete; + +public: + ParaPortion(ContentNode* pNode); + ~ParaPortion(); + + sal_Int32 GetLineNumber(sal_Int32 nIndex) const; + + EditLineList& GetLines() { return aLineList; } + const EditLineList& GetLines() const { return aLineList; } + + bool IsInvalid() const { return bInvalid; } + bool IsSimpleInvalid() const { return bSimple; } + void SetValid() + { + bInvalid = false; + bSimple = true; + } + + bool MustRepaint() const { return bForceRepaint; } + void SetMustRepaint(bool bRP) { bForceRepaint = bRP; } + + sal_Int32 GetBulletX() const { return nBulletX; } + void SetBulletX(sal_Int32 n) { nBulletX = n; } + + void MarkInvalid(sal_Int32 nStart, sal_Int32 nDiff); + void MarkSelectionInvalid(sal_Int32 nStart); + + void SetVisible(bool bVisible); + bool IsVisible() const { return bVisible; } + + bool IsEmpty() { return GetTextPortions().Count() == 1 && GetTextPortions()[0].GetLen() == 0; } + + tools::Long GetHeight() const { return (bVisible ? nHeight : 0); } + sal_Int32 GetFirstLineOffset() const { return (bVisible ? nFirstLineOffset : 0); } + void ResetHeight() + { + nHeight = 0; + nFirstLineOffset = 0; + } + + ContentNode* GetNode() const { return pNode; } + TextPortionList& GetTextPortions() { return aTextPortionList; } + const TextPortionList& GetTextPortions() const { return aTextPortionList; } + + sal_Int32 GetInvalidPosStart() const { return nInvalidPosStart; } + short GetInvalidDiff() const { return nInvalidDiff; } + + void CorrectValuesBehindLastFormattedLine(sal_Int32 nLastFormattedLine); +#if OSL_DEBUG_LEVEL > 0 + static bool DbgCheckTextPortions(ParaPortion const&); +#endif +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/editeng/inc/editdoc.hxx b/editeng/inc/editdoc.hxx index f81eac050b76..1b93d52a6a88 100644 --- a/editeng/inc/editdoc.hxx +++ b/editeng/inc/editdoc.hxx @@ -37,6 +37,7 @@ #include "EditLineList.hxx" #include "EditPaM.hxx" #include "EditSelection.hxx" +#include "ParagraphPortion.hxx" #include <cstddef> #include <memory> @@ -58,39 +59,6 @@ EditCharAttrib* MakeCharAttrib( SfxItemPool& rPool, const SfxPoolItem& rAttr, sa class EditDoc; -struct ScriptTypePosInfo -{ - short nScriptType; - sal_Int32 nStartPos; - sal_Int32 nEndPos; - - ScriptTypePosInfo( short Type, sal_Int32 Start, sal_Int32 End ) - : nScriptType(Type) - , nStartPos(Start) - , nEndPos(End) - { - } -}; - -typedef std::vector<ScriptTypePosInfo> ScriptTypePosInfos; - -struct WritingDirectionInfo -{ - sal_uInt8 nType; - sal_Int32 nStartPos; - sal_Int32 nEndPos; - - WritingDirectionInfo( sal_uInt8 Type, sal_Int32 Start, sal_Int32 End ) - : nType(Type) - , nStartPos(Start) - , nEndPos(End) - { - } -}; - - -typedef std::vector<WritingDirectionInfo> WritingDirectionInfos; - class ContentAttribsInfo { private: @@ -114,76 +82,6 @@ enum class DeleteMode { Simple, RestOfWord, RestOfContent }; -class ParaPortion -{ - friend class ImpEditEngine; // to adjust the height -private: - EditLineList aLineList; - TextPortionList aTextPortionList; - ContentNode* pNode; - tools::Long nHeight; - - ScriptTypePosInfos aScriptInfos; - WritingDirectionInfos aWritingDirectionInfos; - - sal_Int32 nInvalidPosStart; - sal_Int32 nFirstLineOffset; // For Writer-LineSpacing-Interpretation - sal_Int32 nBulletX; - sal_Int32 nInvalidDiff; - - bool bInvalid : 1; - bool bSimple : 1; // only linear Tap - bool bVisible : 1; // Belongs to the node! - bool bForceRepaint : 1; - - ParaPortion( const ParaPortion& ) = delete; - -public: - ParaPortion( ContentNode* pNode ); - ~ParaPortion(); - - sal_Int32 GetLineNumber( sal_Int32 nIndex ) const; - - EditLineList& GetLines() { return aLineList; } - const EditLineList& GetLines() const { return aLineList; } - - bool IsInvalid() const { return bInvalid; } - bool IsSimpleInvalid() const { return bSimple; } - void SetValid() { bInvalid = false; bSimple = true;} - - bool MustRepaint() const { return bForceRepaint; } - void SetMustRepaint( bool bRP ) { bForceRepaint = bRP; } - - sal_Int32 GetBulletX() const { return nBulletX; } - void SetBulletX( sal_Int32 n ) { nBulletX = n; } - - void MarkInvalid( sal_Int32 nStart, sal_Int32 nDiff); - void MarkSelectionInvalid( sal_Int32 nStart ); - - void SetVisible( bool bVisible ); - bool IsVisible() const { return bVisible; } - - bool IsEmpty() { return GetTextPortions().Count() == 1 && GetTextPortions()[0].GetLen() == 0; } - - tools::Long GetHeight() const { return ( bVisible ? nHeight : 0 ); } - sal_Int32 GetFirstLineOffset() const { return ( bVisible ? nFirstLineOffset : 0 ); } - void ResetHeight() { nHeight = 0; nFirstLineOffset = 0; } - - ContentNode* GetNode() const { return pNode; } - TextPortionList& GetTextPortions() { return aTextPortionList; } - const TextPortionList& GetTextPortions() const { return aTextPortionList; } - - sal_Int32 GetInvalidPosStart() const { return nInvalidPosStart; } - short GetInvalidDiff() const { return nInvalidDiff; } - - void CorrectValuesBehindLastFormattedLine( sal_Int32 nLastFormattedLine ); -#if OSL_DEBUG_LEVEL > 0 - static bool DbgCheckTextPortions(ParaPortion const&); -#endif -}; - - - class ParaPortionList { mutable sal_Int32 nLastCache; commit 0020f05df2e7fc739e5e017e035efbe3c9bc8b35 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Fri Dec 29 17:01:03 2023 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Mon Jan 1 04:34:06 2024 +0100 editeng: move impl. of TextPortionList methods to own cxx file Also move some simple methods to header file and clean-up the constructors and destructors. Change-Id: I5113d785ecc71d36b4c6a480b15427ca68eb2e0b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161474 Tested-by: Tomaž Vajngerl <qui...@gmail.com> Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/editeng/Library_editeng.mk b/editeng/Library_editeng.mk index 49225b910d14..d9d1124bbb79 100644 --- a/editeng/Library_editeng.mk +++ b/editeng/Library_editeng.mk @@ -75,6 +75,7 @@ $(eval $(call gb_Library_add_exception_objects,editeng,\ editeng/source/editeng/misspellrange \ editeng/source/editeng/section \ editeng/source/editeng/textconv \ + editeng/source/editeng/TextPortionList \ editeng/source/items/borderline \ editeng/source/items/bulitem \ editeng/source/items/CustomPropertyField \ diff --git a/editeng/inc/TextPortionList.hxx b/editeng/inc/TextPortionList.hxx index 3e2272f4de9c..b25f4156155b 100644 --- a/editeng/inc/TextPortionList.hxx +++ b/editeng/inc/TextPortionList.hxx @@ -28,21 +28,35 @@ class TextPortionList PortionsType maPortions; public: - TextPortionList(); - ~TextPortionList(); + TextPortionList() = default; + + void Reset() { maPortions.clear(); } - void Reset(); sal_Int32 FindPortion(sal_Int32 nCharPos, sal_Int32& rPortionStart, bool bPreferStartingPortion = false) const; sal_Int32 GetStartPos(sal_Int32 nPortion); void DeleteFromPortion(sal_Int32 nDelFrom); - sal_Int32 Count() const; - const TextPortion& operator[](sal_Int32 nPos) const; - TextPortion& operator[](sal_Int32 nPos); - void Append(TextPortion* p); - void Insert(sal_Int32 nPos, TextPortion* p); - void Remove(sal_Int32 nPos); + sal_Int32 Count() const { return sal_Int32(maPortions.size()); } + + const TextPortion& operator[](sal_Int32 nPosition) const { return *maPortions[nPosition]; } + + TextPortion& operator[](sal_Int32 nPosition) { return *maPortions[nPosition]; } + + void Append(TextPortion* pTextPortion) + { + maPortions.push_back(std::unique_ptr<TextPortion>(pTextPortion)); + } + + void Insert(sal_Int32 nPosition, TextPortion* pTextPortion) + { + maPortions.insert(maPortions.begin() + nPosition, + std::unique_ptr<TextPortion>(pTextPortion)); + } + + void Remove(sal_Int32 nPosition) { maPortions.erase(maPortions.begin() + nPosition); } + sal_Int32 GetPos(const TextPortion* p) const; }; + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/editeng/source/editeng/TextPortionList.cxx b/editeng/source/editeng/TextPortionList.cxx new file mode 100644 index 000000000000..ca9d68159a5a --- /dev/null +++ b/editeng/source/editeng/TextPortionList.cxx @@ -0,0 +1,95 @@ +/* -*- 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 . + */ + +#include <TextPortionList.hxx> + +#include <EditLine.hxx> +#include <osl/diagnose.h> + + +void TextPortionList::DeleteFromPortion(sal_Int32 nDelFrom) +{ + assert((nDelFrom < static_cast<sal_Int32>(maPortions.size())) || ((nDelFrom == 0) && maPortions.empty())); + PortionsType::iterator it = maPortions.begin(); + std::advance(it, nDelFrom); + maPortions.erase(it, maPortions.end()); +} + +namespace { + +class FindTextPortionByAddress +{ + const TextPortion* mp; +public: + explicit FindTextPortionByAddress(const TextPortion* p) : mp(p) {} + bool operator() (const std::unique_ptr<TextPortion>& v) const + { + return v.get() == mp; + } +}; + +} + +sal_Int32 TextPortionList::GetPos(const TextPortion* p) const +{ + PortionsType::const_iterator it = + std::find_if(maPortions.begin(), maPortions.end(), FindTextPortionByAddress(p)); + + if (it == maPortions.end()) + return std::numeric_limits<sal_Int32>::max(); // not found. + + return std::distance(maPortions.begin(), it); +} + +sal_Int32 TextPortionList::FindPortion( + sal_Int32 nCharPos, sal_Int32& nPortionStart, bool bPreferStartingPortion) const +{ + // When nCharPos at portion limit, the left portion is found + sal_Int32 nTmpPos = 0; + sal_Int32 n = maPortions.size(); + for (sal_Int32 i = 0; i < n; ++i) + { + const TextPortion& rPortion = *maPortions[i]; + nTmpPos = nTmpPos + rPortion.GetLen(); + if ( nTmpPos >= nCharPos ) + { + // take this one if we don't prefer the starting portion, or if it's the last one + if ( ( nTmpPos != nCharPos ) || !bPreferStartingPortion || ( i == n-1 ) ) + { + nPortionStart = nTmpPos - rPortion.GetLen(); + return i; + } + } + } + OSL_FAIL( "FindPortion: Not found!" ); + return n - 1; +} + +sal_Int32 TextPortionList::GetStartPos(sal_Int32 nPortion) +{ + sal_Int32 nPos = 0; + for (sal_Int32 i = 0; i < nPortion; ++i) + { + const TextPortion& rPortion = *maPortions[i]; + nPos = nPos + rPortion.GetLen(); + } + return nPos; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/editeng/source/editeng/editdoc.cxx b/editeng/source/editeng/editdoc.cxx index 1b10e1cfeb59..6091c78ede4c 100644 --- a/editeng/source/editeng/editdoc.cxx +++ b/editeng/source/editeng/editdoc.cxx @@ -367,119 +367,6 @@ EditCharAttrib* MakeCharAttrib( SfxItemPool& rPool, const SfxPoolItem& rAttr, sa return nullptr; } -TextPortionList::TextPortionList() -{ -} - -TextPortionList::~TextPortionList() -{ - Reset(); -} - -void TextPortionList::Reset() -{ - maPortions.clear(); -} - -void TextPortionList::DeleteFromPortion(sal_Int32 nDelFrom) -{ - assert((nDelFrom < static_cast<sal_Int32>(maPortions.size())) || ((nDelFrom == 0) && maPortions.empty())); - PortionsType::iterator it = maPortions.begin(); - std::advance(it, nDelFrom); - maPortions.erase(it, maPortions.end()); -} - -sal_Int32 TextPortionList::Count() const -{ - return static_cast<sal_Int32>(maPortions.size()); -} - -const TextPortion& TextPortionList::operator[](sal_Int32 nPos) const -{ - return *maPortions[nPos]; -} - -TextPortion& TextPortionList::operator[](sal_Int32 nPos) -{ - return *maPortions[nPos]; -} - -void TextPortionList::Append(TextPortion* p) -{ - maPortions.push_back(std::unique_ptr<TextPortion>(p)); -} - -void TextPortionList::Insert(sal_Int32 nPos, TextPortion* p) -{ - maPortions.insert(maPortions.begin()+nPos, std::unique_ptr<TextPortion>(p)); -} - -void TextPortionList::Remove(sal_Int32 nPos) -{ - maPortions.erase(maPortions.begin()+nPos); -} - -namespace { - -class FindTextPortionByAddress -{ - const TextPortion* mp; -public: - explicit FindTextPortionByAddress(const TextPortion* p) : mp(p) {} - bool operator() (const std::unique_ptr<TextPortion>& v) const - { - return v.get() == mp; - } -}; - -} - -sal_Int32 TextPortionList::GetPos(const TextPortion* p) const -{ - PortionsType::const_iterator it = - std::find_if(maPortions.begin(), maPortions.end(), FindTextPortionByAddress(p)); - - if (it == maPortions.end()) - return std::numeric_limits<sal_Int32>::max(); // not found. - - return std::distance(maPortions.begin(), it); -} - -sal_Int32 TextPortionList::FindPortion( - sal_Int32 nCharPos, sal_Int32& nPortionStart, bool bPreferStartingPortion) const -{ - // When nCharPos at portion limit, the left portion is found - sal_Int32 nTmpPos = 0; - sal_Int32 n = maPortions.size(); - for (sal_Int32 i = 0; i < n; ++i) - { - const TextPortion& rPortion = *maPortions[i]; - nTmpPos = nTmpPos + rPortion.GetLen(); - if ( nTmpPos >= nCharPos ) - { - // take this one if we don't prefer the starting portion, or if it's the last one - if ( ( nTmpPos != nCharPos ) || !bPreferStartingPortion || ( i == n-1 ) ) - { - nPortionStart = nTmpPos - rPortion.GetLen(); - return i; - } - } - } - OSL_FAIL( "FindPortion: Not found!" ); - return n - 1; -} - -sal_Int32 TextPortionList::GetStartPos(sal_Int32 nPortion) -{ - sal_Int32 nPos = 0; - for (sal_Int32 i = 0; i < nPortion; ++i) - { - const TextPortion& rPortion = *maPortions[i]; - nPos = nPos + rPortion.GetLen(); - } - return nPos; -} - ParaPortion::ParaPortion( ContentNode* pN ) : pNode(pN), nHeight(0), diff --git a/solenv/clang-format/excludelist b/solenv/clang-format/excludelist index 9b416bc3e0ce..6f472b55d07a 100644 --- a/solenv/clang-format/excludelist +++ b/solenv/clang-format/excludelist @@ -3419,6 +3419,7 @@ editeng/source/editeng/misspellrange.cxx editeng/source/editeng/section.cxx editeng/source/editeng/textconv.cxx editeng/source/editeng/textconv.hxx +editeng/source/editeng/TextPortionList.cxx editeng/source/items/CustomPropertyField.cxx editeng/source/items/borderline.cxx editeng/source/items/bulitem.cxx