use officecfg for menu options

Change-Id: I94c9cf310ed6975f158548913439445faf6d178f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/119483
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
diff --git a/cui/source/options/optgdlg.cxx b/cui/source/options/optgdlg.cxx
index 30ca6b7..e55eca6 100644
--- a/cui/source/options/optgdlg.cxx
+++ b/cui/source/options/optgdlg.cxx
@@ -30,7 +30,6 @@
#include <i18nlangtag/mslangid.hxx>
#include <i18nlangtag/languagetag.hxx>
#include <unotools/compatibility.hxx>
#include <svtools/menuoptions.hxx>
#include <svl/languageoptions.hxx>
#include <svtools/miscopt.hxx>
#include <unotools/syslocaleoptions.hxx>
@@ -661,11 +660,10 @@ std::unique_ptr<SfxTabPage> OfaViewTabPage::Create( weld::Container* pPage, weld

bool OfaViewTabPage::FillItemSet( SfxItemSet* )
{
    SvtMenuOptions aMenuOpt;

    bool bModified = false;
    bool bMenuOptModified = false;
    bool bRepaintWindows(false);
    std::shared_ptr<comphelper::ConfigurationChanges> xChanges(comphelper::ConfigurationChanges::create());

    SvtMiscOptions aMiscOptions;
    const sal_Int32 nSizeLB_NewSelection = m_xIconSizeLB->get_active();
@@ -698,9 +696,7 @@ bool OfaViewTabPage::FillItemSet( SfxItemSet* )
            default:
                OSL_FAIL( "OfaViewTabPage::FillItemSet(): This state of m_xSidebarIconSizeLB should not be possible!" );
        }
        auto xChanges = comphelper::ConfigurationChanges::create();
        officecfg::Office::Common::Misc::SidebarIconSize::set(static_cast<sal_Int16>(eSet), xChanges);
        xChanges->commit();
    }

    const sal_Int32 nNotebookbarSizeLB_NewSelection = m_xNotebookbarIconSizeLB->get_active();
@@ -716,9 +712,7 @@ bool OfaViewTabPage::FillItemSet( SfxItemSet* )
            default:
                OSL_FAIL( "OfaViewTabPage::FillItemSet(): This state of m_xNotebookbarIconSizeLB should not be possible!" );
        }
        auto xChanges = comphelper::ConfigurationChanges::create();
        officecfg::Office::Common::Misc::NotebookbarIconSize::set(static_cast<sal_Int16>(eSet), xChanges);
        xChanges->commit();
    }

    const sal_Int32 nStyleLB_NewSelection = m_xIconStyleLB->get_active();
