[Libreoffice-commits] .: Branch 'feature/unitymenus' - vcl/inc vcl/unx

Antonio Fernandez afernandez at kemper.freedesktop.org
Thu Aug 16 16:05:11 PDT 2012


 vcl/inc/unx/gtk/gloactiongroup.h      |   27 +--
 vcl/inc/unx/gtk/gtksalmenu.hxx        |   19 +-
 vcl/unx/gtk/window/gloactiongroup.cxx |  263 +++++++++++++---------------------
 vcl/unx/gtk/window/gtksalmenu.cxx     |  130 ++++++----------
 4 files changed, 181 insertions(+), 258 deletions(-)

New commits:
commit a8eca38fa4e5008cb3d2efcba9d2cb412645e71d
Author: Antonio Fernandez <antonio.fernandez at aentos.es>
Date:   Thu Aug 16 22:48:54 2012 +0100

    GLOActionGroup partially implemented. Menus work but no special items shown.
    
    Change-Id: I7c48fbc5763daf789e7347cfedc62f14be53c934

diff --git a/vcl/inc/unx/gtk/gloactiongroup.h b/vcl/inc/unx/gtk/gloactiongroup.h
index 431b93b..a44dbaa 100644
--- a/vcl/inc/unx/gtk/gloactiongroup.h
+++ b/vcl/inc/unx/gtk/gloactiongroup.h
@@ -2,7 +2,6 @@
 #define GLOACTIONGROUP_H
 
 #include <gio/gio.h>
-//#include "gactionmap.h"
 
 G_BEGIN_DECLS
 
@@ -39,26 +38,22 @@ struct _GLOActionGroupClass
     gpointer padding[12];
 };
 
-GType               g_lo_action_group_get_type                  (void) G_GNUC_CONST;
+GType               g_lo_action_group_get_type              (void) G_GNUC_CONST;
 
-GLOActionGroup *    g_lo_action_group_new                       (void);
+GLOActionGroup *    g_lo_action_group_new                   (void);
 
-GAction *           g_lo_action_group_lookup                    (GLOActionGroup     *group,
-                                                                 const gchar        *action_name);
+void                g_lo_action_group_insert                (GLOActionGroup *group,
+                                                             const gchar    *action_name,
+                                                             gpointer        action_info);
 
-void                g_lo_action_group_insert                    (GLOActionGroup     *group,
-                                                                 GAction            *action);
+void                g_lo_action_group_set_action_enabled    (GLOActionGroup *group,
+                                                             const gchar    *action_name,
+                                                             gboolean        enabled);
 
-void                g_lo_action_group_remove                    (GLOActionGroup     *group,
-                                                                 const gchar        *action_name);
+void                g_lo_action_group_remove                (GLOActionGroup *group,
+                                                             const gchar    *action_name);
 
-// This function has been added to make current implementation of GtkSalMenu work.
-void                g_lo_action_group_clear                     (GLOActionGroup     *group);
-
-void                g_lo_action_group_add_entries               (GLOActionGroup     *group,
-                                                                 const GActionEntry *entries,
-                                                                 gint                n_entries,
-                                                                 gpointer            user_data);
+void                g_lo_action_group_clear                 (GLOActionGroup *group);
 
 G_END_DECLS
 
diff --git a/vcl/inc/unx/gtk/gtksalmenu.hxx b/vcl/inc/unx/gtk/gtksalmenu.hxx
index 3bffc6c..d5ee38f 100644
--- a/vcl/inc/unx/gtk/gtksalmenu.hxx
+++ b/vcl/inc/unx/gtk/gtksalmenu.hxx
@@ -98,6 +98,7 @@ public:
     virtual GMenuModel*         GetCurrentSection() { return mpCurrentSection; }
     virtual unsigned            GetItemCount() { return maItems.size(); }
     virtual GtkSalMenuItem*     GetItemAtPos( unsigned nPos ) { return maItems[ nPos ]; }
+    virtual GActionGroup*       GetActionGroup() { return mpActionGroup; }
 };
 
 class GtkSalMenuItem : public SalMenuItem
