[Libreoffice-commits] core.git: sd/source

Serge Krot Serge.Krot at cib.de
Wed Sep 20 01:50:25 UTC 2017


 sd/source/ui/sidebar/LayoutMenu.cxx |   46 +++++++++++++++++++++---------------
 sd/source/ui/sidebar/LayoutMenu.hxx |    2 -
 2 files changed, 27 insertions(+), 21 deletions(-)

New commits:
commit 8abc7ba9784f7898576fbdd7a48f0ff9e4445a68
Author: Serge Krot <Serge.Krot at cib.de>
Date:   Tue Sep 19 12:43:26 2017 +0200

    tdf#98980 Update selection inside control when new slide layout is selected
    
    Change-Id: Ibf8fe8d2fcdb5efef6df657607e65a791b67d4a0
    Reviewed-on: https://gerrit.libreoffice.org/42462
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>

diff --git a/sd/source/ui/sidebar/LayoutMenu.cxx b/sd/source/ui/sidebar/LayoutMenu.cxx
index 12a3c02e3866..3b52103c4404 100644
--- a/sd/source/ui/sidebar/LayoutMenu.cxx
+++ b/sd/source/ui/sidebar/LayoutMenu.cxx
@@ -129,7 +129,6 @@ LayoutMenu::LayoutMenu (
       DropTargetHelper(this),
       mrBase(rViewShellBase),
       mxListener(nullptr),
-      mbSelectionUpdatePending(true),
       mbIsMainViewChangePending(false),
       mxSidebar(rxSidebar),
       mbIsDisposed(false)
@@ -253,16 +252,6 @@ ui::LayoutSize LayoutMenu::GetHeightForWidth (const sal_Int32 nWidth)
     return ui::LayoutSize(nPreferredHeight,nPreferredHeight,nPreferredHeight);
 }
 
-void LayoutMenu::Paint (vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect)
-{
-    if (mbSelectionUpdatePending)
-    {
-        mbSelectionUpdatePending = false;
-        UpdateSelection();
-    }
-    ValueSet::Paint(rRenderContext, rRect);
-}
-
 void LayoutMenu::Resize()
 {
     Size aWindowSize = GetOutputSizePixel();
@@ -342,6 +331,9 @@ void LayoutMenu::InvalidateContent()
 
     if (mxSidebar.is())
         mxSidebar->requestLayout();
+
+    // set selection inside the control during Impress start up
+    UpdateSelection();
 }
 
 int LayoutMenu::CalculateRowCount (const Size&, int nColumnCount)
@@ -547,8 +539,6 @@ void LayoutMenu::Fill()
             SetItemData (i, new AutoLayout(pInfo->maAutoLayout));
         }
     }
-
-    mbSelectionUpdatePending = true;
 }
 
 void LayoutMenu::Clear()
@@ -653,6 +643,11 @@ IMPL_LINK(LayoutMenu, OnMenuItemSelected, Menu*, pMenu, bool)
     return false;
 }
 
+// Selects an appropriate layout of the slide inside control.
+//
+// Method may be called several times with the same item-id to be selected -
+// only once the actually state of the control will be changed.
+//
 void LayoutMenu::UpdateSelection()
 {
     bool bItemSelected = false;
@@ -674,14 +669,19 @@ void LayoutMenu::UpdateSelection()
             break;
 
         // Find the entry of the menu for to the layout.
-        SetNoSelection();
-        sal_uInt16 nItemCount (GetItemCount());
+        const sal_uInt16 nItemCount = GetItemCount();
         for (sal_uInt16 nId=1; nId<=nItemCount; nId++)
         {
             if (*static_cast<AutoLayout*>(GetItemData(nId)) == aLayout)
             {
-                SelectItem(nId);
-                bItemSelected = true;
+                // do not set selection twice to the same item
+                if (GetSelectItemId() != nId)
+                {
+                    SetNoSelection();
+                    SelectItem(nId);
+                }
+
+                bItemSelected = true; // no need to call SetNoSelection()
                 break;
             }
         }
@@ -696,10 +696,18 @@ IMPL_LINK(LayoutMenu, EventMultiplexerListener, ::sd::tools::EventMultiplexerEve
 {
     switch (rEvent.meEventId)
     {
+        // tdf#89890 During changes of the Layout of the slide when focus is not set inside main area
+        // we do not receive notification EventMultiplexerEventId::CurrentPageChanged, but we receive the following 3 notification types.
+        // => let's make UpdateSelection() also when some shape is changed (during Layout changes)
+        case EventMultiplexerEventId::ShapeChanged:
+        case EventMultiplexerEventId::ShapeInserted:
+        case EventMultiplexerEventId::ShapeRemoved:
+            UpdateSelection();
+            break;
+
         case EventMultiplexerEventId::CurrentPageChanged:
         case EventMultiplexerEventId::SlideSortedSelection:
-            if ( ! mbSelectionUpdatePending)
-                UpdateSelection();
+            UpdateSelection();
             break;
 
         case EventMultiplexerEventId::MainViewAdded:
diff --git a/sd/source/ui/sidebar/LayoutMenu.hxx b/sd/source/ui/sidebar/LayoutMenu.hxx
index 2b5823f9f92f..bdb06cc5c9c0 100644
--- a/sd/source/ui/sidebar/LayoutMenu.hxx
+++ b/sd/source/ui/sidebar/LayoutMenu.hxx
@@ -87,7 +87,6 @@ public:
     virtual css::ui::LayoutSize GetHeightForWidth (const sal_Int32 nWidth) override;
 
     // From vcl::Window
-    virtual void Paint (vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect) override;
     virtual void Resize() override;
 
     /** Show a context menu when the right mouse button is pressed.
@@ -126,7 +125,6 @@ private:
         many columns for the calculation.
     */
     css::uno::Reference<css::frame::XStatusListener> mxListener;
-    bool mbSelectionUpdatePending;
     bool mbIsMainViewChangePending;
     css::uno::Reference<css::ui::XSidebar> mxSidebar;
     bool mbIsDisposed;


More information about the Libreoffice-commits mailing list