@@ -768,17 +762,19 @@ bool OfaViewTabPage::FillItemSet( SfxItemSet* )

    if (m_xFontShowCB->get_state_changed_from_saved())
    {
        std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create());
        officecfg::Office::Common::Font::View::ShowFontBoxWYSIWYG::set(m_xFontShowCB->get_active(), batch);
        batch->commit();
        officecfg::Office::Common::Font::View::ShowFontBoxWYSIWYG::set(m_xFontShowCB->get_active(), xChanges);
        bModified = true;
    }

    if (m_xMenuIconsLB->get_value_changed_from_saved())
    {
        aMenuOpt.SetMenuIconsState(m_xMenuIconsLB->get_active() == 0 ?
        TriState eMenuIcons = m_xMenuIconsLB->get_active() == 0 ?
            TRISTATE_INDET :
            static_cast<TriState>(m_xMenuIconsLB->get_active() - 1));
            static_cast<TriState>(m_xMenuIconsLB->get_active() - 1);
        // Output cache of current setting as possibly modified by System Theme for older version
        bool bMenuIcons = Application::GetSettings().GetStyleSettings().GetUseImagesInMenus();
        officecfg::Office::Common::View::Menu::IsSystemIconsInMenus::set(eMenuIcons == TRISTATE_INDET, xChanges);
        officecfg::Office::Common::View::Menu::ShowIconsInMenues::set(bMenuIcons, xChanges);
        bModified = true;
        bMenuOptModified = true;
        bAppearanceChanged = true;
@@ -786,9 +782,11 @@ bool OfaViewTabPage::FillItemSet( SfxItemSet* )

    if (m_xContextMenuShortcutsLB->get_value_changed_from_saved())
    {
        aMenuOpt.SetContextMenuShortcuts(m_xContextMenuShortcutsLB->get_active() == 0 ?
        officecfg::Office::Common::View::Menu::ShortcutsInContextMenus::set(
            m_xContextMenuShortcutsLB->get_active() == 0 ?
            TRISTATE_INDET :
            static_cast<TriState>(m_xContextMenuShortcutsLB->get_active() - 1));
            static_cast<TriState>(m_xContextMenuShortcutsLB->get_active() - 1),
            xChanges);
        bModified = true;
        bMenuOptModified = true;
        bAppearanceChanged = true;
@@ -818,13 +816,13 @@ bool OfaViewTabPage::FillItemSet( SfxItemSet* )
    if (m_xUseSkia->get_state_changed_from_saved() ||
        m_xForceSkiaRaster->get_state_changed_from_saved())
    {
        std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create());
        officecfg::Office::Common::VCL::UseSkia::set(m_xUseSkia->get_active(), batch);
        officecfg::Office::Common::VCL::ForceSkiaRaster::set(m_xForceSkiaRaster->get_active(), batch);
        batch->commit();
        officecfg::Office::Common::VCL::UseSkia::set(m_xUseSkia->get_active(), xChanges);
        officecfg::Office::Common::VCL::ForceSkiaRaster::set(m_xForceSkiaRaster->get_active(), xChanges);
        bModified = true;
    }

    xChanges->commit();

    if( bMenuOptModified )
    {
        // Set changed settings to the application instance
@@ -926,11 +924,13 @@ void OfaViewTabPage::Reset( const SfxItemSet* )

    // WorkingSet
    m_xFontShowCB->set_active(officecfg::Office::Common::Font::View::ShowFontBoxWYSIWYG::get());
    SvtMenuOptions aMenuOpt;
    m_xMenuIconsLB->set_active(aMenuOpt.GetMenuIconsState() == 2 ? 0 : aMenuOpt.GetMenuIconsState() + 1);
    bool bMenuIcons = officecfg::Office::Common::View::Menu::ShowIconsInMenues::get();
    bool bSystemMenuIcons = officecfg::Office::Common::View::Menu::IsSystemIconsInMenus::get();
    TriState eMenuIcons = bSystemMenuIcons ? TRISTATE_INDET : static_cast<TriState>(bMenuIcons);
    m_xMenuIconsLB->set_active(eMenuIcons == 2 ? 0 : eMenuIcons + 1);
    m_xMenuIconsLB->save_value();

    TriState eContextMenuShortcuts = aMenuOpt.GetContextMenuShortcuts();
    TriState eContextMenuShortcuts = static_cast<TriState>(officecfg::Office::Common::View::Menu::ShortcutsInContextMenus::get());
    bool bContextMenuShortcutsNonDefault = eContextMenuShortcuts == TRISTATE_FALSE || eContextMenuShortcuts == TRISTATE_TRUE;
    m_xContextMenuShortcutsLB->set_active(bContextMenuShortcutsNonDefault ? eContextMenuShortcuts + 1 : 0);
    m_xContextMenuShortcutsLB->save_value();
diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx
index dec1fbe..828ba1b 100644
--- a/desktop/source/app/app.cxx
+++ b/desktop/source/app/app.cxx
@@ -100,7 +100,6 @@
#include <rtl/byteseq.hxx>
#include <unotools/pathoptions.hxx>
#include <unotools/VersionConfig.hxx>
#include <svtools/menuoptions.hxx>
#include <rtl/bootstrap.hxx>
#include <vcl/test/GraphicsRenderTests.hxx>
#include <vcl/glxtestprocess.hxx>
@@ -1863,9 +1862,11 @@ void Desktop::OverrideSystemSettings( AllSettings& rSettings )
    hMouseSettings.SetFollow( aAppearanceCfg.IsMenuMouseFollow() ? (nFollow|MouseFollowFlags::Menu) : (nFollow&~MouseFollowFlags::Menu));
    rSettings.SetMouseSettings(hMouseSettings);

    SvtMenuOptions aMenuOpt;
    hStyleSettings.SetUseImagesInMenus(aMenuOpt.GetMenuIconsState());
    hStyleSettings.SetContextMenuShortcuts(aMenuOpt.GetContextMenuShortcuts());
    bool bMenuIcons = officecfg::Office::Common::View::Menu::ShowIconsInMenues::get();
    bool bSystemMenuIcons = officecfg::Office::Common::View::Menu::IsSystemIconsInMenus::get();
    TriState eMenuIcons = bSystemMenuIcons ? TRISTATE_INDET : static_cast<TriState>(bMenuIcons);
    hStyleSettings.SetUseImagesInMenus(eMenuIcons);
    hStyleSettings.SetContextMenuShortcuts(static_cast<TriState>(officecfg::Office::Common::View::Menu::ShortcutsInContextMenus::get()));
    hStyleSettings.SetDragFullOptions( nDragFullOptions );
    rSettings.SetStyleSettings ( hStyleSettings );
}
diff --git a/framework/source/uielement/menubarmanager.cxx b/framework/source/uielement/menubarmanager.cxx
index 5cf5e9b..0357eb0 100644
--- a/framework/source/uielement/menubarmanager.cxx
+++ b/framework/source/uielement/menubarmanager.cxx
@@ -43,7 +43,6 @@

#include <comphelper/propertysequence.hxx>
#include <officecfg/Office/Common.hxx>
#include <svtools/menuoptions.hxx>
#include <svtools/javainteractionhandler.hxx>
#include <uno/current_context.hxx>
#include <unotools/cmdoptions.hxx>
@@ -571,7 +570,7 @@ IMPL_LINK( MenuBarManager, Activate, Menu *, pMenu, bool )
                css::uno::getCurrentContext()));

        // set/unset hiding disabled menu entries
        bool bDontHide           = SvtMenuOptions().IsEntryHidingEnabled();
        bool bDontHide           = officecfg::Office::Common::View::Menu::DontHideDisabledEntry::get();
        const StyleSettings& rSettings = Application::GetSettings().GetStyleSettings();
        bool bShowMenuImages     = rSettings.GetUseImagesInMenus();
        bool bShowShortcuts      = m_bHasMenuBar || rSettings.GetContextMenuShortcuts();