@@ -106,14 +107,16 @@ public:
     GtkSalMenuItem( const SalItemParams* );
     virtual ~GtkSalMenuItem();
 
-    sal_uInt16          mnId;                 // Item ID
-    sal_uInt16          mnPos;                // Item position
-    Menu*               mpVCLMenu;            // VCL Menu into which this MenuItem is inserted
-    GtkSalMenu*         mpParentMenu;         // The menu in which this menu item is inserted
-    GtkSalMenu*         mpSubMenu;            // Sub menu of this item (if defined)
-    GMenuModel*         mpParentSection;      // Section where this item is added.
-    GLOMenuItem*        mpMenuItem;           // The GMenuItem
-    GAction*            mpAction;             // The GAction associated with this item
+    sal_uInt16          mnId;               // Item ID
+    sal_uInt16          mnPos;              // Item position
+    gchar*              maCommand;          // Item command
+    Menu*               mpVCLMenu;          // VCL Menu into which this MenuItem is inserted
+    GtkSalMenu*         mpParentMenu;       // The menu in which this menu item is inserted
+    GtkSalMenu*         mpSubMenu;          // Sub menu of this item (if defined)
+    GMenuModel*         mpParentSection;    // Section where this item is added.
+    GLOMenuItem*        mpMenuItem;         // The GMenuItem
+    GVariantType*       mpStateType;        // A GVariantType with item state type
+    GVariant*           mpState;            // A GVariant with current item state
 };
 
 #endif // GTKSALMENU_HXX
diff --git a/vcl/unx/gtk/window/gloactiongroup.cxx b/vcl/unx/gtk/window/gloactiongroup.cxx
index 4e99712..07919d7 100644
--- a/vcl/unx/gtk/window/gloactiongroup.cxx
+++ b/vcl/unx/gtk/window/gloactiongroup.cxx
@@ -1,26 +1,26 @@
 #include <unx/gtk/gloactiongroup.h>
 
-//#include "gsimpleaction.h"
-//#include "gactionmap.h"
-//#include "gaction.h"
+#include <unx/gtk/gtkinst.hxx>
+#include <unx/gtk/gtkframe.hxx>
+#include <unx/gtk/gtksalmenu.hxx>
+#include <vcl/menu.hxx>
 
 #include <stdio.h>
+#include <iostream>
 
+using namespace std;
 
 struct _GLOActionGroupPrivate
 {
-    GHashTable *table;  /* string -> GAction */
+    GHashTable *table;  /* string -> GtkSalMenuItem* */
 };
 
 static void g_lo_action_group_iface_init (GActionGroupInterface *);
-static void g_lo_action_group_map_iface_init (GActionMapInterface *);
 
 G_DEFINE_TYPE_WITH_CODE (GLOActionGroup,
     g_lo_action_group, G_TYPE_OBJECT,
     G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_GROUP,
-                           g_lo_action_group_iface_init);
-    G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_MAP,
-                           g_lo_action_group_map_iface_init))
+                           g_lo_action_group_iface_init));
 
 static gchar **
 g_lo_action_group_list_actions (GActionGroup *group)
@@ -52,28 +52,32 @@ g_lo_action_group_query_action (GActionGroup        *group,
                                 GVariant           **state_hint,
                                 GVariant           **state)
 {
+//    printf("%s - %s\n", __FUNCTION__, action_name);
+
     GLOActionGroup *loGroup = G_LO_ACTION_GROUP (group);
-    GAction *action;
+    GtkSalMenuItem* item_info;
 
-    action = G_ACTION( g_hash_table_lookup (loGroup->priv->table, action_name) );
+    item_info = static_cast< GtkSalMenuItem* >( g_hash_table_lookup (loGroup->priv->table, action_name) );
 
-    if (action == NULL)
+    if (item_info == NULL)
         return FALSE;
 
-    if (enabled)
-        *enabled = g_action_get_enabled (action);
+    if (enabled) {
+        sal_Bool bEnabled = item_info->mpVCLMenu->IsItemEnabled( item_info->mnId );
+        *enabled = (bEnabled) ? TRUE : FALSE;
+    }
 
     if (parameter_type)
-        *parameter_type = g_action_get_parameter_type (action);
+        *parameter_type = NULL;
 
     if (state_type)
-        *state_type = g_action_get_state_type (action);
+        *state_type = item_info->mpStateType;
 
     if (state_hint)
-        *state_hint = g_action_get_state_hint (action);
+        *state_hint = NULL;
 
     if (state)
-        *state = g_action_get_state (action);
+        *state = item_info->mpState;
 
     return TRUE;
 }
