2
* Copyright (C) 2011 Canonical Ltd
4
* This program is free software: you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License version 3 as
6
* published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU General Public License for more details.
13
* You should have received a copy of the GNU General Public License
14
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16
* Authored by: Alejandro Piñeiro Iglesias <apinheiro@igalia.com>
20
* SECTION:unity-quicklist_menu_item-accessible
21
* @Title: UnityQuicklistMenuItemAccessible
22
* @short_description: Implementation of the ATK interfaces for #QuicklistMenuItem
23
* @see_also: QuicklistMenuItem
25
* #UnityQuicklistMenuItemAccessible implements the required ATK interfaces for
26
* #QuicklistMenuItem, mainly exposing the text as his name, as this
27
* #object is mainly used as a label
31
#include <glib/gi18n.h>
33
#include "unity-quicklist-menu-item-accessible.h"
35
#include "unitya11y.h"
36
#include "QuicklistMenuItem.h"
37
#include "QuicklistMenuItemLabel.h"
38
#include "QuicklistMenuItemSeparator.h"
41
static void unity_quicklist_menu_item_accessible_class_init(UnityQuicklistMenuItemAccessibleClass* klass);
42
static void unity_quicklist_menu_item_accessible_init(UnityQuicklistMenuItemAccessible* self);
43
static void unity_quicklist_menu_item_accessible_dispose(GObject* object);
46
static void unity_quicklist_menu_item_accessible_initialize(AtkObject* accessible,
48
static const gchar* unity_quicklist_menu_item_accessible_get_name(AtkObject* obj);
49
static AtkStateSet* unity_quicklist_menu_item_accessible_ref_state_set(AtkObject* obj);
52
static void on_parent_selection_change_cb(AtkSelection* selection,
55
G_DEFINE_TYPE(UnityQuicklistMenuItemAccessible, unity_quicklist_menu_item_accessible, NUX_TYPE_VIEW_ACCESSIBLE);
58
#define UNITY_QUICKLIST_MENU_ITEM_ACCESSIBLE_GET_PRIVATE(obj) \
59
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), UNITY_TYPE_QUICKLIST_MENU_ITEM_ACCESSIBLE, \
60
UnityQuicklistMenuItemAccessiblePrivate))
62
struct _UnityQuicklistMenuItemAccessiblePrivate
66
guint on_parent_selection_change_id;
67
guint on_parent_change_id;
70
using unity::QuicklistMenuItem;
71
using unity::QuicklistMenuItemLabel;
72
using unity::QuicklistMenuItemSeparator;
75
unity_quicklist_menu_item_accessible_class_init(UnityQuicklistMenuItemAccessibleClass* klass)
77
GObjectClass* gobject_class = G_OBJECT_CLASS(klass);
78
AtkObjectClass* atk_class = ATK_OBJECT_CLASS(klass);
80
gobject_class->dispose = unity_quicklist_menu_item_accessible_dispose;
83
atk_class->get_name = unity_quicklist_menu_item_accessible_get_name;
84
atk_class->initialize = unity_quicklist_menu_item_accessible_initialize;
85
atk_class->ref_state_set = unity_quicklist_menu_item_accessible_ref_state_set;
87
g_type_class_add_private(gobject_class, sizeof(UnityQuicklistMenuItemAccessiblePrivate));
91
unity_quicklist_menu_item_accessible_init(UnityQuicklistMenuItemAccessible* self)
93
UnityQuicklistMenuItemAccessiblePrivate* priv =
94
UNITY_QUICKLIST_MENU_ITEM_ACCESSIBLE_GET_PRIVATE(self);
100
unity_quicklist_menu_item_accessible_dispose(GObject* object)
102
UnityQuicklistMenuItemAccessible* self = UNITY_QUICKLIST_MENU_ITEM_ACCESSIBLE(object);
103
AtkObject* parent = NULL;
105
parent = atk_object_get_parent(ATK_OBJECT(object));
107
if (UNITY_IS_QUICKLIST_MENU_ITEM_ACCESSIBLE(parent))
109
if (self->priv->on_parent_selection_change_id != 0)
110
g_signal_handler_disconnect(parent, self->priv->on_parent_selection_change_id);
113
if (self->priv->on_parent_change_id != 0)
114
g_signal_handler_disconnect(object, self->priv->on_parent_change_id);
116
G_OBJECT_CLASS(unity_quicklist_menu_item_accessible_parent_class)->dispose(object);
120
unity_quicklist_menu_item_accessible_new(nux::Object* object)
122
AtkObject* accessible = NULL;
124
g_return_val_if_fail(dynamic_cast<QuicklistMenuItem*>(object), NULL);
126
accessible = ATK_OBJECT(g_object_new(UNITY_TYPE_QUICKLIST_MENU_ITEM_ACCESSIBLE, NULL));
128
atk_object_initialize(accessible, object);
135
menu_item_is_a_separator(QuicklistMenuItem* menu_item)
137
QuicklistMenuItemSeparator* separator = NULL;
139
separator = dynamic_cast<QuicklistMenuItemSeparator*>(menu_item);
141
if (separator != NULL)
148
on_parent_change_cb(gchar* property,
152
AtkObject* parent = NULL;
153
UnityQuicklistMenuItemAccessible* self = NULL;
155
g_return_if_fail(UNITY_IS_QUICKLIST_MENU_ITEM_ACCESSIBLE(data));
156
self = UNITY_QUICKLIST_MENU_ITEM_ACCESSIBLE(data);
158
parent = atk_object_get_parent(ATK_OBJECT(self));
163
self->priv->on_parent_selection_change_id =
164
g_signal_connect(parent, "selection-changed",
165
G_CALLBACK(on_parent_selection_change_cb), self);
169
unity_quicklist_menu_item_accessible_initialize(AtkObject* accessible,
172
nux::Object* nux_object = NULL;
173
QuicklistMenuItem* menu_item = NULL;
174
UnityQuicklistMenuItemAccessible* self = NULL;
176
ATK_OBJECT_CLASS(unity_quicklist_menu_item_accessible_parent_class)->initialize(accessible, data);
177
self = UNITY_QUICKLIST_MENU_ITEM_ACCESSIBLE(accessible);
179
nux_object = nux_object_accessible_get_object(NUX_OBJECT_ACCESSIBLE(accessible));
180
menu_item = dynamic_cast<QuicklistMenuItem*>(nux_object);
182
if (menu_item == NULL)
185
if (menu_item_is_a_separator(menu_item))
186
atk_object_set_role(accessible, ATK_ROLE_SEPARATOR);
188
atk_object_set_role(accessible, ATK_ROLE_MENU_ITEM);
190
/* we could do that by redefining ->set_parent */
191
self->priv->on_parent_change_id =
192
g_signal_connect(accessible, "notify::accessible-parent",
193
G_CALLBACK(on_parent_change_cb), self);
199
unity_quicklist_menu_item_accessible_get_name(AtkObject* obj)
201
const gchar* name = NULL;
203
g_return_val_if_fail(UNITY_IS_QUICKLIST_MENU_ITEM_ACCESSIBLE(obj), NULL);
205
name = ATK_OBJECT_CLASS(unity_quicklist_menu_item_accessible_parent_class)->get_name(obj);
208
QuicklistMenuItem* menu_item = NULL;
210
menu_item = dynamic_cast<QuicklistMenuItem*>(nux_object_accessible_get_object(NUX_OBJECT_ACCESSIBLE(obj)));
211
if (menu_item != NULL)
213
name = menu_item->GetLabel().c_str();
221
unity_quicklist_menu_item_accessible_ref_state_set(AtkObject* obj)
223
AtkStateSet* state_set = NULL;
224
UnityQuicklistMenuItemAccessible* self = NULL;
225
nux::Object* nux_object = NULL;
227
g_return_val_if_fail(UNITY_IS_QUICKLIST_MENU_ITEM_ACCESSIBLE(obj), NULL);
228
self = UNITY_QUICKLIST_MENU_ITEM_ACCESSIBLE(obj);
230
state_set = ATK_OBJECT_CLASS(unity_quicklist_menu_item_accessible_parent_class)->ref_state_set(obj);
232
nux_object = nux_object_accessible_get_object(NUX_OBJECT_ACCESSIBLE(obj));
234
if (nux_object == NULL) /* defunct */
238
atk_state_set_add_state(state_set, ATK_STATE_FOCUSABLE);
239
atk_state_set_add_state(state_set, ATK_STATE_ENABLED);
240
atk_state_set_add_state(state_set, ATK_STATE_SENSITIVE);
242
if (self->priv->selected)
244
atk_state_set_add_state(state_set, ATK_STATE_FOCUSED);
245
atk_state_set_add_state(state_set, ATK_STATE_SELECTED);
246
atk_state_set_add_state(state_set, ATK_STATE_ACTIVE);
250
/* we clean the states that could come from NuxAreaAccessible */
251
atk_state_set_remove_state(state_set, ATK_STATE_FOCUSED);
259
check_selected(UnityQuicklistMenuItemAccessible* self)
261
AtkObject* selected_item = NULL;
262
AtkObject* parent = NULL;
263
nux::Object* nux_object = NULL;
264
gboolean found = FALSE;
266
nux_object = nux_object_accessible_get_object(NUX_OBJECT_ACCESSIBLE(self));
267
if (nux_object == NULL) /* state is defunct */
270
parent = atk_object_get_parent(ATK_OBJECT(self));
274
selected_item = atk_selection_ref_selection(ATK_SELECTION(parent), 0);
276
if (ATK_OBJECT(self) == selected_item)
279
if (found != self->priv->selected)
281
gboolean return_val = FALSE;
283
self->priv->selected = found;
284
atk_object_notify_state_change(ATK_OBJECT(self),
287
atk_object_notify_state_change(ATK_OBJECT(self),
290
atk_object_notify_state_change(ATK_OBJECT(self),
294
g_signal_emit_by_name(self, "focus-event", self->priv->selected, &return_val);
299
on_parent_selection_change_cb(AtkSelection* selection,
302
g_return_if_fail(UNITY_IS_QUICKLIST_MENU_ITEM_ACCESSIBLE(data));
304
check_selected(UNITY_QUICKLIST_MENU_ITEM_ACCESSIBLE(data));