vcl/inc/unx/gtk/gtksalmenu.hxx | 13 ++-- vcl/unx/gtk/window/gtksalmenu.cxx | 107 +++++++++++++++++++++++++++++++++----- 2 files changed, 99 insertions(+), 21 deletions(-)
New commits: commit 3bb9393f62bf12d4e5423ab573d895ca04023da6 Author: Antonio Fernandez <antonio.fernan...@aentos.es> Date: Tue Sep 25 15:08:57 2012 +0100 Spare items and its actions are now removed. Change-Id: Idb46b5dec4351e16c5c49a355c7d3cde3aab0789 diff --git a/vcl/inc/unx/gtk/gtksalmenu.hxx b/vcl/inc/unx/gtk/gtksalmenu.hxx index 729eafc..6e8a465 100644 --- a/vcl/inc/unx/gtk/gtksalmenu.hxx +++ b/vcl/inc/unx/gtk/gtksalmenu.hxx @@ -24,15 +24,14 @@ #ifndef GTKSALMENU_HXX #define GTKSALMENU_HXX -#include <vcl/sv.h> -#include <vcl/bitmap.hxx> -#include <unx/gtk/gtkframe.hxx> -#include <unx/salmenu.h> - +#include <vector> #include <gio/gio.h> -#include "glomenu.h" -#include "gloactiongroup.h" +#include <unx/salmenu.h> +#include <unx/gtk/gtkframe.hxx> +#include <unx/gtk/glomenu.h> +#include <unx/gtk/gloactiongroup.h> +#include <vcl/sv.h> class MenuItemList; diff --git a/vcl/unx/gtk/window/gtksalmenu.cxx b/vcl/unx/gtk/window/gtksalmenu.cxx index b3976ec..fa80ec4 100644 --- a/vcl/unx/gtk/window/gtksalmenu.cxx +++ b/vcl/unx/gtk/window/gtksalmenu.cxx @@ -459,6 +459,78 @@ static void NativeSetItemCommand( GLOMenu* pMenu, * Menu updating methods */ +void RemoveSpareItemsFromNativeMenu( GLOMenu* pMenu, GList** pOldCommandList, unsigned nSection, unsigned nValidItems ) +{ + sal_Int32 nSectionItems = g_lo_menu_get_n_items_from_section( pMenu, nSection ); + + while ( nSectionItems > (sal_Int32) nValidItems ) + { + gchar* aCommand = g_lo_menu_get_command_from_item_in_section( pMenu, nSection, --nSectionItems ); + + if ( aCommand != NULL && pOldCommandList != NULL ) + *pOldCommandList = g_list_append( *pOldCommandList, g_strdup( aCommand ) ); + + g_free( aCommand ); + + g_lo_menu_remove_from_section( pMenu, nSection, nSectionItems ); + } +} + +void RemoveSpareSectionsFromNativeMenu( GLOMenu* pMenu, GList** pOldCommandList, unsigned nLastSection ) +{ + if ( pMenu == NULL || pOldCommandList == NULL ) + return; + + sal_Int32 n = g_menu_model_get_n_items( G_MENU_MODEL( pMenu ) ) - 1; + + for ( ; n > (sal_Int32) nLastSection; n-- ) + { + RemoveSpareItemsFromNativeMenu( pMenu, pOldCommandList, n, 0 ); + g_lo_menu_remove( pMenu, n ); + } +} + +gint CompareStr( gpointer str1, gpointer str2 ) +{ + return g_strcmp0( (const gchar*) str1, (const gchar*) str2 ); +} + +void RemoveUnusedCommands( GLOActionGroup* pActionGroup, GList* pOldCommandList, GList* pNewCommandList ) +{ + if ( pActionGroup == NULL || pOldCommandList == NULL ) + return; + + while ( pNewCommandList != NULL ) + { + GList* pNewCommand = g_list_first( pNewCommandList ); + pNewCommandList = g_list_remove_link( pNewCommandList, pNewCommand ); + + gpointer aCommand = g_list_nth_data( pNewCommand, 0 ); + + GList* pOldCommand = g_list_find_custom( pOldCommandList, aCommand, (GCompareFunc) CompareStr ); + + if ( pOldCommand != NULL ) + { + pOldCommandList = g_list_remove_link( pOldCommandList, pOldCommand ); + g_list_free_full( pOldCommand, g_free ); + } + + g_list_free_full( pNewCommand, g_free ); + } + + while ( pOldCommandList != NULL ) + { + GList* pCommand = g_list_first( pOldCommandList ); + pOldCommandList = g_list_remove_link( pOldCommandList, pCommand ); + + gchar* aCommand = (gchar*) g_list_nth_data( pCommand, 0 ); + + g_lo_action_group_remove( pActionGroup, aCommand ); + + g_list_free_full( pCommand, g_free ); + } +} + static void UpdateNativeSubMenu( GtkSalMenu *pMenu ) { if ( pMenu == NULL ) @@ -469,6 +541,8 @@ static void UpdateNativeSubMenu( GtkSalMenu *pMenu ) Menu* pVCLMenu = pMenu->GetMenu(); GLOMenu* pLOMenu = G_LO_MENU( pMenu->GetMenuModel() ); GLOActionGroup* pActionGroup = G_LO_ACTION_GROUP( pMenu->GetActionGroup() ); + GList *pOldCommandList = NULL; + GList *pNewCommandList = NULL; sal_uInt16 nLOMenuSize = g_menu_model_get_n_items( G_MENU_MODEL( pLOMenu ) ); @@ -490,11 +564,7 @@ static void UpdateNativeSubMenu( GtkSalMenu *pMenu ) if ( pSalMenuItem->mnType == MENUITEM_SEPARATOR ) { // Delete extra items from current section. - sal_uInt16 nSectionItems = g_lo_menu_get_n_items_from_section( pLOMenu, nSection ); - - while ( nSectionItems > validItems ) - // FIXME Remove associated command if needed. - g_lo_menu_remove_from_section( pLOMenu, nSection, --nSectionItems ); + RemoveSpareItemsFromNativeMenu( pLOMenu, &pOldCommandList, nSection, validItems ); nSection++; nItemPos = 0; @@ -525,6 +595,12 @@ static void UpdateNativeSubMenu( GtkSalMenu *pMenu ) gboolean bEnabled = ( itemEnabled == sal_True ) ? TRUE : FALSE; gchar* aNativeCommand = g_strdup( rtl::OUStringToOString( aCommand, RTL_TEXTENCODING_UTF8 ).getStr() ); + // Store current item command in command list. + gchar *aCurrentCommand = g_lo_menu_get_command_from_item_in_section( pLOMenu, nSection, nItemPos ); + + if ( aCurrentCommand != NULL ) + pOldCommandList = g_list_append( pOldCommandList, aCurrentCommand ); + // Force updating of native menu labels. NativeSetItemText( pLOMenu, nSection, nItemPos, aText ); NativeSetAccelerator( pLOMenu, nSection, nItemPos, nAccelKey, nAccelKey.GetName( pMenu->GetFrame()->GetWindow() ) ); @@ -546,6 +622,8 @@ static void UpdateNativeSubMenu( GtkSalMenu *pMenu ) NativeSetItemCommand( pLOMenu, pActionGroup, nSection, nItemPos, nId, aNativeCommand, itemBits, bChecked, FALSE ); NativeCheckItem( pLOMenu, pActionGroup, nSection, nItemPos, itemBits, bChecked ); NativeSetEnableItem( pActionGroup, aNativeCommand, bEnabled ); + + pNewCommandList = g_list_append( pNewCommandList, g_strdup( aNativeCommand ) ); } GtkSalMenu* pSubmenu = pSalMenuItem->mpSubMenu; @@ -553,6 +631,7 @@ static void UpdateNativeSubMenu( GtkSalMenu *pMenu ) if ( pSubmenu && pSubmenu->GetMenu() ) { NativeSetItemCommand( pLOMenu, pActionGroup, nSection, nItemPos, nId, aNativeCommand, itemBits, FALSE, TRUE ); + pNewCommandList = g_list_append( pNewCommandList, g_strdup( aNativeCommand ) ); GLOMenu* pSubMenuModel = g_lo_menu_get_submenu_from_item_in_section( pLOMenu, nSection, nItemPos ); @@ -575,15 +654,13 @@ static void UpdateNativeSubMenu( GtkSalMenu *pMenu ) } // Delete extra items in last section. - sal_Int32 nSectionItems = (sal_Int32) g_lo_menu_get_n_items_from_section( pLOMenu, nSection ); - - while ( nSectionItems > validItems ) - g_lo_menu_remove_from_section( pLOMenu, nSection, --nSectionItems ); + RemoveSpareItemsFromNativeMenu( pLOMenu, &pOldCommandList, nSection, validItems ); // Delete extra sections. - for ( sal_Int32 n = nLOMenuSize - 1; n > nSection; ) - // FIXME Remove associated command if needed. - g_lo_menu_remove( pLOMenu, n-- ); + RemoveSpareSectionsFromNativeMenu( pLOMenu, &pOldCommandList, nSection ); + + // Delete unused commands. + RemoveUnusedCommands( pActionGroup, pOldCommandList, pNewCommandList ); } static void UpdateNativeMenu( GtkSalMenu* pMenu ) @@ -805,7 +882,8 @@ void GtkSalMenu::Activate( const gchar* aMenuCommand ) GtkSalMenu* pSalSubMenu = GetMenuForItemCommand( (gchar*) aMenuCommand, TRUE ); if ( pSalSubMenu != NULL ) { - pSalSubMenu->mpVCLMenu->Activate(); + MenuBar* pMenuBar = static_cast< MenuBar* >( mpVCLMenu ); + pMenuBar->HandleMenuActivateEvent( pSalSubMenu->mpVCLMenu ); UpdateNativeSubMenu( pSalSubMenu ); } } @@ -818,7 +896,8 @@ void GtkSalMenu::Deactivate( const gchar* aMenuCommand ) GtkSalMenu* pSalSubMenu = GetMenuForItemCommand( (gchar*) aMenuCommand, TRUE ); if ( pSalSubMenu != NULL ) { - pSalSubMenu->mpVCLMenu->Deactivate(); + MenuBar* pMenuBar = static_cast< MenuBar* >( mpVCLMenu ); + pMenuBar->HandleMenuDeActivateEvent( pSalSubMenu->mpVCLMenu ); } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits