diff options
author | Muhammet Kara <muhammet.kara@pardus.org.tr> | 2017-08-28 15:19:57 +0300 |
---|---|---|
committer | Katarina Behrens <Katarina.Behrens@cib.de> | 2017-08-29 17:03:37 +0200 |
commit | aef02ddb8640f7a47a6ca5d0ea269559128084f6 (patch) | |
tree | a6a78714cc729395c22cee4d89296db15b1a5ef6 | |
parent | 1e21383d023739cf9b77f3e83710235b4518a5d3 (diff) |
Make the Modify button functional in the Customize dialog
feature/gsoc17-revamp-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 <Katarina.Behrens@cib.de>
Tested-by: Katarina Behrens <Katarina.Behrens@cib.de>
-rw-r--r-- | cui/source/customize/SvxMenuConfigPage.cxx | 73 | ||||
-rw-r--r-- | cui/source/customize/SvxToolbarConfigPage.cxx | 244 | ||||
-rw-r--r-- | cui/source/customize/cfg.cxx | 2 | ||||
-rw-r--r-- | cui/source/inc/SvxMenuConfigPage.hxx | 1 | ||||
-rw-r--r-- | cui/source/inc/SvxToolbarConfigPage.hxx | 1 | ||||
-rw-r--r-- | cui/source/inc/cfg.hxx | 1 | ||||
-rw-r--r-- | 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<SvxConfigEntry*>(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<SvxConfigEntry*>(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<SvxConfigEntry*>(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<SvxConfigEntry*>(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<SvxIconSelectorDialog> pIconDialog( + VclPtr<SvxIconSelectorDialog>::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<OUString> 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<SvxConfigEntry*>(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<OUString> 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<SvxConfigEntry*>(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<ToolbarSaveInData*>( 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<OUString> 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<ToolbarSaveInData*>( 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<SvxConfigEntry*>(selection->GetUserData()); - if ( !pEntryData->IsSeparator() ) - { - m_pDescriptionField->SetText(pEntryData->GetHelpText()); - } + bool bIsSeparator = + selection && (static_cast<SvxConfigEntry*>(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<ListBox> m_pSaveInListBox; VclPtr<MenuButton> m_pInsertBtn; + VclPtr<MenuButton> m_pModifyBtn; // Used to reset the selected toolbar/menu/context menu VclPtr<PushButton> 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 @@ </packing> </child> <child> - <object class="GtkButton"> + <object class="GtkButton" id="modify:modifymenu"> <property name="label" translatable="yes">Modify</property> <property name="visible">True</property> <property name="can_focus">True</property> @@ -576,6 +576,42 @@ </object> </child> </object> + <object class="GtkMenu" id="modifymenu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="renameItem"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Rename...</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="changeIcon"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Change Icon...</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="resetIcon"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Reset Icon</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="restoreItem"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Restore Default Command</property> + <property name="use_underline">True</property> + </object> + </child> + </object> <object class="GtkSizeGroup" id="sizegroup1"/> <object class="GtkSizeGroup" id="sizegroup2"/> </interface> |