@@ -83,15 +87,25 @@ g_lo_action_group_change_state (GActionGroup *group,
                                 const gchar  *action_name,
                                 GVariant     *value)
 {
-    GLOActionGroup *loGroup = G_LO_ACTION_GROUP (group);
-    GAction *action;
+    if (!action_name || !value)
+        return;
+
+    GLOActionGroup* lo_group = G_LO_ACTION_GROUP (group);
+    GtkSalMenuItem* item_info;
 
-    action = G_ACTION( g_hash_table_lookup (loGroup->priv->table, action_name) );
+    item_info = static_cast<GtkSalMenuItem*>( g_hash_table_lookup (lo_group->priv->table, action_name) );
 
-    if (action == NULL)
+    if (!item_info)
         return;
 
-    g_action_change_state (action, value);
+    if (!item_info->mpStateType) {
+        item_info->mpStateType = g_variant_type_copy(g_variant_get_type(value));
+    }
+
+    if (g_variant_is_of_type(value, item_info->mpStateType)) {
+        item_info->mpState = g_variant_ref_sink(value);
+        g_action_group_action_state_changed(group, action_name, value);
+    }
 }
 
 static void
@@ -100,109 +114,76 @@ g_lo_action_group_activate (GActionGroup *group,
                             GVariant     *parameter)
 {
     GLOActionGroup *loGroup = G_LO_ACTION_GROUP (group);
-    GAction *action;
+    GtkSalMenuItem *pSalMenuItem;
 
-    action = G_ACTION( g_hash_table_lookup (loGroup->priv->table, action_name) );
+    pSalMenuItem = static_cast< GtkSalMenuItem* >( g_hash_table_lookup (loGroup->priv->table, action_name) );
 
-    if (action == NULL)
+    if (pSalMenuItem == NULL || pSalMenuItem->mpSubMenu )
         return;
 
-    g_action_activate (action, parameter);
-}
-
-static void
-action_enabled_notify (GAction     *action,
-                       GParamSpec  *pspec,
-                       gpointer     user_data)
-{
-    g_action_group_action_enabled_changed (G_ACTION_GROUP( user_data ),
-                                           g_action_get_name (action),
-                                           g_action_get_enabled (action));
-}
-
-static void
-action_state_notify (GAction    *action,
-                     GParamSpec *pspec,
-                     gpointer    user_data)
-{
-    GVariant *value;
-
-    value = g_action_get_state (action);
-    g_action_group_action_state_changed (G_ACTION_GROUP( user_data ),
-                                         g_action_get_name (action),
-                                         value);
-    g_variant_unref (value);
-}
+    GTK_YIELD_GRAB();
 
-static void
-g_lo_action_group_disconnect (gpointer key,
-                              gpointer value,
-                              gpointer user_data)
-{
-    g_signal_handlers_disconnect_by_func (value, (gpointer) action_enabled_notify,
-                                          user_data);
-    g_signal_handlers_disconnect_by_func (value, (gpointer) action_state_notify,
-                                          user_data);
-}
+    const GtkSalFrame *pFrame = pSalMenuItem->mpParentMenu ? pSalMenuItem->mpParentMenu->GetFrame() : NULL;
 
