[Libreoffice-commits] core.git: include/sfx2 sfx2/source

Laurent Godard lgodard.libre at laposte.net
Fri Nov 20 05:33:59 PST 2015


 include/sfx2/sidebar/ContextList.hxx       |    2 
 include/sfx2/sidebar/Deck.hxx              |    1 
 include/sfx2/sidebar/DeckDescriptor.hxx    |    2 
 include/sfx2/sidebar/PanelDescriptor.hxx   |    2 
 include/sfx2/sidebar/ResourceManager.hxx   |   35 +---
 include/sfx2/sidebar/SidebarController.hxx |    6 
 sfx2/source/sidebar/ResourceManager.cxx    |  252 ++++++++++++++++++-----------
 sfx2/source/sidebar/SidebarController.cxx  |  229 ++++++++++++++++----------
 sfx2/source/sidebar/TabBar.cxx             |   14 +
 sfx2/source/sidebar/UnoDeck.cxx            |   62 +++++--
 sfx2/source/sidebar/UnoPanel.cxx           |   64 +++++--
 11 files changed, 436 insertions(+), 233 deletions(-)

New commits:
commit 536c259cb9644971d0eb0cdfb7d823c5383a5481
Author: Laurent Godard <lgodard.libre at laposte.net>
Date:   Tue Aug 25 16:38:43 2015 +0200

    tdf#67770 store sidebar elements states
    
    deck & panel states at user registry level
    when disposing a sidebar
    
    if a shared deck (with "any" context application) is modified,
    it apply to all applications (eg. Gallery between calc and writer); TODO ?
    
    clean ResourceManager Get/Set const/non-const
    
    add panels when deck is created & refactoring
    
    * macro example
    
    Sub Main
    
    controller = thisComponent.currentcontroller
    sidebar = thisComponent.currentcontroller.getSidebar()
    
    sidebar.setVisible(true)
    
    decks = sidebar.getdecks()
    deck = decks.getByName("PropertyDeck")
    
    deck.activate(true)
    deck.setTitle("new deck title")
    deck.moveLast()
    
    panels = deck.getPanels()
    panel = panels.getByName("TextPropertyPanel")
    
    panel.setTitle("new panel title")
    panel.expand(true) ' expand and collapse other
    panel.moveLast()
    
    End Sub
    
    Change-Id: I2552000af92a366ebb51a479962a094b72e400b6
    Reviewed-on: https://gerrit.libreoffice.org/17992
    Reviewed-by: Katarina Behrens <Katarina.Behrens at cib.de>
    Tested-by: Katarina Behrens <Katarina.Behrens at cib.de>

diff --git a/include/sfx2/sidebar/ContextList.hxx b/include/sfx2/sidebar/ContextList.hxx
index 7ce63ee..9c56d15 100644
--- a/include/sfx2/sidebar/ContextList.hxx
+++ b/include/sfx2/sidebar/ContextList.hxx
@@ -55,6 +55,8 @@ public:
         const bool bIsInitiallyVisible,
         const ::rtl::OUString& rsMenuCommand);
 
+    const ::std::vector<Entry>& GetEntries() const {return maEntries;};
+
 private:
     ::std::vector<Entry> maEntries;
 
diff --git a/include/sfx2/sidebar/Deck.hxx b/include/sfx2/sidebar/Deck.hxx
index 0057c72..aa13d43 100644
--- a/include/sfx2/sidebar/Deck.hxx
+++ b/include/sfx2/sidebar/Deck.hxx
@@ -94,6 +94,7 @@ private:
 
     DECL_LINK_TYPED(HandleVerticalScrollBarChange, ScrollBar*, void);
     bool ProcessWheelEvent(CommandEvent* pCommandEvent);
+
 };
 
 } } // end of namespace sfx2::sidebar
diff --git a/include/sfx2/sidebar/DeckDescriptor.hxx b/include/sfx2/sidebar/DeckDescriptor.hxx
index f3e7cd6..8c1b9ef 100644
--- a/include/sfx2/sidebar/DeckDescriptor.hxx
+++ b/include/sfx2/sidebar/DeckDescriptor.hxx
@@ -42,6 +42,8 @@ public:
     sal_Int32 mnOrderIndex;
     bool mbExperimental;
 
+    OUString msNodeName; // some impress deck nodes names are different from their Id
+
     VclPtr<Deck> mpDeck;
 
     DeckDescriptor();
diff --git a/include/sfx2/sidebar/PanelDescriptor.hxx b/include/sfx2/sidebar/PanelDescriptor.hxx
index 1578bfd..2e1abb2 100644
--- a/include/sfx2/sidebar/PanelDescriptor.hxx
+++ b/include/sfx2/sidebar/PanelDescriptor.hxx
@@ -41,6 +41,8 @@ public:
     bool mbWantsCanvas;
     bool mbExperimental;
 
+    OUString msNodeName; // some impress panel nodes names are different from their Id
+
     PanelDescriptor();
     PanelDescriptor (const PanelDescriptor& rPanelDescriptor);
     ~PanelDescriptor();
diff --git a/include/sfx2/sidebar/ResourceManager.hxx b/include/sfx2/sidebar/ResourceManager.hxx
index bd69b9e..9a86bc0 100644
--- a/include/sfx2/sidebar/ResourceManager.hxx
+++ b/include/sfx2/sidebar/ResourceManager.hxx
@@ -43,30 +43,18 @@ public:
      ResourceManager();
     ~ResourceManager();
 
-    static ResourceManager& Instance();
-
     const DeckDescriptor* GetDeckDescriptor(const OUString& rsDeckId) const;
-    const PanelDescriptor* GetPanelDescriptor(const OUString& rsPanelId) const;
-
-    /** Excluded or include a deck from being displayed in the tab
-        bar.
-        Note that this value is not persistent.
-        The flag can not be set directly at a DeckDescriptor object
-        because the ResourceManager gives access to them only
-        read-only.
-    */
-    void SetIsDeckEnabled(const OUString& rsDeckId, const bool bIsEnabled);
-
-    void SetDeckTitle(const OUString& rsDeckId, const OUString& sTitle);
-
-    void SetDeckToDescriptor(const OUString& rsDeckId, VclPtr<Deck> aDeck);
+    DeckDescriptor* GetDeckDescriptor(const OUString& rsDeckId);
 
-    void SetDeckOrderIndex(const OUString& rsDeckId, const sal_Int32 orderIndex);
-
-    void SetPanelOrderIndex(const OUString& rsPanelId, const sal_Int32 orderIndex);
+    const PanelDescriptor* GetPanelDescriptor(const OUString& rsPanelId) const;
+    PanelDescriptor* GetPanelDescriptor(const OUString& rsPanelId);
 
     void UpdateModel(css::uno::Reference<css::frame::XModel> xModel);
 
+    void InitDeckContext(const Context& rContex);
+    void SaveDecksSettings(const Context& rContext);
+    void SaveDeckSettings(const DeckDescriptor* pDeckDesc);
+
     void disposeDecks();
 
     class DeckContextDescriptor
@@ -100,7 +88,6 @@ public:
                                             const css::uno::Reference<css::frame::XController>& rxController);
 
     /** Remember the expansions state per panel and context.
-        This is not persistent past application end.
     */
     void StorePanelExpansionState(const OUString& rsPanelId,
                                   const bool bExpansionState,
@@ -123,13 +110,19 @@ private:
     static void ReadContextList(const utl::OConfigurationNode& rNode,
                          ContextList& rContextList,
                          const OUString& rsDefaultMenuCommand);
+
+    css::uno::Sequence<OUString> BuildContextList (ContextList rContextList, bool isDeckEnabled);
+
     void ReadLegacyAddons(const css::uno::Reference<css::frame::XController>& rxController);
     static utl::OConfigurationTreeRoot GetLegacyAddonRootNode(const OUString& rsModuleName);
     static void GetToolPanelNodeNames(std::vector<OUString>& rMatchingNames,
                                const utl::OConfigurationTreeRoot& aRoot);
-    static bool IsDeckEnabled(const OUString& rsDeckId,
+    bool IsDeckEnabled(const OUString& rsDeckId,
                        const Context& rContext,
                        const css::uno::Reference<css::frame::XController>& rxController);
+
+    const DeckDescriptor* ImplGetDeckDescriptor(const OUString& rsDeckId) const;
+    const PanelDescriptor* ImplGetPanelDescriptor(const OUString& rsPanelId) const;
 };
 
 } } // end of namespace sfx2::sidebar
diff --git a/include/sfx2/sidebar/SidebarController.hxx b/include/sfx2/sidebar/SidebarController.hxx
index f7cc119..c077eeb 100644
--- a/include/sfx2/sidebar/SidebarController.hxx
+++ b/include/sfx2/sidebar/SidebarController.hxx
@@ -151,7 +151,8 @@ public:
     void SwitchToDeck ( const ::rtl::OUString& rsDeckId);
     void SwitchToDefaultDeck();
 
-    void CreateDeck(const ::rtl::OUString& rDeckId);
+    void CreateDeck(const ::rtl::OUString& rDeckId, bool bForceCreate = false);
+    void CreatePanels(const ::rtl::OUString& rDeckId);
 
     ResourceManager::DeckContextDescriptorContainer GetMatchingDecks();
     ResourceManager::PanelContextDescriptorContainer GetMatchingPanels( const ::rtl::OUString& rDeckId);
@@ -223,7 +224,8 @@ private:
         const ::rtl::OUString& rsPanelId,
         vcl::Window* pParentWindow,
         const bool bIsInitiallyExpanded,
-        const Context& rContext);
+        const Context& rContext,
+        VclPtr<Deck> pDeck);
 
     void SwitchToDeck (
         const DeckDescriptor& rDeckDescriptor,
diff --git a/sfx2/source/sidebar/ResourceManager.cxx b/sfx2/source/sidebar/ResourceManager.cxx
index 43c2367..7b639c4 100644
--- a/sfx2/source/sidebar/ResourceManager.cxx
+++ b/sfx2/source/sidebar/ResourceManager.cxx
@@ -56,12 +56,6 @@ bool getBool(utl::OConfigurationNode const & aNode, const char* pNodeName)
 
 } //end anonymous namespace
 
-ResourceManager& ResourceManager::Instance()
-{
-    static ResourceManager s_SidebarResourceManagerInstance;
-    return s_SidebarResourceManagerInstance;
-}
-
 ResourceManager::ResourceManager()
     : maDecks(),
       maPanels(),
@@ -76,104 +70,66 @@ ResourceManager::~ResourceManager()
 {
 }
 
-const DeckDescriptor* ResourceManager::GetDeckDescriptor(const OUString& rsDeckId) const
+void ResourceManager::InitDeckContext(const Context& rContext)
 {
-    DeckContainer::const_iterator iDeck;
+    DeckContainer::iterator iDeck;
     for (iDeck = maDecks.begin(); iDeck != maDecks.end(); ++iDeck)
     {
-        if (iDeck->mbExperimental && !maMiscOptions.IsExperimentalMode())
-            continue;
-        if (iDeck->msId.equals(rsDeckId))
-            return &*iDeck;
-    }
-    return nullptr;
-}
+        bool bIsEnabled;
+        const ContextList::Entry* pMatchingEntry = iDeck->maContextList.GetMatch(rContext);
 
-const PanelDescriptor* ResourceManager::GetPanelDescriptor(const OUString& rsPanelId) const
-{
-    PanelContainer::const_iterator iPanel;
-    for (iPanel = maPanels.begin(); iPanel != maPanels.end(); ++iPanel)
-    {
-        if (iPanel->msId.equals(rsPanelId))
-            return &*iPanel;
-    }
-    return nullptr;
-}
+        if (pMatchingEntry)
+            bIsEnabled = pMatchingEntry->mbIsInitiallyVisible;
+        else
+            bIsEnabled = false;
 
-void ResourceManager::SetIsDeckEnabled(const OUString& rsDeckId, const bool bIsEnabled)
-{
-    DeckContainer::iterator iDeck;
-    for (iDeck = maDecks.begin(); iDeck != maDecks.end(); ++iDeck)
-    {
-        if (iDeck->mbExperimental && !maMiscOptions.IsExperimentalMode())
-            continue;
-        if (iDeck->msId.equals(rsDeckId))
-        {
-            iDeck->mbIsEnabled = bIsEnabled;
-            return;
-        }
+        iDeck->mbIsEnabled = bIsEnabled;
     }
 }
 
-void ResourceManager::SetDeckTitle(const OUString& rsDeckId, const OUString& sTitle)
+const DeckDescriptor* ResourceManager::ImplGetDeckDescriptor(const OUString& rsDeckId) const
 {
-    DeckContainer::iterator iDeck;
+    DeckContainer::const_iterator iDeck;
+
     for (iDeck = maDecks.begin(); iDeck != maDecks.end(); ++iDeck)
     {
         if (iDeck->mbExperimental && !maMiscOptions.IsExperimentalMode())
             continue;
         if (iDeck->msId.equals(rsDeckId))
-        {
-            iDeck->msTitle = sTitle;
-            iDeck->msHelpText = sTitle;
-            return;
-        }
+            return &*iDeck;
     }
+    return NULL;
 }
-
-void ResourceManager::SetDeckToDescriptor(const OUString& rsDeckId, VclPtr<Deck> aDeck)
+const DeckDescriptor* ResourceManager::GetDeckDescriptor(const OUString& rsDeckId) const
 {
-    DeckContainer::iterator iDeck;
-    for (iDeck = maDecks.begin(); iDeck != maDecks.end(); ++iDeck)
-    {
-        if (iDeck->mbExperimental && !maMiscOptions.IsExperimentalMode())
-            continue;
-        if (iDeck->msId.equals(rsDeckId))
-        {
-            iDeck->mpDeck = aDeck;
-            return;
-        }
-    }
+    return ImplGetDeckDescriptor( rsDeckId );
 }
 
-void ResourceManager::SetDeckOrderIndex(const OUString& rsDeckId, const sal_Int32 orderIndex)
+DeckDescriptor* ResourceManager::GetDeckDescriptor(const OUString& rsDeckId)
 {
-    DeckContainer::iterator iDeck;
-    for (iDeck = maDecks.begin(); iDeck != maDecks.end(); ++iDeck)
-    {
-        if (iDeck->mbExperimental && !maMiscOptions.IsExperimentalMode())
-            continue;
-        if (iDeck->msId.equals(rsDeckId))
-        {
-            iDeck->mnOrderIndex = orderIndex;
-            return;
-        }
-    }
+      const ResourceManager* constMe = this;
+      return const_cast<DeckDescriptor*>( constMe->ImplGetDeckDescriptor(rsDeckId) );
 }
 
-void ResourceManager::SetPanelOrderIndex(const OUString& rsPanelId, const sal_Int32 orderIndex)
+const PanelDescriptor* ResourceManager::ImplGetPanelDescriptor(const OUString& rsPanelId) const
 {
-    PanelContainer::iterator iPanel;
+    PanelContainer::const_iterator iPanel;
     for (iPanel = maPanels.begin(); iPanel != maPanels.end(); ++iPanel)
     {
-        if (iPanel->mbExperimental && !maMiscOptions.IsExperimentalMode())
-            continue;
         if (iPanel->msId.equals(rsPanelId))
-        {
-            iPanel->mnOrderIndex = orderIndex;
-            return;
-        }
+            return &*iPanel;
     }
+    return NULL;
+}
+const PanelDescriptor* ResourceManager::GetPanelDescriptor(const OUString& rsPanelId) const
+{
+    return ImplGetPanelDescriptor( rsPanelId );
+}
+
+PanelDescriptor* ResourceManager::GetPanelDescriptor(const OUString& rsPanelId)
+{
+      const ResourceManager* constMe = this;
+      return const_cast<PanelDescriptor*>( constMe->ImplGetPanelDescriptor(rsPanelId) );
 }
 
 const ResourceManager::DeckContextDescriptorContainer& ResourceManager::GetMatchingDecks (
@@ -190,14 +146,18 @@ const ResourceManager::DeckContextDescriptorContainer& ResourceManager::GetMatch
     {
         if (iDeck->mbExperimental && !maMiscOptions.IsExperimentalMode())
             continue;
+
         const DeckDescriptor& rDeckDescriptor (*iDeck);
         if (rDeckDescriptor.maContextList.GetMatch(rContext) == nullptr)
             continue;
+
         DeckContextDescriptor aDeckContextDescriptor;
         aDeckContextDescriptor.msId = rDeckDescriptor.msId;
-        aDeckContextDescriptor.mbIsEnabled =
-            ! bIsDocumentReadOnly
-            || IsDeckEnabled(rDeckDescriptor.msId, rContext, rxController);
+
+        aDeckContextDescriptor.mbIsEnabled = (! bIsDocumentReadOnly || IsDeckEnabled(rDeckDescriptor.msId, rContext, rxController) )
+                                             && rDeckDescriptor.mbIsEnabled;
+
+
         aOrderedIds.insert(::std::multimap<sal_Int32,DeckContextDescriptor>::value_type(
                 rDeckDescriptor.mnOrderIndex,
                 aDeckContextDescriptor));
@@ -282,14 +242,17 @@ void ResourceManager::ReadDeckList()
         rDeckDescriptor.msHighContrastTitleBarIconURL = getString(aDeckNode, "HighContrastTitleBarIconURL");
         rDeckDescriptor.msHelpURL = getString(aDeckNode, "HelpURL");
         rDeckDescriptor.msHelpText = rDeckDescriptor.msTitle;
-        rDeckDescriptor.mbIsEnabled = true;
+    //  rDeckDescriptor.mbIsEnabled = true; // TODO ??? update rDeckDescriptor.mbIsEnabled according to context , see IsDeckEnabled ?
         rDeckDescriptor.mnOrderIndex = getInt32(aDeckNode, "OrderIndex");
         rDeckDescriptor.mbExperimental = getBool(aDeckNode, "IsExperimental");
 
+        rDeckDescriptor.msNodeName = aDeckNodeNames[nReadIndex];
+
         ReadContextList(
             aDeckNode,
             rDeckDescriptor.maContextList,
             OUString());
+
     }
 
     // When there where invalid nodes then we have to adapt the size
@@ -298,6 +261,81 @@ void ResourceManager::ReadDeckList()
         maDecks.resize(nWriteIndex);
 }
 
