From 9129dd6f168d9bc2a303edb4469f0590a8234059 Mon Sep 17 00:00:00 2001 From: dante Date: Tue, 2 Mar 2021 09:51:14 +0100 Subject: Starmath now allows multiple parsers fourth part Now smelementdockingwindow is version sensitible. Change-Id: I1ed172d03f0756f1603a9ff20aadcea59fe35e9f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111805 Tested-by: Jenkins Reviewed-by: Noel Grandin --- starmath/inc/ElementsDockingWindow.hxx | 43 +++++++++------ starmath/source/ElementsDockingWindow.cxx | 90 +++++++++++++++++++++---------- starmath/source/document.cxx | 12 ++++- 3 files changed, 99 insertions(+), 46 deletions(-) diff --git a/starmath/inc/ElementsDockingWindow.hxx b/starmath/inc/ElementsDockingWindow.hxx index 74aab1865d45..bf4a8f056dd4 100644 --- a/starmath/inc/ElementsDockingWindow.hxx +++ b/starmath/inc/ElementsDockingWindow.hxx @@ -63,18 +63,26 @@ class SmElementsControl : public weld::CustomWidgetController friend class ElementSelectorUIObject; friend class ElementUIObject; - static const SmElementDescr m_aUnaryBinaryOperatorsList[]; - static const SmElementDescr m_aRelationsList[]; - static const SmElementDescr m_aSetOperationsList[]; - static const SmElementDescr m_aFunctionsList[]; - static const SmElementDescr m_aOperatorsList[]; - static const SmElementDescr m_aAttributesList[]; - static const SmElementDescr m_aBracketsList[]; - static const SmElementDescr m_aFormatsList[]; - static const SmElementDescr m_aOthersList[]; - static const SmElementDescr m_aExamplesList[]; - static const std::tuple m_aCategories[]; - static const size_t m_aCategoriesSize; + // SmParser 5 elements + static const SmElementDescr m_a5UnaryBinaryOperatorsList[]; + static const SmElementDescr m_a5RelationsList[]; + static const SmElementDescr m_a5SetOperationsList[]; + static const SmElementDescr m_a5FunctionsList[]; + static const SmElementDescr m_a5OperatorsList[]; + static const SmElementDescr m_a5AttributesList[]; + static const SmElementDescr m_a5BracketsList[]; + static const SmElementDescr m_a5FormatsList[]; + static const SmElementDescr m_a5OthersList[]; + static const SmElementDescr m_a5ExamplesList[]; + static const std::tuple m_a5Categories[]; + static const size_t m_a5CategoriesSize; + + // SmParser 6 elements + static const std::tuple m_a6Categories[0]; + static const size_t m_a6CategoriesSize = 0; + + // Parser for them + std::unique_ptr maParser; virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) override; virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; @@ -91,8 +99,8 @@ class SmElementsControl : public weld::CustomWidgetController OString msCurrentSetId; sal_uInt16 m_nCurrentElement; sal_uInt16 m_nCurrentRolloverElement; - sal_uInt16 m_nCurrentOffset; - SmParser maParser; + sal_uInt16 m_nCurrentOffset; + sal_uInt16 m_nSmSyntaxVersion; Link maSelectHdlLink; std::vector< std::unique_ptr > maElementList; @@ -123,8 +131,8 @@ public: explicit SmElementsControl(std::unique_ptr xScrolledWindow); virtual ~SmElementsControl() override; - static const auto& categories() { return m_aCategories; } - static size_t categoriesSize() { return m_aCategoriesSize; } + static const auto& categories() { return m_a5Categories; } + static size_t categoriesSize() { return m_a5CategoriesSize; } const OString& elementSetId() const { return msCurrentSetId; } void setElementSetId(const char* pSetId); @@ -139,6 +147,7 @@ public: OUString itemName(sal_uInt16) const; bool itemTrigger(sal_uInt16); void setItemHighlighted(sal_uInt16); + void setSmSyntaxVersion(sal_uInt16 nSmSyntaxVersion); sal_uInt16 itemOffset() const { return m_nCurrentOffset; } virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override; @@ -176,6 +185,8 @@ public: virtual void EndDocking( const tools::Rectangle& rReactangle, bool bFloatMode) override; virtual void ToggleFloatingMode() override; + + void setSmSyntaxVersion(sal_uInt16 nSmSyntaxVersion); }; class SmElementsDockingWindowWrapper final : public SfxChildWindow diff --git a/starmath/source/ElementsDockingWindow.cxx b/starmath/source/ElementsDockingWindow.cxx index 623f8202b079..4db585fa0d1a 100644 --- a/starmath/source/ElementsDockingWindow.cxx +++ b/starmath/source/ElementsDockingWindow.cxx @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -51,7 +52,7 @@ SmElementSeparator::SmElementSeparator() : SmElement(std::unique_ptr(), OUString(), OUString()) {} -const SmElementDescr SmElementsControl::m_aUnaryBinaryOperatorsList[] = +const SmElementDescr SmElementsControl::m_a5UnaryBinaryOperatorsList[] = { {RID_PLUSX, RID_PLUSX_HELP}, {RID_MINUSX, RID_MINUSX_HELP}, {RID_PLUSMINUSX, RID_PLUSMINUSX_HELP}, {RID_MINUSPLUSX, RID_MINUSPLUSX_HELP}, @@ -69,7 +70,7 @@ const SmElementDescr SmElementsControl::m_aUnaryBinaryOperatorsList[] = {RID_NEGX, RID_NEGX_HELP}, {RID_XANDY, RID_XANDY_HELP}, {RID_XORY, RID_XORY_HELP} }; -const SmElementDescr SmElementsControl::m_aRelationsList[] = +const SmElementDescr SmElementsControl::m_a5RelationsList[] = { {RID_XEQY, RID_XEQY_HELP}, {RID_XNEQY, RID_XNEQY_HELP}, {RID_XLTY, RID_XLTY_HELP}, {RID_XLEY, RID_XLEY_HELP}, {RID_XLESLANTY, RID_XLESLANTY_HELP}, {RID_XGTY, RID_XGTY_HELP}, @@ -90,7 +91,7 @@ const SmElementDescr SmElementsControl::m_aRelationsList[] = {RID_XNOTPRECEDESY, RID_XNOTPRECEDESY_HELP}, {RID_XNOTSUCCEEDSY, RID_XNOTSUCCEEDSY_HELP}, }; -const SmElementDescr SmElementsControl::m_aSetOperationsList[] = +const SmElementDescr SmElementsControl::m_a5SetOperationsList[] = { {RID_XINY, RID_XINY_HELP}, {RID_XNOTINY, RID_XNOTINY_HELP}, {RID_XOWNSY, RID_XOWNSY_HELP}, {nullptr, nullptr}, @@ -105,7 +106,7 @@ const SmElementDescr SmElementsControl::m_aSetOperationsList[] = {RID_SETZ, RID_SETZ_HELP}, {RID_SETQ, RID_SETQ_HELP}, {RID_SETR, RID_SETR_HELP}, {RID_SETC, RID_SETC_HELP} }; -const SmElementDescr SmElementsControl::m_aFunctionsList[] = +const SmElementDescr SmElementsControl::m_a5FunctionsList[] = { {RID_ABSX, RID_ABSX_HELP}, {RID_FACTX, RID_FACTX_HELP}, {RID_SQRTX, RID_SQRTX_HELP}, {RID_NROOTXY, RID_NROOTXY_HELP}, {RID_RSUPX, RID_RSUPX_HELP}, {RID_EX, RID_EX_HELP}, @@ -122,7 +123,7 @@ const SmElementDescr SmElementsControl::m_aFunctionsList[] = {RID_FUNCX, RID_FUNCX_HELP} }; -const SmElementDescr SmElementsControl::m_aOperatorsList[] = +const SmElementDescr SmElementsControl::m_a5OperatorsList[] = { {RID_LIMX, RID_LIMX_HELP}, {RID_LIM_FROMX, RID_LIM_FROMX_HELP}, {RID_LIM_TOX, RID_LIM_TOX_HELP}, {RID_LIM_FROMTOX, RID_LIM_FROMTOX_HELP}, @@ -164,7 +165,7 @@ const SmElementDescr SmElementsControl::m_aOperatorsList[] = {RID_OPER_TOX, RID_OPER_TOX_HELP}, {RID_OPER_FROMTOX, RID_OPER_FROMTOX_HELP} }; -const SmElementDescr SmElementsControl::m_aAttributesList[] = +const SmElementDescr SmElementsControl::m_a5AttributesList[] = { {RID_ACUTEX, RID_ACUTEX_HELP}, {RID_GRAVEX, RID_GRAVEX_HELP}, {RID_BREVEX, RID_BREVEX_HELP}, {RID_CIRCLEX, RID_CIRCLEX_HELP}, {RID_DOTX, RID_DOTX_HELP}, {RID_DDOTX, RID_DDOTX_HELP}, @@ -197,7 +198,7 @@ const SmElementDescr SmElementsControl::m_aAttributesList[] = {RID_COLORX_SNOW, RID_COLORX_SNOW_HELP}, }; -const SmElementDescr SmElementsControl::m_aBracketsList[] = +const SmElementDescr SmElementsControl::m_a5BracketsList[] = { {RID_LRGROUPX, RID_LRGROUPX_HELP}, {nullptr, nullptr}, @@ -219,7 +220,7 @@ const SmElementDescr SmElementsControl::m_aBracketsList[] = {RID_EVAL_TOX, RID_EVALUATE_TOX_HELP}, {RID_EVAL_FROMTOX, RID_EVALUATE_FROMTOX_HELP}, }; -const SmElementDescr SmElementsControl::m_aFormatsList[] = +const SmElementDescr SmElementsControl::m_a5FormatsList[] = { {RID_RSUPX, RID_RSUPX_HELP}, {RID_RSUBX, RID_RSUBX_HELP}, {RID_LSUPX, RID_LSUPX_HELP}, {RID_LSUBX, RID_LSUBX_HELP}, {RID_CSUPX, RID_CSUPX_HELP}, {RID_CSUBX, RID_CSUBX_HELP}, @@ -232,7 +233,7 @@ const SmElementDescr SmElementsControl::m_aFormatsList[] = {RID_MATRIX, RID_MATRIX_HELP}, }; -const SmElementDescr SmElementsControl::m_aOthersList[] = +const SmElementDescr SmElementsControl::m_a5OthersList[] = { {RID_INFINITY, RID_INFINITY_HELP}, {RID_PARTIAL, RID_PARTIAL_HELP}, {RID_NABLA, RID_NABLA_HELP}, {RID_EXISTS, RID_EXISTS_HELP}, {RID_NOTEXISTS, RID_NOTEXISTS_HELP}, {RID_FORALL, RID_FORALL_HELP}, @@ -247,7 +248,7 @@ const SmElementDescr SmElementsControl::m_aOthersList[] = {RID_DOTSUP, RID_DOTSUP_HELP}, {RID_DOTSDOWN, RID_DOTSDOWN_HELP} }; -const SmElementDescr SmElementsControl::m_aExamplesList[] = +const SmElementDescr SmElementsControl::m_a5ExamplesList[] = { {"{func e}^{i %pi} + 1 = 0", RID_EXAMPLE_EULER_IDENTITY_HELP}, {"C = %pi cdot d = 2 cdot %pi cdot r", RID_EXAMPLE_CIRCUMFERENCE_HELP}, @@ -264,34 +265,36 @@ const SmElementDescr SmElementsControl::m_aExamplesList[] = }; #define AS_PAIR(a) a, SAL_N_ELEMENTS(a) -const std::tuple SmElementsControl::m_aCategories[] = +const std::tuple SmElementsControl::m_a5Categories[] = { - {RID_CATEGORY_UNARY_BINARY_OPERATORS, AS_PAIR(m_aUnaryBinaryOperatorsList)}, - {RID_CATEGORY_RELATIONS, AS_PAIR(m_aRelationsList)}, - {RID_CATEGORY_SET_OPERATIONS, AS_PAIR(m_aSetOperationsList)}, - {RID_CATEGORY_FUNCTIONS, AS_PAIR(m_aFunctionsList)}, - {RID_CATEGORY_OPERATORS, AS_PAIR(m_aOperatorsList)}, - {RID_CATEGORY_ATTRIBUTES, AS_PAIR(m_aAttributesList)}, - {RID_CATEGORY_BRACKETS, AS_PAIR(m_aBracketsList)}, - {RID_CATEGORY_FORMATS, AS_PAIR(m_aFormatsList)}, - {RID_CATEGORY_OTHERS, AS_PAIR(m_aOthersList)}, - {RID_CATEGORY_EXAMPLES, AS_PAIR(m_aExamplesList)}, + {RID_CATEGORY_UNARY_BINARY_OPERATORS, AS_PAIR(m_a5UnaryBinaryOperatorsList)}, + {RID_CATEGORY_RELATIONS, AS_PAIR(m_a5RelationsList)}, + {RID_CATEGORY_SET_OPERATIONS, AS_PAIR(m_a5SetOperationsList)}, + {RID_CATEGORY_FUNCTIONS, AS_PAIR(m_a5FunctionsList)}, + {RID_CATEGORY_OPERATORS, AS_PAIR(m_a5OperatorsList)}, + {RID_CATEGORY_ATTRIBUTES, AS_PAIR(m_a5AttributesList)}, + {RID_CATEGORY_BRACKETS, AS_PAIR(m_a5BracketsList)}, + {RID_CATEGORY_FORMATS, AS_PAIR(m_a5FormatsList)}, + {RID_CATEGORY_OTHERS, AS_PAIR(m_a5OthersList)}, + {RID_CATEGORY_EXAMPLES, AS_PAIR(m_a5ExamplesList)}, }; -const size_t SmElementsControl::m_aCategoriesSize = SAL_N_ELEMENTS(m_aCategories); +const size_t SmElementsControl::m_a5CategoriesSize = SAL_N_ELEMENTS(m_a5Categories); SmElementsControl::SmElementsControl(std::unique_ptr xScrolledWindow) : mpDocShell(new SmDocShell(SfxModelFlags::EMBEDDED_OBJECT)) , m_nCurrentElement(SAL_MAX_UINT16) , m_nCurrentRolloverElement(SAL_MAX_UINT16) , m_nCurrentOffset(1) // Default offset of 1 due to the ScrollBar child + , m_nSmSyntaxVersion(SM_MOD()->GetConfig()->GetDefaultSmSyntaxVersion()) , mbVerticalMode(true) , mxScroll(std::move(xScrolledWindow)) , m_bFirstPaintAfterLayout(false) { mxScroll->connect_hadjustment_changed( LINK(this, SmElementsControl, ScrollHdl) ); mxScroll->connect_vadjustment_changed( LINK(this, SmElementsControl, ScrollHdl) ); - maParser.SetImportSymbolNames(true); + maParser.reset(starmathdatabase::GetVersionSmParser(m_nSmSyntaxVersion)); + maParser->SetImportSymbolNames(true); } SmElementsControl::~SmElementsControl() @@ -844,7 +847,7 @@ void SmElementsControl::addElement(const OUString& aElementVisual, const OUStrin { // SAL_MAX_UINT16 is invalid, zero is the scrollbar assert(maElementList.size() < SAL_MAX_UINT16 - 2); - auto pNode = maParser.ParseExpression(aElementVisual); + auto pNode = maParser->ParseExpression(aElementVisual); OutputDevice& rDevice = GetDrawingArea()->get_ref_device(); rDevice.Push(PushFlags::MAPMODE); @@ -1029,15 +1032,26 @@ void SmElementsControl::build() // The first element is the scrollbar. We can't change its indexInParent // value, as this is set by being a child of the SmElementsControl. m_nCurrentOffset = 1; - for (sal_uInt16 n = 0; n < SAL_N_ELEMENTS(m_aCategories); ++n) + + switch(m_nSmSyntaxVersion) { - if (msCurrentSetId == std::get<0>(m_aCategories[n])) + case 5: { - addElements(std::get<1>(m_aCategories[n]), std::get<2>(m_aCategories[n])); + for (sal_uInt16 n = 0; n < m_a5CategoriesSize; ++n) + { + if (msCurrentSetId == std::get<0>(m_a5Categories[n])) + { + addElements(std::get<1>(m_a5Categories[n]), std::get<2>(m_a5Categories[n])); + break; + } + else + m_nCurrentOffset += std::get<2>(m_a5Categories[n]); + } break; } - else - m_nCurrentOffset += std::get<2>(m_aCategories[n]); + case 6: + default: + throw std::range_error("parser version limit"); } m_nCurrentRolloverElement = SAL_MAX_UINT16; @@ -1139,6 +1153,18 @@ void SmElementsControl::setItemHighlighted(sal_uInt16 nPos) Invalidate(); } +void SmElementsControl::setSmSyntaxVersion(sal_uInt16 nSmSyntaxVersion) +{ + if( m_nSmSyntaxVersion != nSmSyntaxVersion ) + { + m_nSmSyntaxVersion = nSmSyntaxVersion; + maParser.reset(starmathdatabase::GetVersionSmParser(nSmSyntaxVersion)); + maParser->SetImportSymbolNames(true); + // Be carefull, we need the parser in order to build !!! + build(); + } +} + OUString SmElementsControl::itemName(sal_uInt16 nPos) const { if (nPos < m_nCurrentOffset) @@ -1206,6 +1232,11 @@ void SmElementsDockingWindow::ToggleFloatingMode() Invalidate(); } +void SmElementsDockingWindow::setSmSyntaxVersion(sal_uInt16 nSmSyntaxVersion) +{ + mxElementsControl->setSmSyntaxVersion(nSmSyntaxVersion); +} + void SmElementsDockingWindow::EndDocking( const tools::Rectangle& rReactangle, bool bFloatMode) { SfxDockingWindow::EndDocking(rReactangle, bFloatMode); @@ -1235,6 +1266,7 @@ IMPL_LINK( SmElementsDockingWindow, ElementSelectedHandle, weld::ComboBox&, rLis if (aCurrentCategoryString == rList.get_active_text()) { mxElementsControl->setElementSetId(pCurrentCategory); + setSmSyntaxVersion(GetView()->GetDoc()->GetSmSyntaxVersion()); return; } } diff --git a/starmath/source/document.cxx b/starmath/source/document.cxx index 6c0e5663a5a0..67e216611e57 100644 --- a/starmath/source/document.cxx +++ b/starmath/source/document.cxx @@ -83,6 +83,7 @@ #include #include #include +#include using namespace ::com::sun::star; using namespace ::com::sun::star::accessibility; @@ -103,6 +104,15 @@ void SmDocShell::SetSmSyntaxVersion(sal_uInt16 nSmSyntaxVersion) { mnSmSyntaxVersion = nSmSyntaxVersion; maParser.reset(starmathdatabase::GetVersionSmParser(mnSmSyntaxVersion)); + SmViewShell* pViewSh = SmGetActiveView(); + if (pViewSh) + { + SmElementsDockingWindow* dockingWindow = pViewSh->GetDockingWindow(); + if(dockingWindow) + { + dockingWindow->setSmSyntaxVersion(nSmSyntaxVersion); + } + } } SFX_IMPL_OBJECTFACTORY(SmDocShell, SvGlobalName(SO3_SM_CLASSID), "smath" ) @@ -633,12 +643,12 @@ SmDocShell::SmDocShell( SfxModelFlags i_nSfxCreationFlags ) SmModule *pp = SM_MOD(); maFormat = pp->GetConfig()->GetStandardFormat(); - maParser.reset(starmathdatabase::GetVersionSmParser(mnSmSyntaxVersion)); StartListening(maFormat); StartListening(*pp->GetConfig()); SetBaseModel(new SmModel(this)); + SetSmSyntaxVersion(mnSmSyntaxVersion); } SmDocShell::~SmDocShell() -- cgit