diff --git a/framework/source/uielement/toolbarmanager.cxx b/framework/source/uielement/toolbarmanager.cxx
index 00bf67d..c7e6d8c 100644
--- a/framework/source/uielement/toolbarmanager.cxx
+++ b/framework/source/uielement/toolbarmanager.cxx
@@ -73,8 +73,6 @@
#include <vcl/weldutils.hxx>
#include <tools/debug.hxx>

#include <svtools/menuoptions.hxx>

//  namespaces

using namespace ::com::sun::star::awt;
@@ -1887,7 +1885,7 @@ void ToolBarManager::AddCustomizeMenuItems(ToolBox const * pToolBar)
    }

    // popup menu for quick customization
    bool bHideDisabledEntries = !SvtMenuOptions().IsEntryHidingEnabled();
    bool bHideDisabledEntries = !officecfg::Office::Common::View::Menu::DontHideDisabledEntry::get();

    ::PopupMenu *pMenu = pToolBar->GetMenu();

diff --git a/include/svtools/menuoptions.hxx b/include/svtools/menuoptions.hxx
deleted file mode 100644
index 1a08c73..0000000
--- a/include/svtools/menuoptions.hxx
+++ /dev/null
@@ -1,90 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements. See the NOTICE file distributed
 *   with this work for additional information regarding copyright
 *   ownership. The ASF licenses this file to you under the Apache
 *   License, Version 2.0 (the "License"); you may not use this file
 *   except in compliance with the License. You may obtain a copy of
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */
#pragma once

