diff options
author | Antonio Fernandez <antonio.fernandez@aentos.es> | 2012-08-16 22:48:54 +0100 |
---|---|---|
committer | Bjoern Michaelsen <bjoern.michaelsen@canonical.com> | 2012-11-14 13:52:42 +0100 |
commit | bd777c0952266a988001d2008117b3b5cbf9d091 (patch) | |
tree | cc8a3b6e18e85dc8077d1b3a902d75f1a110c606 /vcl/unx/gtk/window/gloactiongroup.cxx | |
parent | bbd5e6acb0da1382644e6e39bdd7ca6e96a6d715 (diff) |
GLOActionGroup partially implemented. Menus work but no special items shown.
Change-Id: I7c48fbc5763daf789e7347cfedc62f14be53c934
Diffstat (limited to 'vcl/unx/gtk/window/gloactiongroup.cxx')
-rw-r--r-- | vcl/unx/gtk/window/gloactiongroup.cxx | 263 |
1 files changed, 106 insertions, 157 deletions
diff --git a/vcl/unx/gtk/window/gloactiongroup.cxx b/vcl/unx/gtk/window/gloactiongroup.cxx index 4e99712c0ade..07919d7aeed9 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); -} - |