+void ResourceManager::SaveDecksSettings(const Context& rContext)
+{
+
+    DeckContainer::const_iterator iDeck;
+    for (iDeck = maDecks.begin(); iDeck != maDecks.end(); ++iDeck)
+    {
+       const ContextList::Entry* pMatchingEntry = iDeck->maContextList.GetMatch(rContext);
+       if (pMatchingEntry)
+       {
+            const DeckDescriptor* pDeckDesc = GetDeckDescriptor(iDeck->msId);
+            if (pDeckDesc)
+                SaveDeckSettings(pDeckDesc);
+       }
+
+    }
+}
+
+void ResourceManager::SaveDeckSettings(const DeckDescriptor* pDeckDesc)
+{
+    const utl::OConfigurationTreeRoot aDeckRootNode(
+                                    comphelper::getProcessComponentContext(),
+                                    OUString("org.openoffice.Office.UI.Sidebar/Content/DeckList"),
+                                    true);
+    if (!aDeckRootNode.isValid())
+        return;
+
+    // save deck settings
+
+    ::uno::Sequence< OUString > sContextList = BuildContextList(pDeckDesc->maContextList, pDeckDesc->mbIsEnabled);
+
+    utl::OConfigurationNode aDeckNode (aDeckRootNode.openNode(pDeckDesc->msNodeName));
+
+    aDeckNode.setNodeValue("Title", makeAny(pDeckDesc->msTitle));
+    aDeckNode.setNodeValue("OrderIndex", makeAny(pDeckDesc->mnOrderIndex));
+    aDeckNode.setNodeValue("ContextList", makeAny( sContextList ));
+
+    aDeckRootNode.commit();
+
+    // save panel settings
+
+    const utl::OConfigurationTreeRoot aPanelRootNode(
+                                    comphelper::getProcessComponentContext(),
+                                    OUString("org.openoffice.Office.UI.Sidebar/Content/PanelList"),
+                                    true);
+
+    if (!aPanelRootNode.isValid())
+        return;
+
+    if (!pDeckDesc->mpDeck) // the deck has not been edited
+        return;
+
+    SharedPanelContainer rPanels = pDeckDesc->mpDeck->GetPanels();
+
+    for ( SharedPanelContainer::iterator iPanel(rPanels.begin()), iEnd(rPanels.end());
+              iPanel!=iEnd; ++iPanel)
+            {
+                Panel* aPanel = *iPanel;
+                OUString panelId = aPanel->GetId();
+                bool isExpanded = aPanel->IsExpanded();
+                const PanelDescriptor* pPanelDesc = GetPanelDescriptor(panelId);
+
+                ::uno::Sequence< OUString > sPanelContextList = BuildContextList(pPanelDesc->maContextList, isExpanded);
+
+                utl::OConfigurationNode aPanelNode (aPanelRootNode.openNode(pPanelDesc->msNodeName));
+
+                aPanelNode.setNodeValue("Title", makeAny(pPanelDesc->msTitle));
+                aPanelNode.setNodeValue("OrderIndex", makeAny(pPanelDesc->mnOrderIndex));
+                aPanelNode.setNodeValue("ContextList", makeAny( sPanelContextList ));
+
+            }
+
+     aPanelRootNode.commit();
+
+}
+
 void ResourceManager::ReadPanelList()
 {
     const utl::OConfigurationTreeRoot aPanelRootNode(
@@ -333,6 +371,8 @@ void ResourceManager::ReadPanelList()
         rPanelDescriptor.mbExperimental = getBool(aPanelNode, "IsExperimental");
         const OUString sDefaultMenuCommand(getString(aPanelNode, "DefaultMenuCommand"));
 
+        rPanelDescriptor.msNodeName = aPanelNodeNames[nReadIndex];
+
         ReadContextList(aPanelNode, rPanelDescriptor.maContextList, sDefaultMenuCommand);
     }
 
@@ -342,6 +382,40 @@ void ResourceManager::ReadPanelList()
         maPanels.resize(nWriteIndex);
 }
 
+css::uno::Sequence<OUString> ResourceManager::BuildContextList (ContextList rContextList, bool isEnabled)
+{
+    const ::std::vector<ContextList::Entry>& entries = rContextList.GetEntries();
+
+     css::uno::Sequence<OUString> result(entries.size());
+     long i = 0;
+
+    for (::std::vector<ContextList::Entry>::const_iterator iEntry(entries.begin()), iEnd(entries.end());
+                                                            iEntry!=iEnd; ++iEntry)
+         {
+            OUString appName = iEntry->maContext.msApplication;
+            OUString contextName = iEntry->maContext.msContext;
+            OUString menuCommand = iEntry->msMenuCommand;
+
+            OUString visibility;
+            if (isEnabled)
+                visibility = "visible";
+            else
+                visibility = "hidden";
+
+            OUString element = appName + ", " + contextName +", " + visibility;
+
+            if (menuCommand != "")
+                element += ", "+menuCommand;
+
+            result[i] = element;
+
+            i++;
+        }
+
+    return result;
+
+}
+
 void ResourceManager::ReadContextList (
                         const utl::OConfigurationNode& rParentNode,
                         ContextList& rContextList,
@@ -358,6 +432,7 @@ void ResourceManager::ReadContextList (
     for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex)
     {
         const OUString sValue (aValues[nIndex]);
+
         sal_Int32 nCharacterIndex (0);
         const OUString sApplicationName (sValue.getToken(0, ',', nCharacterIndex).trim());
         if (nCharacterIndex < 0)
@@ -404,6 +479,7 @@ void ResourceManager::ReadContextList (
         // for Impress).
         std::vector<EnumContext::Application> aApplications;
         EnumContext::Application eApplication (EnumContext::GetApplicationEnum(sApplicationName));
+
         if (eApplication == EnumContext::Application_None
             && !sApplicationName.equals(EnumContext::GetApplicationName(EnumContext::Application_None)))
         {
@@ -471,6 +547,7 @@ void ResourceManager::ReadContextList (
             continue;
         }
 
+
         // Add context descriptors.
         std::vector<EnumContext::Application>::const_iterator iApplication;
         for (iApplication = aApplications.begin(); iApplication != aApplications.end(); ++iApplication)
@@ -630,20 +707,19 @@ bool ResourceManager::IsDeckEnabled (
                         const Context& rContext,
                         const Reference<frame::XController>& rxController)
 {
+
     // Check if any panel that matches the current context can be
     // displayed.
-    ResourceManager::PanelContextDescriptorContainer aPanelContextDescriptors;
+    PanelContextDescriptorContainer aPanelContextDescriptors;
 
-    ResourceManager::Instance().GetMatchingPanels(aPanelContextDescriptors,
-                                                  rContext, rsDeckId, rxController);
+    GetMatchingPanels(aPanelContextDescriptors, rContext, rsDeckId, rxController);
 
-    ResourceManager::PanelContextDescriptorContainer::const_iterator iPanel;
+    PanelContextDescriptorContainer::const_iterator iPanel;
     for (iPanel = aPanelContextDescriptors.begin(); iPanel != aPanelContextDescriptors.end(); ++iPanel)
     {
         if (iPanel->mbShowForReadOnlyDocuments)
             return true;
     }
-
     return false;
 }
 
@@ -656,11 +732,11 @@ void ResourceManager::UpdateModel(css::uno::Reference<css::frame::XModel> xModel
 
         const SharedPanelContainer& rContainer = itr->mpDeck->GetPanels();
 
-        for (SharedPanelContainer::const_iterator it = rContainer.begin(); it != rContainer.end(); ++it) {
+        for (SharedPanelContainer::const_iterator it = rContainer.begin(); it != rContainer.end(); ++it)
+        {
             css::uno::Reference<css::ui::XUpdateModel> xPanel((*it)->GetPanelComponent(), css::uno::UNO_QUERY);
             xPanel->updateModel(xModel);
         }
-
     }
 }
 
diff --git a/sfx2/source/sidebar/SidebarController.cxx b/sfx2/source/sidebar/SidebarController.cxx
index 8cd077f..9fcb82b6 100644
--- a/sfx2/source/sidebar/SidebarController.cxx
+++ b/sfx2/source/sidebar/SidebarController.cxx
@@ -198,6 +198,34 @@ void SAL_CALL SidebarController::disposing()
     maFocusManager.Clear();
     mpTabBar.disposeAndClear();
 
+    // save decks settings
+    // Impress shutdown : context (frame) is disposed before sidebar disposing
+    // calc writer : context (frame) is disposed after sidebar disposing
+    // so need to test if GetCurrentContext is still valid regarding msApplication
+
+    if (GetCurrentContext().msApplication != "none")
+        mpResourceManager->SaveDecksSettings(GetCurrentContext());
+
+    // clear decks
+    ResourceManager::DeckContextDescriptorContainer aDecks;
+
+    mpResourceManager->GetMatchingDecks (
+            aDecks,
+            GetCurrentContext(),
+            IsDocumentReadOnly(),
+            mxFrame->getController());
+
+    for (ResourceManager::DeckContextDescriptorContainer::const_iterator
+            iDeck(aDecks.begin()), iEnd(aDecks.end());
+            iDeck!=iEnd; ++iDeck)
+    {
+        const DeckDescriptor* deckDesc = mpResourceManager->GetDeckDescriptor(iDeck->msId);
+
+        VclPtr<Deck> aDeck = deckDesc->mpDeck;
+        if (aDeck)
+            aDeck.disposeAndClear();
+    }
+
     uno::Reference<css::frame::XController> xController = mxFrame->getController();
     if (!xController.is())
         xController = mxCurrentController;
@@ -233,9 +261,11 @@ void SAL_CALL SidebarController::notifyContextChangeEvent (const css::ui::Contex
     // Update to the requested new context asynchronously to avoid
     // subtle errors caused by SFX2 which in rare cases can not
     // properly handle a synchronous update.
+
     maRequestedContext = Context(
         rEvent.ApplicationName,
         rEvent.ContextName);
+
     if (maRequestedContext != maCurrentContext)
     {
         mxCurrentController.set(rEvent.Source, css::uno::UNO_QUERY);
@@ -272,6 +302,7 @@ void SAL_CALL SidebarController::statusChanged (const css::frame::FeatureStateEv
         // Force the current deck to update its panel list.
         if ( ! mbIsDocumentReadOnly)
             msCurrentDeckId = gsDefaultDeckId;
+
         mnRequestedForceFlags |= SwitchFlag_ForceSwitch;
         maAsynchronousDeckSwitch.CancelRequest();
         maContextChangeUpdate.RequestCall();
@@ -401,11 +432,18 @@ void SidebarController::ProcessNewWidth (const sal_Int32 nNewWidth)
 
 void SidebarController::UpdateConfigurations()
 {
+
     if (maCurrentContext != maRequestedContext
         || mnRequestedForceFlags!=SwitchFlag_NoForce)
     {
+
+        if (maCurrentContext.msApplication != "none")
+            mpResourceManager->SaveDecksSettings(maCurrentContext);
+
         maCurrentContext = maRequestedContext;
 
+        mpResourceManager->InitDeckContext(GetCurrentContext());
+
         // Find the set of decks that could be displayed for the new context.
         ResourceManager::DeckContextDescriptorContainer aDecks;
 
@@ -507,22 +545,93 @@ void SidebarController::SwitchToDeck (
 }
 
 
-void SidebarController::CreateDeck(const ::rtl::OUString& rDeckId)
+void SidebarController::CreateDeck(const ::rtl::OUString& rDeckId, bool bForceCreate)
 {
-    const DeckDescriptor* pDeckDescriptor = mpResourceManager->GetDeckDescriptor(rDeckId);
+    DeckDescriptor* pDeckDescriptor = mpResourceManager->GetDeckDescriptor(rDeckId);
 
-    if (pDeckDescriptor->mpDeck.get()==nullptr)
+    if (pDeckDescriptor)
     {
-        VclPtr<Deck> aDeck = VclPtr<Deck>::Create(
-                *pDeckDescriptor,
-                mpParentWindow,
-                [this]() { return this->RequestCloseDeck(); });
+        VclPtr<Deck> aDeck = pDeckDescriptor->mpDeck;
+        if (aDeck.get()==nullptr || bForceCreate)
+        {
+            if (aDeck.get()!=nullptr)
+                aDeck.disposeAndClear();
 
-        mpResourceManager->SetDeckToDescriptor(rDeckId, aDeck);
+            aDeck = VclPtr<Deck>::Create(
+                            *pDeckDescriptor,
+                            mpParentWindow,
+                            [this]() { return this->RequestCloseDeck(); });
+        }
+        pDeckDescriptor->mpDeck = aDeck;
+        CreatePanels(rDeckId);
     }
-
 }
 
+void SidebarController::CreatePanels(const ::rtl::OUString& rDeckId)
+{
+     DeckDescriptor* pDeckDescriptor = mpResourceManager->GetDeckDescriptor(rDeckId);
+
+    // init panels bounded to that deck, do not wait them being displayed as may be accessed through API
+
+            VclPtr<Deck> pDeck = pDeckDescriptor->mpDeck;
+
+            ResourceManager::PanelContextDescriptorContainer aPanelContextDescriptors;
+
+            css::uno::Reference<css::frame::XController> xController = mxCurrentController.is() ? mxCurrentController : mxFrame->getController();
+
+            mpResourceManager->GetMatchingPanels(
+                                                aPanelContextDescriptors,
+                                                maCurrentContext,
+                                                rDeckId,
+                                                xController);
+
+            // Update the panel list.
+            const sal_Int32 nNewPanelCount (aPanelContextDescriptors.size());
+            SharedPanelContainer aNewPanels;
+
+            aNewPanels.resize(nNewPanelCount);
+            sal_Int32 nWriteIndex (0);
+
+            for (sal_Int32 nReadIndex=0; nReadIndex<nNewPanelCount; ++nReadIndex)
+            {
+                const ResourceManager::PanelContextDescriptor& rPanelContexDescriptor (
+                    aPanelContextDescriptors[nReadIndex]);
+
+                // Determine if the panel can be displayed.
+                const bool bIsPanelVisible (!mbIsDocumentReadOnly || rPanelContexDescriptor.mbShowForReadOnlyDocuments);
+                if ( ! bIsPanelVisible)
+                    continue;
+
+                VclPtr<Panel>  aPanel = CreatePanel(
+                                            rPanelContexDescriptor.msId,
+                                            pDeck->GetPanelParentWindow(),
+                                            rPanelContexDescriptor.mbIsInitiallyVisible,
+                                            maCurrentContext,
+                                            pDeck);
+                if (aPanel.get()!=nullptr )
+                {
+                    aNewPanels[nWriteIndex] = aPanel;
+
+                    // Depending on the context we have to change the command
+                    // for the "more options" dialog.
+                    PanelTitleBar* pTitleBar = aNewPanels[nWriteIndex]->GetTitleBar();
+                    if (pTitleBar != NULL)
+                    {
+                        pTitleBar->SetMoreOptionsCommand(
+                            rPanelContexDescriptor.msMenuCommand,
+                            mxFrame, xController);
+                    }
+                    ++nWriteIndex;
+                 }
+
+            }
+
+            // mpCurrentPanels - may miss stuff (?)
+            aNewPanels.resize(nWriteIndex);
+            pDeck->ResetPanels(aNewPanels);
+
+            pDeckDescriptor->mpDeck = pDeck;
+}
 
 void SidebarController::SwitchToDeck (
     const DeckDescriptor& rDeckDescriptor,
@@ -578,7 +687,11 @@ void SidebarController::SwitchToDeck (
 
     // Provide a configuration and Deck object.
 
-    CreateDeck(rDeckDescriptor.msId);
+    CreateDeck(rDeckDescriptor.msId, bForceNewDeck);
+
+    if (bForceNewPanels && !bForceNewDeck) // already forced if bForceNewDeck
+        CreatePanels(rDeckDescriptor.msId);
+
     mpCurrentDeck.reset(rDeckDescriptor.mpDeck);
 
     if ( ! mpCurrentDeck)
@@ -591,79 +704,6 @@ void SidebarController::SwitchToDeck (
         pDebugTitleBar->SetTitle(rDeckDescriptor.msTitle + " (" + maCurrentContext.msContext + ")");
 #endif
 
-
-    // Update the panel list.
-    const sal_Int32 nNewPanelCount (aPanelContextDescriptors.size());
-    SharedPanelContainer aNewPanels;
-    const SharedPanelContainer& rCurrentPanels (mpCurrentDeck->GetPanels());
-
-    aNewPanels.resize(nNewPanelCount);
-    sal_Int32 nWriteIndex (0);
-    bool bHasPanelSetChanged (false);
-    for (sal_Int32 nReadIndex=0; nReadIndex<nNewPanelCount; ++nReadIndex)
-    {
-        const ResourceManager::PanelContextDescriptor& rPanelContexDescriptor (
-            aPanelContextDescriptors[nReadIndex]);
-
-        // Determine if the panel can be displayed.
-        const bool bIsPanelVisible (!mbIsDocumentReadOnly || rPanelContexDescriptor.mbShowForReadOnlyDocuments);
-        if ( ! bIsPanelVisible)
-            continue;
-
-        // Find the corresponding panel among the currently active
-        // panels.
-        SharedPanelContainer::const_iterator iPanel = rCurrentPanels.end();
-
-        if (!bForceNewPanels)
-        {
-            iPanel = rCurrentPanels.end();
-            for (auto a = rCurrentPanels.begin(); a != rCurrentPanels.end(); ++a)
-            {
-                if ((*a)->HasIdPredicate(rPanelContexDescriptor.msId))
-                {
-                    iPanel = a;
-                    break;
-                }
-            }
-        }
-        if (iPanel != rCurrentPanels.end())
-        {
-            // Panel already exists in current deck.  Reuse it.
-            aNewPanels[nWriteIndex] = *iPanel;
-            aNewPanels[nWriteIndex]->SetExpanded(rPanelContexDescriptor.mbIsInitiallyVisible);
-        }
-        else
-        {
-            // Panel does not yet exist or creation of new panels is forced.
-            // Create it.
-            aNewPanels[nWriteIndex] = CreatePanel(
-                rPanelContexDescriptor.msId,
-                mpCurrentDeck->GetPanelParentWindow(),
-                rPanelContexDescriptor.mbIsInitiallyVisible,
-                rContext);
-            bHasPanelSetChanged = true;
-        }
-
-        if (aNewPanels[nWriteIndex] != nullptr)
-        {
-            // Depending on the context we have to change the command
-            // for the "more options" dialog.
-            PanelTitleBar* pTitleBar = aNewPanels[nWriteIndex]->GetTitleBar();
-            if (pTitleBar != nullptr)
-            {
-                pTitleBar->SetMoreOptionsCommand(
-                    rPanelContexDescriptor.msMenuCommand,
-                    mxFrame, xController);
-            }
-
-            ++nWriteIndex;
-        }
-
-    }
-    // mpCurrentPanels - may miss stuff (?)
-    aNewPanels.resize(nWriteIndex);
-
-
     SfxSplitWindow* pSplitWindow = GetSplitWindow();
     sal_Int32 nTabBarDefaultWidth = TabBar::GetDefaultWidth() * mpTabBar->GetDPIScaleFactor();
     WindowAlign eAlign = pSplitWindow ? pSplitWindow->GetAlign() : WindowAlign::Right;
@@ -685,13 +725,11 @@ void SidebarController::SwitchToDeck (
         mpParentWindow->GetSizePixel().Width() - nTabBarDefaultWidth,
         mpParentWindow->GetSizePixel().Height());
 
-    mpCurrentDeck->ResetPanels(aNewPanels);
     mpCurrentDeck->Show();
 
     mpParentWindow->SetText(rDeckDescriptor.msTitle);
 
-    if (bHasPanelSetChanged)
-        NotifyResize();
+    NotifyResize();
 
     // Tell the focus manager about the new panels and tab bar
     // buttons.
@@ -716,7 +754,8 @@ VclPtr<Panel> SidebarController::CreatePanel (
     const OUString& rsPanelId,
     vcl::Window* pParentWindow,
     const bool bIsInitiallyExpanded,
-    const Context& rContext)
+    const Context& rContext,
+    VclPtr<Deck> pDeck)
 {
     const PanelDescriptor* pPanelDescriptor = mpResourceManager->GetPanelDescriptor(rsPanelId);
 
@@ -728,7 +767,7 @@ VclPtr<Panel> SidebarController::CreatePanel (
         *pPanelDescriptor,
         pParentWindow,
         bIsInitiallyExpanded,
-        [this]() { return mpCurrentDeck.get()->RequestLayout(); },
+        [pDeck]() { return pDeck.get()->RequestLayout(); },
         [this]() { return this->GetCurrentContext(); },
         mxFrame);
 
@@ -915,7 +954,7 @@ std::shared_ptr<PopupMenu> SidebarController::CreatePopupMenu (
         else
         {
             pCustomizationMenu->InsertItem(nSubMenuIndex, iItem->msDisplayName, MenuItemBits::CHECKABLE);
-            pCustomizationMenu->CheckItem(nSubMenuIndex, iItem->mbIsActive);
+            pCustomizationMenu->CheckItem(nSubMenuIndex, iItem->mbIsEnabled && iItem->mbIsActive);
         }
     }
 
@@ -982,7 +1021,19 @@ IMPL_LINK_TYPED(SidebarController, OnMenuItemSelected, Menu*, pMenu, bool)
                 }
                 else if (nIndex >=MID_FIRST_HIDE)
                     if (pMenu->GetItemBits(nIndex) == MenuItemBits::CHECKABLE)
+                    {
                         mpTabBar->ToggleHideFlag(nIndex-MID_FIRST_HIDE);
+
+                        // Find the set of decks that could be displayed for the new context.
+                        ResourceManager::DeckContextDescriptorContainer aDecks;
+                        mpResourceManager->GetMatchingDecks (
+                                                    aDecks,
+                                                    GetCurrentContext(),
+                                                    IsDocumentReadOnly(),
+                                                    mxFrame->getController());
+                        // Notify the tab bar about the updated set of decks.
+                        mpTabBar->SetDecks(aDecks);
+                    }
             }
             catch (RuntimeException&)
             {
diff --git a/sfx2/source/sidebar/TabBar.cxx b/sfx2/source/sidebar/TabBar.cxx
index 9e31bb8..0c99317 100644
--- a/sfx2/source/sidebar/TabBar.cxx
+++ b/sfx2/source/sidebar/TabBar.cxx
@@ -132,8 +132,8 @@ void TabBar::SetDecks(const ResourceManager::DeckContextDescriptorContainer& rDe
         rItem.mpButton = CreateTabItem(*pDescriptor);
         rItem.mpButton->SetClickHdl(LINK(&rItem, TabBar::Item, HandleClick));
         rItem.maDeckActivationFunctor = maDeckActivationFunctor;
-        rItem.mbIsHiddenByDefault = false;
         rItem.mbIsHidden = ! pDescriptor->mbIsEnabled;
+        rItem.mbIsHiddenByDefault = rItem.mbIsHidden; // the default is the state while creating
 
         rItem.mpButton->Enable(iDeck->mbIsEnabled);
     }
@@ -335,9 +335,10 @@ void TabBar::ToggleHideFlag (const sal_Int32 nIndex)
     {
         maItems[nIndex].mbIsHidden = ! maItems[nIndex].mbIsHidden;
 
-    pParentSidebarController->GetResourceManager()->SetIsDeckEnabled(
-            maItems[nIndex].msDeckId,
-            maItems[nIndex].mbIsHidden);
+        DeckDescriptor* pDeckDescriptor = pParentSidebarController->GetResourceManager()->GetDeckDescriptor(maItems[nIndex].msDeckId);
+        if (pDeckDescriptor)
+            pDeckDescriptor->mbIsEnabled = ! maItems[nIndex].mbIsHidden;
+
         Layout();
     }
 }
@@ -351,6 +352,11 @@ void TabBar::RestoreHideFlags()
         {
             iItem->mbIsHidden = iItem->mbIsHiddenByDefault;
             bNeedsLayout = true;
+
+            DeckDescriptor* pDeckDescriptor = pParentSidebarController->GetResourceManager()->GetDeckDescriptor(iItem->msDeckId);
+            if (pDeckDescriptor)
+                pDeckDescriptor->mbIsEnabled = ! iItem->mbIsHidden;
+
         }
     }
     if (bNeedsLayout)
diff --git a/sfx2/source/sidebar/UnoDeck.cxx b/sfx2/source/sidebar/UnoDeck.cxx
index 094fa8a..9305d44 100644
--- a/sfx2/source/sidebar/UnoDeck.cxx
+++ b/sfx2/source/sidebar/UnoDeck.cxx
@@ -67,15 +67,19 @@ void SAL_CALL SfxUnoDeck::setTitle( const OUString& newTitle )
     SidebarController* pSidebarController = getSidebarController();
     pSidebarController->CreateDeck(mDeckId);
 
-    Deck* pDeck = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId)->mpDeck;
+    DeckDescriptor* pDeckDescriptor = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId);
 
-    DeckTitleBar* pTitleBar = pDeck->GetTitleBar();
-    pTitleBar->SetTitle(newTitle);
+    if (pDeckDescriptor)
+    {
+        Deck* pDeck = pDeckDescriptor->mpDeck;
+        DeckTitleBar* pTitleBar = pDeck->GetTitleBar();
+        pTitleBar->SetTitle(newTitle);
 
-    // update the ResourceManager
-    pSidebarController->GetResourceManager()->SetDeckTitle(mDeckId, newTitle);
-    pSidebarController->notifyDeckTitle(mDeckId);
+        pDeckDescriptor->msTitle = newTitle;
+        pDeckDescriptor->msHelpText = newTitle;
 
+        pSidebarController->notifyDeckTitle(mDeckId);
+    }
 }
 
 sal_Bool SAL_CALL SfxUnoDeck::isActive()
@@ -129,10 +133,14 @@ void SAL_CALL SfxUnoDeck::setOrderIndex( const sal_Int32 newOrderIndex )
     SolarMutexGuard aGuard;
     SidebarController* pSidebarController = getSidebarController();
 
-    pSidebarController->GetResourceManager()->SetDeckOrderIndex(mDeckId, newOrderIndex);
+    DeckDescriptor* pDeckDescriptor = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId);
 
-    // update the sidebar
-    pSidebarController->NotifyResize();
+    if (pDeckDescriptor)
+    {
+        pDeckDescriptor->mnOrderIndex = newOrderIndex;
+        // update the sidebar
+        pSidebarController->NotifyResize();
+    }
 }
 
 void SAL_CALL SfxUnoDeck::moveFirst()
@@ -149,8 +157,13 @@ void SAL_CALL SfxUnoDeck::moveFirst()
     if (curOrderIndex != minIndex) // is deck already in place ?
     {
         minIndex -= 1;
-        pSidebarController->GetResourceManager()->SetDeckOrderIndex(mDeckId, minIndex);
-        pSidebarController->NotifyResize();
+        DeckDescriptor* pDeckDescriptor = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId);
+        if (pDeckDescriptor)
+        {
+            pDeckDescriptor->mnOrderIndex = minIndex;
+            // update the sidebar
+            pSidebarController->NotifyResize();
+        }
     }
 }
 
@@ -168,8 +181,13 @@ void SAL_CALL SfxUnoDeck::moveLast()
     if (curOrderIndex != maxIndex) // is deck already in place ?
     {
         maxIndex += 1;
-        pSidebarController->GetResourceManager()->SetDeckOrderIndex(mDeckId, maxIndex);
-        pSidebarController->NotifyResize();
+        DeckDescriptor* pDeckDescriptor = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId);
+        if (pDeckDescriptor)
+        {
+            pDeckDescriptor->mnOrderIndex = maxIndex;
+            // update the sidebar
+            pSidebarController->NotifyResize();
+        }
     }
 }
 
@@ -196,8 +214,13 @@ void SAL_CALL SfxUnoDeck::moveUp()
     if (curOrderIndex != previousIndex) // is deck already in place ?
     {
         previousIndex -= 1;
-        pSidebarController->GetResourceManager()->SetDeckOrderIndex(mDeckId, previousIndex);
-        pSidebarController->NotifyResize();
+        DeckDescriptor* pDeckDescriptor = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId);
+        if (pDeckDescriptor)
+        {
+            pDeckDescriptor->mnOrderIndex = previousIndex;
+            // update the sidebar
+            pSidebarController->NotifyResize();
+        }
     }
 }
 
@@ -225,8 +248,13 @@ void SAL_CALL SfxUnoDeck::moveDown()
     if (curOrderIndex != nextIndex) // is deck already in place ?
     {
         nextIndex += 1;
-        pSidebarController->GetResourceManager()->SetDeckOrderIndex(mDeckId, nextIndex);
-        pSidebarController->NotifyResize();
+        DeckDescriptor* pDeckDescriptor = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId);
+        if (pDeckDescriptor)
+        {
+            pDeckDescriptor->mnOrderIndex = nextIndex;
+            // update the sidebar
+            pSidebarController->NotifyResize();
+        }
     }
 }
 
diff --git a/sfx2/source/sidebar/UnoPanel.cxx b/sfx2/source/sidebar/UnoPanel.cxx
index e52bb27..820515f 100644
--- a/sfx2/source/sidebar/UnoPanel.cxx
+++ b/sfx2/source/sidebar/UnoPanel.cxx
@@ -31,9 +31,11 @@ mpPanel()
 {
     SidebarController* pSidebarController = getSidebarController();
 
+    pSidebarController->CreateDeck(mDeckId); // creates deck object is not already
     mpDeck = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId)->mpDeck;
     mpPanel = mpDeck->GetPanel(mPanelId);
 }
+
 SidebarController* SfxUnoPanel::getSidebarController()
 {
     return SidebarController::GetSidebarControllerForFrame(xFrame);
@@ -61,8 +63,16 @@ void SAL_CALL SfxUnoPanel::setTitle( const OUString& newTitle )
 {
     SolarMutexGuard aGuard;
 
-    PanelTitleBar* pTitleBar = mpPanel->GetTitleBar();
-    pTitleBar->SetTitle(newTitle);
+    SidebarController* pSidebarController = getSidebarController();
+    PanelDescriptor* pPanelDescriptor = pSidebarController->GetResourceManager()->GetPanelDescriptor(mPanelId);
+
+    if (pPanelDescriptor)
+    {
+        pPanelDescriptor->msTitle = newTitle;
+        PanelTitleBar* pTitleBar = mpPanel->GetTitleBar();
+        if (pTitleBar)
+            pTitleBar->SetTitle(newTitle);
+    }
 }
 
 sal_Bool SAL_CALL SfxUnoPanel::isExpanded()
@@ -97,6 +107,9 @@ void SAL_CALL SfxUnoPanel::expand( const sal_Bool bCollapseOther )
         }
     }
 
+    SidebarController* pSidebarController = getSidebarController();
+    pSidebarController->NotifyResize();
+
 }
 
 void SAL_CALL SfxUnoPanel::collapse()
@@ -105,6 +118,8 @@ void SAL_CALL SfxUnoPanel::collapse()
     SolarMutexGuard aGuard;
 
     mpPanel->SetExpanded(false);
+    SidebarController* pSidebarController = getSidebarController();
+    pSidebarController->NotifyResize();
 }
 
 uno::Reference<awt::XWindow> SAL_CALL SfxUnoPanel::getDialog()
@@ -132,9 +147,14 @@ void SAL_CALL SfxUnoPanel::setOrderIndex( const sal_Int32 newOrderIndex )
     SolarMutexGuard aGuard;
     SidebarController* pSidebarController = getSidebarController();
 
-    pSidebarController->GetResourceManager()->SetPanelOrderIndex(mPanelId, newOrderIndex);
+    PanelDescriptor* pPanelDescriptor = pSidebarController->GetResourceManager()->GetPanelDescriptor(mPanelId);
 
-    pSidebarController->NotifyResize();
+    if (pPanelDescriptor)
+    {
+        pPanelDescriptor->mnOrderIndex = newOrderIndex;
+        // update the sidebar
+        pSidebarController->NotifyResize();
+    }
 }
 
 void SAL_CALL SfxUnoPanel::moveFirst()
@@ -151,8 +171,13 @@ void SAL_CALL SfxUnoPanel::moveFirst()
     if (curOrderIndex != minIndex) // is current panel already in place ?
     {
         minIndex -= 1;
-        pSidebarController->GetResourceManager()->SetPanelOrderIndex(mPanelId, minIndex);
-        pSidebarController->NotifyResize();
+        PanelDescriptor* pPanelDescriptor = pSidebarController->GetResourceManager()->GetPanelDescriptor(mPanelId);
+        if (pPanelDescriptor)
+        {
+            pPanelDescriptor->mnOrderIndex = minIndex;
+            // update the sidebar
+            pSidebarController->NotifyResize();
+        }
     }
 }
 
@@ -170,8 +195,13 @@ void SAL_CALL SfxUnoPanel::moveLast()
     if (curOrderIndex != maxIndex) // is current panel already in place ?
     {
         maxIndex += 1;
-        pSidebarController->GetResourceManager()->SetPanelOrderIndex(mPanelId, maxIndex);
-        pSidebarController->NotifyResize();
+        PanelDescriptor* pPanelDescriptor = pSidebarController->GetResourceManager()->GetPanelDescriptor(mPanelId);
+        if (pPanelDescriptor)
+        {
+            pPanelDescriptor->mnOrderIndex = maxIndex;
+            // update the sidebar
+            pSidebarController->NotifyResize();
+        }
     }
 }
 
@@ -198,8 +228,13 @@ void SAL_CALL SfxUnoPanel::moveUp()
     if (curOrderIndex != previousIndex) // is current panel already in place ?
     {
         previousIndex -= 1;
-        pSidebarController->GetResourceManager()->SetPanelOrderIndex(mPanelId, previousIndex);
-        pSidebarController->NotifyResize();
+        PanelDescriptor* pPanelDescriptor = pSidebarController->GetResourceManager()->GetPanelDescriptor(mPanelId);
+        if (pPanelDescriptor)
+        {
+            pPanelDescriptor->mnOrderIndex = previousIndex;
+            // update the sidebar
+            pSidebarController->NotifyResize();
+        }
     }
 }
 
@@ -226,8 +261,13 @@ void SAL_CALL SfxUnoPanel::moveDown()
     if (curOrderIndex != nextIndex) // is current panel already in place ?
     {
         nextIndex += 1;
-        pSidebarController->GetResourceManager()->SetPanelOrderIndex(mPanelId, nextIndex);
-        pSidebarController->NotifyResize();
+        PanelDescriptor* pPanelDescriptor = pSidebarController->GetResourceManager()->GetPanelDescriptor(mPanelId);
+        if (pPanelDescriptor)
+        {
+            pPanelDescriptor->mnOrderIndex = nextIndex;
+            // update the sidebar
+            pSidebarController->NotifyResize();
+        }
     }
 }
 


More information about the Libreoffice-commits mailing list