#include <svtools/svtdllapi.h>
#include <sal/types.h>
#include <tools/gen.hxx>
#include <unotools/options.hxx>
#include <memory>

namespace osl
{
class Mutex;
}

/*-************************************************************************************************************
    @short          forward declaration to our private date container implementation
    @descr          We use these class as internal member to support small memory requirements.
                    You can create the container if it is necessary. The class which use these mechanism
                    is faster and smaller then a complete implementation!
**-***********************************************************************************************************/

class SvtMenuOptions_Impl;

/*-************************************************************************************************************
    @short          collect information about menu features
    @devstatus      ready to use
**-***********************************************************************************************************/

class SAL_WARN_UNUSED SVT_DLLPUBLIC SvtMenuOptions final : public utl::detail::Options
{
public:
    SvtMenuOptions();
    virtual ~SvtMenuOptions() override;

    /*-****************************************************************************************************
        @short      interface methods to get and set value of config key "org.openoffice.Office.Common/View/Menu/..."
        @descr      These options describe internal states to enable/disable features of installed office.

                    IsEntryHidingEnabled()
                    SetEntryHidingState()   =>  Activate this field for viewing all deactivated menu entries.
                                                Menu commands that are normally not necessary are hidden by default.
                                                Default=false

                    IsFollowMouseEnabled()
                    SetFollowMouseState()   =>  Automatic selection while moving the mouse on a menu.
                                                Default=true

        @seealso    configuration package "org.openoffice.Office.Common/View/Menu"
    **-***************************************************************************************************/

    bool IsEntryHidingEnabled() const;
    TriState GetMenuIconsState() const;
    void SetMenuIconsState(TriState eState);
    TriState GetContextMenuShortcuts() const;
    void SetContextMenuShortcuts(TriState eState);

private:
    /*-****************************************************************************************************
        @short      return a reference to a static mutex
        @descr      These class is partially threadsafe (for de-/initialization only).
                    All access methods aren't safe!
                    We create a static mutex only for one ime and use at different times.
        @return     A reference to a static mutex member.
    **-***************************************************************************************************/

    SVT_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex();

private:
    std::shared_ptr<SvtMenuOptions_Impl> m_pImpl;

}; // class SvtMenuOptions

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/unotools/itemholderbase.hxx b/include/unotools/itemholderbase.hxx
index 676ed45..2748623 100644
--- a/include/unotools/itemholderbase.hxx
+++ b/include/unotools/itemholderbase.hxx
@@ -48,7 +48,6 @@ enum class EItem

    LinguConfig                   ,

    MenuOptions                   ,
    MiscOptions                   ,
    ModuleOptions                 ,

