From aef02ddb8640f7a47a6ca5d0ea269559128084f6 Mon Sep 17 00:00:00 2001 From: Muhammet Kara Date: Mon, 28 Aug 2017 15:19:57 +0300 Subject: Make the Modify button functional in the Customize dialog By adding "rename", "change icon", "reset icon", and "restore default command" options to the Modify button at the bottom of the right (toolbar/menu entries) list. Change icon / Reset icon / Restore default command options are not supported in the menu/context menu tabs yet. Change-Id: Iade3d1aca722c7f8eddcadf251b9562c5366d8ad Reviewed-on: https://gerrit.libreoffice.org/41620 Reviewed-by: Katarina Behrens Tested-by: Katarina Behrens --- cui/source/customize/SvxMenuConfigPage.cxx | 73 ++++++-- cui/source/customize/SvxToolbarConfigPage.cxx | 244 ++++++++++++++++++++++++-- cui/source/customize/cfg.cxx | 2 + cui/source/inc/SvxMenuConfigPage.hxx | 1 + cui/source/inc/SvxToolbarConfigPage.hxx | 1 + cui/source/inc/cfg.hxx | 1 + cui/uiconfig/ui/menuassignpage.ui | 38 +++- 7 files changed, 337 insertions(+), 23 deletions(-) diff --git a/cui/source/customize/SvxMenuConfigPage.cxx b/cui/source/customize/SvxMenuConfigPage.cxx index af426bf0b2fc..ead2948f868e 100644 --- a/cui/source/customize/SvxMenuConfigPage.cxx +++ b/cui/source/customize/SvxMenuConfigPage.cxx @@ -135,9 +135,18 @@ SvxMenuConfigPage::SvxMenuConfigPage(vcl::Window *pParent, const SfxItemSet& rSe m_pInsertBtn->SetSelectHdl( LINK( this, SvxMenuConfigPage, InsertHdl ) ); + m_pModifyBtn->SetSelectHdl( + LINK( this, SvxMenuConfigPage, ModifyItemHdl ) ); m_pResetBtn->SetClickHdl( LINK( this, SvxMenuConfigPage, ResetMenuHdl ) ); + PopupMenu* pPopup = m_pModifyBtn->GetPopupMenu(); + // These operations are not possible on menus/context menus yet + pPopup->EnableItem( pPopup->GetItemId("changeIcon"), false ); + pPopup->EnableItem( pPopup->GetItemId("resetIcon"), false ); + pPopup->EnableItem( pPopup->GetItemId("restoreItem"), false ); + pPopup->RemoveDisabledEntries(); + if ( !bIsMenuBar ) { // Context menus cannot be added/removed @@ -149,7 +158,6 @@ SvxMenuConfigPage::SvxMenuConfigPage(vcl::Window *pParent, const SfxItemSet& rSe // TODO: Remove this when it is possible to reset menubar menus individually m_pResetBtn->Disable(); } - } SvxMenuConfigPage::~SvxMenuConfigPage() @@ -197,19 +205,19 @@ void SvxMenuConfigPage::UpdateButtonStates() // Disable Up and Down buttons depending on current selection SvTreeListEntry* selection = m_pContentsListBox->GetCurEntry(); - if ( m_pContentsListBox->GetEntryCount() == 0 || selection == nullptr ) - { - m_pMoveUpButton->Enable( false ); - m_pMoveDownButton->Enable( false ); + bool bIsSeparator = + selection && (static_cast(selection->GetUserData()))->IsSeparator(); + bool bIsValidSelection = + !(m_pContentsListBox->GetEntryCount() == 0 || selection == nullptr); - return; - } + m_pMoveUpButton->Enable( + bIsValidSelection && selection != m_pContentsListBox->First() ); + m_pMoveDownButton->Enable( + bIsValidSelection && selection != m_pContentsListBox->Last() ); - SvTreeListEntry* first = m_pContentsListBox->First(); - SvTreeListEntry* last = m_pContentsListBox->Last(); + m_pRemoveCommandButton->Enable( bIsValidSelection ); - m_pMoveUpButton->Enable( selection != first ); - m_pMoveDownButton->Enable( selection != last ); + m_pModifyBtn->Enable( bIsValidSelection && !bIsSeparator); } void SvxMenuConfigPage::DeleteSelectedTopLevel() @@ -386,6 +394,49 @@ IMPL_LINK( SvxMenuConfigPage, InsertHdl, MenuButton *, pButton, void ) } } +IMPL_LINK( SvxMenuConfigPage, ModifyItemHdl, MenuButton *, pButton, void ) +{ + OString sIdent = pButton->GetCurItemIdent(); + + SAL_WARN("cui.customize", "sIdent: " << sIdent); + + if (sIdent == "renameItem") + { + SvTreeListEntry* pActEntry = m_pContentsListBox->GetCurEntry(); + SvxConfigEntry* pEntry = + static_cast(pActEntry->GetUserData()); + + OUString aNewName( SvxConfigPageHelper::stripHotKey( pEntry->GetName() ) ); + OUString aDesc = CuiResId( RID_SVXSTR_LABEL_NEW_NAME ); + + VclPtrInstance< SvxNameDialog > pNameDialog( this, aNewName, aDesc ); + pNameDialog->SetHelpId( HID_SVX_CONFIG_RENAME_MENU_ITEM ); + pNameDialog->SetText( CuiResId( RID_SVXSTR_RENAME_MENU ) ); + + if ( pNameDialog->Execute() == RET_OK ) + { + pNameDialog->GetName( aNewName ); + + pEntry->SetName( aNewName ); + m_pContentsListBox->SetEntryText( pActEntry, aNewName ); + + GetSaveInData()->SetModified(); + GetTopLevelSelection()->SetModified(); + } + } + else + { + //This block should never be reached + SAL_WARN("cui.customize", "Unknown insert option: " << sIdent); + return; + } + + if ( GetSaveInData()->IsModified() ) + { + UpdateButtonStates(); + } +} + IMPL_LINK_NOARG( SvxMenuConfigPage, ResetMenuHdl, Button *, void ) { SvxConfigEntry* pMenuData = GetTopLevelSelection(); diff --git a/cui/source/customize/SvxToolbarConfigPage.cxx b/cui/source/customize/SvxToolbarConfigPage.cxx index c6aa393d40cc..a6d89ece008b 100644 --- a/cui/source/customize/SvxToolbarConfigPage.cxx +++ b/cui/source/customize/SvxToolbarConfigPage.cxx @@ -145,6 +145,8 @@ SvxToolbarConfigPage::SvxToolbarConfigPage(vcl::Window *pParent, const SfxItemSe m_pInsertBtn->SetSelectHdl( LINK( this, SvxToolbarConfigPage, InsertHdl ) ); + m_pModifyBtn->SetSelectHdl( + LINK( this, SvxToolbarConfigPage, ModifyItemHdl ) ); m_pResetBtn->SetClickHdl( LINK( this, SvxToolbarConfigPage, ResetToolbarHdl ) ); @@ -454,6 +456,226 @@ IMPL_LINK( SvxToolbarConfigPage, InsertHdl, MenuButton *, pButton, void ) } } +IMPL_LINK( SvxToolbarConfigPage, ModifyItemHdl, MenuButton *, pButton, void ) +{ + bool bNeedsApply = false; + + // get currently selected toolbar + SvxConfigEntry* pToolbar = GetTopLevelSelection(); + + OString sIdent = pButton->GetCurItemIdent(); + + if (sIdent == "renameItem") + { + SvTreeListEntry* pActEntry = m_pContentsListBox->GetCurEntry(); + SvxConfigEntry* pEntry = + static_cast(pActEntry->GetUserData()); + + OUString aNewName( SvxConfigPageHelper::stripHotKey( pEntry->GetName() ) ); + OUString aDesc = CuiResId( RID_SVXSTR_LABEL_NEW_NAME ); + + VclPtrInstance< SvxNameDialog > pNameDialog( this, aNewName, aDesc ); + pNameDialog->SetHelpId( HID_SVX_CONFIG_RENAME_TOOLBAR_ITEM ); + pNameDialog->SetText( CuiResId( RID_SVXSTR_RENAME_TOOLBAR ) ); + + if ( pNameDialog->Execute() == RET_OK ) + { + pNameDialog->GetName(aNewName); + + if( aNewName.isEmpty() ) // tdf#80758 - Accelerator character ("~") is passed as + pEntry->SetName( "~" ); // the button name in case of empty values. + else + pEntry->SetName( aNewName ); + + m_pContentsListBox->SetEntryText( pActEntry, aNewName ); + bNeedsApply = true; + } + } + else if (sIdent == "changeIcon") + { + SvTreeListEntry* pActEntry = m_pContentsListBox->GetCurEntry(); + SvxConfigEntry* pEntry = + static_cast(pActEntry->GetUserData()); + + // Position of entry within the list + // TODO: Add a GetSelectionPos() method to the SvTreeListBox class + sal_uInt16 nSelectionPos = m_pContentsListBox->GetModel()->GetAbsPos( pActEntry ); + + ScopedVclPtr pIconDialog( + VclPtr::Create( nullptr, + GetSaveInData()->GetImageManager(), + GetSaveInData()->GetParentImageManager() )); + + if ( pIconDialog->Execute() == RET_OK ) + { + css::uno::Reference< css::graphic::XGraphic > newgraphic = + pIconDialog->GetSelectedIcon(); + + if ( newgraphic.is() ) + { + css::uno::Sequence< css::uno::Reference< css::graphic::XGraphic > > + aGraphicSeq( 1 ); + + css::uno::Sequence aURLSeq { pEntry->GetCommand() }; + + if ( !pEntry->GetBackupGraphic().is() ) + { + css::uno::Reference< css::graphic::XGraphic > backup; + backup = SvxConfigPageHelper::GetGraphic( + GetSaveInData()->GetImageManager(), aURLSeq[ 0 ] ); + + if ( backup.is() ) + { + pEntry->SetBackupGraphic( backup ); + } + } + + aGraphicSeq[ 0 ] = newgraphic; + try + { + GetSaveInData()->GetImageManager()->replaceImages( + SvxConfigPageHelper::GetImageType(), aURLSeq, aGraphicSeq ); + + m_pContentsListBox->GetModel()->Remove( pActEntry ); + SvTreeListEntry* pNewLBEntry = + InsertEntryIntoUI( pEntry, nSelectionPos ); + + m_pContentsListBox->SetCheckButtonState( pNewLBEntry, + pEntry->IsVisible() ? + SvButtonState::Checked : SvButtonState::Unchecked ); + + m_pContentsListBox->Select( pNewLBEntry ); + m_pContentsListBox->MakeVisible( pNewLBEntry ); + + GetSaveInData()->PersistChanges( + GetSaveInData()->GetImageManager() ); + } + catch ( css::uno::Exception& e) + { + SAL_WARN("cui.customize", "Error replacing image: " << e.Message); + } + } + } + } + else if (sIdent == "resetIcon") + { + SvTreeListEntry* pActEntry = m_pContentsListBox->GetCurEntry(); + SvxConfigEntry* pEntry = + static_cast(pActEntry->GetUserData()); + + // Position of entry within the list + // TODO: Add a GetSelectionPos() method to the SvTreeListBox class + sal_uInt16 nSelectionPos = m_pContentsListBox->GetModel()->GetAbsPos( pActEntry ); + + css::uno::Reference< css::graphic::XGraphic > backup = + pEntry->GetBackupGraphic(); + + css::uno::Sequence< css::uno::Reference< css::graphic::XGraphic > > + aGraphicSeq( 1 ); + aGraphicSeq[ 0 ] = backup; + + css::uno::Sequence aURLSeq { pEntry->GetCommand() }; + + try + { + GetSaveInData()->GetImageManager()->replaceImages( + SvxConfigPageHelper::GetImageType(), aURLSeq, aGraphicSeq ); + + m_pContentsListBox->GetModel()->Remove( pActEntry ); + + SvTreeListEntry* pNewLBEntry = + InsertEntryIntoUI( pEntry, nSelectionPos ); + + m_pContentsListBox->SetCheckButtonState( pNewLBEntry, + pEntry->IsVisible() ? + SvButtonState::Checked : SvButtonState::Unchecked ); + + m_pContentsListBox->Select( pNewLBEntry ); + m_pContentsListBox->MakeVisible( pNewLBEntry ); + + // reset backup in entry + pEntry->SetBackupGraphic( + css::uno::Reference< css::graphic::XGraphic >() ); + + GetSaveInData()->PersistChanges( + GetSaveInData()->GetImageManager() ); + } + catch ( css::uno::Exception& e ) + { + SAL_WARN("cui.customize", "Error resetting image: " << e.Message); + } + } + else if (sIdent == "restoreItem") + { + SvTreeListEntry* pActEntry = m_pContentsListBox->GetCurEntry(); + SvxConfigEntry* pEntry = + static_cast(pActEntry->GetUserData()); + + // Position of entry within the list + // TODO: Add a GetSelectionPos() method to the SvTreeListBox class + sal_uInt16 nSelectionPos = m_pContentsListBox->GetModel()->GetAbsPos( pActEntry ); + + ToolbarSaveInData* pSaveInData = + static_cast( GetSaveInData() ); + + OUString aSystemName = + pSaveInData->GetSystemUIName( pEntry->GetCommand() ); + + if ( !pEntry->GetName().equals( aSystemName ) ) + { + pEntry->SetName( aSystemName ); + m_pContentsListBox->SetEntryText( + pActEntry, SvxConfigPageHelper::stripHotKey( aSystemName ) ); + bNeedsApply = true; + } + + css::uno::Sequence aURLSeq { pEntry->GetCommand() }; + + try + { + GetSaveInData()->GetImageManager()->removeImages( + SvxConfigPageHelper::GetImageType(), aURLSeq ); + + // reset backup in entry + pEntry->SetBackupGraphic( + css::uno::Reference< css::graphic::XGraphic >() ); + + GetSaveInData()->PersistChanges( + GetSaveInData()->GetImageManager() ); + + m_pContentsListBox->RemoveEntry( pActEntry ); + + SvTreeListEntry* pNewLBEntry = + InsertEntryIntoUI( pEntry, nSelectionPos ); + + m_pContentsListBox->SetCheckButtonState( pNewLBEntry, + pEntry->IsVisible() ? + SvButtonState::Checked : SvButtonState::Unchecked ); + + m_pContentsListBox->Select( pNewLBEntry ); + m_pContentsListBox->MakeVisible( pNewLBEntry ); + + bNeedsApply = true; + } + catch ( css::uno::Exception& e ) + { + SAL_WARN("cui.customize", "Error restoring image: " << e.Message); + } + } + else + { + //This block should never be reached + SAL_WARN("cui.customize", "Unknown insert option: " << sIdent); + return; + } + + if ( bNeedsApply ) + { + static_cast( GetSaveInData())->ApplyToolbar( pToolbar ); + UpdateButtonStates(); + } +} + IMPL_LINK_NOARG( SvxToolbarConfigPage, ResetToolbarHdl, Button *, void ) { sal_Int32 nSelectionPos = m_pTopLevelListBox->GetSelectEntryPos(); @@ -477,19 +699,19 @@ IMPL_LINK_NOARG( SvxToolbarConfigPage, ResetToolbarHdl, Button *, void ) void SvxToolbarConfigPage::UpdateButtonStates() { - m_pDescriptionField->SetText(""); - SvTreeListEntry* selection = m_pContentsListBox->GetCurEntry(); - if ( m_pContentsListBox->GetEntryCount() == 0 || selection == nullptr ) - { - return; - } - SvxConfigEntry* pEntryData = static_cast(selection->GetUserData()); - if ( !pEntryData->IsSeparator() ) - { - m_pDescriptionField->SetText(pEntryData->GetHelpText()); - } + bool bIsSeparator = + selection && (static_cast(selection->GetUserData()))->IsSeparator(); + bool bIsValidSelection = + !(m_pContentsListBox->GetEntryCount() == 0 || selection == nullptr); + + m_pMoveUpButton->Enable( bIsValidSelection ); + m_pMoveDownButton->Enable( bIsValidSelection ); + + m_pRemoveCommandButton->Enable( bIsValidSelection ); + + m_pModifyBtn->Enable( bIsValidSelection && !bIsSeparator ); } short SvxToolbarConfigPage::QueryReset() diff --git a/cui/source/customize/cfg.cxx b/cui/source/customize/cfg.cxx index 01d32e8fbb74..3f3fd23d2e3b 100644 --- a/cui/source/customize/cfg.cxx +++ b/cui/source/customize/cfg.cxx @@ -1162,6 +1162,7 @@ SvxConfigPage::SvxConfigPage(vcl::Window *pParent, const SfxItemSet& rSet) get(m_pMoveDownButton, "down"); get(m_pSaveInListBox, "savein"); get(m_pInsertBtn, "insert"); + get(m_pModifyBtn, "modify"); get(m_pResetBtn, "resetbtn"); get(m_pDescriptionField, "desc"); m_pDescriptionField->set_height_request(m_pDescriptionField->GetTextHeight()*4); @@ -1203,6 +1204,7 @@ void SvxConfigPage::dispose() m_pMoveDownButton.clear(); m_pSaveInListBox.clear(); m_pInsertBtn.clear(); + m_pModifyBtn.clear(); m_pResetBtn.clear(); m_pDescriptionField.clear(); diff --git a/cui/source/inc/SvxMenuConfigPage.hxx b/cui/source/inc/SvxMenuConfigPage.hxx index f0b0bcafa247..3763dcaffe77 100644 --- a/cui/source/inc/SvxMenuConfigPage.hxx +++ b/cui/source/inc/SvxMenuConfigPage.hxx @@ -63,6 +63,7 @@ private: DECL_LINK( RemoveCommandHdl, Button *, void ); DECL_LINK( InsertHdl, MenuButton *, void ); + DECL_LINK( ModifyItemHdl, MenuButton *, void ); DECL_LINK( ResetMenuHdl, Button *, void ); void Init() override; diff --git a/cui/source/inc/SvxToolbarConfigPage.hxx b/cui/source/inc/SvxToolbarConfigPage.hxx index 07cae0dab56d..7426fb2b7be3 100644 --- a/cui/source/inc/SvxToolbarConfigPage.hxx +++ b/cui/source/inc/SvxToolbarConfigPage.hxx @@ -64,6 +64,7 @@ private: DECL_LINK( RemoveCommandHdl, Button *, void ); DECL_LINK( InsertHdl, MenuButton *, void ); + DECL_LINK( ModifyItemHdl, MenuButton *, void ); DECL_LINK( ResetToolbarHdl, Button *, void ); void UpdateButtonStates() override; diff --git a/cui/source/inc/cfg.hxx b/cui/source/inc/cfg.hxx index c7190648e3cd..b4ca60f8bfa7 100644 --- a/cui/source/inc/cfg.hxx +++ b/cui/source/inc/cfg.hxx @@ -409,6 +409,7 @@ protected: VclPtr m_pSaveInListBox; VclPtr m_pInsertBtn; + VclPtr m_pModifyBtn; // Used to reset the selected toolbar/menu/context menu VclPtr m_pResetBtn; diff --git a/cui/uiconfig/ui/menuassignpage.ui b/cui/uiconfig/ui/menuassignpage.ui index 571cc2c8e073..928e78d6ce7a 100644 --- a/cui/uiconfig/ui/menuassignpage.ui +++ b/cui/uiconfig/ui/menuassignpage.ui @@ -166,7 +166,7 @@ - + Modify True True @@ -576,6 +576,42 @@ + + True + False + + + True + False + Rename... + True + + + + + True + False + Change Icon... + True + + + + + True + False + Reset Icon + True + + + + + True + False + Restore Default Command + True + + + -- cgit v1.2.3