diff options
Diffstat (limited to 'sc/source/ui/inc/TableFillingAndNavigationTools.hxx')
-rw-r--r-- | sc/source/ui/inc/TableFillingAndNavigationTools.hxx | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/sc/source/ui/inc/TableFillingAndNavigationTools.hxx b/sc/source/ui/inc/TableFillingAndNavigationTools.hxx new file mode 100644 index 0000000000..ab79115118 --- /dev/null +++ b/sc/source/ui/inc/TableFillingAndNavigationTools.hxx @@ -0,0 +1,159 @@ +/* -*- 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/. + * + */ + +#pragma once + +#include <address.hxx> +#include <rangelst.hxx> + +#include <map> +#include <vector> + +class FormulaTemplate +{ +private: + OUString mTemplate; + ScDocument* mpDoc; + bool mbUse3D; + + typedef std::map<OUString, ScRange> RangeReplacementMap; + typedef std::map<OUString, ScAddress> AddressReplacementMap; + + AddressReplacementMap mAddressReplacementMap; + RangeReplacementMap mRangeReplacementMap; + +public: + FormulaTemplate(ScDocument* pDoc); + + void setTemplate(const OUString& aTemplate); + void setTemplate(const char* aTemplate); + const OUString& getTemplate(); + + void autoReplaceRange(const OUString& aVariable, const ScRange& rRange); + void autoReplaceAddress(const OUString& aVariable, ScAddress const & aAddress); + void autoReplaceUses3D(bool bUse3D) { mbUse3D = bUse3D; } + + void applyRange(std::u16string_view aVariable, const ScRange& aRange, bool b3D = true); + void applyRangeList(std::u16string_view aVariable, const ScRangeList& aRangeList, sal_Unicode cDelimiter ); + void applyAddress(std::u16string_view aVariable, const ScAddress& aAddress, bool b3D = true); + void applyString(std::u16string_view aVariable, std::u16string_view aValue); + void applyNumber(std::u16string_view aVariable, sal_Int32 aValue); +}; + +class AddressWalker +{ +public: + std::vector<ScAddress> mAddressStack; + + ScAddress mCurrentAddress; + ScAddress mMinimumAddress; + ScAddress mMaximumAddress; + + AddressWalker(const ScAddress& aInitialAddress); + + ScAddress current(SCCOL aRelativeCol = 0, SCROW aRelativeRow = 0, SCTAB aRelativeTab = 0); + + void reset(); + void resetColumn(); + void resetRow(); + void nextColumn(); + void nextRow(); + void newLine(); + void push(SCCOL aRelativeCol = 0, SCROW aRelativeRow = 0, SCTAB aRelativeTab = 0); +}; + +class AddressWalkerWriter : public AddressWalker +{ + ScDocShell* mpDocShell; + ScDocument& mrDocument; + formula::FormulaGrammar::Grammar meGrammar; + +public: + AddressWalkerWriter(const ScAddress& aInitialAddress, ScDocShell* pDocShell, ScDocument& rDocument, + formula::FormulaGrammar::Grammar eGrammar ); + + void writeFormula(const OUString& aFormula); + void writeFormulas(const std::vector<OUString>& rFormulas); + void writeMatrixFormula(const OUString& aFormula, SCCOL nCols = 1, SCROW nRows = 1); + void writeString(const OUString& aString); + void writeString(const char* aCharArray); + void writeBoldString(const OUString& aString); + void writeValue(double aValue); +}; + +class DataCellIterator final +{ +private: + ScRange mInputRange; + bool mByColumn; + SCCOL mCol; + SCROW mRow; + +public: + DataCellIterator(const ScRange& aInputRange, bool aByColumn); + + bool hasNext() const; + ScAddress get(); + void next(); + ScAddress getRelative(int aDelta); +}; + +class DataRangeIterator +{ +protected: + ScRange mInputRange; + sal_Int32 mIndex; + +public: + DataRangeIterator(const ScRange& aInputRange); + virtual ~DataRangeIterator(); + + virtual bool hasNext() = 0; + virtual ScRange get() = 0; + virtual size_t size() = 0; + virtual void next() = 0; + virtual void reset() = 0; + + sal_Int32 index(); + + virtual DataCellIterator iterateCells() = 0; +}; + +class DataRangeByColumnIterator final : public DataRangeIterator +{ + SCCOL mCol; + +public: + DataRangeByColumnIterator(const ScRange& aInputRange); + + virtual bool hasNext() override; + virtual void next() override; + virtual ScRange get() override; + virtual size_t size() override; + virtual void reset() override; + virtual DataCellIterator iterateCells() override; +}; + +class DataRangeByRowIterator final : public DataRangeIterator +{ + SCROW mRow; + +public: + DataRangeByRowIterator(const ScRange& aInputRange); + + virtual bool hasNext() override; + virtual void next() override; + virtual ScRange get() override; + virtual size_t size() override; + virtual void reset() override; + virtual DataCellIterator iterateCells() override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |