[screen-reader] Further seprate trait gennerated by role as description, state. 65/82765/7
authorPrasoon Singh <prasoon.16@samsung.com>
Fri, 5 Aug 2016 13:14:07 +0000 (18:44 +0530)
committerPrasoon Singh <prasoon.16@samsung.com>
Mon, 26 Sep 2016 15:34:24 +0000 (21:04 +0530)
Change-Id: I10298e9bd0f4e6d074e0c692982437451799c8a4

res/po/en_US.po
src/navigator.c

index b908094027b3e5db76fad67789aa188fb629437e..30a85035bdaca626d1fde2d23aa34db826a7736e 100644 (file)
@@ -14,7 +14,7 @@ msgid "IDS_TRAIT_SLIDER_SWIPE_COMMUNICATE"
 msgstr "flick up and down to adjust the position. "
 
 msgid "IDS_TRAIT_SLIDER_VALUE"
-msgstr " %.*f of %.*f"
+msgstr " %.*f of %.*f"
 
 msgid "IDS_SCROLLING_FINISHED"
 msgstr "Scrolling finished"
@@ -50,7 +50,10 @@ msgid "IDS_REACHED_ITEMS_NOTIFICATION"
 msgstr "Visible items from %1$d to %2$d"
 
 msgid "IDS_TRAIT_PD_HOVERSEL"
-msgstr "Dropdown list. Showing %d items. Double tap to open the menu."
+msgstr "Dropdown list. Showing %d items."
+
+msgid "IDS_TRAIT_PD_HOVERSEL_OPEN"
+msgstr "Double tap to open the menu."
 
 msgid "IDS_TRAIT_GROUP_INDEX"
 msgstr "group index"
@@ -101,7 +104,7 @@ msgid "IDS_TRAIT_PD_PROGRESSBAR"
 msgstr "In progress"
 
 msgid "IDS_TRAIT_PD_PROGRESSBAR_PERCENT"
-msgstr "%.0f percent, In progress"
+msgstr "%.0f percent"
 
 msgid "IDS_TRAIT_PUSH_BUTTON"
 msgstr "button"
@@ -248,13 +251,16 @@ msgid "IDS_TRAIT_ITEM_SELECTED_IMAGE"
 msgstr "image"
 
 msgid "IDS_TRAIT_ITEM_SELECTED_COUNT"
-msgstr "%d selected in total"
+msgstr "%d selected in total"
 
 msgid "IDS_TRAIT_ITEM_SELECT"
 msgstr "Double tap to select"
 
+msgid "IDS_TRAIT_REORDER_ITEM_NAME"
+msgstr "Reorder, Button"
+
 msgid "IDS_TRAIT_REORDER_ITEM_SELECT"
-msgstr "Reorder, Button, Double tap and hold, then drag to reorder"
+msgstr "Double tap and hold, then drag to reorder"
 
 msgid "IDS_TRAIT_REORDER_DRAG_START"
 msgstr "Started dragging item at position %d"
index 4a1b41485a9fc39035c4d937d9423e6b5561b12c..94d2c7de406672c5ef40a749151c834574c624c2 100644 (file)
@@ -503,118 +503,145 @@ void add_slider_description(char *dest, uint dest_size, AtspiAccessible *obj)
        snprintf(trait, HOVERSEL_TRAIT_SIZE, _("IDS_TRAIT_SLIDER_VALUE"), accuracy, val, accuracy, max_val);
        strncat(dest, trait, dest_size - strlen(dest) - 1);
 
-       if (_widget_has_state(obj, ATSPI_STATE_ENABLED)) {
-               strncat(dest, _("IDS_TRAIT_SLIDER_SWIPE_COMMUNICATE"), dest_size - strlen(dest) - 1);
-       }
        g_object_unref(value_iface);
 }
 
-char *generate_trait(AtspiAccessible * obj)
+char *generate_role_trait(AtspiAccessible * obj)
 {
        if (!obj)
                return strdup("");
 
        AtspiRole role = atspi_accessible_get_role(obj, NULL);
        AtspiStateSet *state_set = atspi_accessible_get_state_set(obj);
-       char ret[TTS_MAX_TEXT_SIZE] = "\0";
+       char ret[TTS_MAX_TEXT_SIZE] = { [TTS_MAX_TEXT_SIZE - 1] = 0 };
        switch (role) {
        case ATSPI_ROLE_ENTRY:
        case ATSPI_ROLE_PASSWORD_TEXT: {
                gchar *role_name = atspi_accessible_get_localized_role_name(obj, NULL);
                if (role_name) {
-                       strncat(ret, role_name, sizeof(ret) - strlen(ret) - 1);
-                       strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
-                       if (atspi_state_set_contains(state_set, ATSPI_STATE_FOCUSED))
-                               strncat(ret, _("IDS_TRAIT_TEXT_EDIT_FOCUSED"), sizeof(ret) - strlen(ret) - 1);
-                       else
-                               strncat(ret, _("IDS_TRAIT_TEXT_EDIT"), sizeof(ret) - strlen(ret) - 1);
+                       snprintf(ret, sizeof(ret), "%s", role_name);
                        g_free(role_name);
                }
                break;
        }
-       case ATSPI_ROLE_MENU_ITEM: {
-               AtspiAccessible *parent = atspi_accessible_get_parent(obj, NULL);
-               AtspiRole parent_role = atspi_accessible_get_role(parent, NULL);
-               GError *err = NULL;
-               if (parent_role == ATSPI_ROLE_TOOL_BAR) {
-                       int children_count = atspi_accessible_get_child_count(parent, NULL);
-                       int index = atspi_accessible_get_index_in_parent(obj, NULL);
-                       AtspiSelection* selection = atspi_accessible_get_selection_iface(parent);
-                       gboolean is_selected = atspi_selection_is_child_selected(selection, index, &err);
-                       GERROR_CHECK(err);
-                       char tab_index[MENU_ITEM_TAB_INDEX_SIZE];
-                       snprintf(tab_index, MENU_ITEM_TAB_INDEX_SIZE, _("IDS_TRAIT_MENU_ITEM_TAB_INDEX"), index + 1, children_count);
-                       strncat(ret, tab_index, sizeof(ret) - strlen(ret) - 1);
-                       strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
-                       if (!is_selected)
-                               strncat(ret, _("IDS_TRAIT_ITEM_SELECT"), sizeof(ret) - strlen(ret) - 1);
-                       g_object_unref(selection);
-               }
-               g_object_unref(parent);
-               break;
-       }
        case ATSPI_ROLE_POPUP_MENU: {
                AtspiAccessible *parent = atspi_accessible_get_parent(obj, NULL);
                AtspiRole parent_role = atspi_accessible_get_role(parent, NULL);
                if (parent_role == ATSPI_ROLE_COMBO_BOX) break;
                int children_count;
-               char trait[HOVERSEL_TRAIT_SIZE];
-
                children_count = atspi_accessible_get_child_count(obj, NULL);
-
-               snprintf(trait, HOVERSEL_TRAIT_SIZE, _("IDS_TRAIT_SHOWING"));
-               strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
-               strncat(ret, " ", sizeof(ret) - strlen(ret) - 1);
-
-               snprintf(trait, HOVERSEL_TRAIT_SIZE, "%d", children_count);
-               strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
-               strncat(ret, " ", sizeof(ret) - strlen(ret) - 1);
-
-               snprintf(trait, HOVERSEL_TRAIT_SIZE, _("IDS_TRAIT_ITEMS"));
-               strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
-               strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
-
-               snprintf(trait, HOVERSEL_TRAIT_SIZE, _("IDS_TRAIT_POPUP_CLOSE"));
-               strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
-               g_object_unref(parent);
+               snprintf(ret, sizeof(ret), "%s, %s %d %s", _("IDS_TRAIT_CTX_POPUP"),
+                       _("IDS_TRAIT_SHOWING"), children_count, _("IDS_TRAIT_ITEMS"));
                break;
        }
        case ATSPI_ROLE_DIALOG: {
                int children_count = _find_popup_list_children_count(obj);
-               char trait[HOVERSEL_TRAIT_SIZE];
-
-               if (children_count > 0) {
-                       snprintf(trait, HOVERSEL_TRAIT_SIZE, _("IDS_TRAIT_SHOWING"));
-                       strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
-                       strncat(ret, " ", sizeof(ret) - strlen(ret) - 1);
-
-                       snprintf(trait, HOVERSEL_TRAIT_SIZE, "%d", children_count);
-                       strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
-                       strncat(ret, " ", sizeof(ret) - strlen(ret) - 1);
-
-                       snprintf(trait, HOVERSEL_TRAIT_SIZE, _("IDS_TRAIT_ITEMS"));
-                       strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
-                       strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
-               }
-               if (_has_activate_action(obj)) {
-                       snprintf(trait, HOVERSEL_TRAIT_SIZE, _("IDS_TRAIT_POPUP_CLOSE"));
-                       strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
-               }
+               if (children_count > 0)
+                       snprintf(ret, sizeof(ret), "%s %d %s",
+                               _("IDS_TRAIT_SHOWING"), children_count, _("IDS_TRAIT_ITEMS"));
                break;
        }
        case ATSPI_ROLE_COMBO_BOX: {
                int children_count = atspi_accessible_get_child_count(obj, NULL);
-               char trait[HOVERSEL_TRAIT_SIZE];
-               snprintf(trait, HOVERSEL_TRAIT_SIZE, _("IDS_TRAIT_PD_HOVERSEL"), children_count);
-               strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
+               snprintf(ret, sizeof(ret), _("IDS_TRAIT_PD_HOVERSEL"), children_count);
                break;
        }
        case ATSPI_ROLE_GLASS_PANE: {
                AtspiAccessible *parent = atspi_accessible_get_parent(obj, NULL);
                int children_count = atspi_accessible_get_child_count(parent, NULL);
-               char trait[HOVERSEL_TRAIT_SIZE];
-               snprintf(trait, HOVERSEL_TRAIT_SIZE, _("IDS_TRAIT_PD_HOVERSEL"), children_count);
-               strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
+               snprintf(ret, sizeof(ret), _("IDS_TRAIT_PD_HOVERSEL"), children_count);
+               g_object_unref(parent);
+               break;
+       }
+       case ATSPI_ROLE_LIST_ITEM: {
+               AtspiAccessible *parent = atspi_accessible_get_parent(obj, NULL);
+               AtspiStateSet *parent_state_set = atspi_accessible_get_state_set(parent);
+               if (atspi_state_set_contains(parent_state_set, ATSPI_STATE_ANIMATED)) {
+                       strncpy(ret, _("IDS_TRAIT_REORDER_ITEM_NAME"), sizeof(ret) - strlen(ret) - 1);
+               }
+               g_object_unref(parent_state_set);
+               g_object_unref(parent);
+               break;
+       }
+       case ATSPI_ROLE_PUSH_BUTTON: {
+               strncpy(ret, _("IDS_TRAIT_PUSH_BUTTON"), sizeof(ret) - strlen(ret) - 1);
+               break;
+       }
+       case ATSPI_ROLE_PROGRESS_BAR: {
+               AtspiValue *value = atspi_accessible_get_value_iface(obj);
+               if (value) {
+                       double val = atspi_value_get_current_value(value, NULL);
+                       if (val > 0)
+                               snprintf(ret, sizeof(ret), _("IDS_TRAIT_PD_PROGRESSBAR_PERCENT"), val * 100);
+                       g_object_unref(value);
+               }
+               break;
+       }
+       case ATSPI_ROLE_TOGGLE_BUTTON: {
+               snprintf(ret, sizeof(ret), "%s", _("IDS_TRAIT_TOGGLE_BUTTON"));
+               break;
+       }
+       case ATSPI_ROLE_SLIDER: {
+               add_slider_description(ret, sizeof(ret), obj);
+               break;
+       }
+       case ATSPI_ROLE_HEADING:
+       case ATSPI_ROLE_PAGE_TAB:
+       case ATSPI_ROLE_SCROLL_BAR:
+       case ATSPI_ROLE_EDITBAR:
+       case ATSPI_ROLE_CHECK_BOX:
+       case ATSPI_ROLE_MENU_ITEM:
+       case ATSPI_ROLE_RADIO_MENU_ITEM:
+       case ATSPI_ROLE_RADIO_BUTTON:
+       case ATSPI_ROLE_GROUPING: {
+               break;
+       }
+       default: {
+               gchar *role_name = atspi_accessible_get_localized_role_name(obj, NULL);
+               if (role_name) {
+                       strncpy(ret, role_name, sizeof(ret) - strlen(ret) - 1);
+                       g_free(role_name);
+               }
+       }
+       }
+
+       if (state_set)
+               g_object_unref(state_set);
+
+       return strdup(ret);
+}
+
+char *generate_description_trait(AtspiAccessible * obj) {
+       if (!obj)
+               return strdup("");
+
+       AtspiRole role = atspi_accessible_get_role(obj, NULL);
+       AtspiStateSet *state_set = atspi_accessible_get_state_set(obj);
+       char ret[TTS_MAX_TEXT_SIZE] = { [TTS_MAX_TEXT_SIZE - 1] = 0 };
+       switch (role) {
+       case ATSPI_ROLE_ENTRY:
+       case ATSPI_ROLE_PASSWORD_TEXT: {
+               if (atspi_state_set_contains(state_set, ATSPI_STATE_FOCUSED))
+                       strncpy(ret, _("IDS_TRAIT_TEXT_EDIT_FOCUSED"), sizeof(ret) - strlen(ret) - 1);
+               else
+                       strncpy(ret, _("IDS_TRAIT_TEXT_EDIT"), sizeof(ret) - strlen(ret) - 1);
+               break;
+       }
+       case ATSPI_ROLE_MENU_ITEM: {
+               AtspiAccessible *parent = atspi_accessible_get_parent(obj, NULL);
+               AtspiRole parent_role = atspi_accessible_get_role(parent, NULL);
+               GError *err = NULL;
+               if (parent_role == ATSPI_ROLE_TOOL_BAR) {
+                       int children_count = atspi_accessible_get_child_count(parent, NULL);
+                       int index = atspi_accessible_get_index_in_parent(obj, NULL);
+                       AtspiSelection* selection = atspi_accessible_get_selection_iface(parent);
+                       gboolean is_selected = atspi_selection_is_child_selected(selection, index, &err);
+                       GERROR_CHECK(err);
+                       snprintf(ret, sizeof(ret), _("IDS_TRAIT_MENU_ITEM_TAB_INDEX"), index + 1, children_count);
+                       if (!is_selected)
+                               snprintf(ret + strlen(ret), sizeof(ret), ", %s", _("IDS_TRAIT_ITEM_SELECT"));
+                       g_object_unref(selection);
+               }
                g_object_unref(parent);
                break;
        }
@@ -625,15 +652,6 @@ char *generate_trait(AtspiAccessible * obj)
                if(parent_role == ATSPI_ROLE_TREE_TABLE) {
                        strncat(ret, _("IDS_TRAIT_ITEM_SELECTED_IMAGE"), sizeof(ret) - strlen(ret) - 1);
 
-                       AtspiStateSet *state_set = atspi_accessible_get_state_set(obj);
-                       gboolean is_selected = atspi_state_set_contains(state_set, ATSPI_STATE_SELECTED);
-                       g_object_unref(state_set);
-
-                       if(is_selected) {
-                               strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
-                               strncat(ret, _("IDS_TRAIT_ITEM_SELECTED"), sizeof(ret) - strlen(ret) - 1);
-                       }
-
                        AtspiStateSet *parent_state_set = atspi_accessible_get_state_set(parent);
                        bool is_parent_multiselectable = atspi_state_set_contains(parent_state_set, ATSPI_STATE_MULTISELECTABLE);
 
@@ -641,16 +659,9 @@ char *generate_trait(AtspiAccessible * obj)
                        g_object_unref(parent);
                        if(is_parent_multiselectable) {
 
-                               char buf[200];
-
                                AtspiSelection *parent_selection = atspi_accessible_get_selection(parent);
                                int selected_children_count = atspi_selection_get_n_selected_children(parent_selection, NULL);
-
-                               strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
-
-                               snprintf(buf, 200, _("IDS_TRAIT_ITEM_SELECTED_COUNT"), selected_children_count);
-                               strncat(ret, buf, sizeof(ret) - strlen(ret) - 1);
-
+                               snprintf(ret + strlen(ret), sizeof(ret), _("IDS_TRAIT_ITEM_SELECTED_COUNT"), selected_children_count);
                                g_object_unref(parent_selection);
                        }
                }
@@ -669,7 +680,7 @@ char *generate_trait(AtspiAccessible * obj)
                                        AtspiRole child_role = atspi_accessible_get_role(child_iter, &err);
                                        GERROR_CHECK(err);
                                        if(child_role == ATSPI_ROLE_CHECK_BOX) {
-                                               strncat(ret, _("IDS_TRAIT_GROUP_INDEX_IN_CHECK_BOX"), sizeof(ret) - strlen(ret) - 1);
+                                               strncpy(ret, _("IDS_TRAIT_GROUP_INDEX_IN_CHECK_BOX"), sizeof(ret) - strlen(ret) - 1);
                                                g_object_unref(child_iter);
                                                break;
                                        }
@@ -680,89 +691,123 @@ char *generate_trait(AtspiAccessible * obj)
                else if (atspi_state_set_contains(state_set, ATSPI_STATE_EXPANDABLE)) {
                        //ELM_GENLIST_ITEM_TREE
                        if (atspi_state_set_contains(state_set, ATSPI_STATE_EXPANDED)) {
-                               strncat(ret, _("IDS_TRAIT_GROUP_INDEX_EXPANDED"), sizeof(ret) - strlen(ret) - 1);
+                               strncpy(ret, _("IDS_TRAIT_GROUP_INDEX_EXPANDED"), sizeof(ret) - strlen(ret) - 1);
                        } else {
-                               strncat(ret, _("IDS_TRAIT_GROUP_INDEX_COLLAPSED"), sizeof(ret) - strlen(ret) - 1);
+                               strncpy(ret, _("IDS_TRAIT_GROUP_INDEX_COLLAPSED"), sizeof(ret) - strlen(ret) - 1);
                        }
                }
                else if (atspi_state_set_contains(parent_state_set, ATSPI_STATE_ANIMATED)) {
-                       strncat(ret, _("IDS_TRAIT_REORDER_ITEM_SELECT"), sizeof(ret) - strlen(ret) - 1);
+                       strncpy(ret, _("IDS_TRAIT_REORDER_ITEM_SELECT"), sizeof(ret) - strlen(ret) - 1);
                }
                g_object_unref(parent_state_set);
                g_object_unref(parent);
                break;
        }
+       case ATSPI_ROLE_POPUP_MENU: {
+               if (!_has_activate_action(obj)) break;
+               AtspiAccessible *parent = atspi_accessible_get_parent(obj, NULL);
+               AtspiRole parent_role = atspi_accessible_get_role(parent, NULL);
+               if (parent_role == ATSPI_ROLE_COMBO_BOX) break;
+               strncpy(ret, _("IDS_TRAIT_POPUP_CLOSE"), sizeof(ret) - strlen(ret) - 1);
+               g_object_unref(parent);
+               break;
+       }
+       case ATSPI_ROLE_DIALOG: {
+               AtspiAccessible *parent = atspi_accessible_get_parent(obj, NULL);
+               strncpy(ret, _("IDS_TRAIT_POPUP_CLOSE"), sizeof(ret) - strlen(ret) - 1);
+               g_object_unref(parent);
+               break;
+       }
+       case ATSPI_ROLE_COMBO_BOX:
+       case ATSPI_ROLE_GLASS_PANE: {
+               strncpy(ret, _("IDS_TRAIT_PD_HOVERSEL_OPEN"), sizeof(ret) - strlen(ret) - 1);
+               break;
+       }
        case ATSPI_ROLE_CHECK_BOX:
        case ATSPI_ROLE_RADIO_BUTTON: {
                AtspiAccessible *parent;
-               AtspiRole parent_role;
                parent = atspi_accessible_get_parent(obj, NULL);
-               parent_role = atspi_accessible_get_role(parent, NULL);
-               if (atspi_state_set_contains(state_set, ATSPI_STATE_CHECKED)) {
-                       strncat(ret, _("IDS_TRAIT_CHECK_BOX_SELECTED"), sizeof(ret) - strlen(ret) - 1);
-               }
-               else {
-                       if (atspi_state_set_contains(state_set, ATSPI_STATE_EDITABLE)) {
-                               strncat(ret, _("IDS_TRAIT_ITEM_EDIT"), sizeof(ret) - strlen(ret) - 1);
-                       }
-                       else if (parent_role != ATSPI_ROLE_COLOR_CHOOSER)
-                               strncat(ret, _("IDS_TRAIT_CHECK_BOX_NOT_SELECTED"), sizeof(ret) - strlen(ret) - 1);
-               }
+               if (!atspi_state_set_contains(state_set, ATSPI_STATE_CHECKED) && atspi_state_set_contains(state_set, ATSPI_STATE_EDITABLE))
+                       strncpy(ret, _("IDS_TRAIT_ITEM_EDIT"), sizeof(ret) - strlen(ret) - 1);
                g_object_unref(parent);
                //Role name should not be read for radio button, color selector, multibuttonentry items
                break;
        }
-       case ATSPI_ROLE_PUSH_BUTTON: {
-               strncat(ret, _("IDS_TRAIT_PUSH_BUTTON"), sizeof(ret) - strlen(ret) - 1);
+       case ATSPI_ROLE_PROGRESS_BAR: {
+               strncpy(ret, _("IDS_TRAIT_PD_PROGRESSBAR"), sizeof(ret) - strlen(ret) - 1);
                break;
        }
-       case ATSPI_ROLE_PROGRESS_BAR: {
-               AtspiValue *value = atspi_accessible_get_value_iface(obj);
-               if (value) {
-                       double val = atspi_value_get_current_value(value, NULL);
-                       char trait[HOVERSEL_TRAIT_SIZE];
-                       if (val > 0) {
-                               snprintf(trait, HOVERSEL_TRAIT_SIZE, _("IDS_TRAIT_PD_PROGRESSBAR_PERCENT"), val * 100);
-                               strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
-                       } else {
-                               strncat(ret, _("IDS_TRAIT_PD_PROGRESSBAR"), sizeof(ret) - strlen(ret) - 1);
+       case ATSPI_ROLE_SLIDER: {
+               if (atspi_state_set_contains(state_set, ATSPI_STATE_ENABLED))
+                       strncpy(ret, _("IDS_TRAIT_SLIDER_SWIPE_COMMUNICATE"), sizeof(ret) - strlen(ret) - 1);
+               break;
+       }
+       default:
+               break;
+       }
+
+       if (state_set)
+               g_object_unref(state_set);
+
+       return strdup(ret);
+}
+
+char *generate_state_trait(AtspiAccessible * obj)
+{
+       if (!obj)
+               return strdup("");
+
+       AtspiRole role = atspi_accessible_get_role(obj, NULL);
+       AtspiStateSet *state_set = atspi_accessible_get_state_set(obj);
+       char ret[TTS_MAX_TEXT_SIZE] = "\0";
+       switch (role) {
+       case ATSPI_ROLE_LIST_ITEM: {
+               AtspiAccessible *parent = atspi_accessible_get_parent(obj, NULL);
+               AtspiRole parent_role = atspi_accessible_get_role(parent, NULL);
+               AtspiStateSet *parent_state_set = atspi_accessible_get_state_set(parent);
+               if(parent_role == ATSPI_ROLE_TREE_TABLE) {
+
+                       AtspiStateSet *state_set = atspi_accessible_get_state_set(obj);
+                       gboolean is_selected = atspi_state_set_contains(state_set, ATSPI_STATE_SELECTED);
+                       g_object_unref(state_set);
+
+                       if(is_selected) {
+                               strncpy(ret, _("IDS_TRAIT_ITEM_SELECTED"), sizeof(ret) - strlen(ret) - 1);
                        }
-                       g_object_unref(value);
+
                }
+               g_object_unref(parent_state_set);
+               g_object_unref(parent);
+               break;
+       }
+       case ATSPI_ROLE_CHECK_BOX:
+       case ATSPI_ROLE_RADIO_BUTTON: {
+               AtspiAccessible *parent;
+               AtspiRole parent_role;
+               parent = atspi_accessible_get_parent(obj, NULL);
+               parent_role = atspi_accessible_get_role(parent, NULL);
+               if (atspi_state_set_contains(state_set, ATSPI_STATE_CHECKED))
+                       strncpy(ret, _("IDS_TRAIT_CHECK_BOX_SELECTED"), sizeof(ret) - strlen(ret) - 1);
+               else if (!atspi_state_set_contains(state_set, ATSPI_STATE_EDITABLE) && (parent_role != ATSPI_ROLE_COLOR_CHOOSER))
+                       strncpy(ret, _("IDS_TRAIT_CHECK_BOX_NOT_SELECTED"), sizeof(ret) - strlen(ret) - 1);
+               g_object_unref(parent);
+               //Role name should not be read for radio button, color selector, multibuttonentry items
                break;
        }
        case ATSPI_ROLE_TOGGLE_BUTTON: {
-               strncat(ret, _("IDS_TRAIT_TOGGLE_BUTTON"), sizeof(ret) - strlen(ret) - 1);
-               strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
                if (atspi_state_set_contains(state_set, ATSPI_STATE_CHECKED)) {
-                       strncat(ret, _("IDS_TRAIT_TOGGLE_BUTTON_ON"), sizeof(ret) - strlen(ret) - 1);
+                       strncpy(ret, _("IDS_TRAIT_TOGGLE_BUTTON_ON"), sizeof(ret) - strlen(ret) - 1);
                } else {
-                       strncat(ret, _("IDS_TRAIT_TOGGLE_BUTTON_OFF"), sizeof(ret) - strlen(ret) - 1);
+                       strncpy(ret, _("IDS_TRAIT_TOGGLE_BUTTON_OFF"), sizeof(ret) - strlen(ret) - 1);
                }
                break;
        }
-       case ATSPI_ROLE_SLIDER: {
-               add_slider_description(ret, sizeof(ret), obj);
-               break;
-       }
-       case ATSPI_ROLE_HEADING:
-       case ATSPI_ROLE_PAGE_TAB:
-       case ATSPI_ROLE_SCROLL_BAR:
-       case ATSPI_ROLE_EDITBAR:
-       case ATSPI_ROLE_GROUPING: {
-               break;
-       }
        case ATSPI_ROLE_RADIO_MENU_ITEM: {
-               strncat(ret, _("IDS_TRAIT_CHECK_BOX_SELECTED"), sizeof(ret) - strlen(ret) - 1);
+               strncpy(ret, _("IDS_TRAIT_CHECK_BOX_SELECTED"), sizeof(ret) - strlen(ret) - 1);
                break;
        }
-       default: {
-               gchar *role_name = atspi_accessible_get_localized_role_name(obj, NULL);
-               if (role_name) {
-                       strncat(ret, role_name, sizeof(ret) - strlen(ret) - 1);
-                       g_free(role_name);
-               }
-       }
+       default:
+               break;
        }
 
        if (state_set)
@@ -822,28 +867,42 @@ char *generate_text_for_relation_objects(AtspiAccessible * obj, AtspiRelationTyp
 static char *generate_description_from_relation_object(AtspiAccessible *obj)
 {
        GError *err = NULL;
-       char *ret = generate_trait(obj);
+       char *ret = NULL;
+       char trait[TTS_MAX_TEXT_SIZE] = "\0";
+       char *role_name = generate_role_trait(obj);
+       char *description_from_role = generate_description_trait(obj);
+       char *state_from_role = generate_state_trait(obj);
+       if (role_name && strlen(role_name) > 0)
+               strncat(trait, role_name, sizeof(trait) - strlen(trait) - 1);
+       if (description_from_role && strlen(description_from_role) > 0) {
+               if (strlen(trait) > 0)
+                       strncat(trait, ", ", sizeof(trait) - strlen(trait) - 1);
+               strncat(trait, description_from_role, sizeof(trait) - strlen(trait) - 1);
+       }
+       if (state_from_role && strlen(state_from_role) > 0) {
+               if (strlen(trait) > 0)
+                       strncat(trait, ", ", sizeof(trait) - strlen(trait) - 1);
+               strncat(trait, state_from_role, sizeof(trait) - strlen(trait) - 1);
+       }
+
        char *desc = atspi_accessible_get_description(obj, &err);
 
        if (err)
        {
                g_error_free(err);
                g_free(desc);
-               return ret;
+               return strdup(trait);
        }
 
-       if (desc) {
-               if (desc[0] != '\0') {
-                       char *tmp = ret;
-                       if (asprintf(&ret, "%s, %s", desc, ret) < 0)
-                               ERROR("asprintf failed.");
-                       free(tmp);
-               }
+       if (desc && desc[0]!= '\0') {
+               if (asprintf(&ret, "%s, %s", desc, trait) < 0)
+                       ERROR("asprintf failed.");
+               return strdup(ret);
                g_free(desc);
        }
 
 
-       return ret;
+       return strdup(trait);
 }
 
 static char *generate_name_from_relation_object(AtspiAccessible *obj)
@@ -871,7 +930,9 @@ static char *generate_what_to_read(AtspiAccessible * obj)
        char *text = NULL;
        char ret[TTS_MAX_TEXT_SIZE] = "\0";
        char *description_from_relation = NULL;
-       char *name_from_relation = NULL;;
+       char *name_from_relation = NULL;
+       char *description_from_role = NULL;
+       char *state_from_role = NULL;
        GHashTable *hash_table = NULL;
        gchar *reading_info = NULL;
        gchar *type = NULL;
@@ -956,7 +1017,7 @@ static char *generate_what_to_read(AtspiAccessible * obj)
                SCREEN_READER_SAFE_FREE(names, free);
        }
        if (attribute & ACCESSIBLE_READING_INFO_TYPE_ROLE) {
-               role_name = generate_trait(obj);
+               role_name = generate_role_trait(obj);
                if (role_name && strlen(role_name) > 0) {
                        if (strlen(ret) > 0)
                                strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
@@ -965,10 +1026,17 @@ static char *generate_what_to_read(AtspiAccessible * obj)
                SCREEN_READER_SAFE_FREE(role_name, free);
        }
        if (attribute & ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION) {
+               description_from_role = generate_description_trait(obj);
                description = atspi_accessible_get_description(obj, NULL);
                description_from_relation = generate_text_for_relation_objects(obj, ATSPI_RELATION_DESCRIBED_BY,
                        generate_description_from_relation_object);
                DEBUG("Description:%s VALUE %d", description, read_description);
+
+               if (description_from_role && strlen(description_from_role) > 0) {
+                       if (strlen(ret) > 0)
+                               strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
+                       strncat(ret, description_from_role, sizeof(ret) - strlen(ret) - 1);
+               }
                if (description && strlen(description) > 0) {
                        /* If description reading is enabled */
                        if (read_description) {
@@ -977,19 +1045,27 @@ static char *generate_what_to_read(AtspiAccessible * obj)
                                strncat(ret, description, sizeof(ret) - strlen(ret) - 1);
                        }
                }
-               if (description_from_relation && (description_from_relation[0] != '\n')) {
+               if (description_from_relation && strlen(description_from_relation)) {
                        if (strlen(ret) > 0)
                                strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
                        strncat(ret, description_from_relation, sizeof(ret) - strlen(ret) - 1);
                }
                SCREEN_READER_SAFE_FREE(description, free);
                SCREEN_READER_SAFE_FREE(description_from_relation, free);
+               SCREEN_READER_SAFE_FREE(description_from_role, free);
        }
        if (attribute & ACCESSIBLE_READING_INFO_TYPE_STATE) {
+               state_from_role = generate_state_trait(obj);
+               if (state_from_role && strlen(state_from_role) > 0) {
+                       if (strlen(ret) > 0)
+                               strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
+                       strncat(ret, state_from_role, sizeof(ret) - strlen(ret) - 1);
+               }
                if (!_widget_has_state(obj, ATSPI_STATE_ENABLED)) {
                        strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
                        strncat(ret, _("IDS_TRAIT_DISABLED"), sizeof(ret) - strlen(ret) - 1);
                }
+               SCREEN_READER_SAFE_FREE(state_from_role, free);
        }
        DEBUG("RESULT: %s", ret);
        return strdup(ret);