2 * Copyright (c) 2013 Samsung Electronics Co., Ltd.
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.
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.
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with this library; see the file COPYING.LIB. If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
21 * @file eail_gengrid.c
22 * @brief EailGengrid implementation
25 #include <Elementary.h>
27 #include "eail_gengrid.h"
28 #include "eail_item_parent.h"
29 #include "eail_factory.h"
30 #include "eail_utils.h"
31 #include "eail_priv.h"
33 static void eail_item_parent_interface_init(EailItemParentIface *iface);
34 static void atk_table_interface_init(AtkTableIface *iface);
35 static void atk_selection_interface_init(AtkSelectionIface *iface);
37 /** @brief GObject definition for EailGengrid implementation*/
38 G_DEFINE_TYPE_WITH_CODE(EailGengrid,
41 G_IMPLEMENT_INTERFACE(EAIL_TYPE_ITEM_PARENT,
42 eail_item_parent_interface_init)
43 G_IMPLEMENT_INTERFACE(ATK_TYPE_TABLE,
44 atk_table_interface_init)
45 G_IMPLEMENT_INTERFACE(ATK_TYPE_SELECTION,
46 atk_selection_interface_init));
49 * Implementation of the *AtkObject* interface
53 * @brief Handler for realized event, used to notify about gengrid content
56 * @param data passed to callback
57 * @param obj object that raised event
58 * @param event_info additional event info (item is passed here)
61 eail_gengrid_item_handle_realized_event(void *data,
65 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
66 AtkObject *atk_item = NULL, *atk_parent = NULL;
68 atk_parent = ATK_OBJECT(data);
69 if (!atk_parent) return;
71 atk_item = eail_factory_get_item_atk_obj
72 (item, ATK_ROLE_LIST_ITEM, atk_parent);
74 if (!atk_item) return;
76 eail_emit_children_changed_obj(TRUE, atk_parent, atk_item);
80 * @brief Handler for unrealized event, used to notify about gengrid content
83 * @param data passed to callback
84 * @param obj object that raised event
85 * @param event_info additional event info (item is passed here)
88 eail_gengrid_item_handle_unrealized_event(void *data,
92 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
93 AtkObject *atk_item = NULL, *atk_parent = NULL;
95 atk_parent = ATK_OBJECT(data);
96 if (!atk_parent) return;
98 atk_item = eail_factory_get_item_atk_obj
99 (item, ATK_ROLE_LIST_ITEM, atk_parent);
101 if (!atk_item) return;
103 eail_emit_children_changed_obj(FALSE, atk_parent, atk_item);
104 atk_object_notify_state_change(atk_item, ATK_STATE_DEFUNCT, TRUE);
106 DBG("Unregistering item from cache...");
107 eail_factory_unregister_item_from_cache(item);
111 * @brief Initializes EailGengrid object
113 * @param obj EailGengrid instance
114 * @param data user data passed for initialization
117 eail_gengrid_initialize(AtkObject *obj, gpointer data)
119 Evas_Object *nested_widget = NULL;
120 ATK_OBJECT_CLASS(eail_gengrid_parent_class)->initialize(obj, data);
121 obj->role = ATK_ROLE_TABLE;
123 nested_widget = eail_widget_get_widget(EAIL_WIDGET(obj));
126 ERR("No evas object inside EailWidget was found");
130 evas_object_smart_callback_add(nested_widget, "selected",
131 eail_list_item_handle_selected_event, obj);
132 evas_object_smart_callback_add(nested_widget, "unselected",
133 eail_list_item_handle_unselected_event, obj);
134 evas_object_smart_callback_add(nested_widget, "realized",
135 eail_gengrid_item_handle_realized_event, obj);
136 evas_object_smart_callback_add(nested_widget, "unrealized",
137 eail_gengrid_item_handle_unrealized_event, obj);
141 * @brief Gets the list of created widgets
143 * @param gengrid EailGengrid instance
145 * @returns Eina_List representing the list of widgets elm_gengrid holds
148 eail_gengrid_items_get(EailGengrid *gengrid)
150 g_return_val_if_fail(EAIL_IS_WIDGET(gengrid), NULL);
152 Evas_Object *widget = eail_widget_get_widget(EAIL_WIDGET(gengrid));
154 return elm_gengrid_realized_items_get(widget);
158 * @brief Gets the number of created widgets
160 * @param obj AtkObject instance
162 * @returns integer representing the number of created widgets
165 eail_gengrid_n_items_get(AtkObject *obj)
168 Eina_List *items = eail_gengrid_items_get(EAIL_GENGRID(obj));
169 n_items = eina_list_count(items);
170 eina_list_free(items);
176 * @brief Gets the reference to the specified elm_gengrid's child
178 * @param obj AtkObject instance
179 * @param i child index
181 * @returns AtkObject representing the elm_gengrid's child
184 eail_gengrid_ref_child(AtkObject *obj, gint i)
186 g_return_val_if_fail(EAIL_IS_GENGRID(obj), NULL);
188 AtkObject *child = NULL;
190 Eina_List *list = eail_gengrid_items_get(EAIL_GENGRID(obj));
191 if (eina_list_count(list) > i)
193 child = eail_factory_get_item_atk_obj
194 (eina_list_nth(list, i), ATK_ROLE_LIST_ITEM, obj);
203 * @brief Gets a reference to the state set of the accessible
205 * The caller must unreference it when it is no longer needed.
207 * Implementation of ref_state_set from AtkObject.
209 * @param obj AtkObject instance
211 * @returns AtkStateSet representing the state set of the accessible
214 eail_gengrid_ref_state_set(AtkObject *obj)
216 Evas_Object *widget = eail_widget_get_widget(EAIL_WIDGET(obj));
217 AtkStateSet *state_set =
218 ATK_OBJECT_CLASS(eail_gengrid_parent_class)->ref_state_set(obj);
220 if (!widget) return state_set;
222 if (elm_gengrid_multi_select_get(widget))
223 atk_state_set_add_state(state_set, ATK_STATE_MULTISELECTABLE);
229 * @brief Initializes EailGengrid object
231 * @param gengrid EailGengrid instance
234 eail_gengrid_init(EailGengrid *gengrid)
239 * @brief Initializes EailGengrid class
241 * @param klass EailGengridClass instance
244 eail_gengrid_class_init(EailGengridClass *klass)
246 AtkObjectClass *atk_class = ATK_OBJECT_CLASS(klass);
248 atk_class->initialize = eail_gengrid_initialize;
249 atk_class->get_n_children = eail_gengrid_n_items_get;
250 atk_class->ref_child = eail_gengrid_ref_child;
251 atk_class->ref_state_set = eail_gengrid_ref_state_set;
255 * @brief Gets the name of elm_gengrid child
257 * @param parent EailItemParent instance
258 * @param item EailItem child instance
260 * @returns string representing the item's name
263 eail_gengrid_item_name_get(EailItemParent *parent, EailItem *item)
265 Elm_Object_Item *it = eail_item_get_item(item);
266 /*that will work only for default theme*/
267 if (!it) return NULL;
269 return elm_object_item_part_text_get(it, "elm.text");
273 * @brief Gets the item's index in parent object
275 * @param parent EailItemParent instance
276 * @param item EailItem child instance
278 * @returns integer representing the child's index in parent
281 eail_gengrid_item_index_in_parent_get(EailItemParent *parent, EailItem *item)
283 Elm_Object_Item *it = eail_item_get_item(item);
287 return elm_gengrid_item_index_get(it);
291 * @brief Gets the state set of EailGengrid item
293 * @param parent EailItemParent instance
294 * @param item EailItem child instance
295 * @param state_set AtkStateSet to fill
297 * @returns AtkStateSet representing the state set of the child
300 eail_gengrid_ref_item_state_set(EailItemParent *parent,
302 AtkStateSet *state_set)
304 Evas_Object *widget = eail_widget_get_widget(EAIL_WIDGET(parent));
305 Elm_Object_Item *it = eail_item_get_item(item);
307 if (!widget || !it) return state_set;
309 Evas_Object *cell = elm_object_item_widget_get(it);
311 if ((elm_gengrid_select_mode_get(widget) != ELM_OBJECT_SELECT_MODE_NONE) &&
312 (elm_gengrid_item_select_mode_get(it) != ELM_OBJECT_SELECT_MODE_NONE))
314 atk_state_set_add_state(state_set, ATK_STATE_SELECTABLE);
315 if (elm_gengrid_selected_item_get(cell))
316 atk_state_set_add_state(state_set, ATK_STATE_SELECTED);
319 if (evas_object_visible_get(cell))
320 atk_state_set_add_state(state_set, ATK_STATE_VISIBLE);
322 atk_state_set_add_state(state_set, ATK_STATE_SHOWING);
328 * @brief Grabs focus of EailGengrid item
330 * @param parent EailGengrid instance
331 * @param item EailGengrid child instance
333 * @returns TRUE on success, FALSE otherwise
336 eail_gengrid_grab_item_focus(EailItemParent *parent,
339 Elm_Object_Item *it = eail_item_get_item(item);
340 if (!it) return FALSE;
342 Evas_Object *obj = elm_object_item_widget_get(it);
343 if (!elm_object_focus_allow_get(obj)) return FALSE;
345 elm_object_focus_set(obj, EINA_TRUE);
351 * @brief Gets the rectangle which gives the extent of the component
353 * Implementation of get_extents from AtkComponent for EailGengrid child.
355 * @param parent EailGengrid instance
356 * @param item EailGengrid child instance
357 * @param [out] x x coordinate
358 * @param [out] y coordinate
359 * @param [out] width width of the rectangle
360 * @param [out] height height of the rectangle
361 * @param coord_type specifies whether the coordinates are relative to the screen or to the components top level window
364 eail_gengrid_item_extents_get(EailItemParent *parent,
370 AtkCoordType coord_type)
372 Evas_Object *widget = eail_widget_get_widget(EAIL_WIDGET(parent));
373 Elm_Object_Item *it = eail_item_get_item(item);
375 if ((!widget) || (!it)) return;
377 Evas_Object *it_widget = elm_object_item_widget_get(it);
378 evas_object_geometry_get(it_widget, x, y, width, height);
380 if (coord_type == ATK_XY_SCREEN) {
383 ecore_evas_ecore_evas_get(evas_object_evas_get(it_widget));
385 ecore_evas_geometry_get(ee, &ee_x, &ee_y, NULL, NULL);
392 * @brief Gets supported actions
394 * Implementation of EailItemParent->get_actions_supported callback.
396 * @param parent EailItemParent instance
397 * @param item EailItem instance
398 * @returns implementation representing supported actions
401 eail_gengrid_get_actions_supported(EailItemParent *parent,
404 return EAIL_ACTION_SUPPORTED_CLICK | EAIL_ACTION_SUPPORTED_PRESS |
405 EAIL_ACTION_SUPPORTED_RELEASE;
409 * @brief EailItemParent interface initialization
411 * @param iface EailItemParentIface instance
414 eail_item_parent_interface_init(EailItemParentIface *iface)
418 iface->get_item_name = eail_gengrid_item_name_get;
419 iface->get_item_index_in_parent = eail_gengrid_item_index_in_parent_get;
420 iface->ref_item_state_set = eail_gengrid_ref_item_state_set;
421 iface->grab_item_focus = eail_gengrid_grab_item_focus;
422 iface->get_item_extents = eail_gengrid_item_extents_get;
423 iface->get_actions_supported = eail_gengrid_get_actions_supported;
427 * @brief Helper function for getting rows and columns count
429 * @param object elm_gengrid instance
430 * @param [out] rows rows count
431 * @param [out] columns columns count
434 _get_n_rows_columns(const Evas_Object *object,
435 int *rows, int *columns)
438 Eina_List *l, *list = elm_gengrid_realized_items_get(object);
449 EINA_LIST_FOREACH(list, l, it)
451 unsigned int item_row, item_col;
452 elm_gengrid_item_pos_get(it, &item_col, &item_row);
453 if (item_row > row) row++;
454 if (item_col > column) column++;
457 eina_list_free(list);
459 *columns = column + 1;
464 * @brief Gets the number of rows in the table
466 * Implementation of get_n_rows from AtkTable.
468 * @param table AtkTable instance
470 * @returns integer representing the number of rows
473 eail_gengrid_n_rows_get(AtkTable *table)
478 g_return_val_if_fail(EAIL_IS_GENGRID(table), -1);
480 widget = eail_widget_get_widget(EAIL_WIDGET(table));
481 if (!widget) return -1;
483 _get_n_rows_columns(widget, &rows, &columns);
488 * @brief Gets the number of columns in the table
490 * Implementation of get_n_columns from AtkTable.
492 * @param table AtkTable instance
494 * @returns integer representing the number of columns
497 eail_gengrid_n_columns_get(AtkTable *table)
502 g_return_val_if_fail(EAIL_IS_GENGRID(table), -1);
504 widget = eail_widget_get_widget(EAIL_WIDGET(table));
506 _get_n_rows_columns(widget, &rows, &columns);
512 * @brief Gets a gint representing the index at the specified row and column
514 * Implementation of get_index_at from AtkTable.
516 * @param table AtkTable instance
517 * @param row number of row in table
518 * @param column number of column in table
520 * @returns integer representing the index of the specified position
523 eail_gengrid_index_at_get(AtkTable *table, gint row, gint column)
526 gint n_rows, n_columns;
529 g_return_val_if_fail(EAIL_IS_GENGRID(table), -1);
530 widget = eail_widget_get_widget(EAIL_WIDGET(table));
531 if (!widget) return -1;
533 _get_n_rows_columns(widget, &n_rows, &n_columns);
535 if ((row >= n_rows) || (column >= n_columns)) return -1;
537 if (elm_gengrid_horizontal_get(widget))
538 ret_val = ((n_columns) * column) + row;
540 ret_val = ((n_columns) * row) + column;
542 /* testing if result is within bounds */
543 if (ret_val >= eail_gengrid_n_items_get(ATK_OBJECT(table)))
550 * @brief Get a reference to the table cell at row, column
552 * Implementation of ref_at from AtkTable.
554 * @param table AtkTable instance
555 * @param row number of row in table
556 * @param column number of column in table
558 * @returns AtkObject representing the child object
561 eail_gengrid_ref_at(AtkTable *table, gint row, gint column)
565 g_return_val_if_fail(EAIL_IS_GENGRID(table), NULL);
567 index = eail_gengrid_index_at_get(table, row, column);
568 if (index == -1) return NULL;
570 return eail_gengrid_ref_child(ATK_OBJECT(table), index);
574 * @brief Helper function for getting object's position in table at given index
576 * @param widget Evas_Object instance
577 * @param [out] row row number
578 * @param [out] column column number
579 * @param index index of child item
582 _get_item_pos(const Evas_Object *widget, gint *row, gint *column, gint index)
594 list = elm_gengrid_realized_items_get(widget);
595 it = eina_list_nth(list, index);
596 elm_gengrid_item_pos_get(it, (unsigned int *)column, (unsigned int *)row);
598 eina_list_free(list);
602 * @brief Gets an integer representing the column at the specified index
604 * Implementation of get_column_at_index from AtkTable.
606 * @param table AtkTable instance
607 * @param index child index
609 * @returns integer representing the column number in table
612 eail_gengrid_column_at_index_get(AtkTable *table, gint index)
617 g_return_val_if_fail(EAIL_IS_GENGRID(table), -1);
618 if (index >= eail_gengrid_n_items_get(ATK_OBJECT(table)))
621 widget = eail_widget_get_widget(EAIL_WIDGET(table));
622 _get_item_pos(widget, &row, &column, index);
628 * @brief Gets a gint representing the row at the specified index
630 * Implementation of get_row_at_index from AtkTable.
632 * @param table AtkTable instance
633 * @param index child index
635 * @returns integer representing the row number in table
638 eail_gengrid_row_at_index_get(AtkTable *table, gint index)
643 g_return_val_if_fail(EAIL_IS_GENGRID(table), -1);
644 if (index >= eail_gengrid_n_items_get(ATK_OBJECT(table)))
647 widget = eail_widget_get_widget(EAIL_WIDGET(table));
648 _get_item_pos(widget, &row, &column, index);
654 * @brief Gets a boolean value indicating whether the accessible object
655 * at the specified row and column is selected
657 * Implementation of is_selected from AtkTable.
659 * @param table AtkTable instance
660 * @param row row's number
661 * @param column column's number
663 * @returns TRUE if selected, FALSE otherwise
666 eail_gengrid_is_selected(AtkTable *table, gint row, gint column)
674 g_return_val_if_fail(EAIL_IS_GENGRID(table), FALSE);
675 widget = eail_widget_get_widget(EAIL_WIDGET(table));
676 index = eail_gengrid_index_at_get(table, row, column);
677 if (index == -1) return FALSE;
679 list = elm_gengrid_realized_items_get(widget);
680 it = eina_list_nth(list, index);
681 result = elm_gengrid_item_selected_get(it);
683 eina_list_free(list);
688 * @brief Gets a boolean value indicating whether the specified row is selected
690 * Implementation of is_row_selected from AtkTable interface.
692 * @param table AtkTable instance
693 * @param row number of row in table
695 * @returns TRUE if selected, FALSE otherwise
698 eail_gengrid_is_row_selected(AtkTable *table, gint row)
702 const Eina_List *selected;
704 int list_count, n_rows;
706 g_return_val_if_fail(EAIL_IS_GENGRID(table), FALSE);
707 widget = eail_widget_get_widget(EAIL_WIDGET(table));
708 /*it is possible to select row only in multiselct mode*/
709 if (!elm_gengrid_multi_select_get(widget))
712 selected = elm_gengrid_selected_items_get(widget);
713 if (!selected) return FALSE;
715 n_rows = eail_gengrid_n_rows_get(table);
716 if (row > n_rows) return FALSE;
718 list = elm_gengrid_realized_items_get(widget);
719 list_count = eina_list_count(list);
722 for (int i = 0; i < list_count; i++)
724 Elm_Object_Item *it = eina_list_nth(list, i);
726 elm_gengrid_item_pos_get(it, &x, &y);
727 if((row == x) && (!elm_gengrid_item_selected_get(it)))
729 /*row is considered selected if all items in row are selected*/
734 eina_list_free(list);
739 * @brief Gets the selected rows of the table by initializing selected
740 * with the selected row numbers
742 * This array should be freed by the caller.
744 * Implementation of get_selected_rows from AtkTable interface.
746 * @param table AtkTable instance
747 * @param [out] selected selected rows number
749 * @returns integer representing the selected rows count
752 eail_gengrid_selected_rows_get(AtkTable *table, gint **selected)
756 int n_rows, n_selected;
758 g_return_val_if_fail(EAIL_IS_GENGRID(table), 0);
759 widget = eail_widget_get_widget(EAIL_WIDGET(table));
761 if (!widget) return 0;
762 if (!elm_gengrid_multi_select_get(widget)) return 0;
764 n_rows = eail_gengrid_n_rows_get(table);
765 array = g_array_new(FALSE, FALSE, sizeof(gint));
766 for (int i = 0; i < n_rows; i++)
768 gboolean success = eail_gengrid_is_row_selected(table, i);
769 if (success) g_array_append_val(array, i);
771 n_selected = array->len;
772 *selected = (gint *) g_array_free(array, FALSE);
777 * @brief Helper function for setting row selection
779 * @param table AtkTable instance
780 * @param row row number
781 * @param selection EINA_TRUE for selection, EINA_FALSE for removing selection
784 _set_row_selection(AtkTable *table, int row, Eina_Bool selection)
786 Evas_Object *widget = eail_widget_get_widget(EAIL_WIDGET(table));
787 Eina_List *list = elm_gengrid_realized_items_get(widget);
788 int list_count = eina_list_count(list);
790 for (int i = 0; i < list_count; i++)
793 Elm_Object_Item *it = eina_list_nth(list, i);
794 elm_gengrid_item_pos_get(it, &x, &y);
797 elm_gengrid_item_selected_set(it, selection);
801 eina_list_free(list);
805 * @brief Adds the specified row to the selection
807 * Implementation of add_row_selection from AtkTable.
809 * @param table AtkTable instance
810 * @param row row number in table
812 * @returns TRUE on success, FALSE otherwise
815 eail_gengrid_add_row_selection(AtkTable *table, gint row)
820 g_return_val_if_fail(EAIL_IS_GENGRID(table), FALSE);
821 widget = eail_widget_get_widget(EAIL_WIDGET(table));
823 if (!widget) return FALSE;
824 if (!elm_gengrid_multi_select_get(widget)) return FALSE;
825 n_rows = eail_gengrid_n_rows_get(table);
826 if (row > n_rows) return FALSE;
828 _set_row_selection(table, row, EINA_TRUE);
833 * @brief Removes the specified row from the selection
835 * Implementation of remove_row_selection from AtkTable interface.
837 * @param table AtkTable instance
838 * @param row number of row in table
840 * @returns TRUE on success, FALSE otherwise
843 eail_gengrid_remove_row_selection(AtkTable *table, gint row)
848 g_return_val_if_fail(EAIL_IS_GENGRID(table), FALSE);
850 widget = eail_widget_get_widget(EAIL_WIDGET(table));
851 if (!widget) return FALSE;
852 if (!elm_gengrid_multi_select_get(widget)) return FALSE;
853 n_rows = eail_gengrid_n_rows_get(table);
854 if (row > n_rows) return FALSE;
856 _set_row_selection(table, row, EINA_FALSE);
862 * @brief Gets a boolean value indicating whether the specified column is selected
864 * Implementation of is_column_selected from AtkTable interface.
866 * @param table AtkTable implementation
867 * @param column number of column in table
869 * @returns TRUE on selection, FALSE otherwise
872 eail_gengrid_is_column_selected(AtkTable *table, gint column)
876 const Eina_List *selected;
877 int n_columns, list_count;
880 g_return_val_if_fail(EAIL_IS_GENGRID(table), FALSE);
881 widget = eail_widget_get_widget(EAIL_WIDGET(table));
882 if (!elm_gengrid_multi_select_get(widget)) return FALSE;
883 n_columns = eail_gengrid_n_columns_get(table);
884 if (column > n_columns) return FALSE;
885 selected = elm_gengrid_selected_items_get(widget);
886 if (!selected) return FALSE;
888 list = elm_gengrid_realized_items_get(widget);
889 list_count = eina_list_count(list);
891 for (int i = 0; i < list_count; i++)
893 Elm_Object_Item *it = eina_list_nth(list, i);
895 elm_gengrid_item_pos_get(it, &x, &y);
896 if ((y == column) && (!elm_gengrid_item_selected_get(it)))
903 eina_list_free(list);
908 * @brief Helper function for setting column selection in elm_gengrid
910 * @param table AtkTable instance
911 * @param column number of column in table
912 * @param selection EINA_TRUE for selection, EINA_FALSE otherwise
915 _set_column_selection(AtkTable *table, int column, Eina_Bool selection)
917 Evas_Object *widget = eail_widget_get_widget(EAIL_WIDGET(table));
918 Eina_List *list = elm_gengrid_realized_items_get(widget);
919 int list_count = eina_list_count(list);
921 for (int i = 0; i < list_count; i++)
924 Elm_Object_Item *it = eina_list_nth(list, i);
925 elm_gengrid_item_pos_get(it, &x, &y);
928 elm_gengrid_item_selected_set(it, selection);
932 eina_list_free(list);
936 * @brief Adds the specified column to the selection
938 * Implementation of add_column_selection from AtkTable interface.
940 * @param table AtkTable instance
941 * @param column number of column in table
943 * @returns TRUE on success, FALSE otherwise
946 eail_gengrid_add_column_selection(AtkTable *table, gint column)
951 g_return_val_if_fail(EAIL_IS_GENGRID(table), FALSE);
952 widget = eail_widget_get_widget(EAIL_WIDGET(table));
953 if (!widget) return FALSE;
954 if (!elm_gengrid_multi_select_get(widget)) return FALSE;
955 n_columns = eail_gengrid_n_columns_get(table);
956 if (column > n_columns) return FALSE;
958 _set_column_selection(table, column, EINA_TRUE);
963 * @brief Removes the specified column from the selection
965 * Implementation of remove_column_selection from AtkTable.
967 * @param table AtkTable instance
968 * @param column column number in table
970 * @returns TRUE on success, FALSE otherwise
973 eail_gengrid_remove_column_selection(AtkTable *table, gint column)
978 g_return_val_if_fail(EAIL_IS_GENGRID(table), FALSE);
979 widget = eail_widget_get_widget(EAIL_WIDGET(table));
980 if (!widget) return FALSE;
981 if (!elm_gengrid_multi_select_get(widget)) return FALSE;
982 n_columns = eail_gengrid_n_columns_get(table);
983 if (column > n_columns) return FALSE;
985 _set_column_selection(table, column, EINA_FALSE);
991 * @brief AtkTable interface initialization
993 * @param iface AtkTableIface instance
996 atk_table_interface_init(AtkTableIface *iface)
1000 iface->ref_at = eail_gengrid_ref_at;
1001 iface->get_n_rows = eail_gengrid_n_rows_get;
1002 iface->get_n_columns = eail_gengrid_n_columns_get;
1003 iface->get_index_at = eail_gengrid_index_at_get;
1004 iface->get_column_at_index = eail_gengrid_column_at_index_get;
1005 iface->get_row_at_index = eail_gengrid_row_at_index_get;
1006 iface->is_row_selected = eail_gengrid_is_row_selected;
1007 iface->is_selected = eail_gengrid_is_selected;
1008 iface->get_selected_rows = eail_gengrid_selected_rows_get;
1009 iface->add_row_selection = eail_gengrid_add_row_selection;
1010 iface->remove_row_selection = eail_gengrid_remove_row_selection;
1011 iface->is_column_selected = eail_gengrid_is_column_selected;
1012 iface->add_column_selection = eail_gengrid_add_column_selection;
1013 iface->remove_column_selection = eail_gengrid_remove_column_selection;
1016 iface->get_column_extent_at = NULL;
1017 iface->get_row_extent_at = NULL;
1018 iface->get_column_header = NULL;
1019 iface->get_column_description = NULL;
1023 * @brief Adds the specified accessible child of the object to the object's selection
1025 * Implementation of add_selection from AtkSelection interface.
1027 * @param selection AtkSelection instance
1028 * @param i index of child to select
1030 * @returns TRUE on success, FALSE otherwise
1033 eail_gengrid_selection_add(AtkSelection *selection, gint i)
1035 Evas_Object *widget;
1036 Elm_Object_Item *it;
1040 g_return_val_if_fail(EAIL_IS_GENGRID(selection), FALSE);
1041 widget = eail_widget_get_widget(EAIL_WIDGET(selection));
1042 list = elm_gengrid_realized_items_get(widget);
1044 if (i > eina_list_count(list)) return FALSE;
1045 it = eina_list_nth(list, i);
1047 if (elm_gengrid_item_selected_get(it))
1051 elm_gengrid_item_selected_set(it, EINA_TRUE);
1055 eina_list_free(list);
1060 * @brief Clears the selection in the object so that no children in the object are selected
1062 * Implementation of clear_selection from AtkSelection.
1064 * @param selection AtkSelection instance
1066 * @returns TRUE on success, FALSE otherwise
1069 eail_gengrid_selection_clear(AtkSelection *selection)
1071 const Eina_List *l, *list;
1072 Evas_Object *widget;
1073 Elm_Object_Item *it;
1075 g_return_val_if_fail(EAIL_IS_GENGRID(selection), FALSE);
1076 widget = eail_widget_get_widget(EAIL_WIDGET(selection));
1078 if (elm_gengrid_multi_select_get(widget))
1080 list = elm_gengrid_selected_items_get(widget);
1081 EINA_LIST_FOREACH(list, l, it)
1083 elm_gengrid_item_selected_set(it, EINA_FALSE);
1088 it = elm_gengrid_selected_item_get(widget);
1089 elm_gengrid_item_selected_set(it, EINA_FALSE);
1097 * @brief Gets a reference to the accessible object representing the specified
1098 * selected child of the object
1100 * Note: callers should not rely on NULL
1101 * or on a zero value for indication of whether AtkSelectionIface is
1102 * implemented, they should use type checking/interface checking macros
1103 * or the atk_get_accessible_value() convenience method.
1105 * Implementation of ref_selection from AtkSelection interface.
1107 * @param selection AtkSelection instance
1108 * @param i index of selected child
1110 * @returns AtkObject representing the selected object
1113 eail_gengrid_selection_ref(AtkSelection *selection, gint i)
1115 Evas_Object *widget;
1116 Elm_Object_Item *it;
1117 const Eina_List *list;
1118 Eina_Bool multiselect;
1121 g_return_val_if_fail(EAIL_IS_GENGRID(selection), NULL);
1122 widget = eail_widget_get_widget(EAIL_WIDGET(selection));
1123 multiselect = elm_gengrid_multi_select_get(widget);
1125 if ((!multiselect) && (i != 0)) return FALSE;
1129 list = elm_gengrid_selected_items_get(widget);
1130 if (i > eina_list_count(list)) return NULL;
1131 it = eina_list_nth(list, i);
1135 it = elm_gengrid_selected_item_get(widget);
1138 if (!it) return NULL;
1140 child = eail_factory_get_item_atk_obj
1141 (it, ATK_ROLE_LIST_ITEM, ATK_OBJECT(selection));
1143 g_object_ref(child);
1149 * @brief Gets the number of accessible children currently selected.
1151 * Note: callers should not rely on NULL or on a zero value
1152 * for indication of whether AtkSelectionIface is implemented,
1153 * they should use type checking/interface checking macros or
1154 * the atk_get_accessible_value() convenience method.
1156 * Implementation of get_selection_count from AtkSelection interface.
1158 * @param selection AtkSelection instance
1160 * @returns integer representing the number of selected items
1163 eail_gengrid_selection_count_get(AtkSelection *selection)
1165 Evas_Object *widget;
1166 Elm_Object_Item *it;
1167 const Eina_List *list;
1170 g_return_val_if_fail(EAIL_IS_GENGRID(selection), -1);
1171 widget = eail_widget_get_widget(EAIL_WIDGET(selection));
1172 if (!elm_gengrid_multi_select_get(widget))
1174 it = elm_gengrid_selected_item_get(widget);
1175 n_selections = (it ? 1 : 0);
1179 list = elm_gengrid_selected_items_get(widget);
1180 n_selections = eina_list_count(list);
1183 return n_selections;
1187 * @brief Determines if the current child of this object is selected.
1189 * Note: callers should not rely on NULL or on a zero value for
1190 * indication of whether AtkSelectionIface is implemented, they
1191 * should use type checking/interface checking macros or
1192 * the atk_get_accessible_value() convenience method.
1194 * Implementation of is_child_selected from AtkSelection interface.
1196 * @param selection AtkSelection instance
1197 * @param i index of child
1199 * @returns TRUE on selection, FALSE otherwise
1202 eail_gengrid_selection_is_child_selected(AtkSelection *selection, int i)
1204 Evas_Object *widget;
1205 Elm_Object_Item *it;
1209 g_return_val_if_fail(EAIL_IS_GENGRID(selection), FALSE);
1210 widget = eail_widget_get_widget(EAIL_WIDGET(selection));
1211 list = elm_gengrid_realized_items_get(widget);
1213 if (i > eina_list_count(list))
1215 eina_list_free(list);
1219 it = eina_list_nth(list, i);
1220 selected = (elm_gengrid_item_selected_get(it) ? TRUE : FALSE);
1221 eina_list_free(list);
1227 * @brief Removes the specified child of the object from the object's selection
1229 * Implementation of remove_selection from AtkSelection.
1231 * @param selection AtkSelection instance
1232 * @param i index of selected child
1234 * @returns TRUE on success, FALSE otherwise
1237 eail_gengrid_selection_remove(AtkSelection *selection, gint i)
1239 Evas_Object *widget;
1240 Elm_Object_Item *it;
1241 const Eina_List *list;
1242 Eina_Bool multiselect;
1244 g_return_val_if_fail(EAIL_IS_GENGRID(selection), FALSE);
1245 widget = eail_widget_get_widget(EAIL_WIDGET(selection));
1246 multiselect = elm_gengrid_multi_select_get(widget);
1247 if ((!multiselect) && (i != 0)) return FALSE;
1251 it = elm_gengrid_selected_item_get(widget);
1252 elm_gengrid_item_selected_set(it, FALSE);
1256 list = elm_gengrid_selected_items_get(widget);
1257 if (i > eina_list_count(list)) return FALSE;
1259 it = eina_list_nth(list, i);
1260 elm_gengrid_item_selected_set(it, EINA_FALSE);
1267 * @brief Causes every child of the object to be selected if the object supports multiple selections
1269 * Implementation of select_all from AtkSelection interface.
1271 * @param selection AtkSelection instance
1273 * @return TRUE on success, FALSE otherwise
1276 eail_gengrid_selection_select_all(AtkSelection *selection)
1278 Evas_Object *widget;
1279 Elm_Object_Item *it;
1280 Eina_List *l, *list;
1282 g_return_val_if_fail(EAIL_IS_GENGRID(selection), FALSE);
1283 widget = eail_widget_get_widget(EAIL_WIDGET(selection));
1284 if (!elm_gengrid_multi_select_get(widget)) return FALSE;
1286 list = elm_gengrid_realized_items_get(widget);
1287 EINA_LIST_FOREACH(list, l, it)
1289 elm_gengrid_item_selected_set(it, EINA_TRUE);
1295 * @brief AtkSelection interface initialization
1297 * @param iface AtkSelectionIface instance
1300 atk_selection_interface_init(AtkSelectionIface *iface)
1302 g_return_if_fail(iface != NULL);
1304 iface->add_selection = eail_gengrid_selection_add;
1305 iface->clear_selection = eail_gengrid_selection_clear;
1306 iface->ref_selection = eail_gengrid_selection_ref;
1307 iface->get_selection_count = eail_gengrid_selection_count_get;
1308 iface->is_child_selected = eail_gengrid_selection_is_child_selected;
1309 iface->remove_selection = eail_gengrid_selection_remove;
1310 iface->select_all_selection = eail_gengrid_selection_select_all;