Updated FSF's address
[platform/upstream/atk.git] / atk / atkstate.c
1 /* ATK -  Accessibility Toolkit
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 "atk.h"
19
20 #include <string.h>
21
22 /**
23  * SECTION:atkstate
24  * @Short_description: An AtkState describes a component's particular state.
25  * @Title:AtkState
26  *
27  * An AtkState describes a component's particular state. The actual
28  * state of an component is described by its AtkStateSet, which is a
29  * set of AtkStates.
30  */
31
32 static guint last_type = ATK_STATE_LAST_DEFINED;
33
34 #define NUM_POSSIBLE_STATES               (sizeof(AtkState)*8)
35
36 static gchar* state_names[NUM_POSSIBLE_STATES];
37
38 /**
39  * atk_state_type_register:
40  * @name: a character string describing the new state.
41  *
42  * Register a new object state.
43  *
44  * Returns: an #AtkState value for the new state.
45  **/
46 AtkStateType
47 atk_state_type_register (const gchar *name)
48 {
49   g_return_val_if_fail (name, ATK_STATE_INVALID);
50
51   if (last_type < NUM_POSSIBLE_STATES -1)
52     {
53       state_names[++last_type] = g_strdup (name); 
54       return (last_type);
55     }
56   return ATK_STATE_INVALID; /* caller needs to check */
57 }
58
59 /**
60  * atk_state_type_get_name:
61  * @type: The #AtkStateType whose name is required
62  *
63  * Gets the description string describing the #AtkStateType @type.
64  *
65  * Returns: the string describing the AtkStateType
66  */
67 const gchar*
68 atk_state_type_get_name (AtkStateType type)
69 {
70   GTypeClass *type_class;
71   GEnumValue *value;
72   const gchar *name = NULL;
73
74   type_class = g_type_class_ref (ATK_TYPE_STATE_TYPE);
75   g_return_val_if_fail (G_IS_ENUM_CLASS (type_class), NULL);
76
77   value = g_enum_get_value (G_ENUM_CLASS (type_class), type);
78
79   if (value)
80     {
81       name = value->value_nick;
82     }
83   else
84     {
85       if (type <= last_type)
86         {
87           if (type >= 0)
88             name = state_names[type];
89         }
90     }
91
92   return name;
93 }
94
95 /**
96  * atk_state_type_for_name:
97  * @name: a character string state name
98  *
99  * Gets the #AtkStateType corresponding to the description string @name.
100  *
101  * Returns: an #AtkStateType corresponding to @name 
102  */
103 AtkStateType
104 atk_state_type_for_name (const gchar *name)
105 {
106   GTypeClass *type_class;
107   GEnumValue *value;
108   AtkStateType type = ATK_STATE_INVALID;
109
110   g_return_val_if_fail (name, ATK_STATE_INVALID);
111
112   type_class = g_type_class_ref (ATK_TYPE_STATE_TYPE);
113   g_return_val_if_fail (G_IS_ENUM_CLASS (type_class), ATK_STATE_INVALID);
114
115   value = g_enum_get_value_by_nick (G_ENUM_CLASS (type_class), name);
116
117   if (value)
118     {
119       type = value->value;
120     }
121   else
122     {
123       gint i;
124
125       for (i = ATK_STATE_LAST_DEFINED + 1; i <= last_type; i++)
126         {
127           if (state_names[i] == NULL)
128             continue; 
129           if (!strcmp(name, state_names[i])) 
130             {
131               type = i;
132               break;
133             }
134         }
135     }
136   return type;
137 }