cui/source/dialogs/hldocntp.cxx | 2 framework/source/uielement/newmenucontroller.cxx | 2 include/unotools/dynamicmenuoptions.hxx | 52 -- include/unotools/itemholderbase.hxx | 1 sfx2/source/appl/shutdowniconaqua.mm | 2 sfx2/source/appl/shutdowniconw32.cxx | 2 unotools/source/config/dynamicmenuoptions.cxx | 453 ++++++----------------- unotools/source/config/itemholder1.cxx | 4 8 files changed, 144 insertions(+), 374 deletions(-)
New commits: commit 4df98358135689e1d2600819c61c6b07d8c8a722 Author: Noel Grandin <noelgran...@gmail.com> AuthorDate: Sun Jul 25 16:55:17 2021 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Mon Jul 26 10:10:47 2021 +0200 simplify SvtDynamicMenuOptions Change-Id: I8892b8a51fcecd84ea1fedcd71b6d1a2febabee1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/119484 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/cui/source/dialogs/hldocntp.cxx b/cui/source/dialogs/hldocntp.cxx index 31b3ba2d5de4..8d8628ded6ed 100644 --- a/cui/source/dialogs/hldocntp.cxx +++ b/cui/source/dialogs/hldocntp.cxx @@ -158,7 +158,7 @@ void SvxHyperlinkNewDocTp::FillDocumentList() { weld::WaitObject aWaitObj(mpDialog->getDialog()); - std::vector<SvtDynMenuEntry> aDynamicMenuEntries( SvtDynamicMenuOptions().GetMenu( EDynamicMenuType::NewMenu ) ); + std::vector<SvtDynMenuEntry> aDynamicMenuEntries( SvtDynamicMenuOptions::GetMenu( EDynamicMenuType::NewMenu ) ); for ( const SvtDynMenuEntry & rDynamicMenuEntry : aDynamicMenuEntries ) { diff --git a/framework/source/uielement/newmenucontroller.cxx b/framework/source/uielement/newmenucontroller.cxx index 4189442d701c..579fff015582 100644 --- a/framework/source/uielement/newmenucontroller.cxx +++ b/framework/source/uielement/newmenucontroller.cxx @@ -326,7 +326,7 @@ void NewMenuController::fillPopupMenu( Reference< css::awt::XPopupMenu > const & return; const std::vector< SvtDynMenuEntry > aDynamicMenuEntries = - SvtDynamicMenuOptions().GetMenu( m_bNewMenu ? EDynamicMenuType::NewMenu : EDynamicMenuType::WizardMenu ); + SvtDynamicMenuOptions::GetMenu( m_bNewMenu ? EDynamicMenuType::NewMenu : EDynamicMenuType::WizardMenu ); sal_uInt16 nItemId = 1; diff --git a/include/unotools/dynamicmenuoptions.hxx b/include/unotools/dynamicmenuoptions.hxx index 9b436d64488b..d1c1c7249af1 100644 --- a/include/unotools/dynamicmenuoptions.hxx +++ b/include/unotools/dynamicmenuoptions.hxx @@ -21,12 +21,8 @@ #include <unotools/unotoolsdllapi.h> #include <sal/types.h> -#include <unotools/options.hxx> #include <rtl/ustring.hxx> -#include <memory> - -namespace com::sun::star::beans { struct PropertyValue; } -namespace osl { class Mutex; } +#include <vector> /*-**************************************************************************************************************** @descr struct to hold information about one menu entry. @@ -48,14 +44,6 @@ enum class EDynamicMenuType WizardMenu = 1 }; -/*-************************************************************************************************************ - @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 SvtDynamicMenuOptions_Impl; /*-************************************************************************************************************ @short collect information about dynamic menus @@ -63,39 +51,23 @@ class SvtDynamicMenuOptions_Impl; @devstatus ready to use *//*-*************************************************************************************************************/ -class SAL_WARN_UNUSED UNOTOOLS_DLLPUBLIC SvtDynamicMenuOptions final : public utl::detail::Options +namespace SvtDynamicMenuOptions { - public: - SvtDynamicMenuOptions(); - virtual ~SvtDynamicMenuOptions() override; - - /*-**************************************************************************************************** - @short return complete specified list - @descr Call it to get all entries of an dynamic menu. - We return a list of all nodes with its names and properties. - @param "eMenu" select right menu. - @return A list of menu items is returned. - - @onerror We return an empty list. - *//*-*****************************************************************************************************/ - std::vector< SvtDynMenuEntry > GetMenu( EDynamicMenuType eMenu ) const; - private: + /*-**************************************************************************************************** + @short return complete specified list + @descr Call it to get all entries of an dynamic menu. + We return a list of all nodes with its names and properties. + @param "eMenu" select right menu. + @return A list of menu items is returned. - /*-**************************************************************************************************** - @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. - *//*-*****************************************************************************************************/ + @onerror We return an empty list. + *//*-*****************************************************************************************************/ - UNOTOOLS_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); + UNOTOOLS_DLLPUBLIC std::vector< SvtDynMenuEntry > GetMenu( EDynamicMenuType eMenu ); - private: - std::shared_ptr<SvtDynamicMenuOptions_Impl> m_pImpl; -}; // class SvtDynamicMenuOptions +}; // namespace SvtDynamicMenuOptions #endif // INCLUDED_UNOTOOLS_DYNAMICMENUOPTIONS_HXX diff --git a/include/unotools/itemholderbase.hxx b/include/unotools/itemholderbase.hxx index 2748623a42bf..579046511e38 100644 --- a/include/unotools/itemholderbase.hxx +++ b/include/unotools/itemholderbase.hxx @@ -40,7 +40,6 @@ enum class EItem CTLOptions , // 2 DefaultOptions , - DynamicMenuOptions , EventConfig , diff --git a/sfx2/source/appl/shutdowniconaqua.mm b/sfx2/source/appl/shutdowniconaqua.mm index 9d788db1abe7..5a92f38adda5 100644 --- a/sfx2/source/appl/shutdowniconaqua.mm +++ b/sfx2/source/appl/shutdowniconaqua.mm @@ -402,7 +402,7 @@ void aqua_init_systray() // collect the URLs of the entries in the File/New menu SvtModuleOptions aModuleOptions; std::set< OUString > aFileNewAppsAvailable; - std::vector < SvtDynMenuEntry > const aNewMenu = SvtDynamicMenuOptions().GetMenu( EDynamicMenuType::NewMenu ); + std::vector < SvtDynMenuEntry > const aNewMenu = SvtDynamicMenuOptions::GetMenu( EDynamicMenuType::NewMenu ); for ( SvtDynMenuEntry const & newMenuProp : aNewMenu ) { diff --git a/sfx2/source/appl/shutdowniconw32.cxx b/sfx2/source/appl/shutdowniconw32.cxx index f86476995f1a..dba876a18532 100644 --- a/sfx2/source/appl/shutdowniconw32.cxx +++ b/sfx2/source/appl/shutdowniconw32.cxx @@ -151,7 +151,7 @@ static HMENU createSystrayMenu( ) // collect the URLs of the entries in the File/New menu ::std::set< OUString > aFileNewAppsAvailable; - std::vector< SvtDynMenuEntry > const aNewMenu = SvtDynamicMenuOptions().GetMenu( EDynamicMenuType::NewMenu ); + std::vector< SvtDynMenuEntry > const aNewMenu = SvtDynamicMenuOptions::GetMenu( EDynamicMenuType::NewMenu ); for ( SvtDynMenuEntry const & newMenuProp : aNewMenu ) { if ( !newMenuProp.sURL.isEmpty() ) 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; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits