[Libreoffice-commits] core.git: svx/source sw/source

Szymon KÅ‚os (via logerrit) logerrit at kemper.freedesktop.org
Sat Mar 6 15:10:14 UTC 2021


 svx/source/inc/StylesPreviewWindow.hxx      |   17 ++++++++++++++
 svx/source/tbxctrls/StylesPreviewWindow.cxx |   32 +++++++++++++++++++++++++---
 sw/source/uibase/app/docst.cxx              |    4 +++
 3 files changed, 49 insertions(+), 4 deletions(-)

New commits:
commit 01d99c0005f67d6ecb139bae7463dc25d45884ef
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Tue Mar 2 12:18:21 2021 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Sat Mar 6 16:09:28 2021 +0100

    Styles preview: use listener to trigger update
    
    Do not render all styles on every selection change.
    Use listener to detect styles modification.
    
    Change-Id: I6d41acd7acad160d1477281d2b3d473233def4d7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111833
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Szymon Kłos <szymon.klos at collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112013
    Tested-by: Jenkins

diff --git a/svx/source/inc/StylesPreviewWindow.hxx b/svx/source/inc/StylesPreviewWindow.hxx
index 7c2c572708ef..533ff40601b4 100644
--- a/svx/source/inc/StylesPreviewWindow.hxx
+++ b/svx/source/inc/StylesPreviewWindow.hxx
@@ -28,6 +28,7 @@
 
 class StylesPreviewWindow_Base;
 
+/// Listener for style selection
 class StyleStatusListener : public SfxStatusListener
 {
     StylesPreviewWindow_Base* m_pPreviewControl;
@@ -40,6 +41,19 @@ public:
     void StateChanged(SfxItemState eState, const SfxPoolItem* pState) override;
 };
 
+/// Listener for styles creation or modification
+class StylePoolChangeListener : public SfxListener
+{
+    StylesPreviewWindow_Base* m_pPreviewControl;
+    SfxStyleSheetBasePool* m_pStyleSheetPool;
+
+public:
+    StylePoolChangeListener(StylesPreviewWindow_Base* pPreviewControl);
+    ~StylePoolChangeListener();
+
+    virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override;
+};
+
 class StyleItemController
 {
     static constexpr unsigned LEFT_MARGIN = 8;
@@ -70,6 +84,7 @@ protected:
     std::unique_ptr<weld::IconView> m_xStylesView;
 
     rtl::Reference<StyleStatusListener> m_xStatusListener;
+    std::unique_ptr<StylePoolChangeListener> m_pStylePoolChangeListener;
 
     std::vector<std::pair<OUString, OUString>> m_aDefaultStyles;
     std::vector<std::pair<OUString, OUString>> m_aAllStyles;
@@ -87,10 +102,10 @@ public:
     ~StylesPreviewWindow_Base();
 
     void Select(const OUString& rStyleName);
+    void UpdateStylesList();
 
 private:
     void Update();
-    void UpdateStylesList();
     bool Command(const CommandEvent& rEvent);
 };
 
diff --git a/svx/source/tbxctrls/StylesPreviewWindow.cxx b/svx/source/tbxctrls/StylesPreviewWindow.cxx
index f392c2fc90de..59e86b7d2bd6 100644
--- a/svx/source/tbxctrls/StylesPreviewWindow.cxx
+++ b/svx/source/tbxctrls/StylesPreviewWindow.cxx
@@ -72,6 +72,32 @@ void StyleStatusListener::StateChanged(SfxItemState /*eState*/, const SfxPoolIte
         m_pPreviewControl->Select(pStateItem->GetStyleName());
 }
 
+StylePoolChangeListener::StylePoolChangeListener(StylesPreviewWindow_Base* pPreviewControl)
+    : SfxListener()
+    , m_pPreviewControl(pPreviewControl)
+{
+    SfxObjectShell* pDocShell = SfxObjectShell::Current();
+
+    if (pDocShell)
+        m_pStyleSheetPool = pDocShell->GetStyleSheetPool();
+
+    if (m_pStyleSheetPool)
+    {
+        StartListening(*m_pStyleSheetPool);
+    }
+}
+
+StylePoolChangeListener::~StylePoolChangeListener()
+{
+    if (m_pStyleSheetPool)
+        EndListening(*m_pStyleSheetPool);
+}
+
+void StylePoolChangeListener::Notify(SfxBroadcaster& /*rBC*/, const SfxHint& /*rHint*/)
+{
+    m_pPreviewControl->UpdateStylesList();
+}
+
 StyleItemController::StyleItemController(const std::pair<OUString, OUString>& aStyleName)
     : m_eStyleFamily(SfxStyleFamily::Para)
     , m_aStyleName(aStyleName)
@@ -335,6 +361,9 @@ StylesPreviewWindow_Base::StylesPreviewWindow_Base(
 
     m_xStatusListener = new StyleStatusListener(this, xDispatchProvider);
 
+    m_pStylePoolChangeListener.reset(new StylePoolChangeListener(this));
+
+    UpdateStylesList();
     Update();
 }
 
@@ -390,14 +419,11 @@ void StylesPreviewWindow_Base::Select(const OUString& rStyleName)
 {
     m_sSelectedStyle = rStyleName;
 
-    UpdateStylesList();
     Update();
 }
 
 void StylesPreviewWindow_Base::Update()
 {
-    UpdateStylesList();
-
     for (std::vector<std::pair<OUString, OUString>>::size_type i = 0; i < m_aAllStyles.size(); ++i)
     {
         if (m_aAllStyles[i].first == m_sSelectedStyle || m_aAllStyles[i].second == m_sSelectedStyle)
diff --git a/sw/source/uibase/app/docst.cxx b/sw/source/uibase/app/docst.cxx
index ff9ea4af3585..f2a414a88955 100644
--- a/sw/source/uibase/app/docst.cxx
+++ b/sw/source/uibase/app/docst.cxx
@@ -1317,6 +1317,8 @@ void SwDocShell::UpdateStyle(const OUString &rName, SfxStyleFamily nFamily, SwWr
         break;
         default: break;
     }
+
+    m_xDoc->BroadcastStyleOperation(rName, nFamily, SfxHintId::StyleSheetModified);
 }
 
 // NewByExample
@@ -1510,6 +1512,8 @@ void SwDocShell::MakeByExample( const OUString &rName, SfxStyleFamily nFamily,
 
         default: break;
     }
+
+    m_xDoc->BroadcastStyleOperation(rName, nFamily, SfxHintId::StyleSheetCreated);
 }
 
 sfx::AccessibilityIssueCollection SwDocShell::runAccessibilityCheck()


More information about the Libreoffice-commits mailing list