From fc613febe3b90260cb3a553311b7b438fb93f073 Mon Sep 17 00:00:00 2001 From: Maxim Monastirsky Date: Fri, 21 Apr 2017 03:25:46 +0300 Subject: tdf#101374 Don't confuse "Label" with "Name" We compare the actual label of a command with the default one, in order to determine whether the label was changed by the user. The problem is that commands that were inserted via the "Add Commands" dialog might have different label by default, because it uses the "Name" command property (from the theUICommandDescription singleton), but the customization dialog assumes usage of the "Label" property. Which means that if these properties differ for some command, it will be considered as having a modified label, and such label will be written to the user profile, and stay there even after UI language change. This commit does 2 things: - Prefer using the "Label" property for inserted commands, instead of copying the label that's shown in the "Add Commands" dialog. - Properly track whether we're using the default label or a custom one. Change-Id: I16ceb4d0bc92ad2a9f833fb09753962ad21a903b --- cui/source/customize/cfg.cxx | 167 ++++++++++++------------------------------- 1 file changed, 46 insertions(+), 121 deletions(-) (limited to 'cui') diff --git a/cui/source/customize/cfg.cxx b/cui/source/customize/cfg.cxx index bb9eb71ed25b..41ca29d8d4c5 100644 --- a/cui/source/customize/cfg.cxx +++ b/cui/source/customize/cfg.cxx @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -569,9 +570,7 @@ bool GetToolbarItemData( } uno::Sequence< beans::PropertyValue > -ConvertSvxConfigEntry( - const uno::Reference< container::XNameAccess >& xCommandToLabelMap, - const SvxConfigEntry* pEntry ) +ConvertSvxConfigEntry( const SvxConfigEntry* pEntry ) { uno::Sequence< beans::PropertyValue > aPropSeq( 3 ); @@ -581,50 +580,13 @@ ConvertSvxConfigEntry( aPropSeq[1].Name = ITEM_DESCRIPTOR_TYPE; aPropSeq[1].Value <<= css::ui::ItemType::DEFAULT; - // If the name has not been changed and the name is the same as - // in the default command to label map then the label can be stored + // If the name has not been changed, then the label can be stored // as an empty string. // It will be initialised again later using the command to label map. aPropSeq[2].Name = ITEM_DESCRIPTOR_LABEL; if ( !pEntry->HasChangedName() && !pEntry->GetCommand().isEmpty() ) { - bool isDefaultName = false; - try - { - uno::Any a( xCommandToLabelMap->getByName( pEntry->GetCommand() ) ); - uno::Sequence< beans::PropertyValue > tmpPropSeq; - if ( a >>= tmpPropSeq ) - { - for ( sal_Int32 i = 0; i < tmpPropSeq.getLength(); ++i ) - { - if ( tmpPropSeq[i].Name == ITEM_DESCRIPTOR_LABEL ) - { - OUString tmpLabel; - tmpPropSeq[i].Value >>= tmpLabel; - - if ( tmpLabel.equals( pEntry->GetName() ) ) - { - isDefaultName = true; - } - - break; - } - } - } - } - catch ( container::NoSuchElementException& ) - { - // isDefaultName is left as FALSE - } - - if ( isDefaultName ) - { - aPropSeq[2].Value <<= OUString(); - } - else - { - aPropSeq[2].Value <<= OUString( pEntry->GetName() ); - } + aPropSeq[2].Value <<= OUString(); } else { @@ -635,9 +597,7 @@ ConvertSvxConfigEntry( } uno::Sequence< beans::PropertyValue > -ConvertToolbarEntry( - const uno::Reference< container::XNameAccess >& xCommandToLabelMap, - const SvxConfigEntry* pEntry ) +ConvertToolbarEntry( const SvxConfigEntry* pEntry ) { uno::Sequence< beans::PropertyValue > aPropSeq( 4 ); @@ -647,50 +607,13 @@ ConvertToolbarEntry( aPropSeq[1].Name = ITEM_DESCRIPTOR_TYPE; aPropSeq[1].Value <<= css::ui::ItemType::DEFAULT; - // If the name has not been changed and the name is the same as - // in the default command to label map then the label can be stored + // If the name has not been changed, then the label can be stored // as an empty string. // It will be initialised again later using the command to label map. aPropSeq[2].Name = ITEM_DESCRIPTOR_LABEL; if ( !pEntry->HasChangedName() && !pEntry->GetCommand().isEmpty() ) { - bool isDefaultName = false; - try - { - uno::Any a( xCommandToLabelMap->getByName( pEntry->GetCommand() ) ); - uno::Sequence< beans::PropertyValue > tmpPropSeq; - if ( a >>= tmpPropSeq ) - { - for ( sal_Int32 i = 0; i < tmpPropSeq.getLength(); ++i ) - { - if ( tmpPropSeq[i].Name == ITEM_DESCRIPTOR_LABEL ) - { - OUString tmpLabel; - tmpPropSeq[i].Value >>= tmpLabel; - - if ( tmpLabel.equals( pEntry->GetName() ) ) - { - isDefaultName = true; - } - - break; - } - } - } - } - catch ( container::NoSuchElementException& ) - { - // isDefaultName is left as FALSE - } - - if ( isDefaultName ) - { - aPropSeq[2].Value <<= OUString(); - } - else - { - aPropSeq[2].Value <<= OUString( pEntry->GetName() ); - } + aPropSeq[2].Value <<= OUString(); } else { @@ -1078,6 +1001,8 @@ bool SaveInData::LoadSubMenus( if ( bItem ) { bool bIsUserDefined = true; + bool bUseDefaultLabel = false; + if ( nType == css::ui::ItemType::DEFAULT ) { uno::Any a; @@ -1095,6 +1020,7 @@ bool SaveInData::LoadSubMenus( // to info service if ( aLabel.isEmpty() ) { + bUseDefaultLabel = true; uno::Sequence< beans::PropertyValue > aPropSeq; if ( a >>= aPropSeq ) { @@ -1109,16 +1035,18 @@ bool SaveInData::LoadSubMenus( } } - if ( xSubMenu.is() ) - { - // popup menu - SvxConfigEntry* pEntry = new SvxConfigEntry( - aLabel, aCommandURL, true ); + SvxConfigEntry* pEntry = new SvxConfigEntry( + aLabel, aCommandURL, xSubMenu.is() ); - pEntry->SetUserDefined( bIsUserDefined ); + pEntry->SetUserDefined( bIsUserDefined ); + if ( !bUseDefaultLabel ) + pEntry->SetName( aLabel ); - pEntries->push_back( pEntry ); + pEntries->push_back( pEntry ); + if ( xSubMenu.is() ) + { + // popup menu OUString subMenuTitle( rBaseTitle ); if ( !subMenuTitle.isEmpty() ) @@ -1134,13 +1062,6 @@ bool SaveInData::LoadSubMenus( LoadSubMenus( xSubMenu, subMenuTitle, pEntry ); } - else - { - SvxConfigEntry* pEntry = new SvxConfigEntry( - aLabel, aCommandURL, false ); - pEntry->SetUserDefined( bIsUserDefined ); - pEntries->push_back( pEntry ); - } } else { @@ -1218,7 +1139,7 @@ void MenuSaveInData::Apply( SvxConfigEntry* pEntryData = *iter; uno::Sequence< beans::PropertyValue > aPropValueSeq = - ConvertSvxConfigEntry( m_xCommandToLabelMap, pEntryData ); + ConvertSvxConfigEntry( pEntryData ); uno::Reference< container::XIndexContainer > xSubMenuBar( rFactory->createInstanceWithContext( xContext ), @@ -1251,7 +1172,7 @@ void SaveInData::ApplyMenu( if ( pEntry->IsPopup() ) { uno::Sequence< beans::PropertyValue > aPropValueSeq = - ConvertSvxConfigEntry( m_xCommandToLabelMap, pEntry ); + ConvertSvxConfigEntry( pEntry ); uno::Reference< container::XIndexContainer > xSubMenuBar( rFactory->createInstanceWithContext( xContext ), @@ -1276,7 +1197,7 @@ void SaveInData::ApplyMenu( else { uno::Sequence< beans::PropertyValue > aPropValueSeq = - ConvertSvxConfigEntry( m_xCommandToLabelMap, pEntry ); + ConvertSvxConfigEntry( pEntry ); rMenuBar->insertByIndex( rMenuBar->getCount(), uno::Any( aPropValueSeq )); } @@ -2200,7 +2121,6 @@ SvxEntries* SvxConfigPage::FindParentForChild( SvTreeListEntry* SvxConfigPage::AddFunction( SvTreeListEntry* pTarget, bool bFront, bool bAllowDuplicates ) { - OUString aDisplayName = m_pSelectorDlg->GetSelectedDisplayName(); OUString aURL = m_pSelectorDlg->GetScriptURL(); if ( aURL.isEmpty() ) @@ -2208,10 +2128,16 @@ SvTreeListEntry* SvxConfigPage::AddFunction( return nullptr; } + OUString aModuleId = vcl::CommandInfoProvider::GetModuleIdentifier( m_xFrame ); + OUString aDisplayName = vcl::CommandInfoProvider::GetMenuLabelForCommand( aURL, aModuleId ); + SvxConfigEntry* pNewEntryData = new SvxConfigEntry( aDisplayName, aURL, false ); pNewEntryData->SetUserDefined(); + if ( aDisplayName.isEmpty() ) + pNewEntryData->SetName( m_pSelectorDlg->GetSelectedDisplayName() ); + // check that this function is not already in the menu SvxConfigEntry* pParent = GetTopLevelSelection(); @@ -2812,6 +2738,7 @@ IMPL_LINK_NOARG( SvxMenuConfigPage, AddSubmenuHdl, Button *, void ) SvxConfigEntry* pNewEntryData = new SvxConfigEntry( aNewName, aNewName, true ); + pNewEntryData->SetName( aNewName ); pNewEntryData->SetUserDefined(); InsertEntry( pNewEntryData ); @@ -2891,6 +2818,7 @@ SvxMainMenuOrganizerDialog::SvxMainMenuOrganizerDialog( SvxConfigEntry* pNewEntryData = new SvxConfigEntry( newname, newurl, true ); + pNewEntryData->SetName( newname ); pNewEntryData->SetUserDefined(); pNewEntryData->SetMain(); @@ -4121,7 +4049,7 @@ void ToolbarSaveInData::ApplyToolbar( if ( pEntry->IsPopup() ) { uno::Sequence< beans::PropertyValue > aPropValueSeq = - ConvertToolbarEntry( m_xCommandToLabelMap, pEntry ); + ConvertToolbarEntry( pEntry ); uno::Reference< container::XIndexContainer > xSubMenuBar( rFactory->createInstanceWithContext( xContext ), @@ -4144,7 +4072,7 @@ void ToolbarSaveInData::ApplyToolbar( else { uno::Sequence< beans::PropertyValue > aPropValueSeq = - ConvertToolbarEntry( m_xCommandToLabelMap, pEntry ); + ConvertToolbarEntry( pEntry ); rToolbarBar->insertByIndex( rToolbarBar->getCount(), uno::Any( aPropValueSeq )); @@ -4359,6 +4287,8 @@ void ToolbarSaveInData::LoadToolbar( if ( bItem ) { bool bIsUserDefined = true; + bool bUseDefaultLabel = false; + if ( nType == css::ui::ItemType::DEFAULT ) { uno::Any a; @@ -4376,6 +4306,7 @@ void ToolbarSaveInData::LoadToolbar( // to info service if ( aLabel.isEmpty() ) { + bUseDefaultLabel = true; uno::Sequence< beans::PropertyValue > aPropSeq; if ( a >>= aPropSeq ) { @@ -4390,27 +4321,21 @@ void ToolbarSaveInData::LoadToolbar( } } - if ( xSubMenu.is() ) - { - SvxConfigEntry* pEntry = new SvxConfigEntry( - aLabel, aCommandURL, true ); + SvxConfigEntry* pEntry = new SvxConfigEntry( + aLabel, aCommandURL, xSubMenu.is() ); + + pEntry->SetUserDefined( bIsUserDefined ); + pEntry->SetVisible( bIsVisible ); - pEntry->SetUserDefined( bIsUserDefined ); - pEntry->SetVisible( bIsVisible ); + if ( !bUseDefaultLabel ) + pEntry->SetName( aLabel ); + if ( !xSubMenu.is() ) + pEntry->SetStyle( nStyle ); - pEntries->push_back( pEntry ); + pEntries->push_back( pEntry ); + if ( xSubMenu.is() ) LoadToolbar( xSubMenu, pEntry ); - } - else - { - SvxConfigEntry* pEntry = new SvxConfigEntry( - aLabel, aCommandURL, false ); - pEntry->SetUserDefined( bIsUserDefined ); - pEntry->SetVisible( bIsVisible ); - pEntry->SetStyle( nStyle ); - pEntries->push_back( pEntry ); - } } else { -- cgit