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)

Reply via email to