-static GAction *
-g_lo_action_group_lookup_action (GActionMap     *action_map,
-                                 const gchar    *action_name)
-{
-    GLOActionGroup *loGroup = G_LO_ACTION_GROUP (action_map);
-
-    return G_ACTION( g_hash_table_lookup (loGroup->priv->table, action_name) );
-}
-
-static void
-g_lo_action_group_add_action (GActionMap *action_map,
-                              GAction    *action)
-{
-    GLOActionGroup *loGroup = G_LO_ACTION_GROUP (action_map);
-    const gchar *action_name;
-    GAction *old_action;
-
-    action_name = g_action_get_name (action);
-    old_action = G_ACTION( g_hash_table_lookup (loGroup->priv->table, action_name) );
-
-    if (old_action != action)
+    if ( pFrame && !pFrame->GetParent() ) {
+        ((PopupMenu*) pSalMenuItem->mpVCLMenu)->SetSelectedEntry( pSalMenuItem->mnId );
+        SalMenuEvent aMenuEvt( pSalMenuItem->mnId, pSalMenuItem->mpVCLMenu );
+        pFrame->CallCallback( SALEVENT_MENUCOMMAND, &aMenuEvt );
+    }
+    else if ( pSalMenuItem->mpVCLMenu )
     {
-        if (old_action != NULL)
+        // if an item from submenu was selected. the corresponding Window does not exist because
+        // we use native popup menus, so we have to set the selected menuitem directly
+        // incidentally this of course works for top level popup menus, too
+        PopupMenu * pPopupMenu = dynamic_cast<PopupMenu *>(pSalMenuItem->mpVCLMenu);
+        if( pPopupMenu )
         {
-            g_action_group_action_removed (G_ACTION_GROUP (loGroup),
-                                           action_name);
-            g_lo_action_group_disconnect (NULL, old_action, loGroup);
+            // FIXME: revise this ugly code
+
+            // select handlers in vcl are dispatch on the original menu
+            // if not consumed by the select handler of the current menu
+            // however since only the starting menu ever came into Execute
+            // the hierarchy is not build up. Workaround this by getting
+            // the menu it should have been
+
+            // get started from hierarchy in vcl menus
+            GtkSalMenu* pParentMenu = pSalMenuItem->mpParentMenu;
+            Menu* pCurMenu = pSalMenuItem->mpVCLMenu;
+            while( pParentMenu && pParentMenu->GetMenu() )
+            {
+                pCurMenu = pParentMenu->GetMenu();
+                pParentMenu = pParentMenu->GetParentSalMenu();
+            }
+
+            pPopupMenu->SetSelectedEntry( pSalMenuItem->mnId );
+            pPopupMenu->ImplSelectWithStart( pCurMenu );
+        }
+        else
+        {
+            OSL_FAIL( "menubar item without frame !" );
         }
-
-        g_signal_connect (action, "notify::enabled",
-                          G_CALLBACK (action_enabled_notify), loGroup);
-
-        if (g_action_get_state_type (action) != NULL)
-            g_signal_connect (action, "notify::state",
-                              G_CALLBACK (action_state_notify), loGroup);
-
-        g_hash_table_insert (loGroup->priv->table,
-                             g_strdup (action_name),
-                             g_object_ref (action));
-
-        g_action_group_action_added (G_ACTION_GROUP (loGroup), action_name);
     }
 }
 
-static void
-g_lo_action_group_remove_action (GActionMap  *action_map,
-                                 const gchar *action_name)
+void
+g_lo_action_group_insert (GLOActionGroup *group,
+                          const gchar    *action_name,
+                          gpointer        action_info)
 {
-    GLOActionGroup *loGroup = G_LO_ACTION_GROUP (action_map);
-    GAction *action;
+    g_return_if_fail (G_IS_LO_ACTION_GROUP (group));
 
-    action = G_ACTION( g_hash_table_lookup (loGroup->priv->table, action_name) );
+    gpointer old_action;
 
-    if (action != NULL)
+    old_action = g_hash_table_lookup (group->priv->table, action_name);
+
+    if (old_action != action_info)
     {
-        g_action_group_action_removed (G_ACTION_GROUP (loGroup), action_name);
-        g_lo_action_group_disconnect (NULL, action, loGroup);
-        g_hash_table_remove (loGroup->priv->table, action_name);
+        if (old_action != NULL)
+            g_action_group_action_removed (G_ACTION_GROUP (group), action_name);
+
+        g_hash_table_insert (group->priv->table, g_strdup (action_name), action_info);
+
+        g_action_group_action_added (G_ACTION_GROUP (group), action_name);
     }
 }
 
@@ -211,13 +192,9 @@ g_lo_action_group_finalize (GObject *object)
 {
     GLOActionGroup *loGroup = G_LO_ACTION_GROUP (object);
 
-    g_hash_table_foreach (loGroup->priv->table,
-                          g_lo_action_group_disconnect,
-                          loGroup);
     g_hash_table_unref (loGroup->priv->table);
 
-    G_OBJECT_CLASS (g_lo_action_group_parent_class)
-            ->finalize (object);
+    G_OBJECT_CLASS (g_lo_action_group_parent_class)->finalize (object);
 }
 
 static void
@@ -227,7 +204,7 @@ g_lo_action_group_init (GLOActionGroup *group)
                                                  G_TYPE_LO_ACTION_GROUP,
                                                  GLOActionGroupPrivate);
     group->priv->table = g_hash_table_new_full (g_str_hash, g_str_equal,
-                                                  g_free, g_object_unref);
+                                                  g_free, NULL );
 }
 
 static void
@@ -249,36 +226,23 @@ g_lo_action_group_iface_init (GActionGroupInterface *iface)
     iface->activate_action = g_lo_action_group_activate;
 }
 
-static void
-g_lo_action_group_map_iface_init (GActionMapInterface *iface)
-{
-    iface->add_action = g_lo_action_group_add_action;
-    iface->remove_action = g_lo_action_group_remove_action;
-    iface->lookup_action = g_lo_action_group_lookup_action;
-}
-
 GLOActionGroup *
 g_lo_action_group_new (void)
 {
     return G_LO_ACTION_GROUP( g_object_new (G_TYPE_LO_ACTION_GROUP, NULL) );
 }
 
-GAction *
-g_lo_action_group_lookup (GLOActionGroup *group,
-                          const gchar    *action_name)
-{
-    g_return_val_if_fail (G_IS_LO_ACTION_GROUP (group), NULL);
-
-    return g_action_map_lookup_action (G_ACTION_MAP (group), action_name);
-}
-
 void
-g_lo_action_group_insert (GLOActionGroup *group,
-                          GAction        *action)
+g_lo_action_group_set_action_enabled (GLOActionGroup *group,
+                                      const gchar    *action_name,
+                                      gboolean        enabled)
 {
     g_return_if_fail (G_IS_LO_ACTION_GROUP (group));
 
-    g_action_map_add_action (G_ACTION_MAP (group), action);
+    g_action_group_action_enabled_changed(G_ACTION_GROUP(group),
+                                          action_name,
+                                          enabled);
+
 }
 
 void
@@ -287,38 +251,23 @@ g_lo_action_group_remove (GLOActionGroup *group,
 {
     g_return_if_fail (G_IS_LO_ACTION_GROUP (group));
 
-    g_action_map_remove_action (G_ACTION_MAP (group), action_name);
+    if (action_name != NULL)
+    {
+        g_action_group_action_removed (G_ACTION_GROUP (group), action_name);
+        g_hash_table_remove (group->priv->table, action_name);
+    }
 }
 
-// This function has been added to make current implementation of GtkSalMenu work.
 void
 g_lo_action_group_clear (GLOActionGroup  *group)
 {
     g_return_if_fail (G_IS_LO_ACTION_GROUP (group));
 
-    GAction *action;
-
     GList* keys = g_hash_table_get_keys(group->priv->table);
 
-    for ( GList* list = g_list_first(keys); list; list = g_list_next(list)) {
+    for ( GList* list = g_list_first(keys); list; list = g_list_next(list) ) {
         gchar* action_name = (gchar*) list->data;
-        action = G_ACTION( g_hash_table_lookup (group->priv->table, action_name) );
 
-        if (action != NULL)
-        {
-            g_action_group_action_removed (G_ACTION_GROUP (group), action_name);
-            g_lo_action_group_disconnect (NULL, action, group);
-            g_hash_table_remove (group->priv->table, action_name);
-        }
+        g_lo_action_group_remove( group, action_name );
     }
 }
-
-void
-g_lo_action_group_add_entries (GLOActionGroup     *group,
-                               const GActionEntry *entries,
-                               gint                n_entries,
-                               gpointer            user_data)
-{
-    g_action_map_add_action_entries (G_ACTION_MAP (group), entries, n_entries, user_data);
-}
-
diff --git a/vcl/unx/gtk/window/gtksalmenu.cxx b/vcl/unx/gtk/window/gtksalmenu.cxx
index b66d4d1..8467434 100644
--- a/vcl/unx/gtk/window/gtksalmenu.cxx
+++ b/vcl/unx/gtk/window/gtksalmenu.cxx
@@ -35,59 +35,6 @@ isSpecialSubmenu (OUString command)
     return FALSE;
 }
 
-static void
-dispatchAction (GSimpleAction   *action,
-                GVariant        *parameter,
-                gpointer        user_data)
-{
-    GTK_YIELD_GRAB();
-
-    if ( user_data ) {
-        GtkSalMenuItem *pSalMenuItem = static_cast< GtkSalMenuItem* >( user_data );
-
-        if ( !pSalMenuItem->mpSubMenu ) {
-            const GtkSalFrame *pFrame = pSalMenuItem->mpParentMenu ? pSalMenuItem->mpParentMenu->GetFrame() : NULL;
-
-            if ( pFrame && !pFrame->GetParent() ) {
-                ((PopupMenu*) pSalMenuItem->mpVCLMenu)->SetSelectedEntry( pSalMenuItem->mnId );
-                SalMenuEvent aMenuEvt( pSalMenuItem->mnId, pSalMenuItem->mpVCLMenu );
-                pFrame->CallCallback( SALEVENT_MENUCOMMAND, &aMenuEvt );
-            }
-            else if ( pSalMenuItem->mpVCLMenu )
-            {
-                // if an item from submenu was selected. the corresponding Window does not exist because
-                // we use native popup menus, so we have to set the selected menuitem directly
-                // incidentally this of course works for top level popup menus, too
-                PopupMenu * pPopupMenu = dynamic_cast<PopupMenu *>(pSalMenuItem->mpVCLMenu);
-                if( pPopupMenu )
-                {
-                    // FIXME: revise this ugly code
-
-                    // select handlers in vcl are dispatch on the original menu
-                    // if not consumed by the select handler of the current menu
-                    // however since only the starting menu ever came into Execute
-                    // the hierarchy is not build up. Workaround this by getting
-                    // the menu it should have been
-
-                    // get started from hierarchy in vcl menus
-                    GtkSalMenu* pParentMenu = pSalMenuItem->mpParentMenu;
-                    Menu* pCurMenu = pSalMenuItem->mpVCLMenu;
-                    while( pParentMenu && pParentMenu->GetMenu() )
-                    {
-                        pCurMenu = pParentMenu->GetMenu();
-                        pParentMenu = pParentMenu->GetParentSalMenu();
-                    }
-
-                    pPopupMenu->SetSelectedEntry( pSalMenuItem->mnId );
-                    pPopupMenu->ImplSelectWithStart( pCurMenu );
-                }
-                else
-                    OSL_FAIL( "menubar item without frame !" );
-            }
-        }
-    }
-}
-
 void generateActions( GtkSalMenu* pMenu, GLOActionGroup* pActionGroup )
 {
     if ( !pMenu || !pActionGroup )
@@ -96,8 +43,8 @@ void generateActions( GtkSalMenu* pMenu, GLOActionGroup* pActionGroup )
     for (sal_uInt16 i = 0; i < pMenu->GetItemCount(); i++) {
         GtkSalMenuItem *pSalMenuItem = pMenu->GetItemAtPos( i );
 
-        if ( pSalMenuItem->mpAction ) {
-            g_lo_action_group_insert( pActionGroup, pSalMenuItem->mpAction );
+        if ( pSalMenuItem->maCommand ) {
+            g_lo_action_group_insert( pActionGroup, pSalMenuItem->maCommand, pSalMenuItem );
         }
 
         generateActions( pSalMenuItem->mpSubMenu, pActionGroup );
@@ -116,6 +63,7 @@ void updateNativeMenu( GtkSalMenu* pMenu ) {
             if ( pSalMenuItem->mpSubMenu && pSalMenuItem->mpSubMenu->GetMenu() ) {
                 pSalMenuItem->mpSubMenu->GetMenu()->Activate();
                 updateNativeMenu( pSalMenuItem->mpSubMenu );
+                pSalMenuItem->mpSubMenu->GetMenu()->Deactivate();
             }
         }
     }
@@ -246,8 +194,6 @@ GtkSalMenu::GtkSalMenu( sal_Bool bMenuBar ) :
     maSections.push_back( mpCurrentSection );
 
     if (bMenuBar) {
-//        mpActionGroup = G_ACTION_GROUP( g_lo_action_group_new() );
-
         pSessionBus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
         if(!pSessionBus) puts ("Fail bus get");
     } else {
@@ -317,7 +263,14 @@ void GtkSalMenu::RemoveItem( unsigned nPos )
 //    if ( nPos < maItems.size() ) {
 //        GtkSalMenuItem* pSalMenuItem = maItems[ nPos ];
 
-//        g_lo_menu_remove( G_LO_MENU( pSalMenuItem->mpParentSection ), pSalMenuItem->mnPos );
+//        if ( pSalMenuItem->mpParentSection ) {
+//            g_lo_menu_remove( G_LO_MENU( pSalMenuItem->mpParentSection ), pSalMenuItem->mnPos );
+//        }
+
+//        if ( mpActionGroup ) {
+//            g_lo_action_group_remove( G_LO_ACTION_GROUP( mpActionGroup ), pSalMenuItem->maCommand );
+//        }
+
 //        maItems.erase( maItems.begin() + nPos, maItems.begin() + nPos );
 //    }
 }
@@ -397,18 +350,33 @@ const GtkSalFrame* GtkSalMenu::GetFrame() const
 
 void GtkSalMenu::CheckItem( unsigned nPos, sal_Bool bCheck )
 {
+    if ( mpActionGroup ) {
+        GtkSalMenuItem* pSalMenuItem = maItems[ nPos ];
+        MenuItemBits itemBits = pSalMenuItem->mpVCLMenu->GetItemBits( pSalMenuItem->mnId );
+
+        GVariant *pCheckValue = NULL;
+
+        if ( itemBits & MIB_CHECKABLE ) {
+            gboolean bCheckedValue = ( bCheck == sal_True ) ? TRUE : FALSE;
+            pCheckValue = g_variant_new_boolean( bCheckedValue );
+        }
+
+        g_action_group_change_action_state( mpActionGroup, pSalMenuItem->maCommand, pCheckValue );
+    }
 }
 
 void GtkSalMenu::EnableItem( unsigned nPos, sal_Bool bEnable )
 {
-    sal_uInt16 itemId = mpVCLMenu->GetItemId( nPos );
+//    if ( mpActionGroup ) {
+//        sal_uInt16 itemId = mpVCLMenu->GetItemId( nPos );
 
-    GtkSalMenuItem *pSalMenuItem = GetSalMenuItem( itemId );
+//        GtkSalMenuItem *pSalMenuItem = GetSalMenuItem( itemId );
 
-    if ( pSalMenuItem && pSalMenuItem->mpAction ) {
-        gboolean bItemEnabled = (bEnable == sal_True) ? TRUE : FALSE;
-        g_simple_action_set_enabled( G_SIMPLE_ACTION( pSalMenuItem->mpAction ), bItemEnabled );
-    }
+//        if ( pSalMenuItem ) {
+//            gboolean bItemEnabled = (bEnable == sal_True) ? TRUE : FALSE;
+//            g_lo_action_group_set_action_enabled( G_LO_ACTION_GROUP( mpActionGroup ), pSalMenuItem->maCommand, bItemEnabled );
+//        }
+//    }
 }
 
 void GtkSalMenu::SetItemText( unsigned nPos, SalMenuItem* pSalMenuItem, const rtl::OUString& rText )
@@ -454,23 +422,22 @@ void GtkSalMenu::SetItemCommand( unsigned nPos, SalMenuItem* pSalMenuItem, const
     GtkSalMenuItem* pGtkSalMenuItem = static_cast< GtkSalMenuItem* >( pSalMenuItem );
 
     if ( pGtkSalMenuItem && pGtkSalMenuItem->mpMenuItem ) {
-        if ( pGtkSalMenuItem->mpAction ) {
-            g_object_unref( pGtkSalMenuItem->mpAction );
-            pGtkSalMenuItem->mpAction = NULL;
-        }
-
         rtl::OString aOCommandStr = rtl::OUStringToOString( aCommandStr, RTL_TEXTENCODING_UTF8 );
 
-        GSimpleAction *pAction = g_simple_action_new( aOCommandStr.getStr(), NULL );
+        if ( pGtkSalMenuItem->maCommand )
+            g_free( pGtkSalMenuItem->maCommand );
 
-        //    if ( !pGtkSalMenuItem->mpVCLMenu->GetPopupMenu( pGtkSalMenuItem->mnId ) ) {
-        g_signal_connect(pAction, "activate", G_CALLBACK( dispatchAction ), pGtkSalMenuItem);
-        //    }
+        pGtkSalMenuItem->maCommand = g_strdup( aOCommandStr.getStr() );
+
+        if ( !pGtkSalMenuItem->mpVCLMenu->GetPopupMenu( pGtkSalMenuItem->mnId ) && mpActionGroup ) {
+            g_lo_action_group_insert( G_LO_ACTION_GROUP( mpActionGroup ), pGtkSalMenuItem->maCommand, pGtkSalMenuItem );
+        }
 
-        pGtkSalMenuItem->mpAction = G_ACTION( pAction );
+        gchar* aItemCommand = g_strconcat("win.", pGtkSalMenuItem->maCommand, NULL );
 
-        rtl::OString aItemCommand = "win." + aOCommandStr;
-        g_lo_menu_item_set_action_and_target( pGtkSalMenuItem->mpMenuItem, aItemCommand.getStr(), NULL );
+        g_lo_menu_item_set_action_and_target( pGtkSalMenuItem->mpMenuItem, aItemCommand, NULL );
+
+        g_free( aItemCommand );
 
         if ( pGtkSalMenuItem->mpParentSection ) {
             g_lo_menu_remove( G_LO_MENU( pGtkSalMenuItem->mpParentSection ), pGtkSalMenuItem->mnPos );
@@ -498,14 +465,22 @@ void GtkSalMenu::Freeze()
 GtkSalMenuItem::GtkSalMenuItem( const SalItemParams* pItemData ) :
     mnId( pItemData->nId ),
     mnPos( 0 ),
+    maCommand( NULL ),
     mpVCLMenu( pItemData->pMenu ),
     mpParentMenu( NULL ),
     mpSubMenu( NULL ),
     mpMenuItem( NULL ),
-    mpAction( NULL )
+    mpStateType( NULL ),
+    mpState( NULL )
 {
     if ( pItemData->eType != MENUITEM_SEPARATOR ) {
         mpMenuItem = g_lo_menu_item_new( "EMPTY STRING", NULL );
+
+        maCommand = g_strdup( rtl::OUStringToOString( mpVCLMenu->GetItemCommand( mnId ), RTL_TEXTENCODING_UTF8 ).getStr() );
+        gchar* aActionCommand = g_strconcat( "win.", maCommand, NULL );
+        g_lo_menu_item_set_action_and_target( mpMenuItem, aActionCommand, NULL );
+
+        g_free( aActionCommand );
     }
 }
 
@@ -513,5 +488,6 @@ GtkSalMenuItem::~GtkSalMenuItem()
 {
     if ( mpMenuItem ) {
         g_object_unref( mpMenuItem );
+        g_free( maCommand );
     }
 }


More information about the Libreoffice-commits mailing list