diff --git a/svtools/Library_svt.mk b/svtools/Library_svt.mk
index 6a23e69..bbcce42 100644
--- a/svtools/Library_svt.mk
+++ b/svtools/Library_svt.mk
@@ -82,7 +82,6 @@ $(eval $(call gb_Library_add_exception_objects,svt,\
    svtools/source/config/fontsubstconfig \
    svtools/source/config/htmlcfg \
    svtools/source/config/itemholder2 \
    svtools/source/config/menuoptions \
    svtools/source/config/miscopt \
    svtools/source/config/slidesorterbaropt \
    svtools/source/config/optionsdrawinglayer \
diff --git a/svtools/source/config/itemholder2.cxx b/svtools/source/config/itemholder2.cxx
index 5299354..92d3226 100644
--- a/svtools/source/config/itemholder2.cxx
+++ b/svtools/source/config/itemholder2.cxx
@@ -26,7 +26,6 @@
#include <com/sun/star/configuration/theDefaultProvider.hpp>

#include <svtools/accessibilityoptions.hxx>
#include <svtools/menuoptions.hxx>
#include <svtools/colorcfg.hxx>
#include <svtools/printoptions.hxx>
#include <unotools/options.hxx>
@@ -128,10 +127,6 @@ void ItemHolder2::impl_newItem(TItemInfo& rItem)
            rItem.pItem.reset( new ::svtools::ColorConfig() );
            break;

        case EItem::MenuOptions :
            rItem.pItem.reset( new SvtMenuOptions() );
            break;

        case EItem::MiscOptions :
            rItem.pItem.reset( new SvtMiscOptions() );
            break;
diff --git a/svtools/source/config/menuoptions.cxx b/svtools/source/config/menuoptions.cxx
deleted file mode 100644
index 49d2128..0000000
--- a/svtools/source/config/menuoptions.cxx
+++ /dev/null
@@ -1,413 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements. See the NOTICE file distributed
 *   with this work for additional information regarding copyright
 *   ownership. The ASF licenses this file to you under the Apache
 *   License, Version 2.0 (the "License"); you may not use this file
 *   except in compliance with the License. You may obtain a copy of
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */

#include <svtools/menuoptions.hxx>
#include <unotools/configitem.hxx>
#include <tools/debug.hxx>
#include <com/sun/star/uno/Any.hxx>
#include <com/sun/star/uno/Sequence.hxx>
#include <vcl/svapp.hxx>
#include <vcl/settings.hxx>

#include "itemholder2.hxx"

//  namespaces

using namespace ::utl                   ;
using namespace ::osl                   ;
using namespace ::com::sun::star::uno   ;

#define ROOTNODE_MENU                           "Office.Common/View/Menu"
#define DEFAULT_DONTHIDEDISABLEDENTRIES         false
#define DEFAULT_FOLLOWMOUSE                     true
#define DEFAULT_MENUICONS                       TRISTATE_INDET
#define DEFAULT_CONTEXTMENUSHORTCUTS            TRISTATE_INDET

#define PROPERTYNAME_DONTHIDEDISABLEDENTRIES    "DontHideDisabledEntry"
#define PROPERTYNAME_FOLLOWMOUSE                "FollowMouse"
#define PROPERTYNAME_SHOWICONSINMENUES          "ShowIconsInMenues"
#define PROPERTYNAME_SYSTEMICONSINMENUES        "IsSystemIconsInMenus"
#define PROPERTYNAME_SHORTCUTSINCONTEXMENU      "ShortcutsInContextMenus"

#define PROPERTYHANDLE_DONTHIDEDISABLEDENTRIES  0
#define PROPERTYHANDLE_FOLLOWMOUSE              1
#define PROPERTYHANDLE_SHOWICONSINMENUES        2
#define PROPERTYHANDLE_SYSTEMICONSINMENUES      3
#define PROPERTYHANDLE_SHORTCUTSINCONTEXMENU    4

//  private declarations!

class SvtMenuOptions_Impl : public ConfigItem
{

    //  private member

    private:
        bool        m_bDontHideDisabledEntries          ;   /// cache "DontHideDisabledEntries" of Menu section
        bool        m_bFollowMouse                      ;   /// cache "FollowMouse" of Menu section
        TriState    m_eMenuIcons                        ;   /// cache "MenuIcons" of Menu section
        TriState    m_eContextMenuShortcuts             ;   /// cache "ShortcutsInContextMenus" of Menu section

    //  public methods

    public:

        //  constructor / destructor

         SvtMenuOptions_Impl();
        virtual ~SvtMenuOptions_Impl() override;

        //  override methods of baseclass

        /*-****************************************************************************************************
            @short      called for notify of configmanager
            @descr      This method is called from the ConfigManager before application ends or from the
                        PropertyChangeListener if the sub tree broadcasts changes. You must update your
                        internal values.

            @seealso    baseclass ConfigItem

            @param      "seqPropertyNames" is the list of properties which should be updated.
        *//*-*****************************************************************************************************/

        virtual void Notify( const Sequence< OUString >& seqPropertyNames ) override;

        //  public interface

        /*-****************************************************************************************************
            @short      access method to get internal values
            @descr      These methods give us a chance to regulate access to our internal values.
                        It's not used at the moment - but it's possible for the future!
        *//*-*****************************************************************************************************/

        bool        IsEntryHidingEnabled() const
                    { return m_bDontHideDisabledEntries; }

        TriState    GetMenuIconsState() const
                    { return m_eMenuIcons; }

        void        SetMenuIconsState(TriState eState)
                    {
                        m_eMenuIcons = eState;
                        SetModified();
                        // tdf#93451: don't Commit() here, it's too early
                    }

        TriState    GetContextMenuShortcuts() const
                    { return m_eContextMenuShortcuts; }

        void        SetContextMenuShortcuts(TriState eState)
                    {
                        m_eContextMenuShortcuts = eState;
                        SetModified();
                        Commit();
                    }

    //  private methods

    private:

        virtual void ImplCommit() override;

        /*-****************************************************************************************************
            @short      return list of fix key names of our configuration management which represent our module tree
            @descr      This method returns a static const list of key names. We need it to get needed values from our
                        configuration management.
            @return     A list of needed configuration keys is returned.
        *//*-*****************************************************************************************************/

        static Sequence< OUString > const & impl_GetPropertyNames();
};

//  constructor

SvtMenuOptions_Impl::SvtMenuOptions_Impl()
    // Init baseclasses first
    :   ConfigItem                  ( ROOTNODE_MENU                     )
    // Init member then.
    ,   m_bDontHideDisabledEntries  ( DEFAULT_DONTHIDEDISABLEDENTRIES   )
    ,   m_bFollowMouse              ( DEFAULT_FOLLOWMOUSE               )
    ,   m_eMenuIcons                ( DEFAULT_MENUICONS                 )
    ,   m_eContextMenuShortcuts     ( DEFAULT_CONTEXTMENUSHORTCUTS      )
{
    // Use our static list of configuration keys to get his values.
    Sequence< OUString >    seqNames    = impl_GetPropertyNames();
    Sequence< Any >         seqValues   = GetProperties( seqNames ) ;

    // Safe impossible cases.
    // We need values from ALL configuration keys.
    // Follow assignment use order of values in relation to our list of key names!
    DBG_ASSERT( !(seqNames.getLength()!=seqValues.getLength()), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nI miss some values of configuration keys!\n" );

    bool bMenuIcons = true;
    bool bSystemMenuIcons = true;
    if (m_eMenuIcons == TRISTATE_INDET)
        bMenuIcons = Application::GetSettings().GetStyleSettings().GetPreferredUseImagesInMenus();
    else
    {
        bSystemMenuIcons = false;
        bMenuIcons = m_eMenuIcons != TRISTATE_FALSE;
    }

    // Copy values from list in right order to our internal member.
    sal_Int32 nPropertyCount    =   seqValues.getLength()   ;
    sal_Int32 nProperty         =   0                       ;
    for( nProperty=0; nProperty<nPropertyCount; ++nProperty )
    {
        // Safe impossible cases.
        // Check any for valid value.
        DBG_ASSERT( seqValues[nProperty].hasValue(), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nInvalid property value for property detected!\n" );

        if (!seqValues[nProperty].hasValue())
            continue;

        switch( nProperty )
        {
            case PROPERTYHANDLE_DONTHIDEDISABLEDENTRIES :   {
                                                                DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\DontHideDisabledEntry\"?" );
                                                                seqValues[nProperty] >>= m_bDontHideDisabledEntries;
                                                            }
                                                            break;

            case PROPERTYHANDLE_FOLLOWMOUSE             :   {
                                                                DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\FollowMouse\"?" );
                                                                seqValues[nProperty] >>= m_bFollowMouse;
                                                            }
                                                            break;
            case PROPERTYHANDLE_SHOWICONSINMENUES       :   {
                                                                DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\ShowIconsInMenues\"?" );
                                                                seqValues[nProperty] >>= bMenuIcons;
                                                            }
                                                            break;
            case PROPERTYHANDLE_SYSTEMICONSINMENUES     :   {
                                                                DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\IsSystemIconsInMenus\"?" );
                                                                seqValues[nProperty] >>= bSystemMenuIcons;
                                                            }
                                                            break;
            case PROPERTYHANDLE_SHORTCUTSINCONTEXMENU   :   {
                                                                DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_SHORT), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\ShortcutsInContextMenus\"?" );
                                                                sal_Int16 nContextMenuShortcuts;
                                                                if ( seqValues[nProperty] >>= nContextMenuShortcuts )
                                                                    m_eContextMenuShortcuts = static_cast<TriState>(nContextMenuShortcuts);
                                                            }
                                                            break;
        }
    }

    m_eMenuIcons = bSystemMenuIcons ? TRISTATE_INDET : static_cast<TriState>(bMenuIcons);

    EnableNotification( seqNames );
}

