summaryrefslogtreecommitdiff
path: root/unotools
diff options
context:
space:
mode:
authorNoel Grandin <noelgrandin@gmail.com>2021-07-25 16:55:17 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2021-07-26 10:10:47 +0200
commit4df98358135689e1d2600819c61c6b07d8c8a722 (patch)
tree3a2d83aa9660e3a37d34d473c589c1b9fd60954e /unotools
parent2ee3d4076481262c1e3014dc9341cdf3d1922ff7 (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')
-rw-r--r--unotools/source/config/dynamicmenuoptions.cxx453
-rw-r--r--unotools/source/config/itemholder1.cxx4
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;