include/vcl/builder.hxx | 16 ++++++++++---- vcl/source/window/builder.cxx | 47 +++++++++++++++++++++++++++++------------- 2 files changed, 45 insertions(+), 18 deletions(-)
New commits: commit 8cf0133973a8aaeb0e434cfe758ee2596b604b4b Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Mon Aug 12 13:06:56 2024 +0200 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Tue Aug 13 07:17:21 2024 +0200 tdf#130857 VclBuilder: Avoid unnecessary work for empty prop If `sProperty` is empty, `sValue` and `sFinalValue` are irrelevant, so only assign (and potentially translate) for the case it's non-empty. This also prepares for extracting part of this method to a helper method used by both, `VclBuilder::collectProperty` and `VclBuilder::handleItems`. Change-Id: I5b6acb1fe3c857c578b88b29d0b17e887134f687 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171787 Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> Tested-by: Jenkins diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 8c6682d2bba0..113f6bb82af4 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -4005,18 +4005,19 @@ void VclBuilder::collectProperty(xmlreader::XmlReader &reader, stringmap &rMap) } (void)reader.nextItem(xmlreader::XmlReader::Text::Raw, &name, &nsId); - OString sValue(name.begin, name.length); - OUString sFinalValue; - if (bTranslated) - { - sFinalValue - = Translate::get(TranslateId{ sContext.getStr(), sValue.getStr() }, getResLocale()); - } - else - sFinalValue = OUString::fromUtf8(sValue); if (!sProperty.isEmpty()) { + OString sValue(name.begin, name.length); + OUString sFinalValue; + if (bTranslated) + { + sFinalValue + = Translate::get(TranslateId{ sContext.getStr(), sValue.getStr() }, getResLocale()); + } + else + sFinalValue = OUString::fromUtf8(sValue); + sProperty = sProperty.replace('_', '-'); if (ResHookProc pStringReplace = Translate::GetReadStringHook()) sFinalValue = (*pStringReplace)(sFinalValue); commit cad292adaba986c04f5bc8e73c11871075b5abe5 Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Mon Aug 12 12:52:16 2024 +0200 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Tue Aug 13 07:17:13 2024 +0200 tdf#130857 VclBuilder: Move locale handling to base class * Introduce `ParserState` in the `BuilderBase` base class and move the `std::locale m_aResLocale` there from `VclParserState`. * Add a virtual `resetParserState()` method to reset both parser states. * Move `VclBuilder::handleInterfaceDomain` to the base class to let it take care of the handling of the translation domain/locale. * Instead of directly accessing the `m_aResLocale` member of the parser state, introduce a new getter, `getResLocale()`. Moving more of the members from `VclBuilder::m_pVclParserState` to `BuilderBase::m_pParserState` might make sense in future commits in order to reuse code for other implementations (like the WIP QtInstanceBuilder from [1]), so start with a corresponding struct right away instead of a member for just the locale. [1] https://gerrit.libreoffice.org/c/core/+/161831 Change-Id: I2cefddae0a7e2e2dd4487cc9b9796afb215e2616 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171786 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> diff --git a/include/vcl/builder.hxx b/include/vcl/builder.hxx index 38af7c5f8305..d91e3b8c51b5 100644 --- a/include/vcl/builder.hxx +++ b/include/vcl/builder.hxx @@ -77,13 +77,23 @@ protected: static void collectAtkRelationAttribute(xmlreader::XmlReader& reader, stringmap& rMap); static void collectAtkRoleAttribute(xmlreader::XmlReader& reader, stringmap& rMap); static void collectAccelerator(xmlreader::XmlReader& reader, accelmap& rMap); + void handleInterfaceDomain(xmlreader::XmlReader& rReader); static bool isToolbarItemClass(std::u16string_view sClass); static std::vector<vcl::EnumContext::Context> handleStyle(xmlreader::XmlReader &reader, int &nPriority); static OUString getStyleClass(xmlreader::XmlReader &reader); bool isLegacy() { return m_bLegacy; } + const std::locale& getResLocale() const; + + virtual void resetParserState(); private: + struct ParserState + { + std::locale m_aResLocale; + }; + + std::unique_ptr<ParserState> m_pParserState; bool m_bLegacy; }; @@ -101,7 +111,7 @@ public: = css::uno::Reference<css::frame::XFrame>(), bool bLegacy = true, const NotebookBarAddonsItem* pNotebookBarAddonsItem = nullptr); - ~VclBuilder(); + virtual ~VclBuilder(); ///releases references and disposes all children. void disposeBuilder(); //sID must exist and be of type T @@ -255,8 +265,6 @@ private: struct VclParserState { - std::locale m_aResLocale; - std::vector<RadioButtonGroupMap> m_aGroupMaps; std::vector<ComboBoxModelMap> m_aModelMaps; @@ -304,6 +312,7 @@ private: bool m_bToplevelParentFound; std::unique_ptr<VclParserState> m_pVclParserState; + virtual void resetParserState() override; vcl::Window *get_by_name(std::u16string_view sID); void delete_by_name(const OUString& sID); @@ -355,7 +364,6 @@ private: // if bToolbarItem=true, pParent is the ToolBox that the item belongs to, since there's no widget for the item itself VclPtr<vcl::Window> handleObject(vcl::Window *pParent, stringmap *pAtkProps, xmlreader::XmlReader &reader, bool bToolbarItem); - void handleInterfaceDomain(xmlreader::XmlReader& rReader); void handlePacking(vcl::Window *pCurrent, vcl::Window *pParent, xmlreader::XmlReader &reader); void applyPackingProperty(vcl::Window *pCurrent, vcl::Window *pParent, xmlreader::XmlReader &reader); void collectProperty(xmlreader::XmlReader &reader, stringmap &rVec) const; diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 6b13c1889fca..8c6682d2bba0 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -446,10 +446,19 @@ namespace weld } BuilderBase::BuilderBase(bool bLegacy) - : m_bLegacy(bLegacy) + : m_pParserState(new ParserState) + , m_bLegacy(bLegacy) { } +const std::locale& BuilderBase::getResLocale() const +{ + assert(m_pParserState && "parser state no more valid"); + return m_pParserState->m_aResLocale; +} + +void BuilderBase::resetParserState() { m_pParserState.reset(); } + VclBuilder::VclBuilder(vcl::Window* pParent, const OUString& sUIDir, const OUString& sUIFile, OUString sID, css::uno::Reference<css::frame::XFrame> xFrame, bool bLegacy, const NotebookBarAddonsItem* pNotebookBarAddonsItem) @@ -770,7 +779,7 @@ VclBuilder::VclBuilder(vcl::Window* pParent, const OUString& sUIDir, const OUStr elem->create_message_area(); //drop maps, etc. that we don't need again - m_pVclParserState.reset(); + resetParserState(); SAL_WARN_IF(!m_sID.isEmpty() && (!m_bToplevelParentFound && !get_by_name(m_sID)), "vcl.builder", "Requested top level widget \"" << m_sID << "\" not found in " << sUIFile); @@ -3014,7 +3023,8 @@ void VclBuilder::handleRow(xmlreader::XmlReader &reader, const OUString &rID) OUString sFinalValue; if (bTranslated) { - sFinalValue = Translate::get(TranslateId{sContext.getStr(), sValue.getStr()}, m_pVclParserState->m_aResLocale); + sFinalValue = Translate::get(TranslateId{ sContext.getStr(), sValue.getStr() }, + getResLocale()); } else sFinalValue = OUString::fromUtf8(sValue); @@ -3185,7 +3195,8 @@ std::vector<ComboBoxTextItem> VclBuilder::handleItems(xmlreader::XmlReader &read OUString sFinalValue; if (bTranslated) { - sFinalValue = Translate::get(TranslateId{sContext.getStr(), sValue.getStr()}, m_pVclParserState->m_aResLocale); + sFinalValue = Translate::get(TranslateId{ sContext.getStr(), sValue.getStr() }, + getResLocale()); } else sFinalValue = OUString::fromUtf8(sValue); @@ -3752,11 +3763,11 @@ VclPtr<vcl::Window> VclBuilder::handleObject(vcl::Window *pParent, stringmap *pA return pCurrentChild; } -void VclBuilder::handleInterfaceDomain(xmlreader::XmlReader& rReader) +void BuilderBase::handleInterfaceDomain(xmlreader::XmlReader& rReader) { xmlreader::Span name = rReader.getAttributeValue(false); const OString sPrefixName(name.begin, name.length); - m_pVclParserState->m_aResLocale = Translate::Create(sPrefixName); + m_pParserState->m_aResLocale = Translate::Create(sPrefixName); } void VclBuilder::handlePacking(vcl::Window *pCurrent, vcl::Window *pParent, xmlreader::XmlReader &reader) @@ -3998,7 +4009,8 @@ void VclBuilder::collectProperty(xmlreader::XmlReader &reader, stringmap &rMap) OUString sFinalValue; if (bTranslated) { - sFinalValue = Translate::get(TranslateId{sContext.getStr(), sValue.getStr()}, m_pVclParserState->m_aResLocale); + sFinalValue + = Translate::get(TranslateId{ sContext.getStr(), sValue.getStr() }, getResLocale()); } else sFinalValue = OUString::fromUtf8(sValue); @@ -4082,6 +4094,12 @@ vcl::Window *VclBuilder::get_widget_root() return m_aChildren.empty() ? nullptr : m_aChildren[0].m_pWindow.get(); } +void VclBuilder::resetParserState() +{ + m_pVclParserState.reset(); + BuilderBase::resetParserState(); +} + vcl::Window *VclBuilder::get_by_name(std::u16string_view sID) { for (auto const& child : m_aChildren)