//  destructor

SvtMenuOptions_Impl::~SvtMenuOptions_Impl()
{
    assert(!IsModified()); // should have been committed
}

//  public method

void SvtMenuOptions_Impl::Notify( const Sequence< OUString >& seqPropertyNames )
{
    // Use given list of updated properties to get his values from configuration directly!
    Sequence< Any > seqValues = GetProperties( seqPropertyNames );
    // Safe impossible cases.
    // We need values from ALL notified configuration keys.
    DBG_ASSERT( !(seqPropertyNames.getLength()!=seqValues.getLength()), "SvtMenuOptions_Impl::Notify()\nI miss some values of configuration keys!\n" );

    bool bMenuSettingsChanged = false;
    bool bMenuIcons = true;
    bool bSystemMenuIcons = true;
    if (m_eMenuIcons == TRISTATE_INDET)
        bMenuIcons = Application::GetSettings().GetStyleSettings().GetUseImagesInMenus();
    else
    {
        bSystemMenuIcons = false;
        bMenuIcons = m_eMenuIcons != TRISTATE_FALSE;
    }

    // Step over list of property names and get right value from corresponding value list to set it on internal members!
    sal_Int32 nCount = seqPropertyNames.getLength();
    for( sal_Int32 nProperty=0; nProperty<nCount; ++nProperty )
    {
        if( seqPropertyNames[nProperty] == PROPERTYNAME_DONTHIDEDISABLEDENTRIES )
        {
            DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::Notify()\nWho has changed the value type of \"Office.Common\\View\\Menu\\DontHideDisabledEntry\"?" );
            seqValues[nProperty] >>= m_bDontHideDisabledEntries;
        }
        else if( seqPropertyNames[nProperty] == PROPERTYNAME_FOLLOWMOUSE )
        {
            DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::Notify()\nWho has changed the value type of \"Office.Common\\View\\Menu\\FollowMouse\"?" );
            seqValues[nProperty] >>= m_bFollowMouse;
        }
        else if( seqPropertyNames[nProperty] == PROPERTYNAME_SHOWICONSINMENUES )
        {
            DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\ShowIconsInMenues\"?" );
            bMenuSettingsChanged |= seqValues[nProperty] >>= bMenuIcons;
        }
        else if( seqPropertyNames[nProperty] == PROPERTYNAME_SYSTEMICONSINMENUES )
        {
            DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\IsSystemIconsInMenus\"?" );
            bMenuSettingsChanged |= seqValues[nProperty] >>= bSystemMenuIcons;
        }
        else if( seqPropertyNames[nProperty] == PROPERTYNAME_SHORTCUTSINCONTEXMENU )
        {
            DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_SHORT), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\ShortcutsInContextMenus\"?" );
            sal_Int16 nContextMenuShortcuts;
            if ( seqValues[nProperty] >>= nContextMenuShortcuts )
                m_eContextMenuShortcuts = static_cast<TriState>(nContextMenuShortcuts);
        }
        else assert( false && "SvtMenuOptions_Impl::Notify()\nUnknown property detected ... I can't handle these!" );
    }

    if ( bMenuSettingsChanged )
        m_eMenuIcons = bSystemMenuIcons ? TRISTATE_INDET : static_cast<TriState>(bMenuIcons);
}

