summaryrefslogtreecommitdiff
path: root/vcl/unx/gtk/window/gloactiongroup.cxx
diff options
context:
space:
mode:
authorAntonio Fernandez <antonio.fernandez@aentos.es>2012-08-16 22:48:54 +0100
committerBjoern Michaelsen <bjoern.michaelsen@canonical.com>2012-11-14 13:52:42 +0100
commitbd777c0952266a988001d2008117b3b5cbf9d091 (patch)
treecc8a3b6e18e85dc8077d1b3a902d75f1a110c606 /vcl/unx/gtk/window/gloactiongroup.cxx
parentbbd5e6acb0da1382644e6e39bdd7ca6e96a6d715 (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.cxx263
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);
-}
-