diff options
author | Noel Grandin <noelgrandin@gmail.com> | 2021-07-25 16:55:17 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2021-07-26 10:10:47 +0200 |
commit | 4df98358135689e1d2600819c61c6b07d8c8a722 (patch) | |
tree | 3a2d83aa9660e3a37d34d473c589c1b9fd60954e /unotools/source | |
parent | 2ee3d4076481262c1e3014dc9341cdf3d1922ff7 (diff) |
simplify SvtDynamicMenuOptions
Change-Id: I8892b8a51fcecd84ea1fedcd71b6d1a2febabee1
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/119484
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'unotools/source')
-rw-r--r-- | unotools/source/config/dynamicmenuoptions.cxx | 453 | ||||
-rw-r--r-- | unotools/source/config/itemholder1.cxx | 4 |
2 files changed, 128 insertions, 329 deletions
diff --git a/unotools/source/config/dynamicmenuoptions.cxx b/unotools/source/config/dynamicmenuoptions.cxx index e89f23406ac4..907d91e4642a 100644 --- a/unotools/source/config/dynamicmenuoptions.cxx +++ b/unotools/source/config/dynamicmenuoptions.cxx @@ -21,21 +21,16 @@ #include <sal/log.hxx> #include <unotools/dynamicmenuoptions.hxx> -#include <unotools/configitem.hxx> #include <tools/debug.hxx> +#include <unotools/configmgr.hxx> +#include <unotools/configitem.hxx> #include <com/sun/star/uno/Any.hxx> #include <com/sun/star/uno/Sequence.hxx> #include <com/sun/star/beans/PropertyValue.hpp> #include <vector> - -#include "itemholder1.hxx" - #include <algorithm> -using namespace ::std; -using namespace ::utl; -using namespace ::osl; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; @@ -44,7 +39,6 @@ using namespace ::com::sun::star::beans; #define DYNAMICMENU_PROPERTYNAME_IMAGEIDENTIFIER "ImageIdentifier" #define DYNAMICMENU_PROPERTYNAME_TARGETNAME "TargetName" -#define ROOTNODE_MENUS "Office.Common/Menus/" #define PATHDELIMITER "/" #define SETNODE_NEWMENU "New" @@ -59,175 +53,83 @@ using namespace ::com::sun::star::beans; #define PATHPREFIX_SETUP "m" -namespace { - - +namespace +{ /*-**************************************************************************************************************** @descr support simple menu structures and operations on it ****************************************************************************************************************-*/ -class SvtDynMenu +struct SvtDynMenu { - public: - // append setup written menu entry - // Don't touch name of entry. It was defined by setup and must be the same every time! - // Look for double menu entries here too... may be some separator items are superfluous... - void AppendSetupEntry( const SvtDynMenuEntry& rEntry ) - { - if( - ( lSetupEntries.empty() ) || - ( lSetupEntries.rbegin()->sURL != rEntry.sURL ) - ) - { - lSetupEntries.push_back( rEntry ); - } - } + // append setup written menu entry + // Don't touch name of entry. It was defined by setup and must be the same every time! + // Look for double menu entries here too... may be some separator items are superfluous... + void AppendSetupEntry( const SvtDynMenuEntry& rEntry ) + { + if( lSetupEntries.empty() || lSetupEntries.rbegin()->sURL != rEntry.sURL ) + lSetupEntries.push_back( rEntry ); + } - // convert internal list to external format - // for using it on right menus really - // Notice: We build a property list with 4 entries and set it on result list then. - // Separator entries will be packed in another way then normal entries! We define - // special string "sSeparator" to perform too ... - std::vector< SvtDynMenuEntry > GetList() const - { - sal_Int32 nSetupCount = static_cast<sal_Int32>(lSetupEntries.size()); - sal_Int32 nUserCount = static_cast<sal_Int32>(lUserEntries.size()); - sal_Int32 nStep = 0; - std::vector< SvtDynMenuEntry > lResult ( nSetupCount+nUserCount ); - OUString sSeparator ( "private:separator" ); + // convert internal list to external format + // for using it on right menus really + // Notice: We build a property list with 4 entries and set it on result list then. + // Separator entries will be packed in another way then normal entries! We define + // special string "sSeparator" to perform too ... + std::vector< SvtDynMenuEntry > GetList() const + { + sal_Int32 nSetupCount = static_cast<sal_Int32>(lSetupEntries.size()); + sal_Int32 nUserCount = static_cast<sal_Int32>(lUserEntries.size()); + sal_Int32 nStep = 0; + std::vector< SvtDynMenuEntry > lResult ( nSetupCount+nUserCount ); + OUString sSeparator ( "private:separator" ); - for( const auto& pList : {&lSetupEntries, &lUserEntries} ) + for( const auto& pList : {&lSetupEntries, &lUserEntries} ) + { + for( const auto& rItem : *pList ) { - for( const auto& rItem : *pList ) + SvtDynMenuEntry entry; + if( rItem.sURL == sSeparator ) + { + entry.sURL = sSeparator; + } + else { - SvtDynMenuEntry entry; - if( rItem.sURL == sSeparator ) - { - entry.sURL = sSeparator; - } - else - { - entry = rItem; - } - lResult[nStep] = entry; - ++nStep; + entry = rItem; } + lResult[nStep] = entry; + ++nStep; } - return lResult; } + return lResult; + } - private: - vector< SvtDynMenuEntry > lSetupEntries; - vector< SvtDynMenuEntry > lUserEntries; +private: + std::vector< SvtDynMenuEntry > lSetupEntries; + std::vector< SvtDynMenuEntry > lUserEntries; }; } -class SvtDynamicMenuOptions_Impl : public ConfigItem +namespace SvtDynamicMenuOptions { - public: - - SvtDynamicMenuOptions_Impl(); - virtual ~SvtDynamicMenuOptions_Impl() override; - - /*-**************************************************************************************************** - @short called for notify of configmanager - @descr This method is called from the ConfigManager before the application ends or from the - PropertyChangeListener if the sub tree broadcasts changes. You must update your - internal values. - - @seealso baseclass ConfigItem - - @param "lPropertyNames" is the list of properties which should be updated. - *//*-*****************************************************************************************************/ - - virtual void Notify( const Sequence< OUString >& lPropertyNames ) override; - - /*-**************************************************************************************************** - @short base implementation of public interface for "SvtDynamicMenuOptions"! - @descr These class is used as static member of "SvtDynamicMenuOptions" ... - => The code exist only for one time and isn't duplicated for every instance! - *//*-*****************************************************************************************************/ - - std::vector< SvtDynMenuEntry > GetMenu ( EDynamicMenuType eMenu ) const; - - private: - - virtual void ImplCommit() override; - - /*-**************************************************************************************************** - @short return list of key names of our configuration management which represent our module tree - @descr This method returns the current list of key names! We need it to get needed values from our - configuration management and support dynamical menu item lists! - @param "nNewCount" , returns count of menu entries for "new" - @param "nWizardCount" , returns count of menu entries for "wizard" - @return A list of configuration key names is returned. - *//*-*****************************************************************************************************/ - - Sequence< OUString > impl_GetPropertyNames( sal_uInt32& nNewCount, sal_uInt32& nWizardCount ); - - /*-**************************************************************************************************** - @short sort given source list and expand it for all well known properties to destination - @descr We must support sets of entries with count inside the name .. but some of them could be missing! - e.g. s1-s2-s3-s0-u1-s6-u5-u7 - Then we must sort it by name and expand it to the follow one: - sSetNode/s0/URL - sSetNode/s0/Title - sSetNode/s0/... - sSetNode/s1/URL - sSetNode/s1/Title - sSetNode/s1/... - ... - sSetNode/s6/URL - sSetNode/s6/Title - sSetNode/s6/... - sSetNode/u1/URL - sSetNode/u1/Title - sSetNode/u1/... - ... - sSetNode/u7/URL - sSetNode/u7/Title - sSetNode/u7/... - Rules: We start with all setup written entries names "sx" and x=[0..n]. - Then we handle all "ux" items. Inside these blocks we sort it ascending by number. - - @attention We add these expanded list to the end of given "lDestination" list! - So we must start on "lDestination.getLength()". - Reallocation of memory of destination list is done by us! - - @seealso method impl_GetPropertyNames() - - @param "lSource" , original list (e.g. [m1-m2-m3-m6-m0] ) - @param "lDestination" , destination of operation - @param "sSetNode" , name of configuration set to build complete path - @return A list of configuration key names is returned. - *//*-*****************************************************************************************************/ - - static void impl_SortAndExpandPropertyNames( const Sequence< OUString >& lSource , - Sequence< OUString >& lDestination , - std::u16string_view sSetNode ); - - // private member - - private: - - SvtDynMenu m_aNewMenu; - SvtDynMenu m_aWizardMenu; -}; -// constructor +static Sequence< OUString > lcl_GetPropertyNames( + css::uno::Reference<css::container::XHierarchicalNameAccess> const & xHierarchyAccess, + sal_uInt32& nNewCount, sal_uInt32& nWizardCount ); -SvtDynamicMenuOptions_Impl::SvtDynamicMenuOptions_Impl() - // Init baseclasses first - : ConfigItem( ROOTNODE_MENUS ) - // Init member then... +std::vector< SvtDynMenuEntry > GetMenu( EDynamicMenuType eMenu ) { + SvtDynMenu aNewMenu; + SvtDynMenu aWizardMenu; + + Reference<css::container::XHierarchicalNameAccess> xHierarchyAccess = utl::ConfigManager::acquireTree(u"Office.Common/Menus/"); + // Get names and values of all accessible menu entries and fill internal structures. // See impl_GetPropertyNames() for further information. sal_uInt32 nNewCount = 0; sal_uInt32 nWizardCount = 0; - Sequence< OUString > lNames = impl_GetPropertyNames ( nNewCount , + Sequence< OUString > lNames = lcl_GetPropertyNames ( xHierarchyAccess, nNewCount , nWizardCount ); - Sequence< Any > lValues = GetProperties ( lNames ); + Sequence< Any > lValues = utl::ConfigItem::GetProperties( xHierarchyAccess, lNames, /*bAllLocales*/false ); // Safe impossible cases. // We need values from ALL configuration keys. @@ -273,7 +175,7 @@ SvtDynamicMenuOptions_Impl::SvtDynamicMenuOptions_Impl() ++nPosition; lValues[nPosition] >>= aItem.sTargetName; ++nPosition; - m_aNewMenu.AppendSetupEntry( aItem ); + aNewMenu.AppendSetupEntry( aItem ); } // Attention: Don't reset nPosition here! @@ -291,143 +193,98 @@ SvtDynamicMenuOptions_Impl::SvtDynamicMenuOptions_Impl() ++nPosition; lValues[nPosition] >>= aItem.sTargetName; ++nPosition; - m_aWizardMenu.AppendSetupEntry( aItem ); - } - - // Attention: Don't reset nPosition here! - -/*TODO: Not used in the moment! see Notify() ... - // Enable notification mechanism of our baseclass. - // We need it to get information about changes outside these class on our used configuration keys! - EnableNotification( lNames ); -*/ -} - -// destructor - -SvtDynamicMenuOptions_Impl::~SvtDynamicMenuOptions_Impl() -{ - assert(!IsModified()); // should have been committed -} - -// public method - -void SvtDynamicMenuOptions_Impl::Notify( const Sequence< OUString >& ) -{ - SAL_WARN( "unotools.config", "SvtDynamicMenuOptions_Impl::Notify() Not implemented yet! I don't know how I can handle a dynamical list of unknown properties ..." ); -} - -// public method - -void SvtDynamicMenuOptions_Impl::ImplCommit() -{ - SAL_WARN("unotools.config", "SvtDynamicMenuOptions_Impl::ImplCommit(): Not implemented yet!"); - /* - // Write all properties! - // Delete complete sets first. - ClearNodeSet( SETNODE_NEWMENU ); - ClearNodeSet( SETNODE_WIZARDMENU ); - - MenuEntry aItem; - OUString sNode; - Sequence< PropertyValue > lPropertyValues( PROPERTYCOUNT ); - sal_uInt32 nItem = 0; - - // Copy "new" menu entries to save-list! - sal_uInt32 nNewCount = m_aNewMenu.size(); - for( nItem=0; nItem<nNewCount; ++nItem ) - { - aItem = m_aNewMenu[nItem]; - // Format: "New/1/URL" - // "New/1/Title" - // ... - sNode = SETNODE_NEWMENU + PATHDELIMITER + PATHPREFIX + OUString::valueOf( (sal_Int32)nItem ) + PATHDELIMITER; - - lPropertyValues[OFFSET_URL ].Name = sNode + PROPERTYNAME_URL; - lPropertyValues[OFFSET_TITLE ].Name = sNode + PROPERTYNAME_TITLE; - lPropertyValues[OFFSET_IMAGEIDENTIFIER ].Name = sNode + PROPERTYNAME_IMAGEIDENTIFIER; - lPropertyValues[OFFSET_TARGETNAME ].Name = sNode + PROPERTYNAME_TARGETNAME; - - lPropertyValues[OFFSET_URL ].Value <<= aItem.sURL; - lPropertyValues[OFFSET_TITLE ].Value <<= aItem.sTitle; - lPropertyValues[OFFSET_IMAGEIDENTIFIER ].Value <<= aItem.sImageIdentifier; - lPropertyValues[OFFSET_TARGETNAME ].Value <<= aItem.sTargetName; - - SetSetProperties( SETNODE_NEWMENU, lPropertyValues ); - } - - // Copy "wizard" menu entries to save-list! - sal_uInt32 nWizardCount = m_aWizardMenu.size(); - for( nItem=0; nItem<nWizardCount; ++nItem ) - { - aItem = m_aWizardMenu[nItem]; - // Format: "Wizard/1/URL" - // "Wizard/1/Title" - // ... - sNode = SETNODE_WIZARDMENU + PATHDELIMITER + PATHPREFIX + OUString::valueOf( (sal_Int32)nItem ) + PATHDELIMITER; - - lPropertyValues[OFFSET_URL ].Name = sNode + PROPERTYNAME_URL; - lPropertyValues[OFFSET_TITLE ].Name = sNode + PROPERTYNAME_TITLE; - lPropertyValues[OFFSET_IMAGEIDENTIFIER ].Name = sNode + PROPERTYNAME_IMAGEIDENTIFIER; - lPropertyValues[OFFSET_TARGETNAME ].Name = sNode + PROPERTYNAME_TARGETNAME; - - lPropertyValues[OFFSET_URL ].Value <<= aItem.sURL; - lPropertyValues[OFFSET_TITLE ].Value <<= aItem.sTitle; - lPropertyValues[OFFSET_IMAGEIDENTIFIER ].Value <<= aItem.sImageIdentifier; - lPropertyValues[OFFSET_TARGETNAME ].Value <<= aItem.sTargetName; - - SetSetProperties( SETNODE_WIZARDMENU, lPropertyValues ); + aWizardMenu.AppendSetupEntry( aItem ); } - */ -} - -// public method - -std::vector< SvtDynMenuEntry > SvtDynamicMenuOptions_Impl::GetMenu( EDynamicMenuType eMenu ) const -{ std::vector< SvtDynMenuEntry > lReturn; switch( eMenu ) { case EDynamicMenuType::NewMenu : - lReturn = m_aNewMenu.GetList(); + lReturn = aNewMenu.GetList(); break; case EDynamicMenuType::WizardMenu : - lReturn = m_aWizardMenu.GetList(); + lReturn = aWizardMenu.GetList(); break; } return lReturn; } -// private method - -Sequence< OUString > SvtDynamicMenuOptions_Impl::impl_GetPropertyNames( sal_uInt32& nNewCount, sal_uInt32& nWizardCount ) +static void lcl_SortAndExpandPropertyNames( const Sequence< OUString >& lSource, + Sequence< OUString >& lDestination, std::u16string_view sSetNode ); + +/*-**************************************************************************************************** + @short return list of key names of our configuration management which represent our module tree + @descr This method returns the current list of key names! We need it to get needed values from our + configuration management and support dynamical menu item lists! + @param "nNewCount" , returns count of menu entries for "new" + @param "nWizardCount" , returns count of menu entries for "wizard" + @return A list of configuration key names is returned. +*//*-*****************************************************************************************************/ +static Sequence< OUString > lcl_GetPropertyNames( + css::uno::Reference<css::container::XHierarchicalNameAccess> const & xHierarchyAccess, + sal_uInt32& nNewCount, sal_uInt32& nWizardCount ) { // First get ALL names of current existing list items in configuration! - Sequence< OUString > lNewItems = GetNodeNames( SETNODE_NEWMENU ); - Sequence< OUString > lWizardItems = GetNodeNames( SETNODE_WIZARDMENU ); + Sequence< OUString > lNewItems = utl::ConfigItem::GetNodeNames( xHierarchyAccess, SETNODE_NEWMENU, utl::ConfigNameFormat::LocalPath ); + Sequence< OUString > lWizardItems = utl::ConfigItem::GetNodeNames( xHierarchyAccess, SETNODE_WIZARDMENU, utl::ConfigNameFormat::LocalPath ); // Get information about list counts ... - nNewCount = lNewItems.getLength (); - nWizardCount = lWizardItems.getLength (); + nNewCount = lNewItems.getLength(); + nWizardCount = lWizardItems.getLength(); // Sort and expand all three list to result list ... Sequence< OUString > lProperties; - impl_SortAndExpandPropertyNames( lNewItems , lProperties, u"" SETNODE_NEWMENU ); - impl_SortAndExpandPropertyNames( lWizardItems , lProperties, u"" SETNODE_WIZARDMENU ); + lcl_SortAndExpandPropertyNames( lNewItems , lProperties, u"" SETNODE_NEWMENU ); + lcl_SortAndExpandPropertyNames( lWizardItems , lProperties, u"" SETNODE_WIZARDMENU ); // Return result. return lProperties; } -// private helper - -namespace { - -class CountWithPrefixSort +/*-**************************************************************************************************** + @short sort given source list and expand it for all well known properties to destination + @descr We must support sets of entries with count inside the name .. but some of them could be missing! + e.g. s1-s2-s3-s0-u1-s6-u5-u7 + Then we must sort it by name and expand it to the follow one: + sSetNode/s0/URL + sSetNode/s0/Title + sSetNode/s0/... + sSetNode/s1/URL + sSetNode/s1/Title + sSetNode/s1/... + ... + sSetNode/s6/URL + sSetNode/s6/Title + sSetNode/s6/... + sSetNode/u1/URL + sSetNode/u1/Title + sSetNode/u1/... + ... + sSetNode/u7/URL + sSetNode/u7/Title + sSetNode/u7/... + Rules: We start with all setup written entries names "sx" and x=[0..n]. + Then we handle all "ux" items. Inside these blocks we sort it ascending by number. + + @attention We add these expanded list to the end of given "lDestination" list! + So we must start on "lDestination.getLength()". + Reallocation of memory of destination list is done by us! + + @seealso method impl_GetPropertyNames() + + @param "lSource" , original list (e.g. [m1-m2-m3-m6-m0] ) + @param "lDestination" , destination of operation + @param "sSetNode" , name of configuration set to build complete path + @return A list of configuration key names is returned. +*//*-*****************************************************************************************************/ + +static void lcl_SortAndExpandPropertyNames( const Sequence< OUString >& lSource , + Sequence< OUString >& lDestination , + std::u16string_view sSetNode ) { - public: + struct CountWithPrefixSort + { bool operator() ( const OUString& s1 , const OUString& s2 ) const { @@ -440,27 +297,17 @@ class CountWithPrefixSort // insert-positions of given entries in sorted list! return( n1<n2 ); } -}; - -class SelectByPrefix -{ - public: + }; + struct SelectByPrefix + { bool operator() ( const OUString& s ) const { // Prefer setup written entries by check first letter of given string. It must be a "s". return s.startsWith( PATHPREFIX_SETUP ); } -}; + }; -} - -// private method - -void SvtDynamicMenuOptions_Impl::impl_SortAndExpandPropertyNames( const Sequence< OUString >& lSource , - Sequence< OUString >& lDestination , - std::u16string_view sSetNode ) -{ - vector< OUString > lTemp; + std::vector< OUString > lTemp; sal_Int32 nSourceCount = lSource.getLength(); sal_Int32 nDestinationStep = lDestination.getLength(); // start on end of current list ...! @@ -470,9 +317,9 @@ void SvtDynamicMenuOptions_Impl::impl_SortAndExpandPropertyNames( const Sequence lTemp.insert( lTemp.end(), lSource.begin(), lSource.end() ); // Sort all entries by number ... - stable_sort( lTemp.begin(), lTemp.end(), CountWithPrefixSort() ); + std::stable_sort( lTemp.begin(), lTemp.end(), CountWithPrefixSort() ); // and split into setup & user written entries! - stable_partition( lTemp.begin(), lTemp.end(), SelectByPrefix() ); + std::stable_partition( lTemp.begin(), lTemp.end(), SelectByPrefix() ); // Copy sorted entries to destination and expand every item with // 4 supported sub properties. @@ -486,51 +333,7 @@ void SvtDynamicMenuOptions_Impl::impl_SortAndExpandPropertyNames( const Sequence } } -namespace { - // global - std::weak_ptr<SvtDynamicMenuOptions_Impl> g_pDynamicMenuOptions; -} - -SvtDynamicMenuOptions::SvtDynamicMenuOptions() -{ - // Global access, must be guarded (multithreading!). - MutexGuard aGuard( GetOwnStaticMutex() ); - - m_pImpl = g_pDynamicMenuOptions.lock(); - if( !m_pImpl ) - { - m_pImpl = std::make_shared<SvtDynamicMenuOptions_Impl>(); - g_pDynamicMenuOptions = m_pImpl; - ItemHolder1::holdConfigItem(EItem::DynamicMenuOptions); - } -} - -SvtDynamicMenuOptions::~SvtDynamicMenuOptions() -{ - // Global access, must be guarded (multithreading!) - MutexGuard aGuard( GetOwnStaticMutex() ); - - m_pImpl.reset(); -} - -// public method -std::vector< SvtDynMenuEntry > SvtDynamicMenuOptions::GetMenu( EDynamicMenuType eMenu ) const -{ - MutexGuard aGuard( GetOwnStaticMutex() ); - return m_pImpl->GetMenu( eMenu ); -} - -namespace -{ - class theDynamicMenuOptionsMutex : public rtl::Static<osl::Mutex, theDynamicMenuOptionsMutex>{}; -} - -// private method - -Mutex& SvtDynamicMenuOptions::GetOwnStaticMutex() -{ - return theDynamicMenuOptionsMutex::get(); -} +} // namespace SvtDynamicMenuOptions /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/unotools/source/config/itemholder1.cxx b/unotools/source/config/itemholder1.cxx index 23149a6af6b8..b5bc50b7e118 100644 --- a/unotools/source/config/itemholder1.cxx +++ b/unotools/source/config/itemholder1.cxx @@ -129,10 +129,6 @@ void ItemHolder1::impl_newItem(TItemInfo& rItem) rItem.pItem.reset( new SvtDefaultOptions() ); break; - case EItem::DynamicMenuOptions : - rItem.pItem.reset( new SvtDynamicMenuOptions() ); - break; - case EItem::EventConfig : //rItem.pItem.reset( new GlobalEventConfig() ); break; |