//  public method

void SvtMenuOptions_Impl::ImplCommit()
{
    // Get names of supported properties, create a list for values and copy current values to it.
    Sequence< OUString >    seqNames    = impl_GetPropertyNames();
    sal_Int32               nCount      = seqNames.getLength();
    Sequence< Any >         seqValues   ( nCount );
    for( sal_Int32 nProperty=0; nProperty<nCount; ++nProperty )
    {
        switch( nProperty )
        {
            case PROPERTYHANDLE_DONTHIDEDISABLEDENTRIES :   {
                                                                seqValues[nProperty] <<= m_bDontHideDisabledEntries;
                                                            }
                                                            break;

            case PROPERTYHANDLE_FOLLOWMOUSE             :   {
                                                                seqValues[nProperty] <<= m_bFollowMouse;
                                                            }
                                                            break;
            //Output cache of current setting as possibly modified by System Theme for older version
            case PROPERTYHANDLE_SHOWICONSINMENUES       :   {
                                                                bool bValue = Application::GetSettings().GetStyleSettings().GetUseImagesInMenus();
                                                                seqValues[nProperty] <<= bValue;
                                                            }
                                                            break;
            case PROPERTYHANDLE_SYSTEMICONSINMENUES     :   {
                                                                bool bValue = m_eMenuIcons == TRISTATE_INDET;
                                                                seqValues[nProperty] <<= bValue;
                                                            }
                                                            break;
            case PROPERTYHANDLE_SHORTCUTSINCONTEXMENU   :   {
                                                                seqValues[nProperty] <<= static_cast<sal_Int16>(m_eContextMenuShortcuts);
                                                            }
                                                            break;
        }
    }
    // Set properties in configuration.
    PutProperties( seqNames, seqValues );
}

