]> Pileus Git - ~andy/gtk/blob - gtk/a11y/gtkbooleancellaccessible.c
GtkBubbleWindow: Use style border color to stroke the bubble shape
[~andy/gtk] / gtk / a11y / gtkbooleancellaccessible.c
1 /* GTK+ - accessibility implementations
2  * Copyright 2001 Sun Microsystems Inc.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #include "config.h"
19
20 #include <gtk/gtk.h>
21 #include <glib/gi18n-lib.h>
22 #include "gtkbooleancellaccessible.h"
23
24 struct _GtkBooleanCellAccessiblePrivate
25 {
26   gboolean cell_value;
27   gboolean cell_sensitive;
28 };
29
30 static AtkActionIface *parent_action_iface;
31
32 static gint
33 gtk_boolean_cell_accessible_get_n_actions (AtkAction *action)
34 {
35   return parent_action_iface->get_n_actions (action) + 1;
36 }
37
38 static const gchar *
39 gtk_boolean_cell_accessible_get_description (AtkAction *action,
40                                              gint       i)
41 {
42   if (i == 0)
43     return C_("Action description", "Toggles the cell");
44
45   return parent_action_iface->get_description (action, i - 1);
46 }
47
48 static const gchar *
49 gtk_boolean_cell_accessible_action_get_name (AtkAction *action,
50                                              gint       i)
51 {
52   if (i == 0)
53     return "toggle";
54
55   return parent_action_iface->get_description (action, i - 1);
56 }
57
58 static const gchar *
59 gtk_boolean_cell_accessible_action_get_localized_name (AtkAction *action,
60                                                        gint       i)
61 {
62   if (i == 0)
63     return C_("Action name", "Toggle");
64
65   return parent_action_iface->get_description (action, i - 1);
66 }
67
68 static gboolean
69 gtk_boolean_cell_accessible_do_action (AtkAction *action,
70                                        gint       i)
71 {
72   if (i == 0)
73     return parent_action_iface->do_action (action, 2);
74
75   return parent_action_iface->do_action (action, i - 1);
76 }
77
78 static void
79 gtk_boolean_cell_accessible_action_interface_init (AtkActionIface *iface)
80 {
81   parent_action_iface = g_type_interface_peek_parent (iface);
82
83   iface->do_action = gtk_boolean_cell_accessible_do_action;
84   iface->get_n_actions = gtk_boolean_cell_accessible_get_n_actions;
85   iface->get_description = gtk_boolean_cell_accessible_get_description;
86   iface->get_name = gtk_boolean_cell_accessible_action_get_name;
87   iface->get_localized_name = gtk_boolean_cell_accessible_action_get_localized_name;
88 }
89
90
91 G_DEFINE_TYPE_EXTENDED (GtkBooleanCellAccessible, gtk_boolean_cell_accessible, GTK_TYPE_RENDERER_CELL_ACCESSIBLE, 0,
92                         G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, gtk_boolean_cell_accessible_action_interface_init))
93
94
95 static AtkStateSet *
96 gtk_boolean_cell_accessible_ref_state_set (AtkObject *accessible)
97 {
98   GtkBooleanCellAccessible *cell = GTK_BOOLEAN_CELL_ACCESSIBLE (accessible);
99   AtkStateSet *state_set;
100
101   state_set = ATK_OBJECT_CLASS (gtk_boolean_cell_accessible_parent_class)->ref_state_set (accessible);
102
103   if (cell->priv->cell_value)
104     atk_state_set_add_state (state_set, ATK_STATE_CHECKED);
105
106   if (cell->priv->cell_sensitive)
107     atk_state_set_add_state (state_set, ATK_STATE_SENSITIVE);
108   else
109     atk_state_set_remove_state (state_set, ATK_STATE_SENSITIVE);
110
111   return state_set;
112 }
113
114 static void
115 gtk_boolean_cell_accessible_update_cache (GtkCellAccessible *cell)
116 {
117   GtkBooleanCellAccessible *boolean_cell = GTK_BOOLEAN_CELL_ACCESSIBLE (cell);
118   gboolean active;
119   gboolean sensitive;
120   GtkCellRenderer *renderer;
121
122   g_object_get (cell, "renderer", &renderer, NULL);
123   g_object_get (renderer,
124                 "active", &active,
125                 "sensitive", &sensitive,
126                 NULL);
127   g_object_unref (renderer);
128
129   if (boolean_cell->priv->cell_value != active)
130     {
131       boolean_cell->priv->cell_value = !boolean_cell->priv->cell_value;
132
133       atk_object_notify_state_change (ATK_OBJECT (cell), ATK_STATE_CHECKED, active);
134     }
135
136   if (boolean_cell->priv->cell_sensitive != sensitive)
137     {
138       boolean_cell->priv->cell_sensitive = !boolean_cell->priv->cell_sensitive;
139
140       atk_object_notify_state_change (ATK_OBJECT (cell), ATK_STATE_CHECKED, sensitive);
141     }
142 }
143
144 static void
145 gtk_boolean_cell_accessible_class_init (GtkBooleanCellAccessibleClass *klass)
146 {
147   GtkCellAccessibleClass *cell_class = GTK_CELL_ACCESSIBLE_CLASS (klass);
148   AtkObjectClass *atkobject_class = ATK_OBJECT_CLASS (klass);
149
150   atkobject_class->ref_state_set = gtk_boolean_cell_accessible_ref_state_set;
151
152   cell_class->update_cache = gtk_boolean_cell_accessible_update_cache;
153
154   g_type_class_add_private (klass, sizeof (GtkBooleanCellAccessiblePrivate));
155 }
156
157 static void
158 gtk_boolean_cell_accessible_init (GtkBooleanCellAccessible *cell)
159 {
160   cell->priv =  G_TYPE_INSTANCE_GET_PRIVATE (cell,
161                                              GTK_TYPE_BOOLEAN_CELL_ACCESSIBLE,
162                                              GtkBooleanCellAccessiblePrivate);
163 }
164