/* * (c) Copyright Ascensio System SIA 2010-2023 * * This program is a free software product. You can redistribute it and/or * modify it under the terms of the GNU Affero General Public License (AGPL) * version 3 as published by the Free Software Foundation. In accordance with * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect * that Ascensio System SIA expressly excludes the warranty of non-infringement * of any third-party rights. * * This program is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html * * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish * street, Riga, Latvia, EU, LV-1050. * * The interactive user interfaces in modified source and object code versions * of the Program must display Appropriate Legal Notices, as required under * Section 5 of the GNU AGPL version 3. * * Pursuant to Section 7(b) of the License you must retain the original Product * logo when distributing the program. Pursuant to Section 7(e) we decline to * grant you any rights under trademark law for use of our trademarks. * * All the Product's GUI elements, including illustrations and icon sets, as * well as technical writing content are licensed under the terms of the * Creative Commons Attribution-ShareAlike 4.0 International. See the License * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * */ #pragma once #include #include #include #include #include #include #include "../../../../DesktopEditor/xml/include/xmlwriter.h" namespace OdfCustomShape { class CElement; enum class TypeElement { //name class NumberOrName, ArithmeticOperation, Function, Bracket, //arithmetic sign plus, minus, division, multiplication, //function sqrt, abs, sin, cos, tan, min, max, If, atan, atan2, logwidth, logheight, pi, empty, comma, }; class CSMReader { public: CSMReader(const std::wstring& wsStarMath, const std::wstring& wsLeft,const std::wstring& wsTop,const std::wstring& wsRight,const std::wstring& wsBottom); ~CSMReader(); std::wstring GetElement(std::wstring::iterator& itStart, std::wstring::iterator& itEnd); CElement* ReadingElement(); bool ReadingNextElement(); bool CheckIteratorPosition(); std::wstring GetElement(); void ClearElement(); void FindingTheEndOfTheBrackets(); void RemovingTheParenthesisIterator(); void SetDoubleSign(const bool& bDoubleSign); bool GetDoubleSign(); std::wstring GetLeft(); std::wstring GetTop(); std::wstring GetRight(); std::wstring GetBottom(); private: std::wstring m_Formula; std::wstring::iterator m_itStart; std::wstring::iterator m_itEnd,m_itEndForBrecket; std::stack m_stEndBrecket; CElement* m_pElement; bool m_bDoubleSign; std::wstring m_wsElement,m_wsLeft,m_wsTop,m_wsRight,m_wsBottom; }; class SMCustomShapePars { public: SMCustomShapePars(); ~SMCustomShapePars(); void StartParsSMCustomShape(const std::wstring& wsFormula, const std::wstring &wsLeft, const std::wstring &wsTop, const std::wstring &wsRight, const std::wstring &wsBottom); static CElement* ParseElement(CSMReader* pReader); static void ParsString(CSMReader* pReader, std::vector& arVec); std::vector& GetVector(); private: std::vector m_arVecElements; }; class SMCustomShapeConversion { public: SMCustomShapeConversion(); ~SMCustomShapeConversion(); void StartConversion(std::vector& arElements, const std::wstring& wsFormulaName = L""); std::wstring GetStringXml(); static void WritingFormulaXml(XmlUtils::CXmlWriter* pXmlWriter,const std::wstring& wsNameFormula,const std::wstring& wsFormula); static std::wstring ParsFormulaName(const std::wstring& wsFormulaName, std::wstring& wsName); private: XmlUtils::CXmlWriter* m_pXmlWriter; }; class CElement { public: CElement(); virtual ~CElement(); virtual void Parse(CSMReader* pReader) = 0; virtual void ConversionOOXml(XmlUtils::CXmlWriter* pXmlWriter,const std::wstring& wsName = L"") = 0; static CElement* CreateElement(const std::wstring& wsElement); void SetBaseType(const TypeElement& enType); TypeElement GetBaseType(); void SetNameFormula(const std::wstring& wsName); std::wstring GetNameFormula(); private: TypeElement m_enBaseType; std::wstring m_wsNameFormula; }; class CElementNumber:public CElement { public: CElementNumber(); CElementNumber(const std::wstring& wsName); virtual ~CElementNumber(); void Parse(CSMReader* pReader) override; void ConversionOOXml(XmlUtils::CXmlWriter* pXmlWriter,const std::wstring& wsName = L"") override; static bool CheckNumber(const std::wstring& wsNumber); std::wstring GetString(); private: std::wstring m_wsNumber; }; class CElementArithmeticOperations:public CElement { public: CElementArithmeticOperations(); CElementArithmeticOperations(const std::wstring& wsSign); virtual ~CElementArithmeticOperations(); void Parse(CSMReader* pReader) override; void ConversionOOXml(XmlUtils::CXmlWriter* pXmlWriter, const std::wstring& wsName = L"") override; static bool CheckArithmeticOperators(const std::wstring& wsElement); bool ComparisonSign(const std::wstring& wsSign); bool ComparisonSign(CElement* pElement); bool ComparingPriorities(const std::wstring& wsSign); void SetFirstValue(CElement* pElement); static TypeElement SetTypeSign(const std::wstring& wsSign); TypeElement GetTypeSign(); void SignRecording(XmlUtils::CXmlWriter* pXmlWriter, const TypeElement &enTypeSign); CElement* GetSecondValue(); std::wstring ConversionValueSign(XmlUtils::CXmlWriter* pXmlWriter, CElement* pElement); void RecordingTheValuesSign(XmlUtils::CXmlWriter* pXmlWriter,const std::wstring& wsNameFirst, const std::wstring& wsNameSecond); private: TypeElement m_enTypeSign; CElement* m_pSecondSign; CElement* m_pFirstValue; CElement* m_pSecondValue; unsigned int m_uiNumberFormula; }; class CElementBracket: public CElement { public: CElementBracket(); virtual ~CElementBracket(); void Parse(CSMReader* pReader) override; void ConversionOOXml(XmlUtils::CXmlWriter* pXmlWriter,const std::wstring& wsName = L"") override; std::vector GetVector(); private: std::vector m_arElements; }; class CElementFunction: public CElement { public: CElementFunction(); CElementFunction(const TypeElement& enType); virtual ~CElementFunction(); void Parse(CSMReader* pReader) override; void ConversionOOXml(XmlUtils::CXmlWriter* pXmlWriter, const std::wstring& wsName = L"") override; void ConversionElement(XmlUtils::CXmlWriter* pXmlWriter,CElement* pElement, std::wstring& wsFormula); static TypeElement TypeCheckingByFunction(const std::wstring& wsFunction); bool ConvertBracketsForTrigonometry(XmlUtils::CXmlWriter *pXmlWriter, std::wstring &wsFormula, const TypeElement &enTypeFunc); void CalculatingTheLogicalHeightOrWidth(XmlUtils::CXmlWriter* pXmlWriter); static void CalculatingNumberName(std::wstring& wsNewName, std::wstring& wsOldNameFormula, unsigned int& uiNumberFormula); private: TypeElement m_enTypeFunction; CElement* m_pValue; unsigned int m_uiNumberFormula; }; class CElementComma: public CElement { public: CElementComma(); virtual ~CElementComma(); void Parse(CSMReader* pReader) override; void ConversionOOXml(XmlUtils::CXmlWriter* pXmlWriter, const std::wstring& wsName = L"") override; }; }