//  private method

Sequence< OUString > const & SvtMenuOptions_Impl::impl_GetPropertyNames()
{
    static const Sequence<OUString> seqPropertyNames {
        OUString(PROPERTYNAME_DONTHIDEDISABLEDENTRIES)    ,
        OUString(PROPERTYNAME_FOLLOWMOUSE)                ,
        OUString(PROPERTYNAME_SHOWICONSINMENUES)          ,
        OUString(PROPERTYNAME_SYSTEMICONSINMENUES)        ,
        OUString(PROPERTYNAME_SHORTCUTSINCONTEXMENU)
    };
    return seqPropertyNames;
}

namespace {

std::weak_ptr<SvtMenuOptions_Impl> g_pMenuOptions;

}

SvtMenuOptions::SvtMenuOptions()
{
    // Global access, must be guarded (multithreading!).
    MutexGuard aGuard( GetOwnStaticMutex() );

    m_pImpl = g_pMenuOptions.lock();
    if( !m_pImpl )
    {
        m_pImpl = std::make_shared<SvtMenuOptions_Impl>();
        g_pMenuOptions = m_pImpl;
        svtools::ItemHolder2::holdConfigItem(EItem::MenuOptions);
    }
}

SvtMenuOptions::~SvtMenuOptions()
{
    // Global access, must be guarded (multithreading!)
    MutexGuard aGuard( GetOwnStaticMutex() );

    m_pImpl.reset();
}

//  public method

bool SvtMenuOptions::IsEntryHidingEnabled() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
    return m_pImpl->IsEntryHidingEnabled();
}

//  public method

TriState SvtMenuOptions::GetMenuIconsState() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
    return m_pImpl->GetMenuIconsState();
}

//  public method

void SvtMenuOptions::SetMenuIconsState(TriState eState)
{
    MutexGuard aGuard( GetOwnStaticMutex() );
    m_pImpl->SetMenuIconsState(eState);
}

TriState SvtMenuOptions::GetContextMenuShortcuts() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
    return m_pImpl->GetContextMenuShortcuts();
}

void SvtMenuOptions::SetContextMenuShortcuts(TriState eState)
{
    MutexGuard aGuard( GetOwnStaticMutex() );
    m_pImpl->SetContextMenuShortcuts(eState);
}

//  private method

Mutex& SvtMenuOptions::GetOwnStaticMutex()
{
    static Mutex ourMutex;

    return ourMutex;
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */