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(pTextPortion)); + } + + void Insert(sal_Int32 nPosition, TextPortion* pTextPortion) + { + maPortions.insert(maPortions.begin() + nPosition, + std::unique_ptr(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 + +#include +#include + + +void TextPortionList::DeleteFromPortion(sal_Int32 nDelFrom) +{ + assert((nDelFrom < static_cast(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& 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::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(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(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(p)); -} - -void TextPortionList::Insert(sal_Int32 nPos, TextPortion* p) -{ - maPortions.insert(maPortions.begin()+nPos, std::unique_ptr(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& 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::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